diff --git a/404.html b/404.html index 60c759161..7394ca9bf 100644 --- a/404.html +++ b/404.html @@ -6,9 +6,9 @@ 404 | Vue FAQ - + - + @@ -28,7 +28,7 @@
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- + \ No newline at end of file diff --git a/assets/app.Oz7jxSrX.js b/assets/app.mQJhfjOh.js similarity index 95% rename from assets/app.Oz7jxSrX.js rename to assets/app.mQJhfjOh.js index a2bdb89d3..df93d4288 100644 --- a/assets/app.Oz7jxSrX.js +++ b/assets/app.mQJhfjOh.js @@ -1,4 +1,4 @@ -import{j as o,av as p,aw as u,ax as l,ay as c,az as f,aA as d,aB as m,aC as h,aD as A,aE as g,X as v,d as P,u as w,l as y,z as C,aF as R,aG as E,aH as _,a7 as D}from"./chunks/framework.P5TqXf0g.js";import{R as b}from"./chunks/theme.3jHxI3s0.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(b),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return y(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),E(),_(),s.setup&&s.setup(),()=>D(s.Layout)}});async function j(){const e=F(),a=x();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function x(){return h(T)}function F(){let e=o,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=v(()=>import(n),__vite__mapDeps([]))),o&&(e=!1),r},s.NotFound)}o&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{j as createApp}; +import{j as o,av as p,aw as u,ax as l,ay as c,az as f,aA as d,aB as m,aC as h,aD as A,aE as g,X as v,d as P,u as w,l as y,z as C,aF as R,aG as E,aH as _,a7 as D}from"./chunks/framework.P5TqXf0g.js";import{R as b}from"./chunks/theme.HfBH_EWg.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(b),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return y(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),E(),_(),s.setup&&s.setup(),()=>D(s.Layout)}});async function j(){const e=F(),a=x();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function x(){return h(T)}function F(){let e=o,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=v(()=>import(n),__vite__mapDeps([]))),o&&(e=!1),r},s.NotFound)}o&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{j as createApp}; function __vite__mapDeps(indexes) { if (!__vite__mapDeps.viteFileDeps) { __vite__mapDeps.viteFileDeps = [] diff --git a/assets/chunks/@localSearchIndexen.N2xzeUE8.js b/assets/chunks/@localSearchIndexen.N2xzeUE8.js new file mode 100644 index 000000000..dbf729ea0 --- /dev/null +++ b/assets/chunks/@localSearchIndexen.N2xzeUE8.js @@ -0,0 +1 @@ +const e='{"documentCount":121,"nextId":121,"documentIds":{"0":"/en/backend/api.html#backend-link-abstraction","1":"/en/backend/api.html#api-service","2":"/en/backend/auth.html#authentication-and-authorization","3":"/en/backend/backend.html#options-to-leverage-your-backend-for-frontenders","4":"/en/backend/cors.html#cors","5":"/en/backend/protocols.html#protocols-to-rest-or-not-to-rest","6":"/en/deployment/ci-cd.html#ci-cd","7":"/en/deployment/docker.html#docker","8":"/en/deployment/hosting.html#hosting","9":"/en/deployment/github-actions.html#github-actions","10":"/en/development/architectural-patterns.html#architectural-patterns","11":"/en/development/architectural-patterns.html#use-cases","12":"/en/development/architectural-patterns.html#best-practices-and-considerations","13":"/en/development/architectural-patterns.html#apploader-vue","14":"/en/development/architectural-patterns.html#useapploader-ts","15":"/en/development/architectural-patterns.html#some-component","16":"/en/development/assets.html#application-resources","17":"/en/development/assets.html#baseicon","18":"/en/development/assets.html#icons-js","19":"/en/development/building.html#create-and-build-an-application","20":"/en/development/ide.html#configuring-the-ide","21":"/en/development/misc.html#helpful-hints","22":"/en/development/misc.html#carousel-or-slider","23":"/en/development/misc.html#date-and-time","24":"/en/development/libraries.html#tell-me-a-handy-library","25":"/en/development/stores.html#state-management-in-vue-3","26":"/en/development/testing.html#testing","27":"/en/frontend/about-frameworks.html#about-frontend-frameworks","28":"/en/frontend/architecture.html#frontend-application-architecture","29":"/en/frontend/architecture.html#avoid-dependencies","30":"/en/frontend/architecture.html#use-wrappers-over-components-of-ui-libraries-and-third-party-utilities","31":"/en/frontend/architecture.html#regular-refactoring","32":"/en/frontend/architecture.html#use-css3","33":"/en/frontend/architecture.html#use-modern-standards-and-language-features","34":"/en/frontend/architecture.html#document-the-project","35":"/en/frontend/css-ui-libs.html#css-and-ui-libraries","36":"/en/frontend/learning.html#learning-vue","37":"/en/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-and-seo","38":"/en/misc/CHANGELOG.html#changelog","39":"/en/misc/CHANGELOG.html#v1-4-24-11-2023","40":"/en/misc/CHANGELOG.html#changed","41":"/en/misc/CHANGELOG.html#v1-3-10-10-2023","42":"/en/misc/CHANGELOG.html#changed-1","43":"/en/misc/CHANGELOG.html#v1-2-28-09-2023","44":"/en/misc/CHANGELOG.html#new","45":"/en/misc/CHANGELOG.html#changed-2","46":"/en/misc/CHANGELOG.html#v1-1-15-09-2023","47":"/en/misc/CHANGELOG.html#new-1","48":"/en/misc/CHANGELOG.html#changed-3","49":"/en/misc/CHANGELOG.html#v1-0-11-09-2023","50":"/en/misc/CHANGELOG.html#new-2","51":"/en/misc/cheat-sheets.html#cheat-sheet","52":"/en/misc/cheat-sheets.html#vue","53":"/en/misc/cheat-sheets.html#javascript","54":"/en/misc/cheat-sheets.html#html","55":"/en/misc/cheat-sheets.html#css","56":"/en/misc/cheat-sheets.html#typescript","57":"/en/misc/cheat-sheets.html#markdown","58":"/en/misc/contribute.html#contribute-to-the-development-of-this-resource","59":"/en/misc/glossary.html#glossary-and-abbreviations","60":"/en/vue-webapp/contribution.html#project-participation","61":"/en/misc/introduction.html#introduction","62":"/en/misc/introduction.html#about-the-author","63":"/en/vue-webapp/getting-started.html#getting-started","64":"/en/vue-webapp/getting-started.html#installation-via-create-vue-webapp","65":"/en/vue-webapp/getting-started.html#initializing-and-launching-a-web-application","66":"/en/vue-webapp/getting-started.html#installation-from-the-repository","67":"/en/vue-webapp/guidelines.html#guidelines","68":"/en/vue-webapp/#scaffolding-a-vue-webapp","69":"/en/vue-webapp/#summary","70":"/en/vue-webapp/#justification","71":"/en/vue-webapp/objectives.html#objectives","72":"/en/vue-webapp/options/adaptability.html#adaptability","73":"/en/vue-webapp/options/api.html#api-module","74":"/en/vue-webapp/options/api.html#api-rest","75":"/en/vue-webapp/options/api.html#json-rpc","76":"/en/vue-webapp/options/baseIcon.html#baseicon","77":"/en/vue-webapp/options/description.html#implementation-details","78":"/en/vue-webapp/options/description.html#code-injections-in-the-index-html","79":"/en/vue-webapp/options/description.html#css-tricks","80":"/en/vue-webapp/options/drawer.html#navigation-drawers","81":"/en/vue-webapp/options/drawer.html#simpledrawer","82":"/en/vue-webapp/options/drawer.html#touchslideoutdrawer","83":"/en/vue-webapp/options/ga-gp.html#github-actions-script-to-deploy-to-github-pages","84":"/en/vue-webapp/options/ga-gp.html#deployment","85":"/en/vue-webapp/options/ga-gp.html#setting-base-in-vite-config","86":"/en/vue-webapp/options/footer.html#footers","87":"/en/vue-webapp/options/footer.html#simplefooter","88":"/en/vue-webapp/options/footer.html#richfooter","89":"/en/vue-webapp/options/footer.html#mantinesimplefooter","90":"/en/vue-webapp/options/footer.html#mantinerichfooter","91":"/en/vue-webapp/options/footer.html#distributedfooter","92":"/en/vue-webapp/options/google-analytics.html#google-analytics","93":"/en/vue-webapp/options/header.html#headers","94":"/en/vue-webapp/options/header.html#simpleheader","95":"/en/vue-webapp/options/header.html#mantinesimpleheader","96":"/en/vue-webapp/options/header.html#mantinelayeredheader","97":"/en/vue-webapp/options/header.html#slidingheader","98":"/en/vue-webapp/options/i18n.html#i18n","99":"/en/vue-webapp/options/i18n.html#i18next","100":"/en/vue-webapp/options/i18n.html#usei18nlight","101":"/en/vue-webapp/options/i18n.html#usage","102":"/en/vue-webapp/options/i18n.html#i18next-extensions","103":"/en/vue-webapp/options/i18n.html#as-a-result","104":"/en/vue-webapp/options/#options-when-creating-an-application","105":"/en/vue-webapp/options/#available-options","106":"/en/vue-webapp/options/#available-by-default","107":"/en/vue-webapp/options/#in-development","108":"/en/vue-webapp/options/#planned","109":"/en/vue-webapp/options/layout-main.html#mainlayout","110":"/en/vue-webapp/options/layout-main.html#routing","111":"/en/vue-webapp/options/layout-one-column.html#onecolumnlayout","112":"/en/vue-webapp/options/navbar.html#navbar","113":"/en/vue-webapp/options/navbar.html#simplenavbar","114":"/en/vue-webapp/options/navbar.html#mantinesimplenavbar","115":"/en/vue-webapp/options/open-graph.html#google-analytics","116":"/en/vue-webapp/options/pwa.html#pwa","117":"/en/vue-webapp/options/pwa.html#manifest-json","118":"/en/vue-webapp/options/pwa.html#service-worker","119":"/en/vue-webapp/options/splash-screen.html#splash-screen","120":"/en/vue-webapp/options/themes.html#themes"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[3,1,1],"1":[2,3,120],"2":[3,1,328],"3":[7,1,226],"4":[1,1,177],"5":[7,1,147],"6":[2,1,71],"7":[1,1,1],"8":[1,1,124],"9":[2,1,385],"10":[2,1,151],"11":[2,3,83],"12":[4,3,171],"13":[2,6,22],"14":[2,6,32],"15":[2,6,25],"16":[2,1,178],"17":[1,3,71],"18":[2,3,116],"19":[5,1,209],"20":[3,1,815],"21":[2,1,9],"22":[3,3,17],"23":[3,3,312],"24":[5,1,49],"25":[5,1,468],"26":[1,1,149],"27":[3,1,368],"28":[3,1,189],"29":[2,4,79],"30":[11,4,41],"31":[2,4,30],"32":[2,4,48],"33":[6,4,18],"34":[3,4,36],"35":[4,1,214],"36":[2,1,408],"37":[6,1,457],"38":[1,1,1],"39":[6,1,1],"40":[1,7,8],"41":[5,1,1],"42":[1,6,11],"43":[6,1,1],"44":[1,7,4],"45":[1,7,14],"46":[6,1,1],"47":[1,7,3],"48":[1,7,4],"49":[6,1,1],"50":[1,7,3],"51":[2,1,1],"52":[1,3,5],"53":[1,3,4],"54":[1,3,4],"55":[1,3,6],"56":[1,3,8],"57":[1,3,2],"58":[7,1,42],"59":[3,1,61],"60":[2,1,15],"61":[1,1,80],"62":[4,2,29],"63":[2,1,1],"64":[5,2,136],"65":[6,7,14],"66":[4,2,37],"67":[1,1,134],"68":[4,1,1],"69":[1,4,63],"70":[1,4,158],"71":[1,1,169],"72":[1,1,79],"73":[2,1,1],"74":[3,2,92],"75":[2,2,89],"76":[1,1,65],"77":[2,1,1],"78":[6,2,44],"79":[2,2,30],"80":[2,1,12],"81":[1,2,23],"82":[1,2,24],"83":[6,1,1],"84":[1,6,67],"85":[5,6,46],"86":[1,1,9],"87":[1,1,1],"88":[1,1,1],"89":[1,1,1],"90":[1,1,1],"91":[1,1,1],"92":[2,1,45],"93":[1,1,5],"94":[1,1,4],"95":[1,1,8],"96":[1,1,8],"97":[1,1,30],"98":[1,1,1],"99":[1,1,99],"100":[1,1,22],"101":[1,1,56],"102":[2,1,56],"103":[3,1,17],"104":[5,1,1],"105":[2,5,73],"106":[3,5,20],"107":[2,5,12],"108":[1,5,74],"109":[1,1,28],"110":[1,1,13],"111":[1,1,46],"112":[1,1,17],"113":[1,1,1],"114":[1,1,1],"115":[2,1,34],"116":[1,1,16],"117":[2,1,56],"118":[2,1,66],"119":[2,1,49],"120":[1,1,83]},"averageFieldLength":[2.4132231404958677,2.2148760330578514,73.52892561983468],"storedFields":{"0":{"title":"Backend link abstraction","titles":[]},"1":{"title":"API service","titles":["Backend link abstraction"]},"2":{"title":"Authentication and authorization","titles":[]},"3":{"title":"Options to leverage your backend for frontenders","titles":[]},"4":{"title":"CORS","titles":[]},"5":{"title":"Protocols. To REST or not to REST?","titles":[]},"6":{"title":"CI/CD","titles":[]},"7":{"title":"Docker","titles":[]},"8":{"title":"Hosting","titles":[]},"9":{"title":"Github Actions","titles":[]},"10":{"title":"Architectural patterns","titles":[]},"11":{"title":"Use cases","titles":["Architectural patterns",null,null]},"12":{"title":"Best Practices and Considerations","titles":["Architectural patterns",null,null]},"13":{"title":"AppLoader.vue","titles":["Architectural patterns",null,null,"Best Practices and Considerations"]},"14":{"title":"useAppLoader.ts","titles":["Architectural patterns",null,null,"Best Practices and Considerations"]},"15":{"title":"Some component","titles":["Architectural patterns",null,null,"Best Practices and Considerations"]},"16":{"title":"Application Resources","titles":[]},"17":{"title":"BaseIcon","titles":["Application Resources",null,null]},"18":{"title":"icons.js","titles":["Application Resources",null,null]},"19":{"title":"Create and build an application","titles":[]},"20":{"title":"Configuring the IDE","titles":[]},"21":{"title":"Helpful hints","titles":[]},"22":{"title":"Carousel or slider","titles":["Helpful hints",null]},"23":{"title":"Date and time","titles":["Helpful hints",null]},"24":{"title":"Tell me a handy library","titles":[]},"25":{"title":"State management in Vue 3","titles":[]},"26":{"title":"Testing","titles":[]},"27":{"title":"About frontend frameworks","titles":[]},"28":{"title":"Frontend application architecture","titles":[]},"29":{"title":"Avoid dependencies","titles":["Frontend application architecture",null,null,null,null]},"30":{"title":"Use wrappers over components of UI libraries and third-party utilities","titles":["Frontend application architecture",null,null,null,null]},"31":{"title":"Regular refactoring","titles":["Frontend application architecture",null,null,null,null]},"32":{"title":"Use CSS3","titles":["Frontend application architecture",null,null,null,null]},"33":{"title":"Use modern standards and language features","titles":["Frontend application architecture",null,null,null,null]},"34":{"title":"Document the project","titles":["Frontend application architecture",null,null,null,null]},"35":{"title":"CSS and UI libraries","titles":[]},"36":{"title":"Learning Vue","titles":[]},"37":{"title":"SPA, PWA, SSG, SSR and SEO","titles":[]},"38":{"title":"Changelog","titles":[]},"39":{"title":"v1.4 (24-11-2023)","titles":["Changelog"]},"40":{"title":"Changed","titles":["Changelog","v1.4 (24-11-2023)",null]},"41":{"title":"v1.3 (10-10-2023)","titles":["Changelog"]},"42":{"title":"Changed","titles":["Changelog","v1.3 (10-10-2023)",null]},"43":{"title":"v1.2 (28-09-2023)","titles":["Changelog"]},"44":{"title":"New","titles":["Changelog","v1.2 (28-09-2023)",null]},"45":{"title":"Changed","titles":["Changelog","v1.2 (28-09-2023)",null]},"46":{"title":"v1.1 (15-09-2023)","titles":["Changelog"]},"47":{"title":"New","titles":["Changelog","v1.1 (15-09-2023)"]},"48":{"title":"Changed","titles":["Changelog","v1.1 (15-09-2023)"]},"49":{"title":"v1.0 (11-09-2023)","titles":["Changelog"]},"50":{"title":"New","titles":["Changelog","v1.0 (11-09-2023)"]},"51":{"title":"Cheat Sheet","titles":[]},"52":{"title":"Vue","titles":["Cheat Sheet",null]},"53":{"title":"JavaScript","titles":["Cheat Sheet",null]},"54":{"title":"HTML","titles":["Cheat Sheet",null]},"55":{"title":"CSS","titles":["Cheat Sheet",null]},"56":{"title":"Typescript","titles":["Cheat Sheet",null]},"57":{"title":"Markdown","titles":["Cheat Sheet",null]},"58":{"title":"Contribute to the development of this resource","titles":[]},"59":{"title":"Glossary and abbreviations","titles":[]},"60":{"title":"Project participation","titles":[]},"61":{"title":"Introduction","titles":[]},"62":{"title":"About the author:","titles":["Introduction",null]},"63":{"title":"Getting started","titles":[]},"64":{"title":"Installation via create vue-webapp","titles":["Getting started"]},"65":{"title":"Initializing and launching a web application","titles":["Getting started","Installation via create vue-webapp"]},"66":{"title":"Installation from the repository","titles":["Getting started"]},"67":{"title":"Guidelines","titles":[]},"68":{"title":"Scaffolding a Vue webapp","titles":[]},"69":{"title":"Summary","titles":["Scaffolding a Vue webapp"]},"70":{"title":"Justification","titles":["Scaffolding a Vue webapp"]},"71":{"title":"Objectives","titles":[]},"72":{"title":"Adaptability","titles":[]},"73":{"title":"API module","titles":[]},"74":{"title":"API (REST)","titles":["API module"]},"75":{"title":"JSON-RPC","titles":["API module"]},"76":{"title":"BaseIcon","titles":[]},"77":{"title":"Implementation details","titles":[]},"78":{"title":"Code injections in the index.html","titles":["Implementation details"]},"79":{"title":"CSS tricks","titles":["Implementation details"]},"80":{"title":"Navigation drawers","titles":[]},"81":{"title":"SimpleDrawer","titles":["Navigation drawers"]},"82":{"title":"TouchSlideoutDrawer","titles":["Navigation drawers"]},"83":{"title":"GitHub Actions script to deploy to GitHub Pages","titles":[]},"84":{"title":"Deployment","titles":["GitHub Actions script to deploy to GitHub Pages"]},"85":{"title":"Setting base in Vite config","titles":["GitHub Actions script to deploy to GitHub Pages"]},"86":{"title":"Footers","titles":[]},"87":{"title":"SimpleFooter","titles":["Footers"]},"88":{"title":"RichFooter","titles":["Footers"]},"89":{"title":"MantineSimpleFooter","titles":["Footers"]},"90":{"title":"MantineRichFooter","titles":["Footers"]},"91":{"title":"DistributedFooter","titles":["Footers"]},"92":{"title":"Google analytics","titles":[]},"93":{"title":"Headers","titles":[]},"94":{"title":"SimpleHeader","titles":["Headers"]},"95":{"title":"MantineSimpleHeader","titles":["Headers"]},"96":{"title":"MantineLayeredHeader","titles":["Headers"]},"97":{"title":"SlidingHeader","titles":["Headers"]},"98":{"title":"i18n","titles":[]},"99":{"title":"i18next","titles":["i18n"]},"100":{"title":"useI18nLight","titles":["i18n"]},"101":{"title":"Usage","titles":["i18n"]},"102":{"title":"i18next extensions","titles":["i18n"]},"103":{"title":"As a result","titles":["i18n"]},"104":{"title":"Options when creating an application","titles":[]},"105":{"title":"Available options","titles":["Options when creating an application"]},"106":{"title":"Available by default","titles":["Options when creating an application"]},"107":{"title":"In development","titles":["Options when creating an application"]},"108":{"title":"Planned","titles":["Options when creating an application"]},"109":{"title":"MainLayout","titles":[]},"110":{"title":"Routing","titles":["MainLayout"]},"111":{"title":"OneColumnLayout","titles":[]},"112":{"title":"Navbar","titles":[]},"113":{"title":"SimpleNavbar","titles":["Navbar"]},"114":{"title":"MantineSimpleNavbar","titles":["Navbar"]},"115":{"title":"Google analytics","titles":[]},"116":{"title":"PWA","titles":[]},"117":{"title":"Manifest.json","titles":["PWA"]},"118":{"title":"Service worker","titles":["PWA"]},"119":{"title":"Splash screen","titles":[]},"120":{"title":"Themes","titles":[]}},"dirtCount":0,"index":[["6",{"2":{"120":1}}],["67",{"2":{"120":3}}],["60",{"2":{"120":6}}],["78",{"2":{"120":1}}],["767",{"2":{"72":1}}],["70",{"2":{"36":1,"100":1}}],["√",{"2":{"64":13,"69":5}}],["q",{"2":{"58":1}}],["qbutton",{"2":{"35":1}}],["questions",{"2":{"61":3}}],["question",{"2":{"36":1,"58":1}}],["questionable",{"2":{"26":1}}],["queries",{"2":{"5":1}}],["query",{"2":{"3":1,"5":1,"33":1}}],["quasar",{"2":{"20":2,"24":1}}],["quality",{"2":{"18":1,"20":1,"35":1,"36":3,"59":2}}],["quickly",{"2":{"28":1,"70":3,"71":1}}],["quick",{"2":{"26":1}}],["quieter",{"2":{"20":1}}],["quiet",{"2":{"20":1}}],["quite",{"2":{"2":1,"20":1,"24":1,"25":1,"27":1,"36":1,"37":2,"70":3,"102":1}}],["quote",{"2":{"35":1}}],["quot",{"2":{"2":2,"3":2,"4":4,"23":6,"25":8,"27":4,"28":4,"32":2,"36":5,"37":4,"64":6,"70":4,"81":2,"84":14,"99":8,"109":2,"111":2}}],["zuckerberg",{"2":{"27":1}}],["zero",{"2":{"2":1,"20":1}}],["^",{"2":{"20":1}}],["^20",{"2":{"19":1}}],["400",{"2":{"97":1}}],["401",{"2":{"2":2}}],["480",{"2":{"72":1}}],["4",{"0":{"39":1},"1":{"40":1},"2":{"18":2,"20":1,"36":1}}],[">",{"2":{"9":1,"12":8,"13":2,"14":1,"16":5,"17":2,"20":1,"35":2,"58":2,"72":5,"76":3,"92":2,"97":3,"101":2,"115":15}}],[">>",{"2":{"9":5}}],["`~",{"2":{"20":1}}],["`$",{"2":{"17":4}}],["`",{"2":{"9":3,"16":1}}],["+page",{"2":{"20":6}}],["+layout",{"2":{"20":7}}],["+$backups",{"2":{"9":1}}],["+",{"2":{"9":1,"18":2}}],["||",{"2":{"92":1}}],["|",{"2":{"9":4,"20":1}}],["$dirs",{"2":{"9":1}}],["$root",{"2":{"9":3}}],["$backup",{"2":{"9":6}}],["$env",{"2":{"9":1}}],["$project",{"2":{"9":3}}],["$github",{"2":{"9":5}}],["$target",{"2":{"9":8}}],["$",{"2":{"9":15,"16":1,"20":96,"65":2,"66":3}}],["$1",{"2":{"8":1}}],["kb",{"2":{"103":1}}],["kits",{"2":{"70":1}}],["kill",{"2":{"36":1}}],["kids",{"2":{"36":1}}],["kinds",{"2":{"36":1}}],["kind",{"2":{"25":1,"37":1}}],["karma",{"2":{"20":10}}],["keen",{"2":{"22":1}}],["keeps",{"2":{"27":1}}],["keep",{"2":{"20":1,"25":1,"36":1}}],["keys",{"2":{"25":1}}],["keyboard",{"2":{"20":2}}],["key",{"2":{"9":10,"23":1,"99":1}}],["knows",{"2":{"36":2}}],["knowledge",{"2":{"36":2}}],["known",{"2":{"22":1,"23":1}}],["know",{"2":{"3":1,"19":1,"35":1,"36":3}}],["🚀",{"2":{"9":1}}],["🛎️",{"2":{"9":1}}],["56",{"2":{"120":1}}],["50",{"2":{"103":1}}],["50kb",{"2":{"23":1}}],["58",{"2":{"20":1}}],["5",{"2":{"9":3,"25":1}}],["86",{"2":{"120":1}}],["8",{"2":{"9":2}}],["yes",{"2":{"64":8,"69":4}}],["yet",{"2":{"27":1}}],["years",{"2":{"23":2,"37":1,"61":1,"62":1,"99":1}}],["year",{"2":{"8":1,"36":1}}],["yielded",{"2":{"25":1}}],["yarnrc",{"2":{"20":2}}],["yarn",{"2":{"19":1,"20":4}}],["yamllint",{"2":{"20":2}}],["yaml",{"2":{"9":7,"20":7}}],["y",{"2":{"9":1}}],["yougithubusername",{"2":{"84":1}}],["youtube",{"2":{"36":2}}],["you",{"2":{"1":1,"2":3,"3":5,"5":2,"8":6,"10":3,"11":3,"12":3,"16":3,"18":1,"19":6,"20":6,"23":4,"25":9,"26":1,"27":3,"28":6,"29":2,"30":1,"32":1,"35":3,"36":9,"37":9,"58":1,"64":1,"70":2,"84":1,"85":3,"92":1,"102":1,"115":1,"118":1}}],["yourname",{"2":{"85":1}}],["yourself",{"2":{"8":2,"19":1,"20":1,"36":1}}],["your",{"0":{"3":1},"2":{"1":3,"2":4,"3":4,"4":1,"5":1,"8":5,"9":18,"11":1,"12":1,"16":3,"19":1,"20":3,"23":1,"25":6,"28":1,"29":3,"30":1,"31":1,"34":1,"35":3,"36":5,"37":4,"58":1,"84":2,"85":1,"92":1,"115":1,"117":1}}],["99",{"2":{"5":1,"25":3}}],["95",{"2":{"2":1,"23":1,"24":1}}],["09",{"0":{"43":1,"46":1,"49":1},"1":{"44":1,"45":1,"47":1,"48":1,"50":1}}],["04",{"2":{"20":1}}],["0",{"0":{"49":1},"1":{"50":1},"2":{"5":1,"9":5,"14":1,"37":2,"75":2,"120":5}}],["38",{"2":{"120":1}}],["300",{"2":{"20":1}}],["30",{"2":{"20":1}}],["3",{"0":{"25":1,"41":1},"1":{"42":1},"2":{"4":1,"5":1,"10":2,"19":1,"20":2,"23":3,"25":9,"27":3,"36":5,"52":1,"61":2,"67":2,"69":1,"71":1,"75":1,"120":2}}],["1443",{"2":{"75":1}}],["1px",{"2":{"72":1}}],["1199",{"2":{"72":1}}],["11",{"0":{"39":1,"49":1},"1":{"40":1,"50":1}}],["1280px",{"2":{"120":1}}],["12",{"2":{"36":1}}],["15",{"0":{"46":1},"1":{"47":1,"48":1},"2":{"29":1}}],["16gb",{"2":{"20":1}}],["10",{"0":{"41":2},"1":{"42":2},"2":{"20":1,"23":1,"36":2}}],["100vw",{"2":{"79":1}}],["10000",{"2":{"72":1}}],["1000",{"2":{"25":1}}],["100",{"2":{"17":2,"37":1,"79":1}}],["1",{"0":{"46":1},"1":{"47":1,"48":1},"2":{"4":6,"18":2,"19":1,"23":2,"25":2,"36":2,"37":1,"74":1,"75":1,"79":1,"120":2}}],["nice",{"2":{"82":1}}],["nix",{"2":{"20":3}}],["nls",{"2":{"20":2}}],["nx",{"2":{"20":2}}],["nvmrc",{"2":{"20":2}}],["number",{"2":{"23":1,"26":1,"28":1,"108":1}}],["numbers",{"2":{"23":1,"99":1}}],["nuxt",{"2":{"20":2,"70":1}}],["null",{"2":{"20":1}}],["npx",{"2":{"19":2}}],["npm",{"2":{"10":1,"19":1,"20":4,"23":1,"29":1,"71":1,"99":1}}],["n",{"2":{"9":1,"20":1,"36":1}}],["naming",{"2":{"71":1}}],["namely",{"2":{"25":1}}],["named",{"2":{"18":2}}],["name=",{"2":{"16":1,"76":1,"115":4}}],["names",{"2":{"4":1,"16":1,"76":1}}],["name",{"2":{"4":1,"9":13,"12":2,"16":3,"17":4,"18":8,"58":1,"64":1,"69":1,"76":1,"84":1,"85":1,"106":1,"117":2}}],["navbar",{"0":{"112":1},"1":{"113":1,"114":1},"2":{"64":2,"105":1,"112":1}}],["navigationdrawer",{"2":{"64":1,"112":1}}],["navigation",{"0":{"80":1},"1":{"81":1,"82":1},"2":{"64":1,"71":1,"80":1,"105":2,"111":1}}],["native",{"2":{"27":1,"37":3,"117":1}}],["nativetabs",{"2":{"20":1}}],["nature",{"2":{"24":1}}],["naturally",{"2":{"9":1,"25":1}}],["nginx",{"2":{"3":1,"8":1}}],["next",{"2":{"20":2,"36":1}}],["nest",{"2":{"20":2}}],["nesting",{"2":{"20":2}}],["nested",{"2":{"12":1}}],["newitem",{"2":{"27":3}}],["news",{"2":{"25":2}}],["newer",{"2":{"19":1}}],["new",{"0":{"44":1,"47":1,"50":1},"2":{"9":5,"14":1,"18":2,"20":1,"27":2,"29":2,"35":1,"36":1,"37":1,"58":1,"72":1,"92":1,"102":1,"108":1,"118":1,"120":1}}],["netlify",{"2":{"8":1,"20":2}}],["networks",{"2":{"75":1,"105":1}}],["network",{"2":{"3":1}}],["nevertheless",{"2":{"70":1}}],["never",{"2":{"5":1,"20":1,"36":1}}],["needs",{"2":{"11":1,"16":1,"25":1,"26":1,"35":1,"37":1}}],["needed",{"2":{"9":1,"16":1,"23":1,"28":1,"67":2,"71":1,"85":1,"99":1,"102":1,"119":1}}],["need",{"2":{"3":1,"5":1,"8":1,"9":2,"10":2,"11":2,"12":1,"16":1,"19":4,"23":1,"25":1,"26":1,"27":3,"28":3,"29":1,"36":3,"37":3,"70":2,"85":1,"102":1}}],["necessary",{"2":{"2":1,"9":1,"20":1,"26":1,"36":1,"37":1,"67":2,"70":1,"103":1}}],["novice",{"2":{"70":1,"71":1}}],["non",{"2":{"25":2,"36":1,"61":1}}],["nontrivial",{"2":{"20":1}}],["normal",{"2":{"16":1,"20":1,"37":2}}],["now",{"2":{"8":1,"36":1}}],["nosql",{"2":{"3":1,"25":1}}],["nodemon",{"2":{"20":4}}],["node",{"2":{"3":2,"9":2,"19":3,"20":7,"36":1,"37":1}}],["no",{"2":{"2":1,"18":1,"20":1,"23":1,"25":4,"29":1,"37":1,"64":8,"69":4}}],["nothing",{"2":{"35":1}}],["notified",{"2":{"27":1}}],["notificationinterceptor",{"2":{"1":2,"75":2}}],["notebook",{"2":{"72":3,"81":1,"109":1,"111":1}}],["notes",{"2":{"37":1}}],["note",{"2":{"19":1,"35":1,"36":1}}],["not",{"0":{"5":1},"2":{"1":1,"2":6,"3":3,"4":3,"5":1,"6":1,"18":1,"20":4,"22":1,"23":7,"25":7,"26":1,"27":4,"28":2,"29":2,"32":1,"35":1,"36":5,"37":7,"61":1,"67":3,"70":1,"85":1,"118":1}}],["x",{"2":{"23":2,"79":1}}],["xshell",{"2":{"20":1}}],["xss",{"2":{"2":1}}],["xo",{"2":{"20":4}}],["xmlhttprequest",{"2":{"37":1}}],["xml",{"2":{"20":4}}],["xaml",{"2":{"20":2}}],["xdv",{"2":{"20":1}}],["x3c",{"2":{"12":20,"13":7,"14":1,"16":4,"17":8,"20":1,"35":4,"72":10,"76":7,"92":5,"97":8,"101":8,"115":15}}],["x26",{"2":{"9":4,"20":1,"72":2}}],["xhr",{"2":{"1":1,"74":1}}],["235",{"2":{"120":4}}],["255",{"2":{"120":2}}],["28",{"0":{"43":1},"1":{"44":1,"45":1}}],["22+",{"2":{"20":1}}],["29",{"2":{"20":1}}],["245",{"2":{"120":3}}],["24",{"0":{"39":1},"1":{"40":1},"2":{"17":2}}],["26",{"2":{"16":1}}],["20+",{"2":{"62":1}}],["2022",{"2":{"61":1}}],["2023",{"0":{"39":1,"41":1,"43":1,"46":1,"49":1},"1":{"40":1,"42":1,"44":1,"45":1,"47":1,"48":1,"50":1},"2":{"20":1,"36":1,"61":1}}],["2016",{"2":{"36":1}}],["200",{"2":{"20":1,"37":1,"97":1}}],["20~30",{"2":{"19":1}}],["20",{"2":{"9":1,"25":1,"36":1}}],["2",{"0":{"43":1},"1":{"44":1,"45":1},"2":{"2":1,"4":1,"20":3,"23":5,"25":2,"27":1,"35":1,"36":3,"37":1,"55":2,"75":1,"120":2}}],["gave",{"2":{"37":1}}],["gatsby",{"2":{"20":5}}],["gateway",{"2":{"3":1}}],["gql",{"2":{"20":2}}],["gz",{"2":{"20":1}}],["goes",{"2":{"20":1,"30":1}}],["governance",{"2":{"20":1}}],["go",{"2":{"20":6,"36":1,"70":1,"84":1}}],["good",{"2":{"3":1,"20":1,"21":1,"22":1,"25":1,"26":1,"27":1,"28":3,"29":1,"31":1,"35":2,"36":3}}],["googletagmanager",{"2":{"92":1}}],["googleanalytics",{"2":{"64":1}}],["google",{"0":{"92":1,"115":1},"2":{"2":8,"3":4,"8":1,"23":1,"29":1,"36":1,"37":3,"64":1,"69":1,"78":1,"92":2,"105":2}}],["gutter",{"2":{"120":1}}],["guidelines",{"0":{"67":1}}],["guide",{"2":{"36":2}}],["guides",{"2":{"20":1}}],["gui",{"2":{"27":1}}],["gulp",{"2":{"20":2}}],["guest",{"2":{"2":1}}],["glass",{"2":{"36":1}}],["gls",{"2":{"20":1}}],["glossary",{"0":{"59":1}}],["glo",{"2":{"20":1}}],["glob",{"2":{"17":1,"18":2,"76":1}}],["global",{"2":{"11":1,"12":1,"25":7,"28":1,"71":1,"107":1}}],["glg",{"2":{"20":1}}],["glitches",{"2":{"20":1}}],["gtag",{"2":{"92":5}}],["gt",{"2":{"9":1,"20":1,"37":2}}],["gh",{"2":{"9":2,"84":3}}],["gitpod",{"2":{"20":2}}],["gitmessage",{"2":{"20":1}}],["gitmodules",{"2":{"20":1}}],["gitattributes",{"2":{"20":1}}],["gitlens",{"2":{"20":4}}],["gitlab",{"2":{"6":1,"20":2}}],["gitignore",{"2":{"9":1,"20":1}}],["githubactionsgithubpagesworkflow",{"2":{"64":1}}],["githubpullrequests",{"2":{"20":1}}],["githubissues",{"2":{"20":1}}],["github",{"0":{"9":1,"83":2},"1":{"84":2,"85":2},"2":{"6":2,"8":3,"9":23,"20":7,"36":2,"44":1,"58":1,"64":2,"66":1,"69":1,"71":1,"84":6,"105":3,"108":1}}],["git",{"2":{"6":1,"9":3,"10":1,"20":10,"66":2}}],["gives",{"2":{"5":2,"20":1,"23":1}}],["given",{"2":{"3":1}}],["give",{"2":{"2":2,"27":1,"37":1}}],["grpc",{"2":{"74":1}}],["grid",{"2":{"33":1,"55":2}}],["growth",{"2":{"31":1}}],["grown",{"2":{"23":1,"99":1}}],["grunt",{"2":{"20":2}}],["greateŕl",{"2":{"27":1}}],["great",{"2":{"19":1,"20":1}}],["greatly",{"2":{"5":1,"10":1,"70":1,"118":1}}],["gray",{"2":{"72":1}}],["graphql",{"2":{"74":1}}],["graph",{"2":{"64":1,"69":1,"78":1,"105":1,"115":1}}],["graphgl",{"2":{"5":1}}],["grains",{"2":{"36":1}}],["grab",{"2":{"9":1}}],["grant",{"2":{"4":1}}],["granted",{"2":{"4":2}}],["granular",{"2":{"2":1}}],["g",{"2":{"3":1,"16":1,"20":1,"25":1,"37":1,"67":1,"92":1}}],["gmail",{"2":{"2":1,"62":1}}],["gemfile",{"2":{"20":2}}],["generation",{"2":{"37":2}}],["generating",{"2":{"19":1,"37":1}}],["generated",{"2":{"37":2}}],["generate",{"2":{"8":1,"9":1,"15":1,"37":1}}],["generates",{"2":{"2":2,"3":1,"37":1}}],["generalize",{"2":{"71":1}}],["generally",{"2":{"61":1}}],["general",{"2":{"16":1,"20":3,"36":1,"37":1,"59":1,"71":2}}],["generalroutes",{"2":{"12":2}}],["genuinely",{"2":{"12":1}}],["getbestblockhash",{"2":{"75":1}}],["getting",{"0":{"63":1},"1":{"64":1,"65":1,"66":1}}],["getters",{"2":{"25":2}}],["gettoken",{"2":{"1":1}}],["getimageurl",{"2":{"17":2,"18":2}}],["getitem",{"2":{"9":1}}],["getsvgicon",{"2":{"17":3,"18":2}}],["gets",{"2":{"2":1,"16":2,"20":1}}],["get",{"2":{"1":1,"2":1,"3":1,"4":1,"6":1,"8":2,"18":2,"27":1,"36":1,"37":2,"74":1}}],["getuserdata",{"2":{"1":2}}],["b",{"2":{"23":2,"28":1}}],["bzl",{"2":{"20":1}}],["bbl",{"2":{"20":1}}],["blank",{"2":{"119":1}}],["blame",{"2":{"20":3}}],["blg",{"2":{"20":1}}],["bloating",{"2":{"78":1}}],["blocks",{"2":{"71":2}}],["block",{"2":{"20":1}}],["bloc",{"2":{"20":1}}],["blog",{"2":{"2":1,"69":1,"70":1,"71":1}}],["bit",{"2":{"25":1,"27":1,"29":1,"37":2}}],["bidirectional",{"2":{"5":1}}],["big",{"2":{"2":1,"27":1,"36":1}}],["bunch",{"2":{"23":1,"25":1,"99":1}}],["bundleconfig",{"2":{"20":2}}],["bundle",{"2":{"3":1,"19":4,"23":1,"29":1,"35":1,"103":1}}],["built",{"2":{"9":1,"25":1,"37":1}}],["builds",{"2":{"19":1}}],["builders",{"2":{"19":1}}],["builder",{"2":{"19":5,"67":1,"69":1,"71":1}}],["builddata",{"2":{"9":4}}],["building",{"2":{"8":1,"19":1,"71":1,"105":1}}],["build",{"0":{"19":1},"2":{"6":1,"9":12,"19":3,"20":4,"26":1,"71":1,"84":2,"103":1,"105":1}}],["buying",{"2":{"8":1}}],["bus",{"2":{"5":1}}],["business",{"2":{"3":1,"25":7,"27":1,"69":1,"70":3,"71":1,"74":1}}],["button>",{"2":{"101":1}}],["button",{"2":{"28":1,"35":1,"101":2}}],["buttons",{"2":{"28":1}}],["but",{"2":{"2":5,"3":3,"4":1,"5":1,"6":1,"9":1,"12":1,"16":1,"20":1,"23":4,"25":4,"26":1,"27":4,"28":2,"29":2,"35":1,"36":6,"37":6,"66":1,"67":2,"70":1,"75":1,"82":1,"99":1,"111":1}}],["border",{"2":{"72":1,"120":1}}],["born",{"2":{"37":1}}],["body",{"2":{"72":1,"119":1}}],["box",{"2":{"71":1,"72":4}}],["bottom",{"2":{"105":1}}],["bot",{"2":{"37":2}}],["bots",{"2":{"37":2}}],["bother",{"2":{"3":1}}],["both",{"2":{"3":2,"5":1,"9":2,"10":1,"19":1,"20":1,"25":1,"31":1,"36":4,"61":2,"102":1,"108":1}}],["book",{"2":{"36":6,"61":1}}],["booting",{"2":{"20":1}}],["boilerplates",{"2":{"71":1}}],["boilerplate",{"2":{"27":1,"70":1}}],["bound",{"2":{"25":3}}],["boundary",{"2":{"20":1}}],["bower",{"2":{"20":3}}],["bonuses",{"2":{"2":1}}],["broken",{"2":{"36":1}}],["browserslist",{"2":{"20":2}}],["browsers",{"2":{"8":1,"23":1,"37":1}}],["browser",{"2":{"2":3,"4":5,"9":1,"16":1,"19":1,"20":1,"26":1,"37":5,"65":1,"108":1,"117":1,"118":1}}],["brings",{"2":{"35":1}}],["bring",{"2":{"25":1,"28":1}}],["brand",{"2":{"119":1}}],["branch",{"2":{"9":5,"37":1,"84":6}}],["branches",{"2":{"9":2,"25":1}}],["bracketpairs",{"2":{"20":1}}],["breakpoint",{"2":{"72":1}}],["break",{"2":{"2":1,"27":1}}],["bar",{"2":{"105":1}}],["bad",{"2":{"23":2,"25":2,"35":2}}],["babel",{"2":{"20":10}}],["babelrc",{"2":{"20":10}}],["bazelproject",{"2":{"20":1}}],["bazelignore",{"2":{"20":1}}],["bazelrc",{"2":{"20":1}}],["bazel",{"2":{"20":3}}],["bandle",{"2":{"16":2}}],["banner",{"2":{"16":1}}],["bash$",{"2":{"64":1}}],["bashpnpm",{"2":{"64":1}}],["basics",{"2":{"36":1}}],["basic",{"2":{"28":1,"36":3}}],["basically",{"2":{"3":1,"25":1}}],["basis",{"2":{"25":1}}],["basetoggle",{"2":{"106":1}}],["baseurl",{"2":{"75":1}}],["baseinput",{"2":{"30":1}}],["baseicon",{"0":{"17":1,"76":1},"2":{"16":2,"19":2,"76":5,"106":1}}],["basebutton",{"2":{"30":1,"35":2}}],["basebuttonandstringhelpers",{"2":{"10":1}}],["base",{"0":{"85":1},"2":{"17":1,"85":2,"120":1}}],["base64",{"2":{"16":1}}],["based",{"2":{"2":2,"9":1,"23":2}}],["baas",{"2":{"3":6}}],["battery",{"2":{"2":1}}],["backers",{"2":{"20":1}}],["backend",{"0":{"0":1,"3":1},"1":{"1":1},"2":{"1":4,"2":6,"3":8,"4":6,"5":2,"8":1,"12":1,"26":1,"27":3,"36":2,"37":1,"42":1,"70":1,"74":2,"75":2,"105":1}}],["background",{"2":{"18":1}}],["backroute",{"2":{"12":1}}],["backups",{"2":{"9":2}}],["backup",{"2":{"9":9}}],["back",{"2":{"2":3,"3":1,"5":1,"20":1,"27":1,"35":1,"36":1}}],["bedroom",{"2":{"37":1}}],["benefit",{"2":{"37":1}}],["believed",{"2":{"36":1}}],["belong",{"2":{"25":1}}],["below",{"2":{"4":1,"58":1}}],["beautiful",{"2":{"35":1,"37":1}}],["besides",{"2":{"29":1,"36":1}}],["best",{"0":{"12":1},"1":{"13":1,"14":1,"15":1},"2":{"2":1,"12":2,"18":1,"20":2,"36":5,"59":1,"61":1,"70":3,"71":2}}],["beyond",{"2":{"27":1}}],["better",{"2":{"27":1,"32":1,"36":2,"37":1,"102":1}}],["between",{"2":{"4":1,"12":1,"25":2,"27":1,"36":2,"37":1}}],["behavior",{"2":{"27":1}}],["behind",{"2":{"27":1}}],["beforehand",{"2":{"36":2}}],["before",{"2":{"16":1,"36":1,"37":1}}],["been",{"2":{"16":1,"23":1,"27":1,"37":2,"119":1}}],["beginners",{"2":{"20":1,"61":1}}],["beginner",{"2":{"5":1,"36":1}}],["becoming",{"2":{"70":1}}],["become",{"2":{"25":1,"27":1,"29":1,"35":2,"36":1}}],["becomes",{"2":{"4":1,"25":2}}],["became",{"2":{"25":2}}],["because",{"2":{"2":1,"5":1,"9":1,"23":1,"25":1,"37":1}}],["be",{"2":{"2":2,"3":2,"8":4,"9":9,"10":2,"12":5,"16":3,"20":2,"23":3,"25":9,"26":4,"27":9,"28":1,"31":1,"32":2,"35":1,"36":6,"37":6,"61":1,"64":2,"66":2,"67":3,"70":2,"71":2,"72":2,"74":1,"81":1,"85":1,"99":1,"111":1,"117":1}}],["being",{"2":{"2":1}}],["bypass",{"2":{"37":1}}],["by",{"0":{"106":1},"2":{"2":5,"3":4,"4":5,"9":1,"12":1,"16":3,"19":1,"20":1,"23":3,"25":4,"26":1,"27":3,"35":1,"36":3,"37":8,"64":1,"81":1,"82":1,"99":2,"101":1,"105":1,"111":1,"119":1,"120":2}}],["jl65gwrnqqq",{"2":{"92":1}}],["jl65gwrnqq",{"2":{"92":1}}],["jumping",{"2":{"79":1}}],["justification",{"0":{"70":1}}],["justifications",{"2":{"28":1}}],["just",{"2":{"2":2,"12":1,"20":1,"23":1,"25":3,"35":2,"36":1,"67":1,"70":1}}],["jest",{"2":{"20":10,"26":1}}],["jenkins",{"2":{"6":1,"20":2}}],["j",{"2":{"19":1}}],["jpg",{"2":{"18":1}}],["jpeg",{"2":{"8":1}}],["jasmine",{"2":{"20":10}}],["java",{"2":{"20":1,"62":1}}],["javascript",{"0":{"53":1},"2":{"3":1,"16":1,"19":2,"20":2,"23":4,"24":1,"25":2,"27":1,"28":1,"35":3,"36":4,"37":4,"53":1,"67":1,"72":1,"103":1}}],["jamesives",{"2":{"9":3,"84":1}}],["job",{"2":{"27":2}}],["jobs",{"2":{"9":2}}],["john",{"2":{"2":2,"99":1}}],["jwt",{"2":{"2":4,"59":2,"108":1}}],["jslint",{"2":{"20":2}}],["jsconfig",{"2":{"20":11}}],["jsconst",{"2":{"9":1,"18":1,"23":2}}],["jsx",{"2":{"20":3}}],["jsexport",{"2":{"12":1,"85":1}}],["jsonrpc",{"2":{"64":1,"75":6}}],["json5",{"2":{"20":1}}],["jsonc",{"2":{"20":1}}],["jsonplaceholder",{"2":{"3":1,"74":1}}],["json",{"0":{"75":1,"117":1},"2":{"1":1,"3":1,"5":7,"9":4,"16":1,"18":4,"19":4,"20":50,"36":1,"37":2,"64":5,"67":1,"74":1,"75":6,"101":1,"102":1,"105":1,"117":2}}],["jsimport",{"2":{"1":3,"15":1,"16":1,"19":1,"74":1,"75":1,"101":1}}],["js",{"0":{"18":1},"2":{"1":4,"2":1,"3":3,"8":1,"11":1,"16":4,"17":1,"18":1,"19":3,"20":21,"22":1,"23":3,"24":2,"25":1,"27":4,"28":1,"36":4,"37":1,"61":1,"71":1,"72":1,"74":1,"75":1,"92":3,"118":3}}],["snippets",{"2":{"78":1,"105":1}}],["snickerbockers",{"2":{"9":2}}],["skeleton",{"2":{"70":1}}],["skill",{"2":{"35":1,"36":1}}],["sd",{"2":{"62":1}}],["sw",{"2":{"37":1,"59":1}}],["swagger",{"2":{"36":1}}],["switch",{"2":{"30":1,"74":1}}],["switching",{"2":{"5":1,"106":1,"120":2}}],["swiper",{"2":{"22":1}}],["slidingheader",{"0":{"97":1}}],["slider",{"0":{"22":1},"2":{"22":1}}],["sleeping",{"2":{"37":1}}],["slowing",{"2":{"28":1}}],["slower",{"2":{"25":2}}],["slot",{"2":{"11":1}}],["svelte",{"2":{"20":3,"27":2}}],["svgo",{"2":{"20":10}}],["svgs",{"2":{"19":1}}],["svgresources",{"2":{"18":4}}],["svg",{"2":{"17":2,"18":2,"20":2,"76":1}}],["syntax",{"2":{"67":1}}],["synthesizing",{"2":{"25":1}}],["synctex",{"2":{"20":1}}],["systems",{"2":{"27":2,"28":1}}],["system",{"2":{"2":4,"27":2,"35":1,"74":1}}],["smartphone",{"2":{"37":2}}],["smaller",{"2":{"27":1,"103":1}}],["small",{"2":{"2":2,"3":1,"16":1,"24":1,"25":1,"35":1,"37":1}}],["smoothscrolling",{"2":{"20":1}}],["sftp",{"2":{"20":1}}],["sfc",{"2":{"20":2,"27":1}}],["src=",{"2":{"16":3,"17":1,"92":1}}],["src",{"2":{"16":1,"19":2,"78":1,"101":1}}],["ssg",{"0":{"37":1},"2":{"37":3}}],["ssd",{"2":{"20":1}}],["ssrs",{"2":{"37":1}}],["ssr",{"0":{"37":1},"2":{"20":1,"25":2,"37":8}}],["ss06",{"2":{"20":1}}],["ss03",{"2":{"20":1}}],["ss02",{"2":{"20":1}}],["ss01",{"2":{"20":1}}],["ssh",{"2":{"9":14,"20":2}}],["ssl",{"2":{"8":2}}],["sso",{"2":{"2":2}}],["s3",{"2":{"8":1}}],["sql",{"2":{"5":1,"9":1,"20":1,"25":2,"36":1}}],["sh$",{"2":{"64":1,"65":1,"66":1,"69":1}}],["sheet",{"0":{"51":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"52":1,"53":1,"54":1,"55":4}}],["shell",{"2":{"10":2,"20":1,"37":1}}],["shims",{"2":{"20":1}}],["sh",{"2":{"20":2}}],["shrinkwrap",{"2":{"20":2}}],["shnpx",{"2":{"19":1}}],["shpnpm",{"2":{"19":1}}],["shadow",{"2":{"28":1}}],["shallowref",{"2":{"23":2}}],["shaking",{"2":{"18":1,"29":1}}],["shared",{"2":{"11":1,"20":1,"25":1}}],["share",{"2":{"11":1,"12":1,"25":1}}],["sharing",{"2":{"4":1}}],["showcase",{"2":{"71":1,"108":1}}],["show",{"2":{"37":1}}],["showed",{"2":{"36":1,"37":1}}],["shows",{"2":{"25":1}}],["showsuggestionsassnippets",{"2":{"20":1}}],["showdocumentation",{"2":{"20":1}}],["showing",{"2":{"9":1}}],["shown",{"2":{"4":1,"12":1,"23":1,"27":1}}],["should",{"2":{"2":3,"3":1,"9":1,"12":1,"16":1,"20":1,"23":2,"25":4,"26":1,"27":2,"31":1,"36":1,"64":1,"67":2,"70":1,"71":1,"92":1,"115":1}}],["shortens",{"2":{"35":1}}],["short",{"2":{"2":1,"36":1,"117":1}}],["scope",{"2":{"117":1}}],["scoped>",{"2":{"17":1}}],["scaffolder",{"2":{"69":1,"71":1}}],["scaffolded",{"2":{"67":1}}],["scaffold",{"2":{"64":1,"71":1}}],["scaffolding",{"0":{"68":1},"1":{"69":1,"70":1},"2":{"64":1,"70":1,"71":1}}],["scalable",{"2":{"27":1}}],["school",{"2":{"36":1}}],["screens",{"2":{"82":1}}],["screenwidthfactor",{"2":{"72":1}}],["screen",{"0":{"119":1},"2":{"37":1,"64":1,"69":2,"71":1,"78":1,"79":2,"81":1,"105":2,"117":1,"119":4}}],["scrollbar",{"2":{"79":1}}],["scroll",{"2":{"23":1}}],["scrolls",{"2":{"23":1,"97":1}}],["script>",{"2":{"13":1,"17":1,"72":1,"76":1,"92":3,"101":1}}],["scripts",{"2":{"9":1,"26":1,"37":1,"108":1}}],["script",{"0":{"83":1},"1":{"84":1,"85":1},"2":{"3":2,"9":2,"13":1,"17":1,"20":1,"23":1,"37":1,"67":1,"72":1,"76":1,"92":1,"101":1,"105":1}}],["scmitem",{"2":{"20":1}}],["scmgroupinline",{"2":{"20":1}}],["scmgroup",{"2":{"20":1}}],["scm",{"2":{"20":2}}],["scss",{"2":{"17":1,"20":1,"67":1,"72":2,"120":1}}],["scenario",{"2":{"2":1,"12":1}}],["sans",{"2":{"120":1}}],["sandboxes",{"2":{"20":1}}],["sandbox",{"2":{"19":1}}],["saw",{"2":{"37":1}}],["says",{"2":{"28":1}}],["say",{"2":{"28":1}}],["sass",{"2":{"20":1}}],["sample",{"2":{"9":2}}],["same",{"2":{"2":2,"5":2,"10":3,"19":1,"20":1,"23":1,"25":4,"26":2,"27":1,"28":1,"30":1,"70":1,"75":1,"84":1,"99":1}}],["saved",{"2":{"9":1}}],["save",{"2":{"2":1,"3":1,"20":1,"29":1,"35":1}}],["saves",{"2":{"2":1,"9":1,"19":1}}],["saving",{"2":{"2":1}}],["sun",{"2":{"62":1}}],["suffer",{"2":{"32":1}}],["sufficient",{"2":{"23":1,"24":1}}],["summary",{"0":{"69":1}}],["sum",{"2":{"20":2}}],["support",{"2":{"23":2,"25":3,"28":1,"36":1,"99":1,"106":1,"120":1}}],["supports",{"2":{"19":1}}],["supported",{"2":{"18":1,"23":1,"25":1,"29":1,"118":1}}],["supabase",{"2":{"3":2,"36":1}}],["suspense",{"2":{"12":1}}],["suspicious",{"2":{"2":1}}],["success",{"2":{"10":1}}],["such",{"2":{"2":1,"3":1,"4":1,"10":1,"11":1,"25":1,"37":1,"67":1}}],["sudo",{"2":{"9":3}}],["subjective",{"2":{"61":1}}],["substring",{"2":{"18":2}}],["submodules",{"2":{"9":4,"10":2}}],["subdirectory",{"2":{"10":1,"16":1}}],["subdirectories",{"2":{"9":1}}],["subdomains",{"2":{"8":1}}],["suggestselection",{"2":{"20":1}}],["suggest",{"2":{"5":1,"36":1,"58":1}}],["suitable",{"2":{"3":1,"10":2,"20":1,"25":1,"27":1,"37":2}}],["sure",{"2":{"2":1,"36":1}}],["sort",{"2":{"25":1}}],["sophisticated",{"2":{"20":1}}],["social",{"2":{"16":1,"105":1}}],["solving",{"2":{"70":3}}],["solvery",{"2":{"36":1}}],["solve",{"2":{"9":1,"16":1,"25":1,"36":1}}],["solid",{"2":{"24":1,"72":1}}],["solutions",{"2":{"37":1,"62":1,"71":1}}],["solution",{"2":{"3":2,"4":2,"5":1,"9":1,"12":1,"20":1,"37":1,"70":1}}],["software",{"2":{"5":1,"8":1,"26":1,"27":1,"34":1}}],["source",{"2":{"4":2,"9":1,"20":4,"36":2,"60":1,"84":1}}],["sources",{"2":{"4":2,"36":1,"61":1}}],["sooner",{"2":{"29":1}}],["soon",{"2":{"2":1}}],["somehow",{"2":{"37":1}}],["somearr",{"2":{"27":4}}],["someone",{"2":{"26":1,"37":1}}],["someimage",{"2":{"16":1}}],["sometimes",{"2":{"10":2,"25":1,"35":1}}],["something",{"2":{"2":1,"25":1,"26":1,"28":1,"36":1}}],["somefunc",{"2":{"3":1}}],["somewhere",{"2":{"3":1}}],["some",{"0":{"15":1},"2":{"2":1,"3":2,"8":1,"12":2,"20":1,"21":1,"23":2,"25":3,"29":1,"30":1,"35":1,"36":3,"37":3,"70":1}}],["so",{"2":{"2":3,"8":2,"9":1,"20":1,"22":1,"23":1,"25":2,"27":1,"36":1,"37":3,"67":1,"70":1,"85":1,"102":2}}],["study",{"2":{"36":1}}],["studying",{"2":{"36":1}}],["student",{"2":{"36":1}}],["stylized",{"2":{"35":1}}],["styling",{"2":{"27":1,"30":1,"71":1}}],["stylus",{"2":{"23":1}}],["styles",{"2":{"35":4}}],["stylelint",{"2":{"20":4}}],["styleci",{"2":{"20":2}}],["style>",{"2":{"17":1}}],["style",{"2":{"17":1,"20":1,"35":1,"36":2,"59":1,"71":1,"95":1,"96":1}}],["style=",{"2":{"17":2}}],["step",{"2":{"37":1}}],["steps",{"2":{"2":1,"9":2}}],["steate",{"2":{"25":1}}],["steit",{"2":{"23":1,"25":1}}],["stick",{"2":{"35":1}}],["sticky",{"2":{"20":1,"94":1,"95":1,"96":1}}],["stickyscroll",{"2":{"20":1}}],["still",{"2":{"12":1,"36":1,"37":1}}],["storage",{"2":{"25":1}}],["storages",{"2":{"25":2}}],["story",{"2":{"20":1}}],["storefront",{"2":{"70":1}}],["stored",{"2":{"36":1,"120":1}}],["stores",{"2":{"25":4,"45":1,"47":1}}],["store",{"2":{"2":2,"9":1,"10":1,"11":1,"25":8,"37":2,"69":1,"70":1,"71":1}}],["stoploading",{"2":{"14":2,"15":2}}],["structured",{"2":{"37":1}}],["structuring",{"2":{"31":1}}],["strategy",{"2":{"118":1}}],["strategies",{"2":{"36":1}}],["straightforward",{"2":{"12":1}}],["strengthen",{"2":{"119":1}}],["streets",{"2":{"36":1}}],["stretch",{"2":{"28":1}}],["strong",{"2":{"18":1}}],["string>",{"2":{"14":1}}],["string",{"2":{"2":1,"4":1,"14":1,"16":1,"17":6,"23":1}}],["stand",{"2":{"27":1}}],["standalone",{"2":{"3":1,"27":1,"117":1}}],["standards",{"0":{"33":1},"2":{"35":1}}],["standard",{"2":{"2":2,"4":1,"5":1,"23":2,"24":1,"36":1,"75":1,"109":1}}],["stack",{"2":{"25":1,"62":1}}],["stackblitz",{"2":{"20":3}}],["stage",{"2":{"28":1}}],["staged",{"2":{"20":2}}],["staging",{"2":{"9":5}}],["states",{"2":{"25":2}}],["stateful",{"2":{"25":1}}],["state",{"0":{"25":1},"2":{"20":1,"25":13,"27":1,"28":1}}],["statistics",{"2":{"19":1}}],["static",{"2":{"8":1,"16":1,"28":1,"37":3}}],["stash",{"2":{"20":3}}],["starter",{"2":{"70":1}}],["started",{"0":{"63":1},"1":{"64":1,"65":1,"66":1}}],["startup",{"2":{"26":1,"105":1,"108":1,"119":1}}],["startloading",{"2":{"14":2,"15":2}}],["start",{"2":{"3":1,"5":1,"36":1,"37":1,"70":1,"117":1}}],["s",{"2":{"2":4,"3":2,"5":1,"9":1,"16":1,"17":1,"19":2,"20":3,"24":1,"25":5,"27":4,"28":2,"35":1,"36":3,"37":3,"59":3,"67":1,"70":1,"74":2}}],["splashscreen",{"2":{"64":1}}],["splash",{"0":{"119":1},"2":{"64":1,"69":2,"71":1,"78":1,"105":2,"119":4}}],["split",{"2":{"25":1}}],["splide",{"2":{"22":1}}],["spite",{"2":{"36":1}}],["spinning",{"2":{"20":1}}],["spread",{"2":{"25":1}}],["sponsors",{"2":{"20":1}}],["spend",{"2":{"20":1,"32":1}}],["spec",{"2":{"20":1}}],["specifying",{"2":{"64":1}}],["specify",{"2":{"27":1,"106":1}}],["specified",{"2":{"4":1,"102":1}}],["specifications",{"2":{"37":1}}],["specification",{"2":{"36":1,"75":1}}],["specifically",{"2":{"4":1}}],["specific",{"2":{"3":1,"4":1,"5":1,"12":1,"67":3,"70":1,"71":3}}],["specialized",{"2":{"4":1}}],["special",{"2":{"4":1,"5":1}}],["speeds",{"2":{"35":1}}],["speed",{"2":{"16":1,"28":2,"35":1,"37":1}}],["speaking",{"2":{"2":1,"4":1,"27":1,"28":1}}],["space",{"2":{"19":1}}],["spaces",{"2":{"4":1}}],["spa",{"0":{"37":1},"2":{"2":1,"37":10,"71":1}}],["silent",{"2":{"64":1}}],["since",{"2":{"37":1}}],["singleton",{"2":{"25":1}}],["singlequote",{"2":{"20":1}}],["singleclick",{"2":{"20":1}}],["single",{"2":{"2":1,"10":1,"27":1,"37":1}}],["situations",{"2":{"28":1}}],["situation",{"2":{"25":1,"27":1}}],["sites",{"2":{"3":1,"37":2}}],["site",{"2":{"2":7,"3":1,"4":3,"6":1,"8":2,"9":17,"23":2,"25":1,"26":1,"27":1,"28":2,"36":3,"37":5,"59":1,"70":1,"71":1,"84":1,"85":1,"99":3}}],["size=",{"2":{"16":1}}],["size",{"2":{"14":1,"16":2,"17":5,"29":1}}],["simulates",{"2":{"26":1}}],["simultaneously",{"2":{"12":1}}],["similar",{"2":{"25":1,"27":1,"36":1,"37":1,"70":1,"82":1,"111":1}}],["simply",{"2":{"28":1}}],["simplified",{"2":{"37":1}}],["simplifies",{"2":{"5":1}}],["simplistically",{"2":{"27":1}}],["simplenavbar",{"0":{"113":1}}],["simpleheader",{"0":{"94":1}}],["simplefooter",{"0":{"87":1}}],["simpledrawer",{"0":{"81":1},"2":{"64":2,"82":1}}],["simpledialog",{"2":{"20":1}}],["simpler",{"2":{"23":1}}],["simple",{"2":{"1":1,"2":1,"6":1,"20":4,"23":1,"27":1,"36":1,"37":4,"71":1,"94":1,"95":1,"99":2,"116":1}}],["sidebar",{"2":{"84":1,"109":2,"111":2}}],["sidebarlayout",{"2":{"12":2}}],["side",{"2":{"10":1,"12":2,"37":3,"118":1}}],["significantly",{"2":{"37":1}}],["significant",{"2":{"23":1,"27":1,"37":1}}],["signing",{"2":{"2":1}}],["sign",{"2":{"2":1}}],["serif",{"2":{"120":1}}],["serve",{"2":{"27":1}}],["server",{"2":{"1":1,"3":4,"4":8,"5":3,"6":1,"8":2,"9":7,"16":1,"20":6,"23":1,"36":1,"37":13,"99":1}}],["services",{"2":{"1":1,"2":1,"3":5,"10":1,"20":1,"25":1,"28":1,"36":1,"71":1,"74":1,"108":1}}],["service",{"0":{"1":1,"118":1},"2":{"1":1,"3":4,"5":1,"20":1,"27":1,"36":1,"37":4,"59":2,"64":1,"69":1,"74":1,"78":1,"105":1,"108":1,"116":1,"118":2}}],["seo",{"0":{"37":1},"2":{"37":1}}],["selected",{"2":{"64":1,"120":1}}],["select",{"2":{"35":2,"64":6,"84":2}}],["self",{"2":{"27":1,"35":1,"36":1}}],["semantic",{"2":{"33":1}}],["semi",{"2":{"20":1}}],["search",{"2":{"20":1,"37":4}}],["several",{"2":{"9":1,"10":1,"12":3,"25":3,"26":1,"27":1,"37":1}}],["seed",{"2":{"75":1}}],["seem",{"2":{"70":1}}],["see",{"2":{"2":1,"12":1,"16":1,"19":2,"20":2,"37":1,"117":1}}],["secrets",{"2":{"9":2}}],["section",{"2":{"4":1,"23":1,"33":1,"84":1}}],["sections",{"2":{"2":1}}],["seconds",{"2":{"20":1}}],["secondary",{"2":{"20":1}}],["second",{"2":{"2":2,"20":3,"97":2}}],["security",{"2":{"2":5,"20":1,"28":1}}],["sense",{"2":{"25":1}}],["sentry",{"2":{"20":2}}],["sent",{"2":{"2":2}}],["send",{"2":{"5":1,"27":1,"37":1}}],["sends",{"2":{"2":1,"37":1}}],["sending",{"2":{"1":1}}],["senior",{"2":{"2":1}}],["setlocale",{"2":{"101":2}}],["setlogoutcallback",{"2":{"1":1}}],["setoptions",{"2":{"75":1}}],["sets",{"2":{"75":1}}],["setsomearr",{"2":{"27":1}}],["setitem",{"2":{"9":1}}],["setup>",{"2":{"13":1,"17":1}}],["setup",{"2":{"9":4,"20":1,"23":1,"25":1,"67":1,"72":1,"76":1,"101":1}}],["setters",{"2":{"25":1}}],["settings",{"2":{"9":1,"11":2,"20":1,"84":1}}],["setting",{"0":{"85":1},"2":{"4":1,"9":1,"19":1,"20":1,"23":4,"70":1,"99":1}}],["settokencallback",{"2":{"1":1}}],["set",{"2":{"1":1,"2":2,"8":1,"14":1,"18":3,"19":2,"20":1,"27":1,"36":1,"37":1,"72":2,"111":1,"115":1}}],["setbaseurl",{"2":{"1":1}}],["separately",{"2":{"71":1}}],["separated",{"2":{"4":1}}],["separate",{"2":{"1":3,"4":2,"10":2,"20":1,"25":2,"27":1,"35":1,"36":1,"118":1}}],["dx",{"2":{"35":1,"59":1}}],["drop",{"2":{"84":1}}],["dropdown",{"2":{"35":1}}],["drawers",{"0":{"80":1},"1":{"81":1,"82":1},"2":{"80":1}}],["drawer",{"2":{"64":1,"71":1,"76":1,"105":2}}],["draw",{"2":{"34":1,"36":1}}],["dream",{"2":{"23":1}}],["driving",{"2":{"36":5}}],["driver",{"2":{"36":2}}],["drive",{"2":{"2":4,"36":1}}],["dribbling",{"2":{"25":1}}],["drilling",{"2":{"12":2}}],["dprint",{"2":{"20":4}}],["dlint",{"2":{"20":4}}],["dash",{"2":{"75":1}}],["days",{"2":{"32":1,"35":1,"36":2}}],["day",{"2":{"23":2,"24":2,"36":1}}],["dangerfile",{"2":{"20":2}}],["dart",{"2":{"20":6}}],["dark",{"2":{"20":1,"106":1,"120":2}}],["dates",{"2":{"23":1,"24":1,"99":1}}],["date=`date",{"2":{"9":1}}],["date",{"0":{"23":1},"2":{"9":9,"19":1,"20":1,"23":1,"92":1}}],["datalayer",{"2":{"92":3}}],["databases",{"2":{"20":1}}],["database",{"2":{"3":5,"20":1,"25":3}}],["data",{"2":{"2":2,"3":6,"4":3,"5":1,"9":2,"11":3,"12":4,"19":1,"23":2,"25":5,"27":7,"28":1,"36":2,"37":4,"117":1}}],["dynamically",{"2":{"16":1,"27":1,"37":1,"71":1,"72":1,"106":1}}],["dynamic",{"2":{"16":1,"37":1,"76":1,"108":1}}],["dt",{"2":{"9":1}}],["d",{"2":{"9":1,"20":16}}],["due",{"2":{"5":1,"27":1}}],["during",{"2":{"4":1,"23":1,"105":1,"119":1}}],["duplicate",{"2":{"2":1}}],["diagrams",{"2":{"34":1}}],["dialyzer",{"2":{"20":1}}],["dialogstyle",{"2":{"20":1}}],["dies",{"2":{"25":1}}],["did",{"2":{"23":1}}],["divider",{"2":{"120":1}}],["divided",{"2":{"10":1}}],["division",{"2":{"35":1}}],["div",{"2":{"13":2,"17":1,"72":4}}],["div>",{"2":{"12":6,"13":1,"72":4,"101":2}}],["dirname",{"2":{"19":1}}],["dirs",{"2":{"9":1}}],["dir=`echo",{"2":{"9":2}}],["dir=your",{"2":{"9":1}}],["dir=dev",{"2":{"9":1}}],["dir=",{"2":{"9":2}}],["dir",{"2":{"9":24,"117":1}}],["direction",{"2":{"72":2}}],["direct",{"2":{"25":1}}],["directly",{"2":{"19":1,"23":2,"29":1,"30":1,"37":1}}],["directories",{"2":{"17":1}}],["directory",{"2":{"9":3,"64":2,"76":1,"78":1}}],["directs",{"2":{"2":1}}],["disappears",{"2":{"79":1}}],["disable",{"2":{"23":1}}],["discussion",{"2":{"25":1}}],["disk",{"2":{"19":1,"20":1}}],["displaying",{"2":{"25":2,"28":1}}],["displaylanguage",{"2":{"20":1}}],["display",{"2":{"11":1,"16":2,"37":1,"72":1,"117":1}}],["dispatch",{"2":{"9":2}}],["distribution",{"2":{"37":1}}],["distributedfooter",{"0":{"91":1}}],["distributed",{"2":{"37":1,"71":1}}],["dist",{"2":{"9":2,"16":1,"20":1}}],["diffeditor",{"2":{"20":1}}],["differing",{"2":{"25":1}}],["differs",{"2":{"4":1}}],["difference",{"2":{"23":1,"25":1,"27":1,"36":1}}],["differences",{"2":{"2":1,"27":1}}],["differently",{"2":{"19":1,"37":1}}],["different",{"2":{"2":2,"3":1,"11":1,"18":2,"19":1,"23":1,"25":1,"26":1,"27":3,"28":2,"37":1,"97":1,"107":1,"108":3,"118":1}}],["diffdecorationsgutterwidth",{"2":{"20":1}}],["difficulties",{"2":{"5":1}}],["difficult",{"2":{"2":1,"36":1}}],["dozens",{"2":{"19":1,"20":1}}],["down",{"2":{"11":1,"27":1,"28":1,"61":1,"84":1,"97":1}}],["downloading",{"2":{"23":1,"99":1}}],["downloaded",{"2":{"16":1,"37":1}}],["download",{"2":{"9":1,"36":1}}],["don",{"2":{"9":1,"12":1,"16":1,"27":1,"29":2,"30":1,"37":2,"85":1,"102":1}}],["done",{"2":{"2":2,"26":1,"32":1,"67":1,"78":1}}],["document",{"0":{"34":1},"2":{"12":1,"35":1,"36":1}}],["documentation",{"2":{"9":1,"12":2,"16":1,"25":1,"34":1,"36":3,"37":1,"59":1,"61":1,"70":1}}],["docs",{"2":{"8":1,"9":1}}],["dockerignore",{"2":{"20":1}}],["dockerfile",{"2":{"20":2}}],["docker",{"0":{"7":1},"2":{"20":2}}],["domains",{"2":{"4":1}}],["domain",{"2":{"4":6,"8":4,"36":1,"85":2,"115":1}}],["do",{"2":{"3":3,"4":1,"8":1,"19":1,"20":1,"23":1,"25":2,"26":1,"27":2,"28":1,"29":1,"31":1,"32":1,"35":1,"36":4,"37":2,"67":1,"120":1}}],["doe",{"2":{"2":2}}],["doesn",{"2":{"3":1,"20":2,"27":1,"29":1}}],["does",{"2":{"1":1,"2":4,"4":1,"20":2,"23":3,"25":1,"27":1,"37":1,"61":1,"118":1}}],["degree",{"2":{"67":1}}],["dead",{"2":{"37":1}}],["debounce",{"2":{"29":1}}],["debugging",{"2":{"23":1}}],["debuganyway",{"2":{"20":1}}],["debug",{"2":{"20":1}}],["demonstrates",{"2":{"25":1}}],["deno",{"2":{"20":2}}],["desired",{"2":{"67":1}}],["designed",{"2":{"35":1}}],["designer",{"2":{"20":2}}],["design",{"2":{"18":1,"27":1,"36":2,"59":1,"61":1,"69":1,"71":1}}],["desktop",{"2":{"37":1,"72":3,"81":1,"109":1,"111":1}}],["descendant",{"2":{"25":2}}],["describe",{"2":{"34":1,"61":1}}],["describes",{"2":{"9":1}}],["description",{"2":{"9":1,"37":1,"115":3,"117":1}}],["deep",{"2":{"17":1,"108":1}}],["defining",{"2":{"70":1}}],["definitions",{"2":{"28":1}}],["definition",{"2":{"25":1}}],["defined",{"2":{"120":1}}],["define",{"2":{"25":1,"27":1}}],["defineconfig",{"2":{"19":1,"85":1}}],["defineprops",{"2":{"17":1}}],["defaultformatter",{"2":{"20":4}}],["default",{"0":{"106":1},"2":{"1":1,"9":2,"17":6,"19":1,"20":2,"75":1,"85":1,"101":1}}],["detailed",{"2":{"28":1}}],["details",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"11":1,"12":1,"16":1,"33":1,"34":1,"84":1}}],["determined",{"2":{"2":1}}],["determines",{"2":{"2":1}}],["deleting",{"2":{"23":1}}],["delete",{"2":{"2":1,"14":1,"23":1}}],["delivery",{"2":{"6":1}}],["de",{"2":{"5":1,"75":1}}],["deception",{"2":{"37":1}}],["decided",{"2":{"28":3}}],["decides",{"2":{"2":1,"25":1}}],["decomposition",{"2":{"27":1}}],["declensions",{"2":{"23":1,"99":1}}],["declared",{"2":{"4":2,"25":2}}],["declaration",{"2":{"4":1}}],["decade",{"2":{"18":1}}],["devdependencies",{"2":{"19":1,"20":1}}],["dev",{"2":{"8":2,"9":10,"19":1,"25":1,"37":1,"65":1,"66":1,"117":1}}],["devops",{"2":{"6":1}}],["developing",{"2":{"27":1,"28":1,"37":1,"67":1}}],["develop",{"2":{"27":1}}],["developed",{"2":{"10":2}}],["developers",{"2":{"12":1,"26":1,"35":2,"36":1,"61":1,"69":1,"71":2}}],["developer",{"2":{"3":2,"6":1,"25":3,"34":1,"35":1,"36":4,"59":2,"62":1,"67":1,"70":2,"74":1}}],["development",{"0":{"58":1,"107":1},"2":{"4":2,"6":1,"8":1,"10":1,"20":4,"23":1,"26":3,"27":1,"28":1,"35":2,"36":1,"37":1,"42":1,"47":1,"48":1,"70":2,"117":1}}],["devtoolsformatters",{"2":{"23":3}}],["devtools",{"2":{"3":1,"23":2,"25":4,"102":1}}],["deposit",{"2":{"99":1}}],["deposits",{"2":{"2":1}}],["deprecated",{"2":{"25":1}}],["deployed",{"2":{"9":2}}],["deploy",{"0":{"83":1},"1":{"84":1,"85":1},"2":{"9":21,"36":1,"71":1,"84":3,"105":2}}],["deployment",{"0":{"84":1},"2":{"6":1,"9":3,"44":1,"45":2,"84":2,"108":1}}],["depend",{"2":{"27":1}}],["dependency",{"2":{"25":1,"29":1,"35":2,"67":1}}],["dependencies",{"0":{"29":1},"2":{"9":2,"23":1,"27":2,"37":1,"67":1,"100":1,"102":1}}],["depends",{"2":{"4":1}}],["depending",{"2":{"2":1,"16":1,"36":1}}],["rgba",{"2":{"120":6}}],["richfooter",{"0":{"88":1}}],["rip",{"2":{"25":1}}],["rigor",{"2":{"5":1}}],["rights",{"2":{"2":1}}],["right",{"2":{"2":3,"20":2,"23":1,"36":1,"37":1,"79":1,"99":1,"116":1}}],["rspack",{"2":{"20":12}}],["rc",{"2":{"20":1}}],["ruslan",{"2":{"62":2}}],["rush",{"2":{"20":1}}],["rust",{"2":{"20":1}}],["rustfmt",{"2":{"20":2}}],["ruby",{"2":{"20":1}}],["ru",{"2":{"20":3,"61":2}}],["rules",{"2":{"20":2,"27":1,"36":1}}],["running",{"2":{"26":1}}],["runs",{"2":{"9":2}}],["run",{"2":{"3":2,"9":9,"20":3,"37":2,"117":1}}],["r",{"2":{"9":2,"25":1,"61":2}}],["rf",{"2":{"9":4}}],["rm",{"2":{"9":3}}],["range",{"2":{"70":1}}],["raise",{"2":{"34":1}}],["ram",{"2":{"20":1,"102":1}}],["raw",{"2":{"16":2,"18":1,"19":1}}],["rather",{"2":{"3":1,"5":1,"70":1}}],["rarely",{"2":{"2":1}}],["roboto",{"2":{"120":1}}],["robust",{"2":{"27":1}}],["row",{"2":{"72":1}}],["room",{"2":{"37":1}}],["root",{"2":{"9":2,"11":2,"18":1,"120":1}}],["routing",{"0":{"110":1}}],["routine",{"2":{"27":1}}],["router",{"2":{"12":4,"67":1,"110":1}}],["routes",{"2":{"10":1,"12":2,"110":1}}],["roughly",{"2":{"2":1,"4":1,"28":1}}],["rollup",{"2":{"19":2,"20":2}}],["rollback",{"2":{"9":1}}],["roles",{"2":{"2":1,"27":1}}],["role",{"2":{"2":2,"25":1,"27":1,"36":1}}],["rbac",{"2":{"2":1}}],["rtl",{"2":{"23":1,"99":1}}],["rt",{"2":{"2":4,"59":1}}],["rpc",{"0":{"75":1},"2":{"1":1,"5":7,"36":1,"64":1,"74":1,"75":5,"105":1}}],["reusable",{"2":{"71":1}}],["reuse",{"2":{"10":1}}],["reviews",{"2":{"37":1}}],["rehydration",{"2":{"37":1}}],["rewriting",{"2":{"25":1,"26":1}}],["reduces",{"2":{"37":1}}],["reduce",{"2":{"26":1,"35":1}}],["reddit",{"2":{"25":1,"61":1}}],["redis",{"2":{"25":1}}],["registration",{"2":{"108":1}}],["registers",{"2":{"27":1}}],["register",{"2":{"25":1,"36":2}}],["regarding",{"2":{"37":1}}],["regulate",{"2":{"12":1}}],["regular",{"0":{"31":1},"2":{"2":1,"19":1,"37":1}}],["renting",{"2":{"37":1}}],["renaming",{"2":{"31":1}}],["renamed",{"2":{"16":1}}],["renovate",{"2":{"20":2}}],["rendering",{"2":{"37":2}}],["renderwhitespace",{"2":{"20":1}}],["render",{"2":{"8":1}}],["reason",{"2":{"36":1}}],["reasons",{"2":{"35":1}}],["react",{"2":{"27":6,"36":2}}],["reactivity",{"2":{"25":1,"27":7,"99":1}}],["reactive",{"2":{"14":2,"23":9,"25":11,"27":11,"71":1}}],["read",{"2":{"25":2,"36":2,"37":1,"76":1}}],["readable",{"2":{"23":1}}],["ready",{"2":{"20":1,"70":2,"71":2}}],["readme",{"2":{"20":2}}],["reality",{"2":{"29":1}}],["really",{"2":{"18":1,"26":1}}],["real",{"2":{"3":1,"26":1,"36":2}}],["refactoring",{"0":{"31":1},"2":{"31":1}}],["refs",{"2":{"25":2}}],["reference",{"2":{"36":2}}],["refer",{"2":{"16":1}}],["referred",{"2":{"10":1}}],["ref",{"2":{"14":1,"23":7,"25":6,"27":2,"74":1}}],["refreshes",{"2":{"2":1}}],["refresh",{"2":{"2":1,"59":1}}],["repetitive",{"2":{"27":1}}],["replacing",{"2":{"23":1,"27":1}}],["replaced",{"2":{"23":1}}],["replacement",{"2":{"23":2}}],["replace",{"2":{"1":1,"28":1,"30":1,"35":2,"92":1}}],["replit",{"2":{"20":1}}],["repo",{"2":{"20":1}}],["repository",{"0":{"66":1},"2":{"6":1,"9":4,"10":1,"20":1,"36":1,"84":4,"85":1}}],["representation",{"2":{"16":1}}],["recalculate",{"2":{"27":1}}],["recent",{"2":{"23":1,"99":1}}],["recentchange",{"2":{"20":1}}],["receive",{"2":{"37":2}}],["receives",{"2":{"4":1,"37":1}}],["receiving",{"2":{"2":1}}],["recursive",{"2":{"9":1}}],["recognition",{"2":{"119":1}}],["recognized",{"2":{"61":1}}],["recommend",{"2":{"23":1}}],["recommended",{"2":{"8":1,"9":1,"19":1,"20":1,"23":1,"75":1,"102":1,"120":1}}],["reconnection",{"2":{"5":1}}],["re",{"2":{"2":2}}],["remain",{"2":{"25":1,"75":1}}],["remains",{"2":{"1":1}}],["remix",{"2":{"20":2}}],["removed",{"2":{"9":1,"119":1}}],["removed=`ls",{"2":{"9":1}}],["remove",{"2":{"9":2}}],["removes",{"2":{"2":1}}],["remote",{"2":{"9":12,"20":5}}],["reliably",{"2":{"20":1}}],["reliable",{"2":{"2":1,"9":1}}],["relevance",{"2":{"61":1}}],["relevant",{"2":{"3":1,"70":1}}],["release",{"2":{"20":4,"118":1}}],["releaserc",{"2":{"20":2}}],["reload",{"2":{"9":2,"108":1}}],["related",{"2":{"1":1,"2":1,"10":1,"25":1,"28":1}}],["require",{"2":{"8":1,"11":1}}],["requiresauth",{"2":{"12":1}}],["requires",{"2":{"5":1,"8":1,"18":1,"19":1,"23":1,"25":1,"99":1}}],["required",{"2":{"3":1,"9":1}}],["requirements",{"2":{"2":1,"35":1,"37":1}}],["requested",{"2":{"2":1,"4":2}}],["requesting",{"2":{"2":1}}],["requests",{"2":{"1":1,"4":3,"5":1,"20":2,"37":3,"75":1}}],["request",{"2":{"1":2,"2":2,"4":7,"37":2}}],["resume",{"2":{"36":1}}],["result",{"0":{"103":1},"2":{"2":1,"3":1,"9":1,"20":1,"25":1,"65":1,"67":1,"70":1}}],["respect",{"2":{"25":1}}],["response",{"2":{"4":4,"9":2}}],["responsible",{"2":{"2":1,"12":2,"25":2,"27":1,"120":1}}],["resides",{"2":{"25":1}}],["resx",{"2":{"20":2}}],["resolutions",{"2":{"28":1,"79":1,"81":1}}],["resolver",{"2":{"19":1,"20":1}}],["resolve",{"2":{"19":2}}],["resources",{"0":{"16":1},"1":{"17":1,"18":1},"2":{"2":1,"3":1,"4":1,"10":4,"16":7,"19":1,"36":1,"37":3,"102":1,"118":1,"119":1}}],["resource",{"0":{"58":1},"2":{"2":3,"4":6,"10":1,"16":3}}],["reserve",{"2":{"12":1}}],["resets",{"2":{"2":1}}],["restrictions",{"2":{"37":1}}],["rest",{"0":{"5":2,"74":1},"2":{"1":1,"5":2,"64":1,"74":1,"75":2}}],["returns",{"2":{"2":2,"3":1,"16":1,"23":1,"74":1}}],["return",{"2":{"1":1,"4":1,"14":1,"17":2,"18":2,"74":1,"75":1}}],["og",{"2":{"115":6}}],["oop",{"2":{"25":1,"27":1,"28":3}}],["ok",{"2":{"23":2}}],["os",{"2":{"20":1}}],["overriding",{"2":{"120":1}}],["overrides",{"2":{"20":1}}],["overflow",{"2":{"79":1}}],["overwrite",{"2":{"64":3}}],["over",{"0":{"30":1},"2":{"25":1,"27":1,"37":1,"74":1}}],["overview",{"2":{"24":1}}],["overuse",{"2":{"12":2}}],["obtained",{"2":{"99":1}}],["obvious",{"2":{"61":1}}],["obj",{"2":{"23":1}}],["objectives",{"0":{"71":1}}],["objective",{"2":{"61":1}}],["object",{"2":{"18":1,"23":5,"25":1,"27":2,"28":3,"36":1}}],["objects",{"2":{"4":2,"23":4,"25":1,"27":1}}],["observer",{"2":{"23":1}}],["obsolete",{"2":{"19":1,"23":1,"24":1,"25":1,"29":1,"35":1,"70":1}}],["old",{"2":{"9":1,"18":1,"23":2,"36":1}}],["outdated",{"2":{"20":1,"36":1}}],["out",{"2":{"20":2,"23":1,"24":1,"25":1,"27":1,"36":2,"71":1,"111":1}}],["output",{"2":{"20":2,"37":1}}],["outer",{"2":{"12":1}}],["outside",{"2":{"4":1,"25":1}}],["our",{"2":{"9":2}}],["occurs",{"2":{"37":1}}],["occur",{"2":{"4":1}}],["otherwise",{"2":{"23":1}}],["others",{"2":{"12":1,"27":1,"108":1}}],["other",{"2":{"3":2,"4":1,"5":1,"6":1,"8":2,"9":1,"10":2,"16":2,"20":3,"23":1,"25":6,"27":2,"28":2,"34":1,"35":1,"37":3,"70":4,"71":1,"99":1,"108":3}}],["own",{"2":{"3":2,"5":1,"9":3,"10":1,"19":2,"23":1,"25":2,"29":1,"30":1,"35":2,"37":1,"92":1}}],["opinion",{"2":{"61":1}}],["optimization",{"2":{"37":1}}],["optional",{"2":{"58":1}}],["option",{"2":{"2":1,"36":1}}],["options",{"0":{"3":1,"104":1,"105":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"2":1,"8":1,"9":1,"11":1,"19":1,"20":1,"23":2,"64":2,"71":3,"105":1}}],["operation",{"2":{"37":1}}],["operations",{"2":{"23":1}}],["open=",{"2":{"97":1}}],["opened",{"2":{"81":1}}],["opengraph",{"2":{"64":1}}],["openclose",{"2":{"20":1}}],["open",{"2":{"3":1,"36":2,"60":1,"64":1,"69":1,"78":1,"105":1,"115":1}}],["oauth",{"2":{"2":2}}],["onmounted",{"2":{"119":1}}],["ontaskerrors",{"2":{"20":1}}],["onecolumnlayout",{"0":{"111":1}}],["ones",{"2":{"19":1,"36":1,"120":1}}],["one",{"2":{"2":1,"4":1,"9":2,"12":6,"16":2,"19":2,"23":1,"25":8,"26":1,"35":1,"36":1,"37":1,"70":2,"97":1,"100":1}}],["once",{"2":{"2":1,"23":1}}],["onlyenabledextensions",{"2":{"20":1}}],["only",{"2":{"2":1,"3":1,"4":2,"6":1,"11":1,"12":1,"18":1,"20":5,"23":3,"25":3,"27":1,"35":2,"36":2,"64":1,"67":2,"99":1,"102":1}}],["online",{"2":{"2":1,"8":1,"10":1,"19":1,"20":1,"37":1,"70":1,"71":1,"108":1}}],["on",{"2":{"2":9,"3":5,"4":3,"5":5,"6":2,"8":4,"9":9,"10":1,"16":2,"19":2,"20":7,"23":4,"25":10,"26":5,"27":8,"28":5,"32":2,"35":3,"36":13,"37":10,"59":2,"61":1,"64":1,"70":3,"72":1,"79":1,"81":2,"82":1,"99":1,"108":2,"109":1,"117":1,"119":1}}],["org",{"2":{"75":1}}],["organise",{"2":{"12":1}}],["organizing",{"2":{"8":1}}],["organizeimports",{"2":{"20":1}}],["organize",{"2":{"5":1,"27":1}}],["oreilly",{"2":{"36":1}}],["orientation",{"2":{"117":1}}],["oriented",{"2":{"27":2,"28":1}}],["originally",{"2":{"37":1}}],["origin",{"2":{"4":7}}],["ordinary",{"2":{"27":1}}],["orders",{"2":{"37":1}}],["order",{"2":{"2":1,"5":1,"37":1}}],["oracle",{"2":{"3":1,"8":1}}],["or",{"0":{"5":1,"22":1},"2":{"1":2,"2":1,"3":2,"4":4,"5":1,"8":1,"10":1,"11":3,"16":3,"18":1,"19":3,"23":3,"25":11,"27":4,"28":1,"29":1,"30":2,"35":4,"36":6,"37":3,"58":3,"64":1,"67":1,"70":4,"72":1,"74":1,"99":1}}],["often",{"2":{"16":1,"23":1,"26":1,"36":1,"37":1,"99":1}}],["offline",{"2":{"37":2}}],["off",{"2":{"20":2,"25":1,"27":1}}],["officially",{"2":{"25":1}}],["official",{"2":{"12":1,"20":1,"25":1,"61":1}}],["offers",{"2":{"27":1}}],["offer",{"2":{"3":1,"35":1,"36":1}}],["of",{"0":{"30":1,"58":1},"2":{"1":2,"2":12,"3":2,"4":8,"5":5,"6":3,"8":1,"9":13,"10":4,"11":2,"12":1,"16":4,"18":1,"19":5,"20":9,"23":20,"24":3,"25":30,"26":7,"27":17,"28":8,"29":4,"30":1,"32":2,"34":2,"35":12,"36":11,"37":20,"58":1,"59":4,"61":5,"62":1,"64":2,"66":1,"67":1,"69":1,"70":3,"71":6,"74":4,"75":2,"76":1,"78":1,"80":1,"84":2,"85":1,"86":1,"99":7,"100":3,"101":1,"105":3,"107":2,"108":6,"110":1,"111":1,"118":5,"119":1}}],["would",{"2":{"25":2,"36":1,"67":1}}],["word",{"2":{"58":1}}],["wordseparators",{"2":{"20":1}}],["words",{"2":{"6":1,"25":2,"37":1,"70":1}}],["worth",{"2":{"36":1}}],["world",{"2":{"35":1,"37":1}}],["worsens",{"2":{"35":1}}],["workable",{"2":{"70":1}}],["workbox",{"2":{"37":2,"118":1}}],["workbench",{"2":{"20":11}}],["worker",{"0":{"118":1},"2":{"37":3,"59":2,"64":1,"69":1,"78":1,"105":1,"116":1,"118":2}}],["workflow",{"2":{"9":2,"64":1,"105":1}}],["workflows",{"2":{"9":3}}],["workingissueformatscm",{"2":{"20":1}}],["working",{"2":{"3":1,"4":1,"6":2,"16":1,"20":1,"21":1,"24":1,"27":1,"59":2,"67":1}}],["work",{"2":{"2":1,"3":2,"5":1,"9":1,"10":1,"12":1,"20":5,"25":2,"26":1,"29":1,"36":2,"116":1}}],["workspace",{"2":{"20":3}}],["works",{"2":{"2":2,"19":1,"23":3,"36":1,"37":2,"102":1}}],["www",{"2":{"4":1,"9":6,"92":1}}],["walk",{"2":{"37":1}}],["water",{"2":{"36":1}}],["watch",{"2":{"27":1}}],["watchman",{"2":{"20":2}}],["was",{"2":{"23":1,"25":2,"27":2,"35":1,"37":5}}],["warm",{"2":{"20":1}}],["wants",{"2":{"3":1}}],["want",{"2":{"3":2,"11":1,"23":1,"28":2,"36":1,"84":1}}],["ways",{"2":{"36":1}}],["way",{"2":{"2":3,"5":1,"9":2,"12":1,"19":1,"23":1,"25":1,"35":2,"37":2,"58":1}}],["welcome",{"2":{"58":1,"60":1}}],["well",{"2":{"16":1,"20":2,"22":1,"23":1,"27":1,"36":3,"37":2,"70":1,"71":1,"102":1}}],["went",{"2":{"35":1}}],["weight",{"2":{"35":1}}],["were",{"2":{"23":1,"27":1,"35":1,"36":1,"37":1}}],["webapp",{"0":{"64":1,"68":1},"1":{"65":1,"69":1,"70":1},"2":{"40":1,"60":2,"64":7,"66":2,"69":1,"84":2,"85":1,"117":1}}],["webdriverio",{"2":{"26":1}}],["webpack",{"2":{"19":4,"20":13}}],["webp",{"2":{"18":1}}],["webstorm",{"2":{"20":2}}],["website",{"2":{"8":9,"9":3,"10":1,"19":1,"37":2,"59":1,"69":1,"70":1,"71":2,"84":1,"115":1}}],["websocket",{"2":{"5":1}}],["websockets",{"2":{"1":1,"5":3,"36":1,"74":1}}],["webservers",{"2":{"20":1}}],["webserver",{"2":{"4":1,"8":2,"20":1,"37":1}}],["web",{"0":{"65":1},"2":{"4":3,"5":2,"10":1,"20":1,"26":1,"28":1,"35":2,"37":8,"67":2,"70":2,"71":3,"75":1,"117":1}}],["we",{"2":{"2":1,"9":4,"23":2,"28":7,"35":1,"36":1}}],["wrap",{"2":{"28":1,"35":1}}],["wrappers",{"0":{"30":1},"2":{"30":1}}],["wrapper",{"2":{"1":1,"27":1,"37":2,"67":1}}],["writes",{"2":{"37":1}}],["write",{"2":{"3":2,"9":1,"25":2,"27":1,"36":1,"37":1}}],["written",{"2":{"2":1,"3":1,"26":1}}],["writing",{"2":{"2":1,"3":1,"26":1,"36":1,"37":1}}],["while",{"2":{"12":1}}],["which",{"2":{"2":1,"3":1,"4":2,"5":1,"8":1,"10":1,"16":2,"19":1,"20":1,"23":2,"25":6,"27":4,"29":1,"35":1,"37":5,"64":1,"70":2,"84":1,"120":2}}],["why",{"2":{"5":1,"20":1,"25":2,"27":2,"28":1,"35":2}}],["where",{"2":{"2":1,"3":1,"8":1,"12":1,"18":1,"20":1,"25":2,"26":1,"27":4,"31":1,"37":2,"71":1}}],["whether",{"2":{"2":2,"12":1,"25":1,"64":1}}],["when",{"0":{"104":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"2":6,"3":1,"4":2,"5":1,"9":2,"16":1,"20":2,"23":2,"25":3,"27":3,"35":1,"36":1,"37":9,"67":1,"71":1,"76":1,"79":1,"109":1,"111":1}}],["whole",{"2":{"35":2,"37":1}}],["whom",{"2":{"2":1}}],["who",{"2":{"2":1,"27":2,"36":1}}],["whatever",{"2":{"35":1}}],["what",{"2":{"1":1,"2":2,"3":2,"4":1,"5":1,"6":1,"9":1,"10":1,"12":1,"18":1,"20":1,"21":1,"25":3,"26":1,"27":3,"28":1,"35":1,"36":2}}],["wireframe",{"2":{"71":1}}],["wide",{"2":{"70":1}}],["widgets",{"2":{"25":1}}],["width",{"2":{"17":7,"111":2,"120":1}}],["windi",{"2":{"20":10}}],["window",{"2":{"9":1,"10":1,"20":4,"23":3,"67":1,"92":2,"117":1}}],["wise",{"2":{"10":1}}],["within",{"2":{"23":1}}],["without",{"2":{"3":2,"6":1,"11":2,"12":3,"20":1,"23":1,"26":1,"27":2,"35":1,"36":1,"37":1,"64":1,"67":1,"70":1,"74":1,"100":1,"111":1,"116":1,"117":1}}],["with",{"2":{"1":2,"2":7,"3":9,"4":2,"5":4,"8":3,"9":12,"10":2,"11":1,"12":4,"16":2,"18":3,"19":3,"20":6,"21":1,"23":3,"24":1,"25":6,"26":3,"27":2,"28":4,"29":1,"30":1,"32":1,"35":2,"36":8,"37":11,"59":1,"62":1,"64":2,"66":1,"67":2,"69":1,"70":3,"71":8,"72":1,"75":1,"76":2,"82":1,"92":1,"99":2,"102":1,"103":1,"105":1,"106":1,"108":1,"109":1,"118":1}}],["will",{"2":{"1":1,"3":3,"4":3,"5":2,"8":1,"9":5,"16":1,"18":1,"23":3,"25":1,"26":4,"27":3,"29":1,"30":2,"32":1,"34":1,"35":1,"36":2,"37":3,"64":3,"66":2,"71":1,"74":1,"118":1}}],["pwa",{"0":{"37":1,"116":1},"1":{"117":1,"118":1},"2":{"37":12,"59":1,"64":2,"69":2,"71":1,"105":1}}],["pwd",{"2":{"9":1}}],["pc",{"2":{"20":2}}],["pdm",{"2":{"20":2}}],["pdf",{"2":{"16":1,"20":1}}],["python",{"2":{"36":1,"37":1}}],["pyproject",{"2":{"20":2}}],["pyrightconfig",{"2":{"20":2}}],["pinia",{"2":{"25":14,"45":1}}],["picked",{"2":{"20":1}}],["picture",{"2":{"18":1,"37":1}}],["pictures",{"2":{"16":1,"18":1,"37":1}}],["pipelines",{"2":{"20":2}}],["psalm",{"2":{"20":1}}],["pm2",{"2":{"20":4}}],["pm",{"2":{"20":1}}],["px`",{"2":{"17":4}}],["pnp",{"2":{"20":2}}],["pnpm",{"2":{"9":12,"19":2,"20":6,"64":3,"65":2,"66":2,"69":1}}],["png`",{"2":{"16":1}}],["png",{"2":{"16":3,"18":3,"76":1}}],["p",{"2":{"9":1}}],["people",{"2":{"28":1}}],["pet",{"2":{"9":1}}],["perfect",{"2":{"27":1}}],["perfectly",{"2":{"27":1}}],["performant",{"2":{"27":1}}],["performance",{"2":{"23":1,"25":1,"29":1,"37":1}}],["performed",{"2":{"27":1}}],["perform",{"2":{"27":1}}],["percent",{"2":{"23":1,"99":1}}],["perspective",{"2":{"25":2}}],["persistentsessionreviveprocess",{"2":{"20":1}}],["person",{"2":{"2":1,"20":1,"36":2}}],["personal",{"2":{"2":1}}],["pereditorgroup",{"2":{"20":1}}],["per",{"2":{"8":1,"27":1}}],["permissions",{"2":{"2":1,"9":1}}],["permission",{"2":{"2":1}}],["phpcs",{"2":{"20":2}}],["phpunit",{"2":{"20":1}}],["php",{"2":{"3":1,"20":2,"36":1,"37":2}}],["photo",{"2":{"2":1}}],["pure",{"2":{"32":1,"35":1,"67":1}}],["purpose",{"2":{"23":1,"25":1,"37":1}}],["purposes",{"2":{"9":1}}],["pug",{"2":{"23":1}}],["pugtools",{"2":{"20":1}}],["pullapprove",{"2":{"20":2}}],["puppeteer",{"2":{"20":10}}],["publishing",{"2":{"64":1}}],["public",{"2":{"3":1,"16":4,"36":1}}],["pubspec",{"2":{"20":3}}],["pubxml",{"2":{"20":2}}],["push",{"2":{"6":1,"9":4,"27":1,"92":1}}],["put",{"2":{"9":1,"10":1,"16":2,"20":1,"25":2,"36":1,"85":1}}],["putting",{"2":{"3":1}}],["puts",{"2":{"2":1}}],["pleasant",{"2":{"35":1}}],["please",{"2":{"20":1}}],["plenty",{"2":{"3":1}}],["plugging",{"2":{"67":1}}],["plug",{"2":{"29":2}}],["plugin",{"2":{"19":2,"20":1,"37":3,"78":3}}],["plugins",{"2":{"19":4,"20":1,"25":1,"106":1}}],["plus",{"2":{"2":1,"9":1,"25":1}}],["planned",{"0":{"108":1},"2":{"71":1}}],["plans",{"2":{"3":2,"8":2}}],["play",{"2":{"36":1}}],["plays",{"2":{"27":1}}],["played",{"2":{"25":1,"36":1}}],["playground",{"2":{"20":1}}],["playwright",{"2":{"20":10}}],["places",{"2":{"37":1}}],["place",{"2":{"23":1,"27":1}}],["placed",{"2":{"8":1,"16":2}}],["placeholder",{"2":{"3":1}}],["placing",{"2":{"3":1,"37":1}}],["pba",{"2":{"2":1}}],["pops",{"2":{"111":1}}],["populated",{"2":{"25":1}}],["popular",{"2":{"3":1,"9":1,"19":1,"20":1,"23":1,"35":1,"37":1,"71":2,"99":1,"108":1}}],["popups",{"2":{"23":1}}],["polymorphism",{"2":{"28":1}}],["policy",{"2":{"2":2}}],["points",{"2":{"61":1}}],["point",{"2":{"25":1,"37":2,"59":1}}],["poorly",{"2":{"23":1}}],["portfolio",{"2":{"69":1,"70":1,"71":1}}],["port",{"2":{"4":1}}],["portal",{"2":{"2":1}}],["position",{"2":{"27":1,"70":1}}],["postcss",{"2":{"20":10}}],["postcssrc",{"2":{"20":10}}],["postman",{"2":{"4":1,"20":1}}],["postgresql",{"2":{"3":1}}],["possibilities",{"2":{"20":1}}],["possibility",{"2":{"2":1,"26":1,"29":1,"71":2}}],["possibly",{"2":{"3":1,"9":1}}],["possible",{"2":{"2":2,"23":1,"25":1,"27":3,"35":1,"37":2,"64":1,"67":1,"112":1,"120":1}}],["poke",{"2":{"3":1}}],["powerful",{"2":{"12":1}}],["power",{"2":{"2":1,"25":1,"28":1}}],["pr",{"2":{"58":1}}],["practical",{"2":{"36":1}}],["practice",{"2":{"23":1,"25":2,"70":1}}],["practices",{"0":{"12":1},"1":{"13":1,"14":1,"15":1},"2":{"2":1,"35":1,"36":5,"59":1,"61":1,"70":2,"71":2}}],["price",{"2":{"37":1}}],["primitive",{"2":{"25":1}}],["primitives",{"2":{"23":2}}],["primevue",{"2":{"24":1}}],["private",{"2":{"9":6,"10":1,"25":1}}],["print",{"2":{"23":1}}],["printwidth",{"2":{"20":1}}],["printf",{"2":{"9":1}}],["printed",{"2":{"4":1}}],["principle",{"2":{"4":1,"27":1}}],["preserving",{"2":{"99":1}}],["presence",{"2":{"26":1,"27":1}}],["presentation",{"2":{"35":1}}],["present",{"2":{"25":1}}],["preprocessor",{"2":{"67":1}}],["precisely",{"2":{"37":1}}],["prerenderer",{"2":{"37":1}}],["pre",{"2":{"36":1,"37":1}}],["prevent",{"2":{"79":1}}],["prevalent",{"2":{"36":1}}],["prevalence",{"2":{"27":1}}],["previous",{"2":{"36":1}}],["previously",{"2":{"9":1}}],["preview",{"2":{"20":1}}],["pretentious",{"2":{"23":1}}],["prettier",{"2":{"20":14}}],["pretty",{"2":{"3":1,"102":2}}],["preferredtagnamecase",{"2":{"20":1}}],["preloader",{"2":{"12":2,"107":1}}],["promise",{"2":{"74":2}}],["promises",{"2":{"36":1}}],["proven",{"2":{"59":1,"70":1}}],["providing",{"2":{"12":1}}],["provides",{"2":{"4":1}}],["provider",{"2":{"3":2,"28":1}}],["providers",{"2":{"3":1,"5":1,"8":3,"36":1,"108":1}}],["provided",{"2":{"3":2,"110":1}}],["provide",{"2":{"3":3,"8":2,"10":1,"11":1,"12":2,"25":3,"35":1}}],["progressive",{"2":{"37":1}}],["programmatically",{"2":{"23":1}}],["programmers",{"2":{"27":2,"61":1}}],["programmer",{"2":{"23":1,"27":2,"28":1}}],["programming",{"2":{"3":2,"27":3,"36":2}}],["programs",{"2":{"20":1}}],["program",{"2":{"4":1,"23":1,"27":2,"28":1}}],["professional",{"2":{"31":1}}],["pros",{"2":{"25":1,"35":2}}],["procfile",{"2":{"20":2}}],["processed",{"2":{"36":1}}],["processing",{"2":{"28":1}}],["processor",{"2":{"20":1}}],["process",{"2":{"6":1,"9":1,"10":1,"16":1,"26":1,"37":1}}],["proj",{"2":{"20":2}}],["projectname",{"2":{"64":1}}],["projects",{"2":{"9":1,"10":2,"19":1,"26":2,"27":1,"35":1,"36":1,"60":1}}],["project",{"0":{"34":1,"60":1},"2":{"3":1,"6":1,"8":1,"9":10,"10":4,"19":3,"20":1,"25":1,"28":1,"32":1,"34":1,"35":1,"36":1,"59":2,"64":6,"65":1,"69":2,"70":1,"84":1}}],["proposed",{"2":{"37":1}}],["property=",{"2":{"115":7}}],["properties",{"2":{"37":1}}],["proper",{"2":{"35":1}}],["prop",{"2":{"11":1,"12":2,"25":1}}],["props",{"2":{"11":1,"12":1,"15":1,"17":11,"25":2}}],["probability",{"2":{"26":1}}],["probably",{"2":{"10":1,"27":1,"37":1}}],["problems",{"2":{"4":2,"25":1,"37":1}}],["problem",{"2":{"3":1,"9":1,"16":1,"25":1,"36":1,"37":1}}],["prod",{"2":{"9":5}}],["productive",{"2":{"20":1}}],["production",{"2":{"19":1,"26":1}}],["productid",{"2":{"15":1}}],["product",{"2":{"6":1,"10":2,"15":2,"36":1,"37":1}}],["products",{"2":{"1":3,"15":1}}],["proxy",{"2":{"4":2,"5":1,"23":2,"27":2}}],["protocols",{"0":{"5":1},"2":{"5":1,"36":1}}],["protocol",{"2":{"4":1,"8":1,"75":1}}],["protect",{"2":{"4":1}}],["palettes",{"2":{"108":1}}],["paid",{"2":{"36":1}}],["payment",{"2":{"28":1}}],["pascal",{"2":{"20":1}}],["pass",{"2":{"11":1,"25":3}}],["passing",{"2":{"11":1,"12":1}}],["passes",{"2":{"2":1}}],["password",{"2":{"2":1,"25":1}}],["paths",{"2":{"19":2}}],["path",{"2":{"12":4,"17":1,"19":3}}],["pattern",{"2":{"12":1,"23":1,"25":2,"27":1}}],["patterns",{"0":{"10":1},"1":{"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"20":1,"35":1,"36":2,"61":1}}],["packages",{"2":{"19":1,"20":2,"71":1}}],["package",{"2":{"10":1,"19":1,"20":8,"23":1,"24":1,"29":1,"67":2,"102":2}}],["panel",{"2":{"10":1,"110":1}}],["page",{"2":{"4":6,"16":1,"26":1,"37":8,"97":1}}],["pagespeed",{"2":{"37":2}}],["pages",{"0":{"83":1},"1":{"84":1,"85":1},"2":{"4":3,"6":1,"8":3,"9":11,"12":1,"35":1,"36":1,"37":2,"64":1,"84":6,"105":2}}],["paragraphs",{"2":{"36":1,"99":1}}],["parameter",{"2":{"64":1,"85":1,"99":1}}],["parameters",{"2":{"9":1,"64":1,"71":1,"72":1,"108":1}}],["params",{"2":{"1":2,"75":1}}],["particular",{"2":{"99":1}}],["participation",{"0":{"60":1}}],["partially",{"2":{"25":3,"27":2}}],["part",{"2":{"23":1,"25":1,"36":2,"105":2}}],["party",{"0":{"30":1},"2":{"2":1,"4":5,"5":1,"25":1,"29":1,"37":1,"67":2,"118":1}}],["parts",{"2":{"2":1,"108":1}}],["vwa",{"2":{"111":1,"120":11}}],["v1",{"0":{"39":1,"41":1,"43":1,"46":1,"49":1},"1":{"40":1,"42":1,"44":1,"45":1,"47":1,"48":1,"50":1}}],["vulnerability",{"2":{"29":1}}],["vulnerabilities",{"2":{"25":1}}],["vuesence",{"2":{"66":1}}],["vuefaq",{"2":{"62":1}}],["vuetify",{"2":{"35":1}}],["vuejs",{"2":{"25":1,"61":4}}],["vuex",{"2":{"25":6,"45":1}}],["vue",{"0":{"13":1,"25":1,"36":1,"52":1,"64":1,"68":1},"1":{"65":1,"69":1,"70":1},"2":{"9":1,"10":2,"11":1,"12":2,"13":1,"14":1,"16":1,"17":2,"19":4,"20":15,"22":1,"23":7,"25":12,"26":1,"27":17,"35":2,"36":20,"37":1,"40":2,"42":1,"52":1,"58":1,"60":2,"61":2,"64":7,"65":1,"66":2,"67":3,"69":3,"70":4,"71":3,"72":2,"76":2,"84":2,"85":1,"101":1,"102":2,"110":1,"119":1}}],["vetur",{"2":{"20":2}}],["verified",{"2":{"37":1,"61":1}}],["verifies",{"2":{"2":2}}],["versionrc",{"2":{"20":2}}],["versions",{"2":{"20":3}}],["versioning",{"2":{"10":1,"118":1}}],["version",{"2":{"9":8,"20":3,"36":1,"37":1,"74":1,"108":1,"118":2}}],["vercel",{"2":{"8":1,"20":2,"108":1}}],["very",{"2":{"2":3,"3":2,"8":1,"20":3,"23":4,"25":1,"26":1,"34":1,"35":1,"36":2,"37":3,"58":1,"75":1,"99":3}}],["vbproj",{"2":{"20":1}}],["vb",{"2":{"20":6}}],["volar",{"2":{"20":4}}],["v",{"2":{"17":3}}],["vs",{"2":{"10":1,"20":7,"27":1,"102":1}}],["vscode",{"2":{"9":1,"20":9}}],["v4",{"2":{"9":5}}],["v2",{"2":{"9":3}}],["v3",{"2":{"9":4}}],["vars",{"2":{"120":1}}],["various",{"2":{"36":1,"108":1}}],["variations",{"2":{"71":1}}],["variant",{"2":{"5":1,"23":1}}],["variants",{"2":{"2":1,"107":1,"108":3,"112":1}}],["variables",{"2":{"23":1,"25":1,"27":2,"120":2}}],["variable",{"2":{"2":1,"23":2,"25":3,"27":6,"111":1}}],["var",{"2":{"9":4}}],["validation",{"2":{"25":1}}],["validate",{"2":{"20":1}}],["valid",{"2":{"2":2}}],["values",{"2":{"64":1,"115":1}}],["value",{"2":{"1":2,"9":1,"15":1,"20":1,"23":1,"25":1,"27":4,"74":1,"92":1,"101":1,"118":1}}],["visual",{"2":{"27":1,"59":1}}],["visualization",{"2":{"25":1,"27":1,"35":1}}],["visualizer",{"2":{"19":4}}],["visuals",{"2":{"20":1}}],["visible",{"2":{"2":1,"20":1}}],["videos",{"2":{"36":3}}],["video",{"2":{"16":1,"36":1,"37":1}}],["view",{"2":{"12":3,"25":3,"27":2,"59":1,"71":1}}],["views",{"2":{"10":1,"12":1}}],["virtual",{"2":{"3":1,"8":1,"23":1,"36":1}}],["via",{"0":{"64":1},"1":{"65":1},"2":{"1":1,"2":3,"3":1,"5":1,"8":1,"9":1,"12":1,"16":2,"20":1,"23":2,"25":1,"72":1,"78":1,"110":1,"120":1}}],["vitest",{"2":{"20":10,"26":1}}],["vitepress",{"2":{"9":1,"34":1,"36":1,"70":1}}],["vite",{"0":{"85":1},"2":{"1":1,"4":1,"16":1,"17":1,"19":13,"20":3,"37":3,"61":1,"67":1,"75":1,"78":2,"85":1}}],["effective",{"2":{"71":1}}],["effort",{"2":{"28":1}}],["efficiency",{"2":{"23":1}}],["efficiently",{"2":{"27":1,"28":1,"70":1,"71":1}}],["efficient",{"2":{"23":1,"27":1,"37":1,"67":2}}],["e2e2e3",{"2":{"120":2}}],["e2e",{"2":{"26":5}}],["empty",{"2":{"70":1}}],["email",{"2":{"62":1}}],["embla",{"2":{"22":1}}],["emmet",{"2":{"20":2}}],["eex",{"2":{"20":1}}],["eol",{"2":{"20":1}}],["education",{"2":{"117":1}}],["edited",{"2":{"117":1}}],["edit",{"2":{"58":1}}],["editorconfig",{"2":{"20":2}}],["editortab",{"2":{"20":1}}],["editorgroup",{"2":{"20":1}}],["editor",{"2":{"20":31}}],["edge",{"2":{"3":2}}],["element",{"2":{"27":1,"59":1,"72":1}}],["elements",{"2":{"2":1,"6":1,"23":4,"26":1,"27":1,"33":1,"37":2}}],["else",{"2":{"17":1,"20":1,"36":1}}],["e88a22df",{"2":{"16":1}}],["evolution",{"2":{"35":1}}],["evolving",{"2":{"27":1}}],["evan",{"2":{"27":1}}],["evaluate",{"2":{"12":1}}],["ever",{"2":{"11":1}}],["everyone",{"2":{"37":1}}],["everybody",{"2":{"25":1}}],["everything",{"2":{"20":1,"23":2,"27":1,"59":1,"66":1}}],["every",{"2":{"1":1}}],["events",{"2":{"25":1}}],["event",{"2":{"5":1,"20":1,"25":1}}],["even",{"2":{"2":1,"4":1,"18":1,"23":1,"25":2,"27":1,"35":1,"36":3,"99":1}}],["ecosystem",{"2":{"20":1,"23":1,"71":1}}],["economical",{"2":{"3":1}}],["echo",{"2":{"9":8}}],["established",{"2":{"70":1}}],["es6",{"2":{"23":1,"27":1}}],["esbenp",{"2":{"20":4}}],["esbuild",{"2":{"19":1}}],["eslint",{"2":{"19":3,"20":17,"36":1,"67":2}}],["esnext",{"2":{"19":1}}],["especially",{"2":{"5":1,"26":1,"71":1}}],["essence",{"2":{"2":1}}],["errors",{"2":{"20":1}}],["error",{"2":{"4":1,"9":1}}],["e",{"2":{"3":1,"11":1,"16":1,"25":1,"27":1,"37":1,"67":1}}],["etc",{"2":{"3":1,"10":1,"19":1,"26":1,"33":1,"37":1,"59":1,"69":2,"70":1,"71":4,"78":1,"120":1}}],["either",{"2":{"2":1,"16":1,"35":1}}],["enhance",{"2":{"119":1}}],["enough",{"2":{"37":1,"70":1}}],["english",{"2":{"36":1}}],["engines",{"2":{"37":1}}],["engine",{"2":{"23":1,"36":1,"37":1}}],["engineer",{"2":{"6":1,"62":1}}],["encapsulates",{"2":{"27":1}}],["encapsulated",{"2":{"27":1}}],["encoded",{"2":{"16":1}}],["entering",{"2":{"64":1}}],["enter",{"2":{"58":1}}],["enters",{"2":{"27":1}}],["entrance",{"2":{"37":1}}],["entry",{"2":{"27":1,"37":1}}],["entities",{"2":{"27":1}}],["entity",{"2":{"25":3}}],["entirely",{"2":{"119":1}}],["entire",{"2":{"18":1,"23":1,"25":1,"99":1}}],["en",{"2":{"20":3}}],["enablesmartcommit",{"2":{"20":1}}],["enable",{"2":{"20":4,"23":1,"71":2}}],["enabled",{"2":{"2":1,"20":9,"23":1,"66":1}}],["endpoint",{"2":{"3":2}}],["endpoints",{"2":{"3":2}}],["end",{"2":{"2":1,"3":5,"5":1,"6":1,"20":1,"26":4,"27":1,"28":1,"37":1,"71":1}}],["envrc",{"2":{"20":12}}],["envs",{"2":{"9":2}}],["environment",{"2":{"9":3,"20":1,"70":1}}],["environments",{"2":{"8":1,"9":1}}],["env",{"2":{"1":1,"9":26,"20":38,"75":1}}],["earlier",{"2":{"20":1}}],["eager",{"2":{"18":2}}],["easy",{"2":{"8":1,"12":2,"16":1,"36":1,"67":1}}],["easingthemes",{"2":{"9":2}}],["easier",{"2":{"9":1,"27":2,"30":2,"35":1,"37":1}}],["easiest",{"2":{"3":1,"36":1}}],["easily",{"2":{"1":1,"36":1,"74":1}}],["each",{"2":{"2":4,"9":3,"10":4,"19":2,"20":1,"25":3,"27":2,"37":1,"71":1,"72":1,"74":1,"118":1}}],["existing",{"2":{"36":1,"64":1}}],["exist",{"2":{"27":1}}],["exiting",{"2":{"9":1}}],["excellent",{"2":{"36":1}}],["exceptional",{"2":{"37":1}}],["except",{"2":{"25":1}}],["exclude",{"2":{"9":1,"20":1}}],["execution",{"2":{"23":1}}],["executes",{"2":{"37":1}}],["execute",{"2":{"9":1}}],["executed",{"2":{"3":1,"12":1}}],["exs",{"2":{"20":5}}],["extreme",{"2":{"36":1}}],["extractor",{"2":{"20":11}}],["external",{"2":{"25":1}}],["extensibility",{"2":{"35":1}}],["extension",{"2":{"20":1,"27":1,"102":2}}],["extensions",{"0":{"102":1},"2":{"4":1,"20":6,"76":1,"102":1}}],["extend",{"2":{"19":1}}],["ex",{"2":{"20":1}}],["express",{"2":{"37":1}}],["experiment",{"2":{"36":1}}],["experimenting",{"2":{"27":1}}],["experience",{"2":{"5":1,"36":3,"37":1,"59":4,"62":1,"119":1}}],["experienced",{"2":{"5":1,"36":2,"61":2,"70":1,"71":1}}],["expediency",{"2":{"26":1}}],["expanding",{"2":{"108":1}}],["expand",{"2":{"20":1,"36":1}}],["expandmode",{"2":{"20":1}}],["explained",{"2":{"36":1}}],["explorer",{"2":{"20":6}}],["explicitly",{"2":{"67":1,"70":1}}],["explicit",{"2":{"1":1}}],["expires",{"2":{"2":2}}],["expired",{"2":{"2":1}}],["exports",{"2":{"18":1}}],["export",{"2":{"1":2,"12":1,"14":1,"18":1,"19":1,"25":2,"75":2}}],["examples",{"2":{"36":1,"71":1}}],["example",{"2":{"1":2,"2":5,"3":5,"4":2,"6":2,"9":1,"10":3,"12":3,"18":2,"20":2,"25":4,"27":4,"29":1,"30":1,"33":1,"37":1,"101":1,"111":1}}],["hurry",{"2":{"29":1}}],["huskyrc",{"2":{"20":2}}],["huge",{"2":{"18":1}}],["hxx",{"2":{"20":3}}],["hpp",{"2":{"20":3}}],["hmr",{"2":{"19":1}}],["h",{"2":{"9":1,"20":4}}],["hotel",{"2":{"37":1}}],["home",{"2":{"37":1,"64":1,"117":1}}],["horizons",{"2":{"36":1}}],["hood",{"2":{"27":1,"36":1}}],["hooks",{"2":{"20":4}}],["holding",{"2":{"25":2}}],["hoppscotch",{"2":{"20":1}}],["houdini",{"2":{"20":1}}],["hover",{"2":{"20":1}}],["hosts",{"2":{"25":1}}],["hosted",{"2":{"8":1}}],["hosting",{"0":{"8":1},"2":{"8":3,"71":1}}],["host",{"2":{"4":1,"8":2,"9":10}}],["however",{"2":{"24":1,"25":2,"102":1}}],["how",{"2":{"2":1,"3":3,"5":1,"10":1,"12":2,"16":1,"18":1,"19":3,"20":1,"23":1,"25":3,"35":1,"36":3,"37":2,"40":1,"42":1}}],["html5",{"2":{"33":1,"54":1,"67":1}}],["htmlnanorc",{"2":{"20":20}}],["html=",{"2":{"17":1}}],["html",{"0":{"54":1,"78":1},"2":{"4":1,"8":1,"9":2,"16":2,"20":6,"27":3,"36":1,"37":10,"72":1,"78":2,"92":2,"115":2,"119":1}}],["https",{"2":{"4":6,"8":1,"20":2,"37":1,"66":1,"74":1,"75":1,"84":1,"92":1}}],["httponly",{"2":{"2":3}}],["http",{"2":{"1":11,"3":1,"4":3,"16":1,"74":5,"75":4}}],["hello",{"2":{"99":1}}],["helpful",{"0":{"21":1},"1":{"22":1,"23":1},"2":{"48":1}}],["helps",{"2":{"18":1,"36":1,"70":1}}],["help",{"2":{"4":1,"20":1,"35":1,"36":3}}],["heavy",{"2":{"37":1}}],["heavyweight",{"2":{"23":1,"24":1,"99":1}}],["heading",{"2":{"84":1}}],["headless",{"2":{"26":1,"35":1,"71":1}}],["header>",{"2":{"76":1,"97":2}}],["header",{"2":{"10":1,"33":1,"64":2,"71":2,"76":2,"94":1,"95":1,"96":1,"105":1,"108":1,"109":1,"111":1}}],["headers",{"0":{"93":1},"1":{"94":1,"95":1,"96":1,"97":1},"2":{"4":1,"75":1,"93":1,"97":1}}],["heidisql",{"2":{"20":1}}],["height",{"2":{"17":7}}],["heex",{"2":{"20":1}}],["hexcolorlength",{"2":{"20":1}}],["heroku",{"2":{"8":1,"108":1}}],["here",{"2":{"3":1,"5":1,"24":1,"25":3,"36":1,"100":1}}],["he",{"2":{"2":1,"25":1,"27":1}}],["half",{"2":{"100":1}}],["hack",{"2":{"79":1}}],["hamburger",{"2":{"76":1,"81":1,"109":1,"111":1}}],["harmful",{"2":{"36":1}}],["hardware",{"2":{"37":2}}],["hard",{"2":{"19":1}}],["happen",{"2":{"25":1}}],["happened",{"2":{"25":1}}],["had",{"2":{"23":1,"25":1}}],["handled",{"2":{"37":1}}],["handle",{"2":{"36":1,"37":1}}],["handles",{"2":{"27":1}}],["handling",{"2":{"28":1}}],["handy",{"0":{"24":1},"2":{"20":1,"34":1}}],["hand",{"2":{"20":1,"25":1,"70":2}}],["have",{"2":{"2":3,"3":1,"9":1,"11":1,"12":1,"16":1,"20":2,"23":3,"25":4,"27":2,"28":2,"29":1,"35":2,"36":1,"37":1,"70":1,"85":2,"119":1}}],["hash",{"2":{"16":1}}],["hassles",{"2":{"2":1}}],["has",{"2":{"2":7,"3":1,"5":1,"9":2,"10":1,"19":1,"23":3,"25":5,"27":3,"37":1,"84":1,"99":2,"102":1}}],["hide=",{"2":{"97":1}}],["hidden",{"2":{"1":1,"79":1,"109":1}}],["high",{"2":{"67":1}}],["highly",{"2":{"26":1}}],["highlightmodifiedtabs",{"2":{"20":1}}],["hierarchical",{"2":{"35":1}}],["hierarchize",{"2":{"27":1}}],["hierarchy",{"2":{"25":2}}],["hints",{"0":{"21":1},"1":{"22":1,"23":1},"2":{"48":1}}],["himself",{"2":{"25":1,"35":1,"70":1}}],["him",{"2":{"2":1,"6":1,"28":2}}],["historically",{"2":{"25":1}}],["history",{"2":{"20":5}}],["histoire",{"2":{"20":10}}],["his",{"2":{"2":2,"3":1,"20":1}}],["uri",{"2":{"75":1}}],["url",{"2":{"1":1,"16":2,"18":1,"75":1,"115":2,"117":1}}],["ux",{"2":{"37":2,"59":1,"67":1,"82":1,"105":1,"118":1}}],["uis",{"2":{"27":1}}],["ui",{"0":{"30":1,"35":1},"2":{"19":1,"24":2,"26":1,"27":2,"28":2,"30":1,"32":1,"35":9,"59":1,"67":1,"71":1,"76":1,"95":1,"96":1}}],["uuid",{"2":{"14":6,"15":1}}],["u",{"2":{"12":1}}],["utility",{"2":{"25":1,"76":1}}],["utilities",{"0":{"30":1},"2":{"10":2,"30":1}}],["utils",{"2":{"1":3,"10":1,"14":1,"17":2,"74":3,"75":5,"76":2,"78":1,"101":1}}],["upper",{"2":{"72":1}}],["upgrading",{"2":{"37":1}}],["upgrade",{"2":{"35":1}}],["up",{"2":{"9":1,"19":1,"20":3,"23":1,"26":1,"28":2,"35":3,"36":1,"70":1,"75":1,"99":1}}],["updating",{"2":{"9":1,"27":1}}],["updates",{"2":{"27":1}}],["updated",{"2":{"26":1,"27":2}}],["update",{"2":{"9":3,"20":1}}],["upload",{"2":{"9":3,"36":1}}],["ubuntu",{"2":{"9":3,"64":1}}],["usability",{"2":{"59":1}}],["usage",{"0":{"101":1},"2":{"23":1}}],["usual",{"2":{"27":1}}],["usually",{"2":{"5":1,"12":1,"23":1,"25":2,"26":1,"27":1,"36":1,"37":1,"70":1,"99":1}}],["us",{"2":{"20":1}}],["using",{"2":{"3":2,"4":1,"5":1,"8":1,"9":1,"10":1,"16":1,"19":2,"25":3,"27":1,"35":1,"37":2,"58":1,"59":1,"71":1,"107":1}}],["usetouchswipe",{"2":{"82":1}}],["uselessly",{"2":{"36":1}}],["useless",{"2":{"36":1,"102":1}}],["usenewswidget",{"2":{"27":1}}],["useappconfig",{"2":{"76":3}}],["useapploader",{"0":{"14":1},"2":{"13":3,"14":1,"15":3}}],["useauthstore",{"2":{"25":1}}],["useauthservice",{"2":{"25":1}}],["useauth",{"2":{"1":4,"25":1}}],["usei18nlight",{"0":{"100":1},"2":{"101":2}}],["usei18n",{"2":{"10":1,"27":1,"101":4}}],["usescreenwidth",{"2":{"72":6}}],["usescreensize",{"2":{"27":1}}],["useshoppingcart",{"2":{"27":1}}],["uses",{"2":{"9":11,"17":1,"19":1,"23":3,"27":1,"67":2,"76":2,"84":1}}],["usefulness",{"2":{"26":1}}],["useful",{"2":{"6":1,"9":1,"20":4,"25":1,"26":1,"28":1,"36":3,"37":2,"42":1,"66":1,"102":1,"108":1}}],["use",{"0":{"11":1,"30":1,"32":1,"33":1},"2":{"2":1,"3":1,"5":2,"10":3,"16":3,"19":2,"20":2,"23":3,"25":3,"26":1,"27":2,"28":2,"30":2,"32":1,"34":1,"35":2,"36":2,"37":4,"67":3,"71":1,"75":1,"76":1,"84":1,"101":1,"102":2,"118":1}}],["used",{"2":{"2":3,"4":3,"9":2,"10":1,"19":2,"23":2,"25":2,"27":3,"28":1,"36":1,"61":1,"67":3,"72":1,"75":1,"111":1,"118":1}}],["userloggedin",{"2":{"25":1}}],["useraccountview",{"2":{"12":1}}],["username",{"2":{"2":1,"9":2,"25":1}}],["user",{"2":{"1":2,"2":16,"9":8,"10":1,"11":2,"20":3,"23":1,"25":3,"26":1,"27":4,"28":1,"37":3,"59":4,"67":1,"71":1,"97":1,"109":1,"117":1,"119":1,"120":1}}],["userid",{"2":{"1":1}}],["users",{"2":{"1":7,"2":2,"28":1,"37":2}}],["userdata",{"2":{"1":1}}],["unwanted",{"2":{"70":1}}],["unnecessarily",{"2":{"67":1}}],["unnecessary",{"2":{"2":1,"5":1,"25":1}}],["unless",{"2":{"32":1,"67":1}}],["unlike",{"2":{"25":1}}],["unlighthouse",{"2":{"20":2}}],["unequivocally",{"2":{"27":1}}],["unfortunate",{"2":{"25":1}}],["unfortunately",{"2":{"20":1}}],["unoptimized",{"2":{"37":1}}],["unocss",{"2":{"20":10}}],["uno",{"2":{"20":10}}],["untrackedchanges",{"2":{"20":1}}],["unified",{"2":{"35":1}}],["unification",{"2":{"5":1}}],["unit",{"2":{"26":6}}],["unicodehighlight",{"2":{"20":1}}],["universal",{"2":{"16":2}}],["unique",{"2":{"15":1,"25":2}}],["under",{"2":{"6":1,"27":1,"60":1,"84":5}}],["understanding",{"2":{"36":1}}],["understand",{"2":{"12":1,"25":1,"36":2,"37":1}}],["understandable",{"2":{"5":1}}],["understood",{"2":{"2":1}}],["undeservedly",{"2":{"2":1}}],["=+",{"2":{"20":1}}],["==",{"2":{"9":3}}],["=>",{"2":{"9":2,"14":1,"17":2,"101":1}}],["=",{"2":{"1":5,"9":1,"12":3,"13":1,"14":3,"15":2,"17":3,"18":6,"23":6,"25":1,"27":1,"72":1,"74":3,"75":2,"76":2,"92":1,"101":3}}],["fcp",{"2":{"37":1}}],["fnc",{"2":{"23":1,"24":1}}],["fly",{"2":{"37":1,"99":1}}],["flagship",{"2":{"27":1}}],["flake",{"2":{"20":2}}],["flow",{"2":{"23":1,"27":1,"56":1}}],["flowconfig",{"2":{"20":2}}],["fls",{"2":{"20":1}}],["flex",{"2":{"72":3}}],["flexbox",{"2":{"32":1,"33":1,"55":2}}],["flexible",{"2":{"25":1,"27":1}}],["flexibility",{"2":{"5":1,"25":1}}],["fledged",{"2":{"3":2,"67":1}}],["fdb",{"2":{"20":1}}],["feature",{"2":{"27":1}}],["features",{"0":{"33":1},"2":{"3":1,"23":1,"25":1,"37":2,"99":1}}],["fetish",{"2":{"26":1}}],["fetch",{"2":{"1":1,"9":1,"70":1,"74":1}}],["ferferga",{"2":{"25":1}}],["few",{"2":{"4":1,"24":1,"70":1,"71":1}}],["future",{"2":{"71":1}}],["further",{"2":{"69":1,"70":1,"71":1}}],["fundamental",{"2":{"27":1}}],["functional",{"2":{"25":1,"71":2}}],["functionality",{"2":{"23":2,"28":1,"34":1,"35":1,"64":1,"66":2,"67":4,"69":1,"70":1,"71":2,"82":1,"99":2,"100":1,"103":1,"108":1}}],["function",{"2":{"12":1,"14":3,"15":1,"17":1,"18":3,"23":1,"25":3,"28":1,"29":2,"67":1,"72":2,"74":1,"82":1,"92":1,"99":1,"101":1}}],["functions",{"2":{"3":3,"10":1,"12":1,"25":9,"27":2,"28":1}}],["fu",{"2":{"20":1,"67":1}}],["fullstack",{"2":{"5":1,"20":1}}],["fullstackers",{"2":{"5":1}}],["full",{"2":{"3":2,"25":1,"35":1,"62":1,"67":1}}],["frequently",{"2":{"61":2}}],["freezed",{"2":{"20":1}}],["free",{"2":{"3":3,"8":2,"36":3}}],["fragments",{"2":{"71":1,"78":1}}],["frantically",{"2":{"20":1}}],["frameworks",{"0":{"27":1},"2":{"27":3,"45":1,"70":1}}],["framework",{"2":{"4":1,"23":4,"25":1,"27":1,"67":1,"70":2,"99":1,"108":1}}],["friendly",{"2":{"19":1,"36":1}}],["front",{"2":{"2":6,"3":4,"5":1,"6":1,"20":1,"26":2,"27":1,"28":1,"71":1}}],["frontenders",{"0":{"3":1}}],["frontend",{"0":{"27":1,"28":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1},"2":{"2":3,"3":3,"4":1,"5":2,"8":1,"20":1,"25":5,"26":2,"27":5,"28":3,"36":2,"37":1,"40":1,"42":1,"45":2,"61":1,"70":1}}],["from",{"0":{"66":1},"2":{"1":10,"2":1,"3":1,"4":7,"8":1,"9":3,"12":1,"13":1,"14":2,"15":1,"16":9,"17":3,"18":3,"19":3,"20":1,"23":1,"25":8,"26":2,"27":3,"28":1,"31":1,"36":7,"37":7,"59":1,"61":1,"71":1,"72":1,"74":2,"75":5,"76":3,"80":1,"84":1,"85":1,"99":1,"101":2,"109":1,"112":1}}],["fix",{"2":{"20":1,"28":1}}],["fixall",{"2":{"20":2}}],["field",{"2":{"18":2,"25":1,"27":2}}],["finance",{"2":{"99":1}}],["final",{"2":{"28":1,"35":1}}],["finished",{"2":{"36":1}}],["fine",{"2":{"20":1,"71":1}}],["finding",{"2":{"99":1}}],["find",{"2":{"18":1,"20":1,"37":1,"101":1}}],["fingerprint",{"2":{"2":1}}],["filling",{"2":{"69":1,"71":1}}],["fill",{"2":{"17":1}}],["filenesting",{"2":{"20":3}}],["filename",{"2":{"18":10}}],["filelistlayout",{"2":{"20":1}}],["file=",{"2":{"9":1}}],["files",{"2":{"8":1,"9":3,"16":1,"17":1,"19":2,"20":4,"37":2,"76":1,"101":1}}],["file",{"2":{"4":1,"9":9,"17":1,"20":3,"37":2,"64":2,"78":1,"117":1,"120":2}}],["fi",{"2":{"9":2}}],["firesbase",{"2":{"108":1}}],["firestore",{"2":{"36":1}}],["firebase",{"2":{"3":2,"8":2,"20":4,"108":1}}],["fira",{"2":{"20":1}}],["first",{"2":{"2":2,"18":1,"20":1,"25":2,"36":2,"37":4,"61":1,"97":1,"118":1}}],["fight",{"2":{"2":1}}],["follows",{"2":{"74":1}}],["follow",{"2":{"36":1}}],["following",{"2":{"28":1,"86":1,"105":1}}],["folder",{"2":{"9":1,"16":6}}],["found",{"2":{"25":1}}],["four",{"2":{"2":1,"72":1}}],["font",{"2":{"120":1}}],["fonts",{"2":{"118":1}}],["fontweight",{"2":{"20":1}}],["fontligatures",{"2":{"20":1}}],["fontfamily",{"2":{"20":1}}],["fontaliasing",{"2":{"20":1}}],["footers",{"0":{"86":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1},"2":{"86":1}}],["footer",{"2":{"10":1,"64":2,"71":2,"105":1,"108":1,"109":1}}],["fork",{"2":{"58":1}}],["forgotten",{"2":{"32":1}}],["forget",{"2":{"23":1}}],["foreign",{"2":{"25":1,"35":1}}],["forbidden",{"2":{"2":1}}],["forces",{"2":{"9":1}}],["force",{"2":{"2":1}}],["forms",{"2":{"37":1,"108":1}}],["formulate",{"2":{"20":10}}],["formkit",{"2":{"20":10}}],["formatters",{"2":{"23":2}}],["formatter",{"2":{"20":1}}],["formatting",{"2":{"20":2,"23":1,"37":1,"67":1}}],["formatonsave",{"2":{"20":1}}],["formats",{"2":{"18":1,"20":1}}],["format",{"2":{"3":1,"5":1,"9":3,"18":2,"20":2,"37":2,"64":1}}],["form",{"2":{"2":1,"3":2,"23":1,"25":1,"58":1}}],["forming",{"2":{"1":1}}],["for",{"0":{"3":1},"2":{"2":15,"3":9,"4":2,"5":6,"6":6,"8":3,"9":6,"10":7,"12":8,"16":2,"18":4,"19":5,"20":14,"21":1,"22":1,"23":7,"24":2,"25":13,"26":3,"27":8,"28":2,"29":1,"30":3,"31":1,"32":1,"33":1,"34":1,"35":4,"36":9,"37":16,"61":1,"64":1,"66":1,"67":4,"69":2,"70":6,"71":2,"72":2,"74":1,"75":2,"76":1,"81":2,"92":1,"99":3,"102":2,"105":6,"108":5,"111":1,"115":1,"117":1,"118":3,"120":1}}],["family",{"2":{"120":1}}],["familiarize",{"2":{"70":1,"71":1}}],["facebook",{"2":{"115":1}}],["facilitate",{"2":{"67":1}}],["fact",{"2":{"23":1,"25":1}}],["factor",{"2":{"27":1}}],["facto",{"2":{"5":1,"75":1}}],["fans",{"2":{"20":1}}],["fast",{"2":{"20":1,"35":1}}],["faster",{"2":{"19":2,"20":1,"27":1,"32":1}}],["fall",{"2":{"25":1,"27":1}}],["fallback",{"2":{"18":1}}],["false",{"2":{"1":1,"9":2,"20":27,"25":1,"64":4}}],["fairly",{"2":{"10":1,"36":1}}],["faq",{"2":{"9":1,"61":1}}],["favorite",{"2":{"1":1}}],["msg",{"2":{"101":1}}],["mjs",{"2":{"20":4}}],["mysql",{"2":{"20":1,"36":1}}],["my",{"2":{"19":1,"25":1,"64":3,"65":1,"69":1,"84":2,"85":1}}],["m",{"2":{"9":2}}],["mdsvex",{"2":{"20":1}}],["md",{"2":{"9":1,"20":3}}],["mkdir",{"2":{"9":2}}],["mvp",{"2":{"26":1}}],["mvc",{"2":{"25":1,"27":1}}],["mv",{"2":{"9":1}}],["multithreaded",{"2":{"27":1}}],["multicursormodifier",{"2":{"20":1}}],["multiple",{"2":{"19":1,"23":1,"28":1,"67":1}}],["much",{"2":{"9":1,"19":1,"20":2,"23":1,"25":1,"27":2,"30":2,"35":4,"36":1,"37":3}}],["must",{"2":{"2":1,"9":2,"16":1,"37":1,"117":1}}],["mit",{"2":{"60":1}}],["mitt",{"2":{"5":1}}],["mistake",{"2":{"28":1}}],["middle",{"2":{"28":1}}],["microservices",{"2":{"28":1}}],["microservice",{"2":{"27":1}}],["microsoft",{"2":{"3":1,"8":1,"20":1,"37":1}}],["micro",{"2":{"20":1}}],["mixins",{"2":{"23":4}}],["mix",{"2":{"20":3,"27":1}}],["minutes",{"2":{"36":1,"71":1}}],["mind",{"2":{"25":1}}],["minimalistic",{"2":{"70":1}}],["minimal",{"2":{"67":1}}],["minimum",{"2":{"66":1}}],["miniserver",{"2":{"20":1}}],["mini",{"2":{"20":2}}],["miniature",{"2":{"3":1}}],["minheight",{"2":{"17":1}}],["minwidth",{"2":{"17":1}}],["might",{"2":{"12":1,"20":1,"25":1,"35":1}}],["megabytes",{"2":{"100":1}}],["mention",{"2":{"37":1}}],["mentor",{"2":{"36":2}}],["menus",{"2":{"20":1}}],["menu",{"2":{"10":1,"12":2,"84":1,"105":1}}],["mess",{"2":{"26":1}}],["message",{"2":{"5":1,"58":1,"99":1}}],["messages",{"2":{"5":2}}],["mechanisms",{"2":{"25":1}}],["me",{"0":{"24":1}}],["means",{"2":{"23":1,"35":1,"67":1,"70":1}}],["measures",{"2":{"2":1}}],["metrics",{"2":{"37":2}}],["met",{"2":{"36":1}}],["methods",{"2":{"4":1,"23":1,"25":1,"36":1}}],["method",{"2":{"2":1,"19":1,"37":2,"64":2,"66":1,"75":1}}],["metaframwork",{"2":{"70":1}}],["metadata",{"2":{"20":1}}],["meta",{"2":{"1":1,"12":1,"17":1,"18":2,"64":1,"69":1,"75":1,"76":1,"105":1,"115":15}}],["moves",{"2":{"109":1}}],["moving",{"2":{"31":1}}],["mobile",{"2":{"37":1,"72":4,"81":1,"109":1,"111":1}}],["morgan",{"2":{"36":1}}],["more",{"2":{"2":1,"4":1,"5":2,"9":1,"10":1,"12":2,"16":1,"19":1,"20":4,"23":4,"25":3,"26":1,"27":6,"28":1,"35":1,"36":3,"37":4,"84":1,"117":1}}],["motivation",{"2":{"36":1}}],["moments",{"2":{"26":1,"36":1}}],["moment",{"2":{"23":2,"24":1,"37":1,"112":1}}],["mouse",{"2":{"20":1}}],["mocha",{"2":{"20":10}}],["monitor",{"2":{"20":2,"27":1}}],["monitoring",{"2":{"2":1}}],["money",{"2":{"20":1}}],["monospace",{"2":{"20":1}}],["mono",{"2":{"20":1}}],["modal",{"2":{"67":1}}],["modifiers",{"2":{"25":1}}],["mod",{"2":{"20":1}}],["modes",{"2":{"109":2,"111":2}}],["models",{"2":{"32":1}}],["model",{"2":{"25":3,"27":2,"35":1}}],["mode",{"2":{"20":3,"25":2,"26":1,"72":1,"117":1}}],["modern",{"0":{"33":1},"2":{"8":1,"18":1,"19":1,"20":1,"23":1,"36":1,"67":1,"71":1}}],["modular",{"2":{"10":1}}],["modules",{"2":{"10":1,"18":6,"19":1,"20":2,"25":2,"28":1,"31":1}}],["module",{"0":{"73":1},"1":{"74":1,"75":1},"2":{"1":2,"10":7,"20":1,"25":2,"27":1,"28":1,"69":2,"71":2,"75":1,"105":2,"108":1}}],["mostly",{"2":{"5":1,"70":1}}],["most",{"2":{"2":1,"3":2,"9":1,"10":2,"19":2,"20":1,"26":1,"27":2,"28":1,"36":2,"37":2,"61":1}}],["max",{"2":{"111":1,"120":1}}],["maximum",{"2":{"111":1}}],["margin",{"2":{"79":1}}],["markdownlint",{"2":{"20":2}}],["markdown",{"0":{"57":1},"2":{"20":1,"57":1}}],["magnitude",{"2":{"37":1}}],["magic",{"2":{"23":1}}],["mat",{"2":{"37":1}}],["matter",{"2":{"36":1}}],["match",{"2":{"9":1,"117":1}}],["machine",{"2":{"20":1}}],["macos",{"2":{"20":1}}],["made",{"2":{"20":1,"25":1,"27":1,"37":1,"70":1,"71":1}}],["mailmap",{"2":{"20":1}}],["mainly",{"2":{"25":1,"27":1}}],["mainlayout",{"0":{"109":1},"1":{"110":1},"2":{"12":2,"64":2,"111":1}}],["maintainability",{"2":{"35":1}}],["maintainers",{"2":{"20":1}}],["maintenanceview",{"2":{"12":1}}],["maintenance",{"2":{"12":2}}],["main",{"2":{"1":1,"2":1,"6":1,"9":6,"10":1,"20":1,"25":2,"26":2,"28":1,"34":1,"36":1,"61":1,"79":1,"101":1,"110":1}}],["may",{"2":{"19":1,"25":1,"27":1,"29":2,"36":1,"37":1,"61":1,"70":1}}],["makarov",{"2":{"62":2}}],["making",{"2":{"19":1,"37":1,"58":1}}],["makes",{"2":{"5":1,"9":1,"25":2,"27":2,"84":1}}],["make",{"2":{"1":1,"2":2,"3":2,"10":1,"12":2,"23":2,"25":1,"27":1,"28":1,"29":1,"30":3,"36":1,"37":1,"64":1,"69":1,"118":1}}],["map",{"2":{"18":2,"20":7}}],["mastery",{"2":{"36":1}}],["master",{"2":{"9":3,"20":1}}],["masked",{"2":{"17":1}}],["mask",{"2":{"4":2}}],["major",{"2":{"3":1}}],["mantinelayeredheader",{"0":{"96":1}}],["mantine",{"2":{"95":1,"96":1}}],["mantinerichfooter",{"0":{"90":1},"2":{"64":2}}],["mantinesimplefooter",{"0":{"89":1}}],["mantinesimpleheader",{"0":{"95":1},"2":{"64":2}}],["mantinesimplenavbar",{"0":{"114":1},"2":{"64":2}}],["manifest",{"0":{"117":1},"2":{"37":3,"64":1,"69":1,"105":1,"116":1,"117":2}}],["manipulating",{"2":{"2":1}}],["managing",{"2":{"25":2}}],["manageable",{"2":{"118":1}}],["managed",{"2":{"37":1}}],["manage",{"2":{"27":1}}],["management",{"0":{"25":1},"2":{"25":3}}],["manager",{"2":{"2":3,"9":1}}],["manual",{"2":{"20":1,"36":1}}],["manually",{"2":{"9":1,"20":1,"64":1}}],["many",{"2":{"2":1,"3":1,"8":1,"16":1,"18":1,"20":2,"27":1,"28":1,"36":1,"37":1,"70":1}}],["l",{"2":{"101":2}}],["luxury",{"2":{"37":1}}],["lumps",{"2":{"27":1}}],["lt",{"2":{"20":1}}],["ll",{"2":{"19":1,"36":1}}],["left",{"2":{"109":1}}],["least",{"2":{"20":1,"25":1,"28":1,"34":1,"36":2}}],["learning",{"0":{"36":1},"2":{"35":1,"36":3,"70":1}}],["learn",{"2":{"9":1,"28":1,"32":1,"36":1,"40":1,"42":1,"71":1}}],["lerna",{"2":{"20":2}}],["leex",{"2":{"20":1}}],["less",{"2":{"20":1,"37":1}}],["length",{"2":{"18":2}}],["let",{"2":{"18":1,"28":2,"32":1}}],["leverage",{"0":{"3":1},"2":{"71":1}}],["levels",{"2":{"2":1,"27":1}}],["level",{"2":{"2":2,"11":2,"23":1,"26":1,"28":1,"34":1,"36":3,"61":1,"70":1}}],["lying",{"2":{"6":1}}],["launching",{"0":{"65":1}}],["launch",{"2":{"50":1}}],["launched",{"2":{"26":1,"37":1}}],["lazy",{"2":{"37":1}}],["labor",{"2":{"37":2}}],["laptop",{"2":{"20":1}}],["later",{"2":{"29":1,"37":1,"67":1}}],["latexmk",{"2":{"20":1}}],["latest",{"2":{"9":2}}],["lang=",{"2":{"17":1,"72":1,"76":1,"101":1}}],["languages",{"2":{"11":1,"27":1,"28":2}}],["language",{"0":{"33":1},"2":{"3":2,"4":1,"5":1,"20":1,"23":2,"25":1,"36":1,"99":2}}],["layout",{"2":{"12":2,"32":1,"35":3,"64":2,"67":1,"69":1,"71":1,"105":2,"108":1,"109":1,"111":3,"120":1}}],["layouts",{"2":{"10":1,"12":2,"71":1}}],["layered",{"2":{"96":1}}],["layer",{"2":{"1":1,"35":1,"37":1,"64":1,"74":1,"105":1}}],["lastindexof",{"2":{"18":2}}],["last",{"2":{"9":1,"20":1}}],["lamda",{"2":{"3":1}}],["lambda",{"2":{"3":1}}],["large",{"2":{"3":1,"9":1,"23":2,"26":2,"27":4,"79":1,"99":1}}],["lof",{"2":{"20":1}}],["lock",{"2":{"20":13}}],["located",{"2":{"35":1,"78":2,"101":1,"111":1,"112":1,"119":1}}],["location",{"2":{"9":1}}],["locally",{"2":{"37":1}}],["locale",{"2":{"23":1,"101":3}}],["locales",{"2":{"23":1,"67":1,"99":1,"101":4}}],["localizing",{"2":{"23":1,"99":1}}],["localization",{"2":{"23":2,"99":2}}],["local",{"2":{"20":1,"25":2,"28":1}}],["localstoragename",{"2":{"9":3}}],["localstorage",{"2":{"2":2,"9":3,"120":1}}],["lot",{"2":{"19":1,"20":3,"23":1,"27":2,"36":2,"37":1,"99":1}}],["lose",{"2":{"25":1,"37":1}}],["loss",{"2":{"18":1}}],["losing",{"2":{"2":1}}],["loose",{"2":{"10":1}}],["loosely",{"2":{"10":1}}],["looks",{"2":{"25":1,"37":2}}],["look",{"2":{"1":1,"5":1,"18":1,"20":1,"24":1,"25":1,"36":1,"74":1}}],["loaded",{"2":{"37":1,"119":1}}],["loaderset",{"2":{"14":4}}],["loaderbar",{"2":{"13":1}}],["loader",{"2":{"13":1}}],["loadicons",{"2":{"18":2}}],["loading",{"2":{"1":2,"9":1,"12":1,"13":2,"14":2,"16":1}}],["load",{"2":{"3":1,"37":2}}],["lower",{"2":{"27":1}}],["low",{"2":{"2":1,"70":1}}],["longer",{"2":{"2":1,"20":1,"23":1,"25":1,"29":1}}],["log",{"2":{"9":1,"20":1,"23":1}}],["logically",{"2":{"31":1}}],["logical",{"2":{"10":1,"23":1,"25":1,"37":1}}],["logic",{"2":{"3":3,"25":11,"27":4,"35":2,"74":1}}],["login",{"2":{"2":6,"25":1,"26":1,"108":1}}],["logs",{"2":{"2":2,"9":1,"20":1}}],["logged",{"2":{"2":1,"25":1}}],["logout",{"2":{"1":1,"25":1}}],["light",{"2":{"120":1}}],["lightweight",{"2":{"67":1}}],["lighthouserc",{"2":{"20":20}}],["little",{"2":{"37":3}}],["lives",{"2":{"27":1}}],["lived",{"2":{"2":2}}],["license",{"2":{"20":1,"60":1}}],["limitations",{"2":{"35":1}}],["limit",{"2":{"20":3}}],["lib",{"2":{"20":1}}],["libraries",{"0":{"30":1,"35":1},"2":{"18":1,"19":1,"21":1,"24":1,"32":1,"35":9,"67":1,"70":2,"71":1,"107":1,"118":1}}],["library",{"0":{"24":1},"2":{"1":1,"10":1,"23":1,"25":6,"27":1,"28":1,"29":2,"30":2,"35":2,"67":2,"99":1}}],["lifehack",{"2":{"25":1}}],["life",{"2":{"9":1}}],["lifetime",{"2":{"2":4}}],["linux",{"2":{"20":1}}],["linting",{"2":{"26":1,"67":1}}],["linter",{"2":{"20":1}}],["lintstagedrc",{"2":{"20":2}}],["lint",{"2":{"20":4}}],["linenumbers",{"2":{"20":1}}],["lines",{"2":{"4":1,"29":1,"37":1,"100":1}}],["line",{"2":{"4":1,"19":1,"20":1,"36":1}}],["links",{"2":{"19":1}}],["link",{"0":{"0":1},"1":{"1":1},"2":{"85":1}}],["lists",{"2":{"99":1}}],["listeners",{"2":{"27":1}}],["list",{"2":{"4":2,"19":1,"20":1}}],["lies",{"2":{"3":1}}],["likely",{"2":{"25":1}}],["likelihood",{"2":{"10":1}}],["like",{"2":{"1":1,"4":1,"8":1,"11":1,"16":1,"19":2,"23":2,"25":5,"28":1,"35":5,"36":2,"37":5,"64":1,"70":1,"85":1,"118":1}}],["c2c2c4",{"2":{"120":1}}],["czrc",{"2":{"20":2}}],["cz",{"2":{"20":2}}],["cypress",{"2":{"20":10,"26":1}}],["cmakepresets",{"2":{"20":1}}],["cmake",{"2":{"20":3}}],["cmakelists",{"2":{"20":1}}],["cxx",{"2":{"20":1}}],["cjs",{"2":{"20":4}}],["cc",{"2":{"20":1}}],["c",{"2":{"20":1,"64":1,"120":9}}],["csproj",{"2":{"20":1}}],["cspell",{"2":{"20":2}}],["cshtml",{"2":{"20":2}}],["cs",{"2":{"20":12}}],["csshtml",{"2":{"79":1}}],["css3",{"0":{"32":1},"2":{"32":1,"33":1,"35":1,"67":1}}],["cssnano",{"2":{"20":10}}],["cssnanorc",{"2":{"20":10}}],["css",{"0":{"35":1,"55":1,"79":1},"2":{"8":1,"20":5,"24":1,"27":1,"32":1,"35":9,"36":1,"37":1,"67":1,"71":1,"72":2,"108":1,"111":1,"118":1,"119":1,"120":4}}],["ctrlcmd",{"2":{"20":1}}],["cpu",{"2":{"102":1}}],["cpp",{"2":{"20":1}}],["cp",{"2":{"9":1}}],["curve",{"2":{"35":1}}],["cursorstyle",{"2":{"20":1}}],["cursorsmoothcaretanimation",{"2":{"20":1}}],["cursorblinking",{"2":{"20":1}}],["currently",{"2":{"80":1,"86":1,"105":1}}],["currentcolor",{"2":{"17":2}}],["current",{"2":{"9":1,"23":1,"64":1}}],["customize",{"2":{"120":1}}],["customization",{"2":{"19":1,"20":3,"67":2,"69":1,"71":1,"108":1,"116":1}}],["customer",{"2":{"28":1,"32":1,"37":1}}],["custom",{"2":{"3":1,"8":1,"19":1,"20":2,"23":3,"28":1,"35":2,"85":2,"120":1}}],["cd",{"0":{"6":1},"2":{"6":5,"9":4,"26":1,"36":1,"45":1,"65":1,"66":1,"108":1}}],["citation",{"2":{"20":1}}],["circleci",{"2":{"20":2}}],["ci",{"0":{"6":1},"2":{"6":5,"9":1,"26":1,"36":1,"45":1,"108":1}}],["clone",{"2":{"66":1}}],["close",{"2":{"37":2}}],["closeonfiledelete",{"2":{"20":1}}],["cloud",{"2":{"3":4,"6":1,"8":2,"36":1}}],["clicked",{"2":{"111":1}}],["clicks",{"2":{"109":1}}],["click",{"2":{"84":1}}],["clicking",{"2":{"81":1}}],["click=",{"2":{"76":1,"101":1}}],["clippy",{"2":{"20":2}}],["clipboard",{"2":{"20":4}}],["cli",{"2":{"19":1,"20":2}}],["clients",{"2":{"4":1}}],["client",{"2":{"4":9,"5":2,"20":2,"37":2,"74":2,"118":2}}],["clamps",{"2":{"27":1}}],["clangd",{"2":{"20":1}}],["clang",{"2":{"20":2}}],["classes",{"2":{"25":2,"28":1,"56":1,"71":1,"72":2}}],["classpath",{"2":{"20":1}}],["class",{"2":{"16":1,"20":1,"25":1,"28":1,"35":1,"119":1}}],["class=",{"2":{"13":3,"17":1,"72":4,"76":2}}],["clarity",{"2":{"5":1}}],["clear",{"2":{"12":1,"35":1,"70":1,"118":1}}],["cleared",{"2":{"2":1}}],["clean",{"2":{"9":1,"67":1,"100":1}}],["certified",{"2":{"62":2}}],["certification",{"2":{"36":2}}],["certifications",{"2":{"36":1}}],["certificate",{"2":{"8":3}}],["certificates",{"2":{"8":1}}],["certbot",{"2":{"8":1}}],["certain",{"2":{"2":2,"3":1,"23":1,"25":1,"28":1,"37":1,"67":1,"70":2,"71":1}}],["center",{"2":{"2":1}}],["crm",{"2":{"71":1}}],["crawler",{"2":{"37":1}}],["crowdin",{"2":{"20":2}}],["cross",{"2":{"4":2,"20":1}}],["credits",{"2":{"20":1}}],["credo",{"2":{"20":1}}],["creator",{"2":{"27":1}}],["creation",{"2":{"20":1,"26":1}}],["creating",{"0":{"104":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"4":1,"12":1,"19":1,"20":1,"27":1,"37":1,"67":1,"70":2,"71":1}}],["create",{"0":{"19":1,"64":1},"1":{"65":1},"2":{"12":1,"16":1,"19":2,"25":1,"28":1,"35":1,"58":1,"60":1,"64":5,"69":1,"70":4,"71":2,"84":1,"120":1}}],["created",{"2":{"9":1,"37":2,"61":1,"118":1}}],["creates",{"2":{"2":1,"23":1,"74":1}}],["crud",{"2":{"3":1}}],["critical",{"2":{"2":1}}],["cryptography",{"2":{"2":1}}],["cheat",{"0":{"51":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"52":1,"53":1,"54":1,"55":4}}],["checkout",{"2":{"9":4}}],["check",{"2":{"2":1,"9":1,"20":1,"26":1,"36":2,"37":1,"108":1}}],["checks",{"2":{"2":2,"20":1}}],["checking",{"2":{"2":1,"25":3}}],["chat",{"2":{"61":1}}],["chaff",{"2":{"36":1}}],["changing",{"2":{"27":1,"28":1,"71":1,"74":1,"99":1,"110":1}}],["changelocale",{"2":{"101":2}}],["changelog",{"0":{"38":1},"1":{"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"20":1}}],["changed",{"0":{"40":1,"42":1,"45":1,"48":1},"2":{"16":1,"27":1}}],["changes",{"2":{"6":1,"20":2,"23":2,"25":1,"27":3,"58":1}}],["change",{"2":{"1":1,"2":1,"23":3,"25":1,"27":3,"28":1,"35":1,"67":1,"108":1,"118":1}}],["chromium",{"2":{"23":1}}],["chrome",{"2":{"23":2,"37":1}}],["choosing",{"2":{"36":1}}],["choose",{"2":{"20":1,"71":1,"80":1,"112":1}}],["choice",{"2":{"9":2,"20":1,"69":1,"74":1}}],["children",{"2":{"12":2}}],["chgrp",{"2":{"9":2}}],["came",{"2":{"37":2}}],["calc",{"2":{"79":1}}],["calculations",{"2":{"27":1}}],["call",{"2":{"74":1}}],["calling",{"2":{"25":1}}],["called",{"2":{"3":1,"25":4,"84":1}}],["calls",{"2":{"1":1,"23":1,"74":2,"75":1,"99":1}}],["categories",{"2":{"28":1,"117":1}}],["category",{"2":{"25":1}}],["catch",{"2":{"23":1}}],["catalog",{"2":{"10":1}}],["caches",{"2":{"118":1}}],["cached",{"2":{"37":1}}],["cache",{"2":{"20":1,"108":1,"118":2}}],["caching",{"2":{"9":1,"25":1,"37":1,"118":2}}],["card",{"2":{"70":1,"115":1}}],["car",{"2":{"36":1}}],["carousel",{"0":{"22":1},"2":{"22":1}}],["cargo",{"2":{"20":2}}],["careful",{"2":{"26":1}}],["care",{"2":{"18":1,"27":1}}],["capabilities",{"2":{"19":1,"23":1,"24":1}}],["capture",{"2":{"2":1,"20":95}}],["cause",{"2":{"5":1}}],["cases",{"0":{"11":1},"2":{"2":1,"10":1,"12":2,"23":1,"24":1,"25":2,"37":2,"111":1}}],["case",{"2":{"2":4,"3":1,"8":1,"9":2,"10":1,"19":1,"23":1,"25":1,"26":1,"27":2,"34":1,"36":1,"64":1}}],["cannot",{"2":{"71":1}}],["can",{"2":{"1":1,"2":3,"3":4,"4":3,"5":2,"8":3,"9":1,"10":2,"11":2,"12":5,"16":4,"19":1,"20":4,"23":2,"25":10,"26":1,"27":8,"28":3,"35":3,"36":8,"37":8,"58":1,"64":1,"70":1,"72":2,"74":1,"81":1,"85":1,"97":1,"99":1,"111":1,"118":1,"119":1}}],["covers",{"2":{"61":1}}],["coincides",{"2":{"37":1}}],["cost",{"2":{"37":1}}],["copy",{"2":{"29":1}}],["copying",{"2":{"19":1,"20":1}}],["cop",{"2":{"27":1}}],["coolcosmos",{"2":{"25":1}}],["cooler",{"2":{"20":1}}],["cookie",{"2":{"2":4}}],["collect",{"2":{"71":1}}],["collects",{"2":{"19":1}}],["colleagues",{"2":{"36":1}}],["column",{"2":{"35":1,"72":1}}],["columnar",{"2":{"32":1}}],["colortheme",{"2":{"20":1}}],["color",{"2":{"17":3,"108":1}}],["could",{"2":{"20":1,"70":1}}],["couple",{"2":{"20":1,"23":1,"32":1,"99":1}}],["coupled",{"2":{"11":1}}],["coupling",{"2":{"10":1,"12":1}}],["counterpart",{"2":{"37":1}}],["counterparties",{"2":{"27":1}}],["count`",{"2":{"9":1}}],["count=5",{"2":{"9":1}}],["courses",{"2":{"36":2}}],["course",{"2":{"5":1,"28":1,"36":1,"37":1}}],["corporation",{"2":{"117":1}}],["corrections",{"2":{"58":1}}],["corresponding",{"2":{"9":1,"23":1,"67":1}}],["corridor",{"2":{"37":1}}],["cors",{"0":{"4":1},"2":{"4":8,"42":1}}],["combination",{"2":{"71":1}}],["combustion",{"2":{"36":1}}],["comfort",{"2":{"37":1}}],["comfortable",{"2":{"20":2,"25":1}}],["comfortably",{"2":{"10":1}}],["come",{"2":{"37":1,"61":1}}],["comes",{"2":{"28":1}}],["coming",{"2":{"28":1}}],["com",{"2":{"3":1,"4":9,"8":5,"9":10,"20":2,"62":1,"66":1,"74":1,"85":1,"92":1}}],["command",{"2":{"19":1,"64":1}}],["commands",{"2":{"9":1,"20":1}}],["communicate",{"2":{"12":1,"75":1}}],["communications",{"2":{"5":1}}],["communication",{"2":{"1":2,"5":2,"105":1}}],["commenting",{"2":{"59":1}}],["comments",{"2":{"2":1,"67":1}}],["commercial",{"2":{"9":1,"36":1}}],["commitlint",{"2":{"20":4}}],["commit",{"2":{"6":1}}],["common",{"2":{"2":2,"23":1,"27":1}}],["complicated",{"2":{"37":1}}],["completely",{"2":{"36":1}}],["completion",{"2":{"20":1}}],["complex",{"2":{"2":1,"5":1,"25":1,"27":1,"35":1,"37":1}}],["complexity",{"2":{"1":1,"27":2,"61":1}}],["competent",{"2":{"36":1,"59":1}}],["computations",{"2":{"28":1}}],["computer",{"2":{"19":1,"20":1,"37":1}}],["computed",{"2":{"14":2,"17":3}}],["compile",{"2":{"20":1}}],["compileroptions",{"2":{"19":1}}],["companies",{"2":{"36":1}}],["company",{"2":{"2":1}}],["comparable",{"2":{"26":1}}],["compare",{"2":{"20":6}}],["compression",{"2":{"18":1}}],["compound",{"2":{"99":1}}],["composition",{"2":{"23":3,"25":1,"36":1,"45":1,"67":1}}],["composite",{"2":{"10":1,"25":1}}],["compose",{"2":{"20":1}}],["composer",{"2":{"20":2}}],["composable",{"2":{"12":1,"23":1,"25":14,"27":2,"28":2,"67":1,"72":2,"82":1,"99":1}}],["composables",{"2":{"1":1,"10":1,"13":1,"15":1,"25":2,"72":1,"76":1,"101":2}}],["components",{"0":{"30":1},"2":{"1":1,"10":2,"11":3,"12":3,"19":1,"20":1,"24":1,"25":4,"27":4,"28":2,"30":3,"31":1,"35":5,"64":1,"66":1,"71":1,"76":1,"108":2,"120":1}}],["component",{"0":{"15":1},"2":{"1":1,"11":2,"12":4,"16":1,"18":1,"20":7,"23":1,"25":18,"27":2,"35":3,"71":1,"76":2,"82":1,"101":1,"106":2,"120":1}}],["connoisseurs",{"2":{"20":1}}],["connected",{"2":{"10":1,"16":1}}],["connect",{"2":{"8":1,"10":1,"16":1,"25":1,"71":1}}],["connection",{"2":{"5":1,"20":2,"101":1}}],["conduct",{"2":{"20":1}}],["conditions",{"2":{"16":1}}],["confusing",{"2":{"25":1}}],["conflict",{"2":{"20":1}}],["conf",{"2":{"20":1}}],["confirmsync",{"2":{"20":1}}],["confirmdraganddrop",{"2":{"20":1}}],["confirmdelete",{"2":{"20":1}}],["configs",{"2":{"20":1}}],["config",{"0":{"85":1},"2":{"19":3,"20":226,"64":4,"67":1,"78":1,"85":1,"92":1}}],["configuring",{"0":{"20":1}}],["configure",{"2":{"19":2}}],["configured",{"2":{"4":1,"9":1}}],["configurations",{"2":{"20":1,"37":1}}],["configuration",{"2":{"9":1,"11":2,"20":1,"64":1,"72":1,"78":1,"105":1}}],["consume",{"2":{"102":1}}],["consultant",{"2":{"62":1}}],["cons",{"2":{"25":2,"35":2}}],["consists",{"2":{"76":1}}],["consist",{"2":{"25":1}}],["consistency",{"2":{"25":1}}],["considers",{"2":{"25":1}}],["consider",{"2":{"12":1,"28":1,"37":1}}],["considerations",{"0":{"12":1},"1":{"13":1,"14":1,"15":1}}],["console",{"2":{"9":1,"23":3}}],["constraints",{"2":{"25":1}}],["construct",{"2":{"25":1}}],["constant",{"2":{"2":1}}],["constantly",{"2":{"2":1}}],["const",{"2":{"1":3,"12":2,"13":1,"14":3,"15":1,"17":3,"18":5,"23":1,"25":1,"72":1,"74":2,"75":2,"76":1,"101":2}}],["contacts",{"2":{"58":1}}],["container",{"2":{"33":1,"72":2}}],["contain",{"2":{"4":1,"9":1,"35":1,"97":1}}],["contains",{"2":{"4":2,"25":1}}],["continue",{"2":{"32":1,"67":1}}],["continuous",{"2":{"6":2}}],["controversial",{"2":{"70":1}}],["controlled",{"2":{"82":1,"119":1,"120":1}}],["controller",{"2":{"20":1,"25":3,"27":2}}],["controls",{"2":{"23":1,"27":1}}],["control",{"2":{"2":1,"4":4,"27":1,"56":1}}],["contributions",{"2":{"60":1}}],["contributing",{"2":{"20":1}}],["contribute",{"0":{"58":1}}],["contributors",{"2":{"20":1}}],["content=",{"2":{"115":11}}],["content",{"2":{"37":5,"64":1,"69":1,"71":1,"75":1,"110":1}}],["contentlayer",{"2":{"20":10}}],["contents",{"2":{"9":1}}],["concepts",{"2":{"28":1}}],["concept",{"2":{"2":1,"27":1,"28":1}}],["convenience",{"2":{"1":1,"2":1,"59":2}}],["conveniently",{"2":{"70":1}}],["convenient",{"2":{"1":1,"5":2,"8":1,"9":1,"10":1,"12":1,"20":2,"23":1,"25":2,"35":3,"36":1,"69":1,"75":1}}],["codesandbox",{"2":{"20":1}}],["coder",{"2":{"20":1}}],["codeowners",{"2":{"20":1}}],["codecov",{"2":{"20":10}}],["codelens",{"2":{"20":4}}],["codeaction",{"2":{"20":1}}],["codeactions",{"2":{"20":1}}],["codeactionsonsave",{"2":{"20":2}}],["codeium",{"2":{"20":1}}],["code",{"0":{"78":1},"2":{"1":4,"3":2,"4":1,"5":1,"6":2,"9":2,"10":1,"20":11,"23":1,"25":1,"27":5,"28":1,"29":1,"31":3,"35":3,"36":4,"37":2,"59":1,"64":1,"67":1,"69":1,"70":1,"71":2,"72":1,"74":2,"75":1,"78":2,"84":1,"92":1,"101":4,"102":2,"105":1,"119":1}}],["ignite",{"2":{"119":1}}],["ignoredlocales",{"2":{"20":1}}],["ignore",{"2":{"20":2,"64":1}}],["ignoretrimwhitespace",{"2":{"20":1}}],["ignorerecommendations",{"2":{"20":1}}],["io",{"2":{"84":1}}],["illustration",{"2":{"67":1}}],["illogical",{"2":{"25":1}}],["irretrievably",{"2":{"23":1,"24":1}}],["ie6",{"2":{"35":1}}],["iex",{"2":{"20":1}}],["ie11",{"2":{"18":1}}],["ie",{"2":{"18":1}}],["iconify",{"2":{"18":1,"20":2}}],["icon",{"2":{"16":2,"17":1,"18":1,"37":1,"76":2,"81":1,"106":1,"109":1,"111":1}}],["icons",{"0":{"18":1},"2":{"16":3,"17":2,"18":2,"19":1,"117":1}}],["i18next",{"0":{"99":1,"102":1},"2":{"23":1,"99":1,"100":1,"102":3,"103":1}}],["i18n",{"0":{"98":1},"1":{"99":1,"100":1,"101":1,"102":1,"103":1},"2":{"11":1,"20":3,"23":3,"67":1,"69":1,"71":1,"99":2,"101":1,"102":1,"107":2}}],["imagine",{"2":{"25":1}}],["imageresources",{"2":{"18":3}}],["imageraw",{"2":{"16":1}}],["imagenameinvariable",{"2":{"16":1}}],["image",{"2":{"16":4,"115":4}}],["imageurl",{"2":{"16":1}}],["images",{"2":{"9":1,"16":10,"18":3,"37":2,"76":1,"115":1,"118":1}}],["imgurl",{"2":{"16":2}}],["img",{"2":{"16":6,"17":1}}],["immediately",{"2":{"16":1,"37":2}}],["impression",{"2":{"59":1}}],["improve",{"2":{"36":1,"37":1,"105":1,"118":1}}],["improvement",{"2":{"23":1}}],["improving",{"2":{"31":1}}],["implies",{"2":{"37":1}}],["implemented",{"2":{"72":1,"74":1,"82":1}}],["implements",{"2":{"67":1,"75":1,"120":1}}],["implement",{"2":{"12":1}}],["implementations",{"2":{"23":1}}],["implementation",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"5":1,"23":2,"29":1,"34":1,"100":1,"102":1,"118":1}}],["impose",{"2":{"70":1}}],["impossible",{"2":{"25":1,"36":1}}],["important",{"2":{"26":1,"34":1}}],["importing",{"2":{"16":1}}],["imported",{"2":{"16":1}}],["import",{"2":{"1":7,"13":1,"14":1,"16":4,"17":4,"18":7,"19":3,"20":2,"25":2,"72":1,"74":1,"75":5,"76":3,"101":1}}],["id=g",{"2":{"92":1}}],["idx",{"2":{"20":1}}],["identifiers",{"2":{"76":1}}],["identifying",{"2":{"37":1}}],["ideally",{"2":{"25":1}}],["idea",{"2":{"25":1,"37":1}}],["ide",{"0":{"20":1},"2":{"20":1,"59":1}}],["id",{"2":{"9":2,"15":1,"92":1}}],["i",{"2":{"5":1,"11":1,"16":1,"19":1,"20":2,"25":4,"26":1,"27":1,"28":2,"36":5,"65":1,"66":1}}],["ip",{"2":{"2":1}}],["iphones",{"2":{"2":1}}],["if=",{"2":{"17":1}}],["if",{"2":{"2":5,"3":1,"4":5,"8":1,"9":5,"10":1,"12":1,"16":2,"18":1,"19":3,"20":1,"23":1,"25":5,"29":2,"30":1,"35":2,"36":4,"37":3,"67":1,"71":1,"84":1,"85":2,"102":1,"111":1}}],["inefficient",{"2":{"37":1}}],["inexpensive",{"2":{"8":1}}],["ingredient",{"2":{"26":1}}],["innovation",{"2":{"25":1}}],["inner",{"2":{"12":1}}],["involved",{"2":{"70":1}}],["invented",{"2":{"27":1,"37":1}}],["invents",{"2":{"25":1}}],["invisiblecharacters",{"2":{"20":1}}],["inheritance",{"2":{"23":1,"28":2}}],["inplace",{"2":{"20":1}}],["input",{"2":{"20":1,"27":1}}],["inputs",{"2":{"9":5}}],["inlinesuggest",{"2":{"20":1}}],["insertfinalnewline",{"2":{"20":1}}],["inside",{"2":{"11":1,"20":1,"23":2,"25":1,"105":1,"112":1}}],["instances",{"2":{"25":1}}],["installation",{"0":{"64":1,"66":1},"1":{"65":1},"2":{"37":1,"64":1}}],["installed",{"2":{"9":1,"37":1,"64":1,"66":1}}],["install",{"2":{"3":2,"8":1,"9":11,"20":1,"36":1,"64":1,"117":1}}],["instructions",{"2":{"9":1}}],["instead",{"2":{"4":1,"19":1,"23":1,"25":1,"37":1,"75":2,"119":1}}],["injection",{"2":{"78":2}}],["injections",{"0":{"78":1},"2":{"78":2}}],["injecting",{"2":{"12":1}}],["injected",{"2":{"71":1}}],["inject",{"2":{"10":1,"11":3,"12":2,"25":2}}],["inc",{"2":{"117":1}}],["include",{"2":{"67":1,"108":1}}],["includes",{"2":{"59":1,"67":1}}],["including",{"2":{"19":1,"20":1,"23":1,"35":1,"71":1,"108":1}}],["increasing",{"2":{"28":1}}],["increase",{"2":{"28":1,"61":1}}],["increased",{"2":{"16":1}}],["increases",{"2":{"10":1,"16":1,"29":1,"37":1}}],["inch",{"2":{"20":1}}],["inconvenient",{"2":{"16":1}}],["incoming",{"2":{"5":1}}],["indirect",{"2":{"25":1}}],["individually",{"2":{"2":1}}],["ind",{"2":{"20":1}}],["indent",{"2":{"20":1}}],["independent",{"2":{"25":1,"62":1}}],["independently",{"2":{"10":1}}],["independence",{"2":{"10":1}}],["indexed",{"2":{"37":1}}],["indexing",{"2":{"37":1}}],["index",{"0":{"78":1},"2":{"9":2,"37":3,"78":1,"92":1,"115":1,"119":1}}],["info",{"2":{"4":3}}],["informational",{"2":{"9":1}}],["information",{"2":{"2":2,"9":1,"11":1,"19":1,"36":1,"61":3,"117":1}}],["initi18n",{"2":{"101":2}}],["initialized",{"2":{"76":1}}],["initialization",{"2":{"75":1,"92":1,"101":1}}],["initializing",{"0":{"65":1}}],["initial",{"2":{"50":1}}],["initially",{"2":{"10":1}}],["initiating",{"2":{"4":1}}],["init",{"2":{"1":1,"9":2,"75":1}}],["introduction",{"0":{"61":1},"1":{"62":1}}],["introduce",{"2":{"29":1}}],["introduced",{"2":{"23":2,"25":1,"27":2}}],["intl",{"2":{"23":1,"24":1}}],["intensive",{"2":{"37":1}}],["intended",{"2":{"36":1}}],["integrate",{"2":{"71":2}}],["integrated",{"2":{"20":5,"116":1}}],["integrating",{"2":{"67":1}}],["integration",{"2":{"6":1,"25":1,"26":1,"67":1,"105":1,"108":1}}],["interaction",{"2":{"28":1}}],["interactivity",{"2":{"27":1}}],["intermediate",{"2":{"27":1,"36":1}}],["intermediary",{"2":{"4":1}}],["intersection",{"2":{"23":1}}],["interval",{"2":{"20":1}}],["internal",{"2":{"27":1,"36":1}}],["internally",{"2":{"16":1}}],["internationalization",{"2":{"11":1,"23":3,"99":2,"107":1}}],["internet",{"2":{"3":3,"4":3,"36":3}}],["interesting",{"2":{"9":1,"25":1,"61":1}}],["interfaces",{"2":{"56":1}}],["interface",{"2":{"3":1,"26":1,"59":1}}],["interceptors",{"2":{"1":1,"74":2,"75":1}}],["into",{"2":{"1":3,"2":1,"6":1,"10":3,"11":2,"16":1,"19":1,"27":2,"35":2,"37":2,"78":1,"116":1}}],["in",{"0":{"25":1,"78":1,"85":1,"107":1},"2":{"1":3,"2":19,"3":13,"4":3,"5":2,"6":2,"8":1,"9":7,"10":4,"11":2,"12":3,"16":11,"18":4,"19":9,"20":14,"23":18,"24":2,"25":32,"26":6,"27":15,"28":5,"29":3,"35":4,"36":9,"37":22,"59":1,"61":2,"62":1,"64":3,"65":1,"67":6,"70":2,"71":1,"72":3,"74":2,"75":1,"76":1,"78":1,"79":1,"84":2,"85":1,"95":1,"96":1,"99":2,"100":1,"101":3,"102":3,"105":1,"109":3,"111":4,"117":1,"118":2,"119":2,"120":3}}],["isdraweropen",{"2":{"76":3}}],["isn",{"2":{"25":2}}],["isauthenticated",{"2":{"25":1}}],["ist",{"2":{"20":1}}],["issues",{"2":{"108":1}}],["issuenumberlabel",{"2":{"20":1}}],["issued",{"2":{"2":1}}],["is",{"2":{"1":4,"2":25,"3":11,"4":12,"5":4,"6":2,"8":2,"9":6,"10":6,"12":6,"16":4,"18":3,"19":8,"20":13,"22":1,"23":10,"24":2,"25":35,"26":5,"27":13,"28":5,"29":2,"31":1,"32":1,"34":1,"35":5,"36":15,"37":21,"58":1,"61":1,"64":1,"66":1,"67":5,"70":3,"71":1,"72":1,"74":2,"75":3,"78":1,"79":1,"81":1,"82":2,"85":1,"99":1,"100":1,"102":3,"103":2,"109":1,"110":1,"111":3,"112":2,"118":2,"119":3,"120":4}}],["itself",{"2":{"9":1,"23":2,"25":1,"26":1,"31":1,"37":1,"70":1}}],["its",{"2":{"2":3,"3":2,"4":1,"9":3,"10":1,"16":1,"19":2,"20":1,"23":1,"25":2,"27":3,"29":1,"34":1,"35":1,"36":1,"37":8,"59":1}}],["item",{"2":{"2":1}}],["it",{"2":{"1":1,"2":24,"3":7,"4":2,"5":5,"8":2,"9":7,"10":4,"11":3,"12":4,"18":1,"19":4,"20":11,"23":6,"25":19,"26":1,"27":11,"28":7,"29":5,"30":1,"32":3,"35":3,"36":11,"37":17,"64":4,"66":1,"67":2,"69":1,"70":5,"71":2,"78":1,"81":1,"99":3,"102":2,"112":1,"117":2,"119":1,"120":1}}],["twitter",{"2":{"62":1,"115":8}}],["twenty",{"2":{"36":1}}],["two",{"2":{"2":2,"10":1,"12":1,"28":1,"36":3,"37":3,"80":1,"97":1,"112":1}}],["tune",{"2":{"71":1}}],["tutorial",{"2":{"36":3}}],["turn",{"2":{"25":1}}],["turned",{"2":{"20":1}}],["turbo",{"2":{"20":2}}],["txt",{"2":{"20":1}}],["tmp",{"2":{"20":1}}],["tsup",{"2":{"20":2}}],["tslint",{"2":{"20":2}}],["tsdoc",{"2":{"20":11}}],["tsdk",{"2":{"20":1}}],["tsx",{"2":{"20":3}}],["tsconfig",{"2":{"19":2,"20":11}}],["tsc",{"2":{"19":1}}],["tsimport",{"2":{"14":1}}],["ts",{"0":{"14":1},"2":{"20":33,"25":1,"72":1,"74":1,"75":1,"76":3,"78":1,"85":1,"101":2}}],["title",{"2":{"36":1,"115":4}}],["titlebarstyle",{"2":{"20":1}}],["tied",{"2":{"32":1}}],["tips",{"2":{"28":1,"42":1}}],["tip",{"2":{"23":1,"27":1,"36":1,"75":1}}],["tidy",{"2":{"20":1}}],["tight",{"2":{"12":1}}],["tightly",{"2":{"11":1,"27":1}}],["times",{"2":{"19":2,"25":2,"37":1}}],["timestamp",{"2":{"9":1}}],["time",{"0":{"23":1},"2":{"2":2,"5":1,"9":1,"10":1,"20":1,"23":2,"25":1,"26":6,"28":1,"29":1,"31":2,"36":2,"70":1,"99":1}}],["tapping",{"2":{"81":1}}],["tablet",{"2":{"72":4,"81":1,"109":1,"111":1}}],["tabs",{"2":{"20":1}}],["tabsize",{"2":{"20":1}}],["tags",{"2":{"64":1,"69":1,"105":1,"115":4}}],["tag",{"2":{"35":1,"92":2,"119":1}}],["taking",{"2":{"27":1,"36":1}}],["taken",{"2":{"27":1}}],["takes",{"2":{"25":1}}],["take",{"2":{"5":1,"20":1,"23":1,"26":2,"37":1,"70":1,"99":1}}],["task",{"2":{"20":1,"27":1,"71":1}}],["tasks",{"2":{"20":2,"70":3}}],["tazerc",{"2":{"20":2}}],["tailwind",{"2":{"20":10,"32":1,"35":2}}],["tail",{"2":{"9":1}}],["target",{"2":{"9":15,"19":1}}],["type=",{"2":{"101":1}}],["typedoc",{"2":{"20":2}}],["types",{"2":{"19":1,"25":2,"26":1,"56":1,"80":1,"86":1,"118":1}}],["typescript",{"0":{"56":1},"2":{"5":1,"12":1,"19":3,"20":6,"25":2,"56":4,"67":1}}],["type",{"2":{"9":1,"12":1,"17":7,"25":1,"35":1,"75":1,"115":1}}],["typicode",{"2":{"3":1,"74":1}}],["t",{"2":{"3":1,"9":1,"12":1,"16":1,"19":3,"20":2,"25":2,"27":3,"28":1,"29":3,"30":1,"37":2,"67":1,"85":1,"99":2,"101":2,"102":1}}],["telegram",{"2":{"61":1}}],["tells",{"2":{"64":1}}],["tell",{"0":{"24":1}}],["team",{"2":{"37":1}}],["teams",{"2":{"27":1}}],["teaches",{"2":{"36":2}}],["teacher",{"2":{"36":1}}],["techniques",{"2":{"71":1}}],["technical",{"2":{"34":1}}],["technologies",{"2":{"19":1,"23":1,"36":1,"70":2}}],["technology",{"2":{"6":1}}],["terserrc",{"2":{"20":10}}],["terminal",{"2":{"20":5}}],["terms",{"2":{"3":1,"23":1,"35":1,"37":1}}],["tex",{"2":{"20":1}}],["textbooks",{"2":{"36":1}}],["textbook",{"2":{"36":1}}],["textlint",{"2":{"20":2}}],["text",{"2":{"11":1,"37":4,"99":1,"120":6}}],["temporarily",{"2":{"23":1}}],["temporary",{"2":{"4":1}}],["templates",{"2":{"37":1,"70":1,"108":1}}],["template>",{"2":{"12":6,"13":2,"17":2,"35":2,"76":2,"97":2,"101":2}}],["template",{"2":{"10":1,"16":1,"27":1,"35":1,"67":1,"69":2,"71":1,"97":3,"105":2}}],["testnet",{"2":{"75":1}}],["testjsonrpc",{"2":{"75":1}}],["testrest",{"2":{"74":2}}],["tests",{"2":{"25":1,"26":11,"37":1}}],["testing",{"0":{"26":1},"2":{"3":1,"6":1,"26":6,"66":1,"108":1}}],["test",{"2":{"3":1,"9":1,"20":1,"26":1,"71":1,"101":1}}],["tricks",{"0":{"79":1}}],["tries",{"2":{"20":1}}],["triggerexpansionontab",{"2":{"20":1}}],["training",{"2":{"36":2}}],["traffic",{"2":{"36":1}}],["tragedy",{"2":{"35":1}}],["tracking",{"2":{"23":1}}],["tracks",{"2":{"23":1}}],["track",{"2":{"23":3,"27":1}}],["travis",{"2":{"20":2}}],["transactions",{"2":{"99":1}}],["transmission",{"2":{"36":1}}],["transform",{"2":{"27":1}}],["transformer",{"2":{"20":1}}],["transfer",{"2":{"9":1,"20":1}}],["translation",{"2":{"11":1,"99":2}}],["translate",{"2":{"5":1}}],["transition",{"2":{"6":1}}],["transpile",{"2":{"19":1}}],["transparently",{"2":{"10":1}}],["transparent",{"2":{"2":1,"9":1,"12":1,"18":1}}],["transport",{"2":{"1":1,"5":1,"36":1,"74":3}}],["trend",{"2":{"35":1}}],["tree",{"2":{"18":1,"20":3,"25":3,"29":1}}],["trevis",{"2":{"6":1}}],["trying",{"2":{"28":1}}],["try",{"2":{"18":2,"20":1,"28":1,"32":1,"36":3}}],["trusted",{"2":{"4":2}}],["true",{"2":{"1":1,"9":1,"12":1,"18":2,"20":61,"64":4}}],["those",{"2":{"71":1}}],["thorough",{"2":{"25":1}}],["than",{"2":{"19":2,"23":1,"25":3,"27":1,"32":1,"35":1,"37":2,"103":1}}],["that",{"2":{"2":5,"3":3,"4":4,"8":1,"10":3,"11":5,"12":1,"16":1,"19":1,"20":1,"23":2,"25":20,"26":3,"27":5,"28":1,"35":3,"36":7,"37":6,"61":1,"67":4,"70":4,"71":1,"72":1,"74":1,"85":1,"99":1}}],["threshold",{"2":{"27":1,"97":2}}],["thread",{"2":{"27":1}}],["three",{"2":{"9":2,"118":1}}],["throw",{"2":{"9":1}}],["throughout",{"2":{"10":1,"25":1}}],["through",{"2":{"2":1,"11":1,"12":1,"19":1,"35":1,"36":1,"67":1}}],["thus",{"2":{"3":1}}],["think",{"2":{"25":1,"28":1}}],["thinner",{"2":{"23":1}}],["thing",{"2":{"5":1,"35":1}}],["things",{"2":{"3":1,"20":1,"23":2,"28":1,"37":1,"99":2}}],["third",{"0":{"30":1},"2":{"2":1,"4":5,"5":1,"25":1,"29":1,"37":1,"67":2,"118":1}}],["this",{"0":{"58":1},"2":{"1":1,"2":4,"3":1,"4":1,"8":2,"9":4,"10":2,"12":1,"16":2,"19":2,"20":5,"23":3,"24":1,"25":11,"26":3,"27":13,"28":4,"30":1,"31":1,"34":1,"35":2,"36":6,"37":7,"59":1,"61":1,"64":3,"66":1,"71":1,"85":1,"99":1,"118":2}}],["theoretical",{"2":{"28":1}}],["themetoggle",{"2":{"120":1}}],["themes",{"0":{"120":1},"2":{"11":1,"28":1,"69":1,"71":2,"108":2,"120":4}}],["theme",{"2":{"11":1,"106":2,"120":2}}],["them",{"2":{"9":1,"11":4,"12":4,"16":3,"19":1,"20":2,"23":1,"25":4,"26":1,"28":1,"30":3,"31":1,"35":1,"36":1,"37":1,"67":1,"102":1}}],["themselves",{"2":{"8":1,"27":1,"70":1,"71":1,"78":1}}],["these",{"2":{"3":2,"4":1,"23":1,"25":1,"26":1,"37":1}}],["theft",{"2":{"2":1}}],["they",{"2":{"2":1,"9":1,"16":4,"19":1,"23":1,"25":2,"27":2,"31":1,"35":1,"36":1,"37":1}}],["their",{"2":{"2":1,"3":3,"16":1,"19":1,"24":1,"25":1,"26":1,"27":1,"35":1,"36":1,"37":1,"71":1,"76":1}}],["therefore",{"2":{"35":1}}],["there",{"2":{"2":3,"3":4,"9":2,"10":2,"12":1,"16":1,"18":1,"20":3,"24":3,"25":6,"26":2,"27":2,"28":1,"29":1,"35":1,"36":4,"37":2,"70":2,"78":1,"80":1,"102":1,"103":1}}],["then",{"2":{"1":1,"2":2,"3":1,"9":4,"18":1,"19":1,"25":3,"37":6}}],["the",{"0":{"20":1,"34":1,"58":1,"62":1,"66":1,"78":1},"2":{"1":11,"2":67,"3":16,"4":40,"5":13,"6":2,"8":4,"9":43,"10":11,"11":3,"12":11,"16":22,"17":1,"18":5,"19":9,"20":16,"22":1,"23":35,"24":2,"25":50,"26":17,"27":41,"28":14,"29":3,"30":2,"31":2,"32":1,"34":2,"35":20,"36":28,"37":55,"58":2,"59":6,"60":1,"61":9,"64":9,"67":12,"70":7,"71":12,"72":2,"74":9,"75":6,"76":4,"78":3,"79":2,"81":1,"84":10,"85":3,"86":1,"92":1,"97":3,"99":10,"100":1,"102":2,"103":2,"105":5,"106":1,"107":1,"108":3,"109":3,"110":2,"111":7,"112":3,"116":1,"117":2,"118":5,"119":7,"120":6}}],["touch",{"2":{"82":2}}],["touchslideoutdrawer",{"0":{"82":1},"2":{"82":1}}],["touched",{"2":{"61":1}}],["toggle",{"2":{"76":1,"106":1}}],["together",{"2":{"27":1,"29":1}}],["todos",{"2":{"74":1}}],["toaster",{"2":{"67":1}}],["top",{"2":{"61":1,"105":1}}],["topics",{"2":{"61":1}}],["topic",{"2":{"26":1}}],["too",{"2":{"36":1,"37":1}}],["took",{"2":{"28":1}}],["toolchain",{"2":{"20":1}}],["tool",{"2":{"19":1,"20":3,"34":1,"70":1}}],["tools",{"2":{"6":1,"23":1,"26":1,"37":1,"70":1}}],["toml",{"2":{"20":10}}],["toc",{"2":{"20":1}}],["tokens",{"2":{"2":2,"11":1,"108":1}}],["token",{"2":{"1":1,"2":15,"59":4}}],["to",{"0":{"3":1,"5":2,"58":1,"83":2},"1":{"84":2,"85":2},"2":{"1":7,"2":33,"3":15,"4":11,"5":8,"6":1,"8":8,"9":30,"10":9,"11":4,"12":7,"15":1,"16":8,"17":1,"18":3,"19":12,"20":12,"23":6,"25":26,"26":5,"27":19,"28":17,"29":3,"30":2,"31":2,"32":5,"35":7,"36":21,"37":26,"40":1,"42":1,"58":1,"64":2,"67":4,"70":8,"71":11,"74":3,"75":2,"76":2,"78":1,"79":1,"80":1,"82":1,"84":3,"85":1,"102":2,"105":3,"106":1,"108":3,"111":1,"112":1,"117":2,"118":1,"119":1,"120":2}}],["aesthetics",{"2":{"59":1}}],["afraid",{"2":{"36":1}}],["affects",{"2":{"29":1}}],["after",{"2":{"5":1,"6":1,"8":1,"9":3,"37":2,"97":1,"103":1,"119":1}}],["agnostic",{"2":{"74":1}}],["ago",{"2":{"23":1}}],["against",{"2":{"9":1,"100":1}}],["again",{"2":{"5":1,"36":1}}],["azure",{"2":{"20":2}}],["air",{"2":{"20":1}}],["ava",{"2":{"20":10}}],["available",{"0":{"105":1,"106":1},"2":{"16":1,"18":1,"25":2,"37":1,"66":1,"71":1,"84":1,"86":1,"105":1}}],["avoids",{"2":{"27":1}}],["avoided",{"2":{"23":1}}],["avoid",{"0":{"29":1},"2":{"12":1,"78":1,"108":1}}],["aux",{"2":{"20":1}}],["audio",{"2":{"16":1}}],["autocompleterefs",{"2":{"20":1}}],["autodetection",{"2":{"20":1}}],["autodetectcolorscheme",{"2":{"20":1}}],["autofetch",{"2":{"20":1}}],["autoupdate",{"2":{"20":1}}],["auto",{"2":{"9":1,"17":1,"20":1,"117":1}}],["automatically",{"2":{"9":1,"27":1,"84":1}}],["automation",{"2":{"9":1,"36":1,"84":1}}],["automating",{"2":{"6":1}}],["automate",{"2":{"9":1}}],["author",{"0":{"62":1},"2":{"61":1}}],["authors",{"2":{"20":3}}],["authorization",{"0":{"2":1},"2":{"2":6}}],["authentication",{"0":{"2":1},"2":{"2":7,"3":1,"11":3,"25":1,"59":2,"108":1}}],["authinterceptor",{"2":{"1":2}}],["auth",{"2":{"1":3,"69":1,"71":1,"108":2}}],["away",{"2":{"116":1}}],["await",{"2":{"1":2,"15":1,"74":1}}],["aws",{"2":{"3":1,"62":1}}],["abbreviations",{"0":{"59":1}}],["above",{"2":{"37":1,"85":1,"100":1}}],["about",{"0":{"27":1,"62":1},"2":{"18":1,"23":1,"25":2,"36":1,"37":1,"45":1,"117":1}}],["able",{"2":{"9":1,"27":1,"32":1,"71":1}}],["ability",{"2":{"3":4,"8":1,"36":1,"71":3,"106":1,"108":1}}],["absolutely",{"2":{"36":2}}],["absolute",{"2":{"3":1}}],["abstracting",{"2":{"1":1}}],["abstraction",{"0":{"0":1},"1":{"1":1},"2":{"74":1,"105":1}}],["among",{"2":{"26":1}}],["amount",{"2":{"2":1,"28":1}}],["ambiguous",{"2":{"25":1}}],["amazon",{"2":{"3":2,"8":2}}],["along",{"2":{"26":1,"37":1}}],["alg",{"2":{"20":1}}],["alias",{"2":{"19":5}}],["always",{"2":{"11":1,"16":1,"25":2,"29":1,"81":1}}],["alternative",{"2":{"3":1,"12":1}}],["already",{"2":{"3":1,"9":1,"26":1,"27":1,"28":1,"36":1}}],["also",{"2":{"2":3,"3":2,"6":1,"8":2,"9":1,"12":1,"19":3,"20":1,"25":4,"26":1,"27":4,"30":1,"35":2,"36":4,"37":2,"58":1,"64":1,"74":1,"78":1,"111":1}}],["ally",{"2":{"20":3,"102":2}}],["allowcompoundwords",{"2":{"20":1}}],["allowing",{"2":{"6":1}}],["allowed",{"2":{"4":1,"37":1}}],["allows",{"2":{"4":4,"10":2,"20":2,"25":1,"27":1,"28":1,"37":2,"74":1,"76":1,"117":1,"118":1}}],["allow",{"2":{"2":2,"4":4,"8":1,"19":1,"70":1}}],["all",{"2":{"1":1,"2":1,"4":4,"20":1,"25":3,"27":6,"28":2,"35":1,"36":2,"37":4,"66":1,"76":1,"93":1,"106":1,"111":2,"118":1,"119":1,"120":1}}],["attribute",{"2":{"76":1}}],["attributes",{"2":{"35":1}}],["attempt",{"2":{"5":1}}],["at",{"2":{"2":10,"4":1,"5":2,"9":1,"10":1,"11":2,"20":3,"23":2,"25":2,"26":4,"27":1,"28":2,"34":1,"36":5,"37":3,"59":1,"70":1,"74":1,"84":1,"99":1,"112":1}}],["aside",{"2":{"33":1}}],["aspect",{"2":{"26":1,"27":1}}],["aspx",{"2":{"20":1}}],["astro",{"2":{"20":1,"70":1}}],["ashx",{"2":{"20":1}}],["ascx",{"2":{"20":1}}],["asax",{"2":{"20":1}}],["associated",{"2":{"25":1}}],["assets",{"2":{"10":1,"16":5,"18":2,"76":1,"118":1}}],["assigned",{"2":{"2":1}}],["asked",{"2":{"61":1}}],["ask",{"2":{"2":1}}],["as",{"0":{"103":1},"2":{"2":5,"3":1,"4":2,"5":1,"10":3,"11":2,"16":4,"18":3,"19":1,"20":4,"23":2,"25":5,"26":1,"27":2,"34":1,"35":5,"36":2,"37":10,"61":1,"67":3,"70":4,"71":5,"74":1,"76":1,"85":1,"102":1}}],["asynchronous",{"2":{"12":1,"74":1}}],["async",{"2":{"1":1,"74":1,"75":1,"92":1}}],["arguments",{"2":{"92":1}}],["architect",{"2":{"62":1}}],["architecture",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1},"2":{"10":2,"28":2,"59":1,"71":1}}],["architecturally",{"2":{"25":1}}],["architectural",{"0":{"10":1},"1":{"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"23":1}}],["arrays",{"2":{"99":1}}],["array",{"2":{"23":6,"27":2,"36":1}}],["articles",{"2":{"35":1}}],["article",{"2":{"23":1,"24":1,"26":1,"33":1}}],["artisan",{"2":{"20":1}}],["area",{"2":{"25":1}}],["are",{"2":{"2":6,"3":3,"4":2,"6":1,"8":1,"9":4,"10":3,"12":3,"16":6,"19":2,"20":4,"21":1,"23":5,"24":2,"25":8,"26":7,"27":5,"28":5,"35":2,"36":6,"37":6,"60":2,"61":1,"70":1,"72":1,"78":2,"80":1,"86":1,"93":1,"101":1,"105":1,"116":1,"118":1,"120":2}}],["around",{"2":{"1":1,"3":1,"25":1,"36":1,"37":1}}],["adaptive",{"2":{"70":1,"93":1}}],["adapter",{"2":{"64":1,"75":2,"105":1}}],["adaptability",{"0":{"72":1},"2":{"28":1,"32":1,"35":1,"72":1}}],["advent",{"2":{"37":1}}],["advertising",{"2":{"29":1}}],["advance",{"2":{"37":1}}],["advantage",{"2":{"25":1}}],["advisable",{"2":{"36":1}}],["adding",{"2":{"23":1,"27":1,"67":1}}],["additional",{"2":{"6":1,"37":1}}],["addition",{"2":{"5":1,"9":2,"10":1,"27":1,"37":2,"105":1}}],["addextraspaceontop",{"2":{"20":1}}],["added",{"2":{"16":1,"37":1}}],["add",{"2":{"4":1,"9":1,"14":1,"20":1,"28":3,"35":1,"58":1,"64":6,"69":3}}],["adds",{"2":{"4":1,"35":1,"64":1,"69":1,"82":1,"92":1,"115":1}}],["addresponseinterceptor",{"2":{"1":2,"75":1}}],["admin",{"2":{"2":2,"10":1}}],["answers",{"2":{"61":3}}],["answer",{"2":{"36":1,"58":1}}],["angular",{"2":{"27":2}}],["analytics",{"0":{"92":1,"115":1},"2":{"64":1,"69":1,"78":1,"105":2}}],["analysis",{"2":{"20":1,"56":1}}],["analogy",{"2":{"28":1,"36":1}}],["analogs",{"2":{"25":1}}],["analog",{"2":{"25":2}}],["annotations",{"2":{"20":1}}],["antony",{"2":{"20":1,"67":1}}],["antfu",{"2":{"20":3}}],["antialiased",{"2":{"20":1}}],["anti",{"2":{"12":1}}],["animation",{"2":{"12":1,"37":1}}],["another",{"2":{"9":1,"25":5,"28":1,"30":1,"36":1,"37":1,"70":1,"74":1}}],["anyone",{"2":{"25":1}}],["anywhere",{"2":{"25":1}}],["anything",{"2":{"9":1}}],["any",{"2":{"2":2,"3":1,"4":2,"5":2,"11":1,"15":1,"16":1,"25":3,"27":1,"32":1,"35":1,"37":1,"58":1,"100":1,"117":1}}],["an",{"0":{"19":1,"104":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"2":3,"3":2,"4":4,"5":3,"8":1,"9":2,"10":1,"11":1,"12":3,"16":1,"19":3,"23":4,"25":8,"27":4,"28":2,"35":1,"36":7,"37":3,"70":3,"74":1,"76":1,"99":1,"102":2}}],["and",{"0":{"2":1,"12":1,"19":1,"23":1,"30":1,"33":1,"35":1,"37":1,"59":1,"65":1},"1":{"13":1,"14":1,"15":1},"2":{"1":3,"2":24,"3":13,"4":3,"5":3,"6":1,"8":4,"9":22,"10":8,"11":2,"12":7,"16":6,"19":6,"20":18,"23":20,"24":3,"25":39,"26":5,"27":22,"28":9,"29":3,"30":1,"31":4,"32":4,"33":1,"34":2,"35":20,"36":37,"37":31,"45":1,"58":1,"59":2,"60":1,"61":8,"64":3,"66":1,"67":5,"69":3,"70":7,"71":10,"72":2,"75":1,"76":3,"81":3,"82":1,"84":5,"99":2,"100":1,"101":1,"102":2,"105":2,"108":8,"109":4,"111":2,"116":2,"117":1,"118":3,"119":1,"120":2}}],["acme",{"2":{"117":3}}],["acr",{"2":{"20":1}}],["across",{"2":{"12":1}}],["acn",{"2":{"20":1}}],["act",{"2":{"71":1}}],["activitybar",{"2":{"20":1}}],["actively",{"2":{"27":1}}],["active",{"2":{"13":1,"20":1}}],["actions",{"0":{"9":1,"83":1},"1":{"84":1,"85":1},"2":{"2":1,"6":2,"9":12,"20":1,"26":1,"36":1,"44":1,"71":1,"84":1,"105":1,"108":1}}],["action",{"2":{"2":2,"9":9,"20":1,"64":1,"84":2}}],["actually",{"2":{"70":1}}],["actual",{"2":{"9":1,"37":1}}],["accepts",{"2":{"64":1}}],["accessing",{"2":{"20":1,"37":2}}],["accessibility",{"2":{"35":1}}],["accessibilitysupport",{"2":{"20":1}}],["accessible",{"2":{"8":1}}],["accesses",{"2":{"3":1}}],["accessed",{"2":{"3":1,"4":1,"16":1,"85":1}}],["access",{"2":{"1":1,"2":14,"3":5,"4":13,"9":1,"11":1,"25":2,"59":1,"74":1}}],["accomplish",{"2":{"28":1}}],["accompanying",{"2":{"25":1}}],["according",{"2":{"25":1}}],["accordingly",{"2":{"4":1,"37":1}}],["accordian",{"2":{"11":1}}],["accordianpanel",{"2":{"11":1}}],["accountroutes",{"2":{"12":2}}],["account",{"2":{"1":1,"2":2,"10":1,"12":2,"16":1,"18":1,"37":1}}],["axios",{"2":{"1":1,"70":1,"74":1}}],["apollo",{"2":{"20":2}}],["apache",{"2":{"8":1}}],["appveyor",{"2":{"20":2}}],["appsettings",{"2":{"20":2}}],["appsidebar",{"2":{"12":1}}],["apparent",{"2":{"18":1}}],["appfooter",{"2":{"12":2}}],["appheader>",{"2":{"97":1}}],["appheadersecond",{"2":{"97":1}}],["appheaderfirst",{"2":{"97":1}}],["appheader",{"2":{"12":2,"97":1}}],["approaches",{"2":{"27":1}}],["approach",{"2":{"12":1,"35":1,"37":1,"70":1}}],["app",{"2":{"10":1,"12":3,"13":1,"14":1,"15":1,"17":2,"37":3,"64":1,"72":1,"119":1}}],["applied",{"2":{"79":1}}],["applicants",{"2":{"27":1}}],["applications",{"2":{"2":1,"37":3,"70":1,"71":1}}],["application",{"0":{"16":1,"19":1,"28":1,"65":1,"104":1},"1":{"17":1,"18":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"105":1,"106":1,"107":1,"108":1},"2":{"1":1,"3":2,"5":1,"9":1,"10":4,"11":1,"12":2,"16":4,"19":3,"23":1,"25":4,"26":1,"27":1,"28":2,"29":1,"35":1,"36":1,"37":8,"59":3,"64":1,"67":4,"70":3,"71":7,"74":2,"75":2,"76":1,"79":1,"105":6,"107":1,"108":4,"116":1,"117":2,"118":1,"119":3,"120":1}}],["applying",{"2":{"67":1}}],["apploader",{"0":{"13":1}}],["appleboy",{"2":{"9":3}}],["appears",{"2":{"11":1,"26":1,"79":1,"97":1}}],["appear",{"2":{"4":1,"20":1,"37":1}}],["apidata",{"2":{"74":2}}],["apis",{"2":{"3":1,"5":1,"36":1}}],["api",{"0":{"1":1,"73":1,"74":1},"1":{"74":1,"75":1},"2":{"1":10,"3":4,"5":1,"8":2,"10":2,"15":1,"20":14,"23":4,"25":2,"27":1,"36":2,"37":1,"45":1,"64":2,"67":1,"69":1,"71":2,"74":5,"75":6,"105":3}}],["a",{"0":{"24":1,"65":1,"68":1,"103":1},"1":{"69":1,"70":1},"2":{"1":4,"2":12,"3":24,"4":11,"5":6,"6":8,"8":9,"9":9,"10":11,"11":1,"12":3,"15":1,"16":3,"18":4,"19":7,"20":15,"23":19,"24":2,"25":33,"26":5,"27":23,"28":11,"29":6,"32":2,"34":2,"35":6,"36":29,"37":33,"58":2,"64":2,"65":1,"66":1,"67":6,"69":2,"70":13,"71":8,"74":2,"75":1,"79":1,"82":1,"84":3,"85":2,"99":6,"100":2,"101":1,"106":1,"117":1,"118":1,"119":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexen.yQWoex4a.js b/assets/chunks/@localSearchIndexen.yQWoex4a.js deleted file mode 100644 index 313739adb..000000000 --- a/assets/chunks/@localSearchIndexen.yQWoex4a.js +++ /dev/null @@ -1 +0,0 @@ -const e='{"documentCount":121,"nextId":121,"documentIds":{"0":"/en/backend/api.html#backend-link-abstraction","1":"/en/backend/api.html#api-service","2":"/en/backend/auth.html#authentication-and-authorization","3":"/en/backend/backend.html#options-to-leverage-your-backend-for-frontenders","4":"/en/backend/cors.html#cors","5":"/en/backend/protocols.html#protocols-to-rest-or-not-to-rest","6":"/en/deployment/ci-cd.html#ci-cd","7":"/en/deployment/docker.html#docker","8":"/en/deployment/github-actions.html#github-actions","9":"/en/deployment/hosting.html#hosting","10":"/en/development/architectural-patterns.html#architectural-patterns","11":"/en/development/architectural-patterns.html#use-cases","12":"/en/development/architectural-patterns.html#best-practices-and-considerations","13":"/en/development/architectural-patterns.html#apploader-vue","14":"/en/development/architectural-patterns.html#useapploader-ts","15":"/en/development/architectural-patterns.html#some-component","16":"/en/development/assets.html#application-resources","17":"/en/development/assets.html#baseicon","18":"/en/development/assets.html#icons-js","19":"/en/development/building.html#create-and-build-an-application","20":"/en/development/ide.html#configuring-the-ide","21":"/en/development/libraries.html#tell-me-a-handy-library","22":"/en/development/misc.html#helpful-hints","23":"/en/development/misc.html#carousel-or-slider","24":"/en/development/misc.html#date-and-time","25":"/en/development/stores.html#state-management-in-vue-3","26":"/en/development/testing.html#testing","27":"/en/frontend/about-frameworks.html#about-frontend-frameworks","28":"/en/frontend/architecture.html#frontend-application-architecture","29":"/en/frontend/architecture.html#avoid-dependencies","30":"/en/frontend/architecture.html#use-wrappers-over-components-of-ui-libraries-and-third-party-utilities","31":"/en/frontend/architecture.html#regular-refactoring","32":"/en/frontend/architecture.html#use-css3","33":"/en/frontend/architecture.html#use-modern-standards-and-language-features","34":"/en/frontend/architecture.html#document-the-project","35":"/en/frontend/css-ui-libs.html#css-and-ui-libraries","36":"/en/frontend/learning.html#learning-vue","37":"/en/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-and-seo","38":"/en/misc/CHANGELOG.html#changelog","39":"/en/misc/CHANGELOG.html#v1-4-24-11-2023","40":"/en/misc/CHANGELOG.html#changed","41":"/en/misc/CHANGELOG.html#v1-3-10-10-2023","42":"/en/misc/CHANGELOG.html#changed-1","43":"/en/misc/CHANGELOG.html#v1-2-28-09-2023","44":"/en/misc/CHANGELOG.html#new","45":"/en/misc/CHANGELOG.html#changed-2","46":"/en/misc/CHANGELOG.html#v1-1-15-09-2023","47":"/en/misc/CHANGELOG.html#new-1","48":"/en/misc/CHANGELOG.html#changed-3","49":"/en/misc/CHANGELOG.html#v1-0-11-09-2023","50":"/en/misc/CHANGELOG.html#new-2","51":"/en/misc/cheat-sheets.html#cheat-sheet","52":"/en/misc/cheat-sheets.html#vue","53":"/en/misc/cheat-sheets.html#javascript","54":"/en/misc/cheat-sheets.html#html","55":"/en/misc/cheat-sheets.html#css","56":"/en/misc/cheat-sheets.html#typescript","57":"/en/misc/cheat-sheets.html#markdown","58":"/en/misc/contribute.html#contribute-to-the-development-of-this-resource","59":"/en/misc/glossary.html#glossary-and-abbreviations","60":"/en/misc/introduction.html#introduction","61":"/en/misc/introduction.html#about-the-author","62":"/en/vue-webapp/contribution.html#project-participation","63":"/en/vue-webapp/getting-started.html#getting-started","64":"/en/vue-webapp/getting-started.html#installation-via-create-vue-webapp","65":"/en/vue-webapp/getting-started.html#initializing-and-launching-a-web-application","66":"/en/vue-webapp/getting-started.html#installation-from-the-repository","67":"/en/vue-webapp/guidelines.html#guidelines","68":"/en/vue-webapp/#scaffolding-a-vue-webapp","69":"/en/vue-webapp/#summary","70":"/en/vue-webapp/#justification","71":"/en/vue-webapp/objectives.html#objectives","72":"/en/vue-webapp/options/adaptability.html#adaptability","73":"/en/vue-webapp/options/api.html#api-module","74":"/en/vue-webapp/options/api.html#api-rest","75":"/en/vue-webapp/options/api.html#json-rpc","76":"/en/vue-webapp/options/baseIcon.html#baseicon","77":"/en/vue-webapp/options/description.html#implementation-details","78":"/en/vue-webapp/options/description.html#code-injections-in-the-index-html","79":"/en/vue-webapp/options/description.html#css-tricks","80":"/en/vue-webapp/options/drawer.html#navigation-drawers","81":"/en/vue-webapp/options/drawer.html#simpledrawer","82":"/en/vue-webapp/options/drawer.html#touchslideoutdrawer","83":"/en/vue-webapp/options/footer.html#footers","84":"/en/vue-webapp/options/footer.html#simplefooter","85":"/en/vue-webapp/options/footer.html#richfooter","86":"/en/vue-webapp/options/footer.html#mantinesimplefooter","87":"/en/vue-webapp/options/footer.html#mantinerichfooter","88":"/en/vue-webapp/options/footer.html#distributedfooter","89":"/en/vue-webapp/options/ga-gp.html#github-actions-script-to-deploy-to-github-pages","90":"/en/vue-webapp/options/ga-gp.html#deployment","91":"/en/vue-webapp/options/ga-gp.html#setting-base-in-vite-config","92":"/en/vue-webapp/options/google-analytics.html#google-analytics","93":"/en/vue-webapp/options/header.html#headers","94":"/en/vue-webapp/options/header.html#simpleheader","95":"/en/vue-webapp/options/header.html#mantinesimpleheader","96":"/en/vue-webapp/options/header.html#mantinelayeredheader","97":"/en/vue-webapp/options/header.html#slidingheader","98":"/en/vue-webapp/options/i18n.html#i18n","99":"/en/vue-webapp/options/i18n.html#i18next","100":"/en/vue-webapp/options/i18n.html#usei18nlight","101":"/en/vue-webapp/options/i18n.html#usage","102":"/en/vue-webapp/options/i18n.html#i18next-extensions","103":"/en/vue-webapp/options/i18n.html#as-a-result","104":"/en/vue-webapp/options/#options-when-creating-an-application","105":"/en/vue-webapp/options/#available-options","106":"/en/vue-webapp/options/#available-by-default","107":"/en/vue-webapp/options/#in-development","108":"/en/vue-webapp/options/#planned","109":"/en/vue-webapp/options/layout-main.html#mainlayout","110":"/en/vue-webapp/options/layout-main.html#routing","111":"/en/vue-webapp/options/layout-one-column.html#onecolumnlayout","112":"/en/vue-webapp/options/navbar.html#navbar","113":"/en/vue-webapp/options/navbar.html#simplenavbar","114":"/en/vue-webapp/options/navbar.html#mantinesimplenavbar","115":"/en/vue-webapp/options/open-graph.html#google-analytics","116":"/en/vue-webapp/options/pwa.html#pwa","117":"/en/vue-webapp/options/pwa.html#manifest-json","118":"/en/vue-webapp/options/pwa.html#service-worker","119":"/en/vue-webapp/options/splash-screen.html#splash-screen","120":"/en/vue-webapp/options/themes.html#themes"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[3,1,1],"1":[2,3,120],"2":[3,1,328],"3":[7,1,226],"4":[1,1,177],"5":[7,1,147],"6":[2,1,71],"7":[1,1,1],"8":[2,1,385],"9":[1,1,124],"10":[2,1,151],"11":[2,3,83],"12":[4,3,171],"13":[2,6,22],"14":[2,6,32],"15":[2,6,25],"16":[2,1,178],"17":[1,3,71],"18":[2,3,116],"19":[5,1,209],"20":[3,1,815],"21":[5,1,49],"22":[2,1,9],"23":[3,3,17],"24":[3,3,312],"25":[5,1,468],"26":[1,1,149],"27":[3,1,368],"28":[3,1,189],"29":[2,4,79],"30":[11,4,41],"31":[2,4,30],"32":[2,4,48],"33":[6,4,18],"34":[3,4,36],"35":[4,1,214],"36":[2,1,408],"37":[6,1,457],"38":[1,1,1],"39":[6,1,1],"40":[1,7,8],"41":[5,1,1],"42":[1,6,11],"43":[6,1,1],"44":[1,7,4],"45":[1,7,14],"46":[6,1,1],"47":[1,7,3],"48":[1,7,4],"49":[6,1,1],"50":[1,7,3],"51":[2,1,1],"52":[1,3,5],"53":[1,3,4],"54":[1,3,4],"55":[1,3,6],"56":[1,3,8],"57":[1,3,2],"58":[7,1,42],"59":[3,1,61],"60":[1,1,80],"61":[4,2,29],"62":[2,1,15],"63":[2,1,1],"64":[5,2,136],"65":[6,7,14],"66":[4,2,37],"67":[1,1,134],"68":[4,1,1],"69":[1,4,63],"70":[1,4,158],"71":[1,1,169],"72":[1,1,79],"73":[2,1,1],"74":[3,2,92],"75":[2,2,89],"76":[1,1,65],"77":[2,1,1],"78":[6,2,44],"79":[2,2,30],"80":[2,1,12],"81":[1,2,23],"82":[1,2,24],"83":[1,1,9],"84":[1,1,1],"85":[1,1,1],"86":[1,1,1],"87":[1,1,1],"88":[1,1,1],"89":[6,1,1],"90":[1,6,67],"91":[5,6,46],"92":[2,1,45],"93":[1,1,5],"94":[1,1,4],"95":[1,1,8],"96":[1,1,8],"97":[1,1,30],"98":[1,1,1],"99":[1,1,99],"100":[1,1,22],"101":[1,1,56],"102":[2,1,56],"103":[3,1,17],"104":[5,1,1],"105":[2,5,73],"106":[3,5,20],"107":[2,5,12],"108":[1,5,74],"109":[1,1,28],"110":[1,1,13],"111":[1,1,46],"112":[1,1,17],"113":[1,1,1],"114":[1,1,1],"115":[2,1,34],"116":[1,1,16],"117":[2,1,56],"118":[2,1,66],"119":[2,1,49],"120":[1,1,83]},"averageFieldLength":[2.4132231404958677,2.2148760330578514,73.5289256198347],"storedFields":{"0":{"title":"Backend link abstraction","titles":[]},"1":{"title":"API service","titles":["Backend link abstraction"]},"2":{"title":"Authentication and authorization","titles":[]},"3":{"title":"Options to leverage your backend for frontenders","titles":[]},"4":{"title":"CORS","titles":[]},"5":{"title":"Protocols. To REST or not to REST?","titles":[]},"6":{"title":"CI/CD","titles":[]},"7":{"title":"Docker","titles":[]},"8":{"title":"Github Actions","titles":[]},"9":{"title":"Hosting","titles":[]},"10":{"title":"Architectural patterns","titles":[]},"11":{"title":"Use cases","titles":["Architectural patterns",null,null]},"12":{"title":"Best Practices and Considerations","titles":["Architectural patterns",null,null]},"13":{"title":"AppLoader.vue","titles":["Architectural patterns",null,null,"Best Practices and Considerations"]},"14":{"title":"useAppLoader.ts","titles":["Architectural patterns",null,null,"Best Practices and Considerations"]},"15":{"title":"Some component","titles":["Architectural patterns",null,null,"Best Practices and Considerations"]},"16":{"title":"Application Resources","titles":[]},"17":{"title":"BaseIcon","titles":["Application Resources",null,null]},"18":{"title":"icons.js","titles":["Application Resources",null,null]},"19":{"title":"Create and build an application","titles":[]},"20":{"title":"Configuring the IDE","titles":[]},"21":{"title":"Tell me a handy library","titles":[]},"22":{"title":"Helpful hints","titles":[]},"23":{"title":"Carousel or slider","titles":["Helpful hints",null]},"24":{"title":"Date and time","titles":["Helpful hints",null]},"25":{"title":"State management in Vue 3","titles":[]},"26":{"title":"Testing","titles":[]},"27":{"title":"About frontend frameworks","titles":[]},"28":{"title":"Frontend application architecture","titles":[]},"29":{"title":"Avoid dependencies","titles":["Frontend application architecture",null,null,null,null]},"30":{"title":"Use wrappers over components of UI libraries and third-party utilities","titles":["Frontend application architecture",null,null,null,null]},"31":{"title":"Regular refactoring","titles":["Frontend application architecture",null,null,null,null]},"32":{"title":"Use CSS3","titles":["Frontend application architecture",null,null,null,null]},"33":{"title":"Use modern standards and language features","titles":["Frontend application architecture",null,null,null,null]},"34":{"title":"Document the project","titles":["Frontend application architecture",null,null,null,null]},"35":{"title":"CSS and UI libraries","titles":[]},"36":{"title":"Learning Vue","titles":[]},"37":{"title":"SPA, PWA, SSG, SSR and SEO","titles":[]},"38":{"title":"Changelog","titles":[]},"39":{"title":"v1.4 (24-11-2023)","titles":["Changelog"]},"40":{"title":"Changed","titles":["Changelog","v1.4 (24-11-2023)",null]},"41":{"title":"v1.3 (10-10-2023)","titles":["Changelog"]},"42":{"title":"Changed","titles":["Changelog","v1.3 (10-10-2023)",null]},"43":{"title":"v1.2 (28-09-2023)","titles":["Changelog"]},"44":{"title":"New","titles":["Changelog","v1.2 (28-09-2023)",null]},"45":{"title":"Changed","titles":["Changelog","v1.2 (28-09-2023)",null]},"46":{"title":"v1.1 (15-09-2023)","titles":["Changelog"]},"47":{"title":"New","titles":["Changelog","v1.1 (15-09-2023)"]},"48":{"title":"Changed","titles":["Changelog","v1.1 (15-09-2023)"]},"49":{"title":"v1.0 (11-09-2023)","titles":["Changelog"]},"50":{"title":"New","titles":["Changelog","v1.0 (11-09-2023)"]},"51":{"title":"Cheat Sheet","titles":[]},"52":{"title":"Vue","titles":["Cheat Sheet",null]},"53":{"title":"JavaScript","titles":["Cheat Sheet",null]},"54":{"title":"HTML","titles":["Cheat Sheet",null]},"55":{"title":"CSS","titles":["Cheat Sheet",null]},"56":{"title":"Typescript","titles":["Cheat Sheet",null]},"57":{"title":"Markdown","titles":["Cheat Sheet",null]},"58":{"title":"Contribute to the development of this resource","titles":[]},"59":{"title":"Glossary and abbreviations","titles":[]},"60":{"title":"Introduction","titles":[]},"61":{"title":"About the author:","titles":["Introduction",null]},"62":{"title":"Project participation","titles":[]},"63":{"title":"Getting started","titles":[]},"64":{"title":"Installation via create vue-webapp","titles":["Getting started"]},"65":{"title":"Initializing and launching a web application","titles":["Getting started","Installation via create vue-webapp"]},"66":{"title":"Installation from the repository","titles":["Getting started"]},"67":{"title":"Guidelines","titles":[]},"68":{"title":"Scaffolding a Vue webapp","titles":[]},"69":{"title":"Summary","titles":["Scaffolding a Vue webapp"]},"70":{"title":"Justification","titles":["Scaffolding a Vue webapp"]},"71":{"title":"Objectives","titles":[]},"72":{"title":"Adaptability","titles":[]},"73":{"title":"API module","titles":[]},"74":{"title":"API (REST)","titles":["API module"]},"75":{"title":"JSON-RPC","titles":["API module"]},"76":{"title":"BaseIcon","titles":[]},"77":{"title":"Implementation details","titles":[]},"78":{"title":"Code injections in the index.html","titles":["Implementation details"]},"79":{"title":"CSS tricks","titles":["Implementation details"]},"80":{"title":"Navigation drawers","titles":[]},"81":{"title":"SimpleDrawer","titles":["Navigation drawers"]},"82":{"title":"TouchSlideoutDrawer","titles":["Navigation drawers"]},"83":{"title":"Footers","titles":[]},"84":{"title":"SimpleFooter","titles":["Footers"]},"85":{"title":"RichFooter","titles":["Footers"]},"86":{"title":"MantineSimpleFooter","titles":["Footers"]},"87":{"title":"MantineRichFooter","titles":["Footers"]},"88":{"title":"DistributedFooter","titles":["Footers"]},"89":{"title":"GitHub Actions script to deploy to GitHub Pages","titles":[]},"90":{"title":"Deployment","titles":["GitHub Actions script to deploy to GitHub Pages"]},"91":{"title":"Setting base in Vite config","titles":["GitHub Actions script to deploy to GitHub Pages"]},"92":{"title":"Google analytics","titles":[]},"93":{"title":"Headers","titles":[]},"94":{"title":"SimpleHeader","titles":["Headers"]},"95":{"title":"MantineSimpleHeader","titles":["Headers"]},"96":{"title":"MantineLayeredHeader","titles":["Headers"]},"97":{"title":"SlidingHeader","titles":["Headers"]},"98":{"title":"i18n","titles":[]},"99":{"title":"i18next","titles":["i18n"]},"100":{"title":"useI18nLight","titles":["i18n"]},"101":{"title":"Usage","titles":["i18n"]},"102":{"title":"i18next extensions","titles":["i18n"]},"103":{"title":"As a result","titles":["i18n"]},"104":{"title":"Options when creating an application","titles":[]},"105":{"title":"Available options","titles":["Options when creating an application"]},"106":{"title":"Available by default","titles":["Options when creating an application"]},"107":{"title":"In development","titles":["Options when creating an application"]},"108":{"title":"Planned","titles":["Options when creating an application"]},"109":{"title":"MainLayout","titles":[]},"110":{"title":"Routing","titles":["MainLayout"]},"111":{"title":"OneColumnLayout","titles":[]},"112":{"title":"Navbar","titles":[]},"113":{"title":"SimpleNavbar","titles":["Navbar"]},"114":{"title":"MantineSimpleNavbar","titles":["Navbar"]},"115":{"title":"Google analytics","titles":[]},"116":{"title":"PWA","titles":[]},"117":{"title":"Manifest.json","titles":["PWA"]},"118":{"title":"Service worker","titles":["PWA"]},"119":{"title":"Splash screen","titles":[]},"120":{"title":"Themes","titles":[]}},"dirtCount":0,"index":[["6",{"2":{"120":1}}],["67",{"2":{"120":3}}],["60",{"2":{"120":6}}],["78",{"2":{"120":1}}],["767",{"2":{"72":1}}],["70",{"2":{"36":1,"100":1}}],["√",{"2":{"64":13,"69":5}}],["q",{"2":{"58":1}}],["qbutton",{"2":{"35":1}}],["questions",{"2":{"60":3}}],["question",{"2":{"36":1,"58":1}}],["questionable",{"2":{"26":1}}],["queries",{"2":{"5":1}}],["query",{"2":{"3":1,"5":1,"33":1}}],["quasar",{"2":{"20":2,"21":1}}],["quality",{"2":{"18":1,"20":1,"35":1,"36":3,"59":2}}],["quickly",{"2":{"28":1,"70":3,"71":1}}],["quick",{"2":{"26":1}}],["quieter",{"2":{"20":1}}],["quiet",{"2":{"20":1}}],["quite",{"2":{"2":1,"20":1,"21":1,"25":1,"27":1,"36":1,"37":2,"70":3,"102":1}}],["quote",{"2":{"35":1}}],["quot",{"2":{"2":2,"3":2,"4":4,"24":6,"25":8,"27":4,"28":4,"32":2,"36":5,"37":4,"64":6,"70":4,"81":2,"90":14,"99":8,"109":2,"111":2}}],["zuckerberg",{"2":{"27":1}}],["zero",{"2":{"2":1,"20":1}}],["^",{"2":{"20":1}}],["^20",{"2":{"19":1}}],["400",{"2":{"97":1}}],["401",{"2":{"2":2}}],["480",{"2":{"72":1}}],["4",{"0":{"39":1},"1":{"40":1},"2":{"18":2,"20":1,"36":1}}],[">",{"2":{"8":1,"12":8,"13":2,"14":1,"16":5,"17":2,"20":1,"35":2,"58":2,"72":5,"76":3,"92":2,"97":3,"101":2,"115":15}}],[">>",{"2":{"8":5}}],["`~",{"2":{"20":1}}],["`$",{"2":{"17":4}}],["`",{"2":{"8":3,"16":1}}],["+page",{"2":{"20":6}}],["+layout",{"2":{"20":7}}],["+$backups",{"2":{"8":1}}],["+",{"2":{"8":1,"18":2}}],["||",{"2":{"92":1}}],["|",{"2":{"8":4,"20":1}}],["$1",{"2":{"9":1}}],["$dirs",{"2":{"8":1}}],["$root",{"2":{"8":3}}],["$backup",{"2":{"8":6}}],["$env",{"2":{"8":1}}],["$project",{"2":{"8":3}}],["$github",{"2":{"8":5}}],["$target",{"2":{"8":8}}],["$",{"2":{"8":15,"16":1,"20":96,"65":2,"66":3}}],["kb",{"2":{"103":1}}],["kits",{"2":{"70":1}}],["kill",{"2":{"36":1}}],["kids",{"2":{"36":1}}],["kinds",{"2":{"36":1}}],["kind",{"2":{"25":1,"37":1}}],["karma",{"2":{"20":10}}],["keen",{"2":{"23":1}}],["keeps",{"2":{"27":1}}],["keep",{"2":{"20":1,"25":1,"36":1}}],["keys",{"2":{"25":1}}],["keyboard",{"2":{"20":2}}],["key",{"2":{"8":10,"24":1,"99":1}}],["knows",{"2":{"36":2}}],["knowledge",{"2":{"36":2}}],["known",{"2":{"23":1,"24":1}}],["know",{"2":{"3":1,"19":1,"35":1,"36":3}}],["🚀",{"2":{"8":1}}],["🛎️",{"2":{"8":1}}],["56",{"2":{"120":1}}],["50",{"2":{"103":1}}],["50kb",{"2":{"24":1}}],["58",{"2":{"20":1}}],["5",{"2":{"8":3,"25":1}}],["86",{"2":{"120":1}}],["8",{"2":{"8":2}}],["yes",{"2":{"64":8,"69":4}}],["yet",{"2":{"27":1}}],["years",{"2":{"24":2,"37":1,"60":1,"61":1,"99":1}}],["year",{"2":{"9":1,"36":1}}],["yielded",{"2":{"25":1}}],["yarnrc",{"2":{"20":2}}],["yarn",{"2":{"19":1,"20":4}}],["yamllint",{"2":{"20":2}}],["yaml",{"2":{"8":7,"20":7}}],["y",{"2":{"8":1}}],["yougithubusername",{"2":{"90":1}}],["youtube",{"2":{"36":2}}],["you",{"2":{"1":1,"2":3,"3":5,"5":2,"9":6,"10":3,"11":3,"12":3,"16":3,"18":1,"19":6,"20":6,"24":4,"25":9,"26":1,"27":3,"28":6,"29":2,"30":1,"32":1,"35":3,"36":9,"37":9,"58":1,"64":1,"70":2,"90":1,"91":3,"92":1,"102":1,"115":1,"118":1}}],["yourname",{"2":{"91":1}}],["yourself",{"2":{"9":2,"19":1,"20":1,"36":1}}],["your",{"0":{"3":1},"2":{"1":3,"2":4,"3":4,"4":1,"5":1,"8":18,"9":5,"11":1,"12":1,"16":3,"19":1,"20":3,"24":1,"25":6,"28":1,"29":3,"30":1,"31":1,"34":1,"35":3,"36":5,"37":4,"58":1,"90":2,"91":1,"92":1,"115":1,"117":1}}],["99",{"2":{"5":1,"25":3}}],["95",{"2":{"2":1,"21":1,"24":1}}],["09",{"0":{"43":1,"46":1,"49":1},"1":{"44":1,"45":1,"47":1,"48":1,"50":1}}],["04",{"2":{"20":1}}],["0",{"0":{"49":1},"1":{"50":1},"2":{"5":1,"8":5,"14":1,"37":2,"75":2,"120":5}}],["38",{"2":{"120":1}}],["300",{"2":{"20":1}}],["30",{"2":{"20":1}}],["3",{"0":{"25":1,"41":1},"1":{"42":1},"2":{"4":1,"5":1,"10":2,"19":1,"20":2,"24":3,"25":9,"27":3,"36":5,"52":1,"60":2,"67":2,"69":1,"71":1,"75":1,"120":2}}],["1443",{"2":{"75":1}}],["1px",{"2":{"72":1}}],["1199",{"2":{"72":1}}],["11",{"0":{"39":1,"49":1},"1":{"40":1,"50":1}}],["1280px",{"2":{"120":1}}],["12",{"2":{"36":1}}],["15",{"0":{"46":1},"1":{"47":1,"48":1},"2":{"29":1}}],["16gb",{"2":{"20":1}}],["10",{"0":{"41":2},"1":{"42":2},"2":{"20":1,"24":1,"36":2}}],["100vw",{"2":{"79":1}}],["10000",{"2":{"72":1}}],["1000",{"2":{"25":1}}],["100",{"2":{"17":2,"37":1,"79":1}}],["1",{"0":{"46":1},"1":{"47":1,"48":1},"2":{"4":6,"18":2,"19":1,"24":2,"25":2,"36":2,"37":1,"74":1,"75":1,"79":1,"120":2}}],["nice",{"2":{"82":1}}],["nix",{"2":{"20":3}}],["nls",{"2":{"20":2}}],["nx",{"2":{"20":2}}],["nvmrc",{"2":{"20":2}}],["number",{"2":{"24":1,"26":1,"28":1,"108":1}}],["numbers",{"2":{"24":1,"99":1}}],["nuxt",{"2":{"20":2,"70":1}}],["null",{"2":{"20":1}}],["npx",{"2":{"19":2}}],["npm",{"2":{"10":1,"19":1,"20":4,"24":1,"29":1,"71":1,"99":1}}],["n",{"2":{"8":1,"20":1,"36":1}}],["naming",{"2":{"71":1}}],["namely",{"2":{"25":1}}],["named",{"2":{"18":2}}],["name=",{"2":{"16":1,"76":1,"115":4}}],["names",{"2":{"4":1,"16":1,"76":1}}],["name",{"2":{"4":1,"8":13,"12":2,"16":3,"17":4,"18":8,"58":1,"64":1,"69":1,"76":1,"90":1,"91":1,"106":1,"117":2}}],["navbar",{"0":{"112":1},"1":{"113":1,"114":1},"2":{"64":2,"105":1,"112":1}}],["navigationdrawer",{"2":{"64":1,"112":1}}],["navigation",{"0":{"80":1},"1":{"81":1,"82":1},"2":{"64":1,"71":1,"80":1,"105":2,"111":1}}],["native",{"2":{"27":1,"37":3,"117":1}}],["nativetabs",{"2":{"20":1}}],["nature",{"2":{"21":1}}],["naturally",{"2":{"8":1,"25":1}}],["nginx",{"2":{"3":1,"9":1}}],["next",{"2":{"20":2,"36":1}}],["nest",{"2":{"20":2}}],["nesting",{"2":{"20":2}}],["nested",{"2":{"12":1}}],["netlify",{"2":{"9":1,"20":2}}],["networks",{"2":{"75":1,"105":1}}],["network",{"2":{"3":1}}],["newitem",{"2":{"27":3}}],["news",{"2":{"25":2}}],["newer",{"2":{"19":1}}],["new",{"0":{"44":1,"47":1,"50":1},"2":{"8":5,"14":1,"18":2,"20":1,"27":2,"29":2,"35":1,"36":1,"37":1,"58":1,"72":1,"92":1,"102":1,"108":1,"118":1,"120":1}}],["nevertheless",{"2":{"70":1}}],["never",{"2":{"5":1,"20":1,"36":1}}],["needs",{"2":{"11":1,"16":1,"25":1,"26":1,"35":1,"37":1}}],["needed",{"2":{"8":1,"16":1,"24":1,"28":1,"67":2,"71":1,"91":1,"99":1,"102":1,"119":1}}],["need",{"2":{"3":1,"5":1,"8":2,"9":1,"10":2,"11":2,"12":1,"16":1,"19":4,"24":1,"25":1,"26":1,"27":3,"28":3,"29":1,"36":3,"37":3,"70":2,"91":1,"102":1}}],["necessary",{"2":{"2":1,"8":1,"20":1,"26":1,"36":1,"37":1,"67":2,"70":1,"103":1}}],["novice",{"2":{"70":1,"71":1}}],["non",{"2":{"25":2,"36":1,"60":1}}],["nontrivial",{"2":{"20":1}}],["normal",{"2":{"16":1,"20":1,"37":2}}],["now",{"2":{"9":1,"36":1}}],["nosql",{"2":{"3":1,"25":1}}],["nodemon",{"2":{"20":4}}],["node",{"2":{"3":2,"8":2,"19":3,"20":7,"36":1,"37":1}}],["no",{"2":{"2":1,"18":1,"20":1,"24":1,"25":4,"29":1,"37":1,"64":8,"69":4}}],["nothing",{"2":{"35":1}}],["notified",{"2":{"27":1}}],["notificationinterceptor",{"2":{"1":2,"75":2}}],["notebook",{"2":{"72":3,"81":1,"109":1,"111":1}}],["notes",{"2":{"37":1}}],["note",{"2":{"19":1,"35":1,"36":1}}],["not",{"0":{"5":1},"2":{"1":1,"2":6,"3":3,"4":3,"5":1,"6":1,"18":1,"20":4,"23":1,"24":7,"25":7,"26":1,"27":4,"28":2,"29":2,"32":1,"35":1,"36":5,"37":7,"60":1,"67":3,"70":1,"91":1,"118":1}}],["x",{"2":{"24":2,"79":1}}],["xshell",{"2":{"20":1}}],["xss",{"2":{"2":1}}],["xo",{"2":{"20":4}}],["xmlhttprequest",{"2":{"37":1}}],["xml",{"2":{"20":4}}],["xaml",{"2":{"20":2}}],["xdv",{"2":{"20":1}}],["x3c",{"2":{"12":20,"13":7,"14":1,"16":4,"17":8,"20":1,"35":4,"72":10,"76":7,"92":5,"97":8,"101":8,"115":15}}],["x26",{"2":{"8":4,"20":1,"72":2}}],["xhr",{"2":{"1":1,"74":1}}],["235",{"2":{"120":4}}],["255",{"2":{"120":2}}],["28",{"0":{"43":1},"1":{"44":1,"45":1}}],["22+",{"2":{"20":1}}],["29",{"2":{"20":1}}],["245",{"2":{"120":3}}],["24",{"0":{"39":1},"1":{"40":1},"2":{"17":2}}],["26",{"2":{"16":1}}],["20+",{"2":{"61":1}}],["2022",{"2":{"60":1}}],["2023",{"0":{"39":1,"41":1,"43":1,"46":1,"49":1},"1":{"40":1,"42":1,"44":1,"45":1,"47":1,"48":1,"50":1},"2":{"20":1,"36":1,"60":1}}],["2016",{"2":{"36":1}}],["200",{"2":{"20":1,"37":1,"97":1}}],["20~30",{"2":{"19":1}}],["20",{"2":{"8":1,"25":1,"36":1}}],["2",{"0":{"43":1},"1":{"44":1,"45":1},"2":{"2":1,"4":1,"20":3,"24":5,"25":2,"27":1,"35":1,"36":3,"37":1,"55":2,"75":1,"120":2}}],["gave",{"2":{"37":1}}],["gatsby",{"2":{"20":5}}],["gateway",{"2":{"3":1}}],["gql",{"2":{"20":2}}],["gz",{"2":{"20":1}}],["goes",{"2":{"20":1,"30":1}}],["governance",{"2":{"20":1}}],["go",{"2":{"20":6,"36":1,"70":1,"90":1}}],["good",{"2":{"3":1,"20":1,"22":1,"23":1,"25":1,"26":1,"27":1,"28":3,"29":1,"31":1,"35":2,"36":3}}],["googletagmanager",{"2":{"92":1}}],["googleanalytics",{"2":{"64":1}}],["google",{"0":{"92":1,"115":1},"2":{"2":8,"3":4,"9":1,"24":1,"29":1,"36":1,"37":3,"64":1,"69":1,"78":1,"92":2,"105":2}}],["gutter",{"2":{"120":1}}],["guidelines",{"0":{"67":1}}],["guide",{"2":{"36":2}}],["guides",{"2":{"20":1}}],["gui",{"2":{"27":1}}],["gulp",{"2":{"20":2}}],["guest",{"2":{"2":1}}],["glass",{"2":{"36":1}}],["gls",{"2":{"20":1}}],["glossary",{"0":{"59":1}}],["glo",{"2":{"20":1}}],["glob",{"2":{"17":1,"18":2,"76":1}}],["global",{"2":{"11":1,"12":1,"25":7,"28":1,"71":1,"107":1}}],["glg",{"2":{"20":1}}],["glitches",{"2":{"20":1}}],["gtag",{"2":{"92":5}}],["gt",{"2":{"8":1,"20":1,"37":2}}],["gh",{"2":{"8":2,"90":3}}],["gitpod",{"2":{"20":2}}],["gitmessage",{"2":{"20":1}}],["gitmodules",{"2":{"20":1}}],["gitattributes",{"2":{"20":1}}],["gitlens",{"2":{"20":4}}],["gitlab",{"2":{"6":1,"20":2}}],["gitignore",{"2":{"8":1,"20":1}}],["githubactionsgithubpagesworkflow",{"2":{"64":1}}],["githubpullrequests",{"2":{"20":1}}],["githubissues",{"2":{"20":1}}],["github",{"0":{"8":1,"89":2},"1":{"90":2,"91":2},"2":{"6":2,"8":23,"9":3,"20":7,"36":2,"44":1,"58":1,"64":2,"66":1,"69":1,"71":1,"90":6,"105":3,"108":1}}],["git",{"2":{"6":1,"8":3,"10":1,"20":10,"66":2}}],["gives",{"2":{"5":2,"20":1,"24":1}}],["given",{"2":{"3":1}}],["give",{"2":{"2":2,"27":1,"37":1}}],["grpc",{"2":{"74":1}}],["grid",{"2":{"33":1,"55":2}}],["growth",{"2":{"31":1}}],["grown",{"2":{"24":1,"99":1}}],["grunt",{"2":{"20":2}}],["greateŕl",{"2":{"27":1}}],["great",{"2":{"19":1,"20":1}}],["greatly",{"2":{"5":1,"10":1,"70":1,"118":1}}],["gray",{"2":{"72":1}}],["graphql",{"2":{"74":1}}],["graph",{"2":{"64":1,"69":1,"78":1,"105":1,"115":1}}],["graphgl",{"2":{"5":1}}],["grains",{"2":{"36":1}}],["grab",{"2":{"8":1}}],["grant",{"2":{"4":1}}],["granted",{"2":{"4":2}}],["granular",{"2":{"2":1}}],["g",{"2":{"3":1,"16":1,"20":1,"25":1,"37":1,"67":1,"92":1}}],["gmail",{"2":{"2":1,"61":1}}],["gemfile",{"2":{"20":2}}],["generation",{"2":{"37":2}}],["generating",{"2":{"19":1,"37":1}}],["generated",{"2":{"37":2}}],["generate",{"2":{"8":1,"9":1,"15":1,"37":1}}],["generates",{"2":{"2":2,"3":1,"37":1}}],["generalize",{"2":{"71":1}}],["generally",{"2":{"60":1}}],["general",{"2":{"16":1,"20":3,"36":1,"37":1,"59":1,"71":2}}],["generalroutes",{"2":{"12":2}}],["genuinely",{"2":{"12":1}}],["getbestblockhash",{"2":{"75":1}}],["getting",{"0":{"63":1},"1":{"64":1,"65":1,"66":1}}],["getters",{"2":{"25":2}}],["gettoken",{"2":{"1":1}}],["getimageurl",{"2":{"17":2,"18":2}}],["getitem",{"2":{"8":1}}],["getsvgicon",{"2":{"17":3,"18":2}}],["gets",{"2":{"2":1,"16":2,"20":1}}],["get",{"2":{"1":1,"2":1,"3":1,"4":1,"6":1,"9":2,"18":2,"27":1,"36":1,"37":2,"74":1}}],["getuserdata",{"2":{"1":2}}],["b",{"2":{"24":2,"28":1}}],["bzl",{"2":{"20":1}}],["bbl",{"2":{"20":1}}],["blank",{"2":{"119":1}}],["blame",{"2":{"20":3}}],["blg",{"2":{"20":1}}],["bloating",{"2":{"78":1}}],["blocks",{"2":{"71":2}}],["block",{"2":{"20":1}}],["bloc",{"2":{"20":1}}],["blog",{"2":{"2":1,"69":1,"70":1,"71":1}}],["bit",{"2":{"25":1,"27":1,"29":1,"37":2}}],["bidirectional",{"2":{"5":1}}],["big",{"2":{"2":1,"27":1,"36":1}}],["bunch",{"2":{"24":1,"25":1,"99":1}}],["bundleconfig",{"2":{"20":2}}],["bundle",{"2":{"3":1,"19":4,"24":1,"29":1,"35":1,"103":1}}],["buying",{"2":{"9":1}}],["built",{"2":{"8":1,"25":1,"37":1}}],["builds",{"2":{"19":1}}],["builders",{"2":{"19":1}}],["builder",{"2":{"19":5,"67":1,"69":1,"71":1}}],["building",{"2":{"9":1,"19":1,"71":1,"105":1}}],["builddata",{"2":{"8":4}}],["build",{"0":{"19":1},"2":{"6":1,"8":12,"19":3,"20":4,"26":1,"71":1,"90":2,"103":1,"105":1}}],["bus",{"2":{"5":1}}],["business",{"2":{"3":1,"25":7,"27":1,"69":1,"70":3,"71":1,"74":1}}],["button>",{"2":{"101":1}}],["button",{"2":{"28":1,"35":1,"101":2}}],["buttons",{"2":{"28":1}}],["but",{"2":{"2":5,"3":3,"4":1,"5":1,"6":1,"8":1,"12":1,"16":1,"20":1,"24":4,"25":4,"26":1,"27":4,"28":2,"29":2,"35":1,"36":6,"37":6,"66":1,"67":2,"70":1,"75":1,"82":1,"99":1,"111":1}}],["border",{"2":{"72":1,"120":1}}],["born",{"2":{"37":1}}],["body",{"2":{"72":1,"119":1}}],["box",{"2":{"71":1,"72":4}}],["bottom",{"2":{"105":1}}],["bot",{"2":{"37":2}}],["bots",{"2":{"37":2}}],["bother",{"2":{"3":1}}],["both",{"2":{"3":2,"5":1,"8":2,"10":1,"19":1,"20":1,"25":1,"31":1,"36":4,"60":2,"102":1,"108":1}}],["book",{"2":{"36":6,"60":1}}],["booting",{"2":{"20":1}}],["boilerplates",{"2":{"71":1}}],["boilerplate",{"2":{"27":1,"70":1}}],["bound",{"2":{"25":3}}],["boundary",{"2":{"20":1}}],["bower",{"2":{"20":3}}],["bonuses",{"2":{"2":1}}],["broken",{"2":{"36":1}}],["browserslist",{"2":{"20":2}}],["browsers",{"2":{"9":1,"24":1,"37":1}}],["browser",{"2":{"2":3,"4":5,"8":1,"16":1,"19":1,"20":1,"26":1,"37":5,"65":1,"108":1,"117":1,"118":1}}],["brings",{"2":{"35":1}}],["bring",{"2":{"25":1,"28":1}}],["brand",{"2":{"119":1}}],["branch",{"2":{"8":5,"37":1,"90":6}}],["branches",{"2":{"8":2,"25":1}}],["bracketpairs",{"2":{"20":1}}],["breakpoint",{"2":{"72":1}}],["break",{"2":{"2":1,"27":1}}],["bar",{"2":{"105":1}}],["bad",{"2":{"24":2,"25":2,"35":2}}],["babel",{"2":{"20":10}}],["babelrc",{"2":{"20":10}}],["bazelproject",{"2":{"20":1}}],["bazelignore",{"2":{"20":1}}],["bazelrc",{"2":{"20":1}}],["bazel",{"2":{"20":3}}],["bandle",{"2":{"16":2}}],["banner",{"2":{"16":1}}],["bash$",{"2":{"64":1}}],["bashpnpm",{"2":{"64":1}}],["basics",{"2":{"36":1}}],["basic",{"2":{"28":1,"36":3}}],["basically",{"2":{"3":1,"25":1}}],["basis",{"2":{"25":1}}],["basetoggle",{"2":{"106":1}}],["baseurl",{"2":{"75":1}}],["baseinput",{"2":{"30":1}}],["baseicon",{"0":{"17":1,"76":1},"2":{"16":2,"19":2,"76":5,"106":1}}],["basebutton",{"2":{"30":1,"35":2}}],["basebuttonandstringhelpers",{"2":{"10":1}}],["base",{"0":{"91":1},"2":{"17":1,"91":2,"120":1}}],["base64",{"2":{"16":1}}],["based",{"2":{"2":2,"8":1,"24":2}}],["baas",{"2":{"3":6}}],["battery",{"2":{"2":1}}],["backers",{"2":{"20":1}}],["backend",{"0":{"0":1,"3":1},"1":{"1":1},"2":{"1":4,"2":6,"3":8,"4":6,"5":2,"9":1,"12":1,"26":1,"27":3,"36":2,"37":1,"42":1,"70":1,"74":2,"75":2,"105":1}}],["background",{"2":{"18":1}}],["backroute",{"2":{"12":1}}],["backups",{"2":{"8":2}}],["backup",{"2":{"8":9}}],["back",{"2":{"2":3,"3":1,"5":1,"20":1,"27":1,"35":1,"36":1}}],["bedroom",{"2":{"37":1}}],["benefit",{"2":{"37":1}}],["believed",{"2":{"36":1}}],["belong",{"2":{"25":1}}],["below",{"2":{"4":1,"58":1}}],["beautiful",{"2":{"35":1,"37":1}}],["besides",{"2":{"29":1,"36":1}}],["best",{"0":{"12":1},"1":{"13":1,"14":1,"15":1},"2":{"2":1,"12":2,"18":1,"20":2,"36":5,"59":1,"60":1,"70":3,"71":2}}],["beyond",{"2":{"27":1}}],["better",{"2":{"27":1,"32":1,"36":2,"37":1,"102":1}}],["between",{"2":{"4":1,"12":1,"25":2,"27":1,"36":2,"37":1}}],["behavior",{"2":{"27":1}}],["behind",{"2":{"27":1}}],["beforehand",{"2":{"36":2}}],["before",{"2":{"16":1,"36":1,"37":1}}],["been",{"2":{"16":1,"24":1,"27":1,"37":2,"119":1}}],["beginners",{"2":{"20":1,"60":1}}],["beginner",{"2":{"5":1,"36":1}}],["becoming",{"2":{"70":1}}],["become",{"2":{"25":1,"27":1,"29":1,"35":2,"36":1}}],["becomes",{"2":{"4":1,"25":2}}],["became",{"2":{"25":2}}],["because",{"2":{"2":1,"5":1,"8":1,"24":1,"25":1,"37":1}}],["be",{"2":{"2":2,"3":2,"8":9,"9":4,"10":2,"12":5,"16":3,"20":2,"24":3,"25":9,"26":4,"27":9,"28":1,"31":1,"32":2,"35":1,"36":6,"37":6,"60":1,"64":2,"66":2,"67":3,"70":2,"71":2,"72":2,"74":1,"81":1,"91":1,"99":1,"111":1,"117":1}}],["being",{"2":{"2":1}}],["bypass",{"2":{"37":1}}],["by",{"0":{"106":1},"2":{"2":5,"3":4,"4":5,"8":1,"12":1,"16":3,"19":1,"20":1,"24":3,"25":4,"26":1,"27":3,"35":1,"36":3,"37":8,"64":1,"81":1,"82":1,"99":2,"101":1,"105":1,"111":1,"119":1,"120":2}}],["jl65gwrnqqq",{"2":{"92":1}}],["jl65gwrnqq",{"2":{"92":1}}],["jumping",{"2":{"79":1}}],["justification",{"0":{"70":1}}],["justifications",{"2":{"28":1}}],["just",{"2":{"2":2,"12":1,"20":1,"24":1,"25":3,"35":2,"36":1,"67":1,"70":1}}],["jest",{"2":{"20":10,"26":1}}],["jenkins",{"2":{"6":1,"20":2}}],["j",{"2":{"19":1}}],["jpg",{"2":{"18":1}}],["jpeg",{"2":{"9":1}}],["jasmine",{"2":{"20":10}}],["java",{"2":{"20":1,"61":1}}],["javascript",{"0":{"53":1},"2":{"3":1,"16":1,"19":2,"20":2,"21":1,"24":4,"25":2,"27":1,"28":1,"35":3,"36":4,"37":4,"53":1,"67":1,"72":1,"103":1}}],["jamesives",{"2":{"8":3,"90":1}}],["job",{"2":{"27":2}}],["jobs",{"2":{"8":2}}],["john",{"2":{"2":2,"99":1}}],["jwt",{"2":{"2":4,"59":2,"108":1}}],["jslint",{"2":{"20":2}}],["jsconfig",{"2":{"20":11}}],["jsconst",{"2":{"8":1,"18":1,"24":2}}],["jsx",{"2":{"20":3}}],["jsexport",{"2":{"12":1,"91":1}}],["jsonrpc",{"2":{"64":1,"75":6}}],["json5",{"2":{"20":1}}],["jsonc",{"2":{"20":1}}],["jsonplaceholder",{"2":{"3":1,"74":1}}],["json",{"0":{"75":1,"117":1},"2":{"1":1,"3":1,"5":7,"8":4,"16":1,"18":4,"19":4,"20":50,"36":1,"37":2,"64":5,"67":1,"74":1,"75":6,"101":1,"102":1,"105":1,"117":2}}],["jsimport",{"2":{"1":3,"15":1,"16":1,"19":1,"74":1,"75":1,"101":1}}],["js",{"0":{"18":1},"2":{"1":4,"2":1,"3":3,"9":1,"11":1,"16":4,"17":1,"18":1,"19":3,"20":21,"21":2,"23":1,"24":3,"25":1,"27":4,"28":1,"36":4,"37":1,"60":1,"71":1,"72":1,"74":1,"75":1,"92":3,"118":3}}],["snippets",{"2":{"78":1,"105":1}}],["snickerbockers",{"2":{"8":2}}],["skeleton",{"2":{"70":1}}],["skill",{"2":{"35":1,"36":1}}],["sd",{"2":{"61":1}}],["sw",{"2":{"37":1,"59":1}}],["swagger",{"2":{"36":1}}],["switch",{"2":{"30":1,"74":1}}],["switching",{"2":{"5":1,"106":1,"120":2}}],["swiper",{"2":{"23":1}}],["slidingheader",{"0":{"97":1}}],["slider",{"0":{"23":1},"2":{"23":1}}],["sleeping",{"2":{"37":1}}],["slowing",{"2":{"28":1}}],["slower",{"2":{"25":2}}],["slot",{"2":{"11":1}}],["svelte",{"2":{"20":3,"27":2}}],["svgo",{"2":{"20":10}}],["svgs",{"2":{"19":1}}],["svgresources",{"2":{"18":4}}],["svg",{"2":{"17":2,"18":2,"20":2,"76":1}}],["syntax",{"2":{"67":1}}],["synthesizing",{"2":{"25":1}}],["synctex",{"2":{"20":1}}],["systems",{"2":{"27":2,"28":1}}],["system",{"2":{"2":4,"27":2,"35":1,"74":1}}],["smartphone",{"2":{"37":2}}],["smaller",{"2":{"27":1,"103":1}}],["small",{"2":{"2":2,"3":1,"16":1,"21":1,"25":1,"35":1,"37":1}}],["smoothscrolling",{"2":{"20":1}}],["sftp",{"2":{"20":1}}],["sfc",{"2":{"20":2,"27":1}}],["src=",{"2":{"16":3,"17":1,"92":1}}],["src",{"2":{"16":1,"19":2,"78":1,"101":1}}],["s3",{"2":{"9":1}}],["ssg",{"0":{"37":1},"2":{"37":3}}],["ssd",{"2":{"20":1}}],["ssrs",{"2":{"37":1}}],["ssr",{"0":{"37":1},"2":{"20":1,"25":2,"37":8}}],["ss06",{"2":{"20":1}}],["ss03",{"2":{"20":1}}],["ss02",{"2":{"20":1}}],["ss01",{"2":{"20":1}}],["ssl",{"2":{"9":2}}],["ssh",{"2":{"8":14,"20":2}}],["sso",{"2":{"2":2}}],["sql",{"2":{"5":1,"8":1,"20":1,"25":2,"36":1}}],["sh$",{"2":{"64":1,"65":1,"66":1,"69":1}}],["sheet",{"0":{"51":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"52":1,"53":1,"54":1,"55":4}}],["shell",{"2":{"10":2,"20":1,"37":1}}],["shims",{"2":{"20":1}}],["sh",{"2":{"20":2}}],["shrinkwrap",{"2":{"20":2}}],["shnpx",{"2":{"19":1}}],["shpnpm",{"2":{"19":1}}],["shadow",{"2":{"28":1}}],["shallowref",{"2":{"24":2}}],["shaking",{"2":{"18":1,"29":1}}],["shared",{"2":{"11":1,"20":1,"25":1}}],["share",{"2":{"11":1,"12":1,"25":1}}],["sharing",{"2":{"4":1}}],["showcase",{"2":{"71":1,"108":1}}],["show",{"2":{"37":1}}],["showed",{"2":{"36":1,"37":1}}],["shows",{"2":{"25":1}}],["showsuggestionsassnippets",{"2":{"20":1}}],["showdocumentation",{"2":{"20":1}}],["showing",{"2":{"8":1}}],["shown",{"2":{"4":1,"12":1,"24":1,"27":1}}],["should",{"2":{"2":3,"3":1,"8":1,"12":1,"16":1,"20":1,"24":2,"25":4,"26":1,"27":2,"31":1,"36":1,"64":1,"67":2,"70":1,"71":1,"92":1,"115":1}}],["shortens",{"2":{"35":1}}],["short",{"2":{"2":1,"36":1,"117":1}}],["scope",{"2":{"117":1}}],["scoped>",{"2":{"17":1}}],["scaffolder",{"2":{"69":1,"71":1}}],["scaffolded",{"2":{"67":1}}],["scaffold",{"2":{"64":1,"71":1}}],["scaffolding",{"0":{"68":1},"1":{"69":1,"70":1},"2":{"64":1,"70":1,"71":1}}],["scalable",{"2":{"27":1}}],["school",{"2":{"36":1}}],["screens",{"2":{"82":1}}],["screenwidthfactor",{"2":{"72":1}}],["screen",{"0":{"119":1},"2":{"37":1,"64":1,"69":2,"71":1,"78":1,"79":2,"81":1,"105":2,"117":1,"119":4}}],["scrollbar",{"2":{"79":1}}],["scroll",{"2":{"24":1}}],["scrolls",{"2":{"24":1,"97":1}}],["script>",{"2":{"13":1,"17":1,"72":1,"76":1,"92":3,"101":1}}],["scripts",{"2":{"8":1,"26":1,"37":1,"108":1}}],["script",{"0":{"89":1},"1":{"90":1,"91":1},"2":{"3":2,"8":2,"13":1,"17":1,"20":1,"24":1,"37":1,"67":1,"72":1,"76":1,"92":1,"101":1,"105":1}}],["scmitem",{"2":{"20":1}}],["scmgroupinline",{"2":{"20":1}}],["scmgroup",{"2":{"20":1}}],["scm",{"2":{"20":2}}],["scss",{"2":{"17":1,"20":1,"67":1,"72":2,"120":1}}],["scenario",{"2":{"2":1,"12":1}}],["sans",{"2":{"120":1}}],["sandboxes",{"2":{"20":1}}],["sandbox",{"2":{"19":1}}],["saw",{"2":{"37":1}}],["says",{"2":{"28":1}}],["say",{"2":{"28":1}}],["sass",{"2":{"20":1}}],["sample",{"2":{"8":2}}],["same",{"2":{"2":2,"5":2,"10":3,"19":1,"20":1,"24":1,"25":4,"26":2,"27":1,"28":1,"30":1,"70":1,"75":1,"90":1,"99":1}}],["saved",{"2":{"8":1}}],["save",{"2":{"2":1,"3":1,"20":1,"29":1,"35":1}}],["saves",{"2":{"2":1,"8":1,"19":1}}],["saving",{"2":{"2":1}}],["sun",{"2":{"61":1}}],["suffer",{"2":{"32":1}}],["sufficient",{"2":{"21":1,"24":1}}],["summary",{"0":{"69":1}}],["sum",{"2":{"20":2}}],["support",{"2":{"24":2,"25":3,"28":1,"36":1,"99":1,"106":1,"120":1}}],["supports",{"2":{"19":1}}],["supported",{"2":{"18":1,"24":1,"25":1,"29":1,"118":1}}],["supabase",{"2":{"3":2,"36":1}}],["suspense",{"2":{"12":1}}],["suspicious",{"2":{"2":1}}],["success",{"2":{"10":1}}],["such",{"2":{"2":1,"3":1,"4":1,"10":1,"11":1,"25":1,"37":1,"67":1}}],["sudo",{"2":{"8":3}}],["subjective",{"2":{"60":1}}],["substring",{"2":{"18":2}}],["subdirectory",{"2":{"10":1,"16":1}}],["subdirectories",{"2":{"8":1}}],["subdomains",{"2":{"9":1}}],["submodules",{"2":{"8":4,"10":2}}],["suggestselection",{"2":{"20":1}}],["suggest",{"2":{"5":1,"36":1,"58":1}}],["suitable",{"2":{"3":1,"10":2,"20":1,"25":1,"27":1,"37":2}}],["sure",{"2":{"2":1,"36":1}}],["sort",{"2":{"25":1}}],["sophisticated",{"2":{"20":1}}],["social",{"2":{"16":1,"105":1}}],["solving",{"2":{"70":3}}],["solvery",{"2":{"36":1}}],["solve",{"2":{"8":1,"16":1,"25":1,"36":1}}],["solid",{"2":{"21":1,"72":1}}],["solutions",{"2":{"37":1,"61":1,"71":1}}],["solution",{"2":{"3":2,"4":2,"5":1,"8":1,"12":1,"20":1,"37":1,"70":1}}],["software",{"2":{"5":1,"9":1,"26":1,"27":1,"34":1}}],["source",{"2":{"4":2,"8":1,"20":4,"36":2,"62":1,"90":1}}],["sources",{"2":{"4":2,"36":1,"60":1}}],["sooner",{"2":{"29":1}}],["soon",{"2":{"2":1}}],["somehow",{"2":{"37":1}}],["somearr",{"2":{"27":4}}],["someone",{"2":{"26":1,"37":1}}],["someimage",{"2":{"16":1}}],["sometimes",{"2":{"10":2,"25":1,"35":1}}],["something",{"2":{"2":1,"25":1,"26":1,"28":1,"36":1}}],["somefunc",{"2":{"3":1}}],["somewhere",{"2":{"3":1}}],["some",{"0":{"15":1},"2":{"2":1,"3":2,"9":1,"12":2,"20":1,"22":1,"24":2,"25":3,"29":1,"30":1,"35":1,"36":3,"37":3,"70":1}}],["so",{"2":{"2":3,"8":1,"9":2,"20":1,"23":1,"24":1,"25":2,"27":1,"36":1,"37":3,"67":1,"70":1,"91":1,"102":2}}],["study",{"2":{"36":1}}],["studying",{"2":{"36":1}}],["student",{"2":{"36":1}}],["stylized",{"2":{"35":1}}],["styling",{"2":{"27":1,"30":1,"71":1}}],["stylus",{"2":{"24":1}}],["styles",{"2":{"35":4}}],["stylelint",{"2":{"20":4}}],["styleci",{"2":{"20":2}}],["style>",{"2":{"17":1}}],["style",{"2":{"17":1,"20":1,"35":1,"36":2,"59":1,"71":1,"95":1,"96":1}}],["style=",{"2":{"17":2}}],["step",{"2":{"37":1}}],["steps",{"2":{"2":1,"8":2}}],["steate",{"2":{"25":1}}],["steit",{"2":{"24":1,"25":1}}],["stick",{"2":{"35":1}}],["sticky",{"2":{"20":1,"94":1,"95":1,"96":1}}],["stickyscroll",{"2":{"20":1}}],["still",{"2":{"12":1,"36":1,"37":1}}],["storage",{"2":{"25":1}}],["storages",{"2":{"25":2}}],["story",{"2":{"20":1}}],["storefront",{"2":{"70":1}}],["stored",{"2":{"36":1,"120":1}}],["stores",{"2":{"25":4,"45":1,"47":1}}],["store",{"2":{"2":2,"8":1,"10":1,"11":1,"25":8,"37":2,"69":1,"70":1,"71":1}}],["stoploading",{"2":{"14":2,"15":2}}],["structured",{"2":{"37":1}}],["structuring",{"2":{"31":1}}],["strategy",{"2":{"118":1}}],["strategies",{"2":{"36":1}}],["straightforward",{"2":{"12":1}}],["strengthen",{"2":{"119":1}}],["streets",{"2":{"36":1}}],["stretch",{"2":{"28":1}}],["strong",{"2":{"18":1}}],["string>",{"2":{"14":1}}],["string",{"2":{"2":1,"4":1,"14":1,"16":1,"17":6,"24":1}}],["stand",{"2":{"27":1}}],["standalone",{"2":{"3":1,"27":1,"117":1}}],["standards",{"0":{"33":1},"2":{"35":1}}],["standard",{"2":{"2":2,"4":1,"5":1,"21":1,"24":2,"36":1,"75":1,"109":1}}],["stack",{"2":{"25":1,"61":1}}],["stackblitz",{"2":{"20":3}}],["stage",{"2":{"28":1}}],["staged",{"2":{"20":2}}],["staging",{"2":{"8":5}}],["states",{"2":{"25":2}}],["stateful",{"2":{"25":1}}],["state",{"0":{"25":1},"2":{"20":1,"25":13,"27":1,"28":1}}],["statistics",{"2":{"19":1}}],["static",{"2":{"9":1,"16":1,"28":1,"37":3}}],["stash",{"2":{"20":3}}],["starter",{"2":{"70":1}}],["started",{"0":{"63":1},"1":{"64":1,"65":1,"66":1}}],["startup",{"2":{"26":1,"105":1,"108":1,"119":1}}],["startloading",{"2":{"14":2,"15":2}}],["start",{"2":{"3":1,"5":1,"36":1,"37":1,"70":1,"117":1}}],["s",{"2":{"2":4,"3":2,"5":1,"8":1,"16":1,"17":1,"19":2,"20":3,"21":1,"25":5,"27":4,"28":2,"35":1,"36":3,"37":3,"59":3,"67":1,"70":1,"74":2}}],["splashscreen",{"2":{"64":1}}],["splash",{"0":{"119":1},"2":{"64":1,"69":2,"71":1,"78":1,"105":2,"119":4}}],["split",{"2":{"25":1}}],["splide",{"2":{"23":1}}],["spite",{"2":{"36":1}}],["spinning",{"2":{"20":1}}],["spread",{"2":{"25":1}}],["sponsors",{"2":{"20":1}}],["spend",{"2":{"20":1,"32":1}}],["spec",{"2":{"20":1}}],["specifying",{"2":{"64":1}}],["specify",{"2":{"27":1,"106":1}}],["specified",{"2":{"4":1,"102":1}}],["specifications",{"2":{"37":1}}],["specification",{"2":{"36":1,"75":1}}],["specifically",{"2":{"4":1}}],["specific",{"2":{"3":1,"4":1,"5":1,"12":1,"67":3,"70":1,"71":3}}],["specialized",{"2":{"4":1}}],["special",{"2":{"4":1,"5":1}}],["speeds",{"2":{"35":1}}],["speed",{"2":{"16":1,"28":2,"35":1,"37":1}}],["speaking",{"2":{"2":1,"4":1,"27":1,"28":1}}],["space",{"2":{"19":1}}],["spaces",{"2":{"4":1}}],["spa",{"0":{"37":1},"2":{"2":1,"37":10,"71":1}}],["silent",{"2":{"64":1}}],["since",{"2":{"37":1}}],["singleton",{"2":{"25":1}}],["singlequote",{"2":{"20":1}}],["singleclick",{"2":{"20":1}}],["single",{"2":{"2":1,"10":1,"27":1,"37":1}}],["situations",{"2":{"28":1}}],["situation",{"2":{"25":1,"27":1}}],["sites",{"2":{"3":1,"37":2}}],["site",{"2":{"2":7,"3":1,"4":3,"6":1,"8":17,"9":2,"24":2,"25":1,"26":1,"27":1,"28":2,"36":3,"37":5,"59":1,"70":1,"71":1,"90":1,"91":1,"99":3}}],["size=",{"2":{"16":1}}],["size",{"2":{"14":1,"16":2,"17":5,"29":1}}],["simulates",{"2":{"26":1}}],["simultaneously",{"2":{"12":1}}],["similar",{"2":{"25":1,"27":1,"36":1,"37":1,"70":1,"82":1,"111":1}}],["simply",{"2":{"28":1}}],["simplified",{"2":{"37":1}}],["simplifies",{"2":{"5":1}}],["simplistically",{"2":{"27":1}}],["simplenavbar",{"0":{"113":1}}],["simpleheader",{"0":{"94":1}}],["simplefooter",{"0":{"84":1}}],["simpledrawer",{"0":{"81":1},"2":{"64":2,"82":1}}],["simpledialog",{"2":{"20":1}}],["simpler",{"2":{"24":1}}],["simple",{"2":{"1":1,"2":1,"6":1,"20":4,"24":1,"27":1,"36":1,"37":4,"71":1,"94":1,"95":1,"99":2,"116":1}}],["sidebar",{"2":{"90":1,"109":2,"111":2}}],["sidebarlayout",{"2":{"12":2}}],["side",{"2":{"10":1,"12":2,"37":3,"118":1}}],["significantly",{"2":{"37":1}}],["significant",{"2":{"24":1,"27":1,"37":1}}],["signing",{"2":{"2":1}}],["sign",{"2":{"2":1}}],["serif",{"2":{"120":1}}],["serve",{"2":{"27":1}}],["server",{"2":{"1":1,"3":4,"4":8,"5":3,"6":1,"8":7,"9":2,"16":1,"20":6,"24":1,"36":1,"37":13,"99":1}}],["services",{"2":{"1":1,"2":1,"3":5,"10":1,"20":1,"25":1,"28":1,"36":1,"71":1,"74":1,"108":1}}],["service",{"0":{"1":1,"118":1},"2":{"1":1,"3":4,"5":1,"20":1,"27":1,"36":1,"37":4,"59":2,"64":1,"69":1,"74":1,"78":1,"105":1,"108":1,"116":1,"118":2}}],["seo",{"0":{"37":1},"2":{"37":1}}],["selected",{"2":{"64":1,"120":1}}],["select",{"2":{"35":2,"64":6,"90":2}}],["self",{"2":{"27":1,"35":1,"36":1}}],["semantic",{"2":{"33":1}}],["semi",{"2":{"20":1}}],["search",{"2":{"20":1,"37":4}}],["several",{"2":{"8":1,"10":1,"12":3,"25":3,"26":1,"27":1,"37":1}}],["seed",{"2":{"75":1}}],["seem",{"2":{"70":1}}],["see",{"2":{"2":1,"12":1,"16":1,"19":2,"20":2,"37":1,"117":1}}],["secrets",{"2":{"8":2}}],["section",{"2":{"4":1,"24":1,"33":1,"90":1}}],["sections",{"2":{"2":1}}],["seconds",{"2":{"20":1}}],["secondary",{"2":{"20":1}}],["second",{"2":{"2":2,"20":3,"97":2}}],["security",{"2":{"2":5,"20":1,"28":1}}],["sense",{"2":{"25":1}}],["sentry",{"2":{"20":2}}],["sent",{"2":{"2":2}}],["send",{"2":{"5":1,"27":1,"37":1}}],["sends",{"2":{"2":1,"37":1}}],["sending",{"2":{"1":1}}],["senior",{"2":{"2":1}}],["setlocale",{"2":{"101":2}}],["setlogoutcallback",{"2":{"1":1}}],["setoptions",{"2":{"75":1}}],["sets",{"2":{"75":1}}],["setsomearr",{"2":{"27":1}}],["setitem",{"2":{"8":1}}],["setup>",{"2":{"13":1,"17":1}}],["setup",{"2":{"8":4,"20":1,"24":1,"25":1,"67":1,"72":1,"76":1,"101":1}}],["setters",{"2":{"25":1}}],["settings",{"2":{"8":1,"11":2,"20":1,"90":1}}],["setting",{"0":{"91":1},"2":{"4":1,"8":1,"19":1,"20":1,"24":4,"70":1,"99":1}}],["settokencallback",{"2":{"1":1}}],["set",{"2":{"1":1,"2":2,"9":1,"14":1,"18":3,"19":2,"20":1,"27":1,"36":1,"37":1,"72":2,"111":1,"115":1}}],["setbaseurl",{"2":{"1":1}}],["separately",{"2":{"71":1}}],["separated",{"2":{"4":1}}],["separate",{"2":{"1":3,"4":2,"10":2,"20":1,"25":2,"27":1,"35":1,"36":1,"118":1}}],["dx",{"2":{"35":1,"59":1}}],["drop",{"2":{"90":1}}],["dropdown",{"2":{"35":1}}],["drawers",{"0":{"80":1},"1":{"81":1,"82":1},"2":{"80":1}}],["drawer",{"2":{"64":1,"71":1,"76":1,"105":2}}],["draw",{"2":{"34":1,"36":1}}],["dream",{"2":{"24":1}}],["driving",{"2":{"36":5}}],["driver",{"2":{"36":2}}],["drive",{"2":{"2":4,"36":1}}],["dribbling",{"2":{"25":1}}],["drilling",{"2":{"12":2}}],["dprint",{"2":{"20":4}}],["dlint",{"2":{"20":4}}],["dash",{"2":{"75":1}}],["days",{"2":{"32":1,"35":1,"36":2}}],["day",{"2":{"21":2,"24":2,"36":1}}],["dangerfile",{"2":{"20":2}}],["dart",{"2":{"20":6}}],["dark",{"2":{"20":1,"106":1,"120":2}}],["dates",{"2":{"21":1,"24":1,"99":1}}],["date=`date",{"2":{"8":1}}],["date",{"0":{"24":1},"2":{"8":9,"19":1,"20":1,"24":1,"92":1}}],["datalayer",{"2":{"92":3}}],["databases",{"2":{"20":1}}],["database",{"2":{"3":5,"20":1,"25":3}}],["data",{"2":{"2":2,"3":6,"4":3,"5":1,"8":2,"11":3,"12":4,"19":1,"24":2,"25":5,"27":7,"28":1,"36":2,"37":4,"117":1}}],["dynamically",{"2":{"16":1,"27":1,"37":1,"71":1,"72":1,"106":1}}],["dynamic",{"2":{"16":1,"37":1,"76":1,"108":1}}],["dt",{"2":{"8":1}}],["d",{"2":{"8":1,"20":16}}],["due",{"2":{"5":1,"27":1}}],["during",{"2":{"4":1,"24":1,"105":1,"119":1}}],["duplicate",{"2":{"2":1}}],["diagrams",{"2":{"34":1}}],["dialyzer",{"2":{"20":1}}],["dialogstyle",{"2":{"20":1}}],["dies",{"2":{"25":1}}],["did",{"2":{"24":1}}],["divider",{"2":{"120":1}}],["divided",{"2":{"10":1}}],["division",{"2":{"35":1}}],["div",{"2":{"13":2,"17":1,"72":4}}],["div>",{"2":{"12":6,"13":1,"72":4,"101":2}}],["dirname",{"2":{"19":1}}],["dirs",{"2":{"8":1}}],["dir=`echo",{"2":{"8":2}}],["dir=your",{"2":{"8":1}}],["dir=dev",{"2":{"8":1}}],["dir=",{"2":{"8":2}}],["dir",{"2":{"8":24,"117":1}}],["direction",{"2":{"72":2}}],["direct",{"2":{"25":1}}],["directly",{"2":{"19":1,"24":2,"29":1,"30":1,"37":1}}],["directories",{"2":{"17":1}}],["directory",{"2":{"8":3,"64":2,"76":1,"78":1}}],["directs",{"2":{"2":1}}],["disappears",{"2":{"79":1}}],["disable",{"2":{"24":1}}],["discussion",{"2":{"25":1}}],["disk",{"2":{"19":1,"20":1}}],["displaying",{"2":{"25":2,"28":1}}],["displaylanguage",{"2":{"20":1}}],["display",{"2":{"11":1,"16":2,"37":1,"72":1,"117":1}}],["dispatch",{"2":{"8":2}}],["distribution",{"2":{"37":1}}],["distributedfooter",{"0":{"88":1}}],["distributed",{"2":{"37":1,"71":1}}],["dist",{"2":{"8":2,"16":1,"20":1}}],["diffeditor",{"2":{"20":1}}],["differing",{"2":{"25":1}}],["differs",{"2":{"4":1}}],["difference",{"2":{"24":1,"25":1,"27":1,"36":1}}],["differences",{"2":{"2":1,"27":1}}],["differently",{"2":{"19":1,"37":1}}],["different",{"2":{"2":2,"3":1,"11":1,"18":2,"19":1,"24":1,"25":1,"26":1,"27":3,"28":2,"37":1,"97":1,"107":1,"108":3,"118":1}}],["diffdecorationsgutterwidth",{"2":{"20":1}}],["difficulties",{"2":{"5":1}}],["difficult",{"2":{"2":1,"36":1}}],["dozens",{"2":{"19":1,"20":1}}],["down",{"2":{"11":1,"27":1,"28":1,"60":1,"90":1,"97":1}}],["downloading",{"2":{"24":1,"99":1}}],["downloaded",{"2":{"16":1,"37":1}}],["download",{"2":{"8":1,"36":1}}],["don",{"2":{"8":1,"12":1,"16":1,"27":1,"29":2,"30":1,"37":2,"91":1,"102":1}}],["done",{"2":{"2":2,"26":1,"32":1,"67":1,"78":1}}],["document",{"0":{"34":1},"2":{"12":1,"35":1,"36":1}}],["documentation",{"2":{"8":1,"12":2,"16":1,"25":1,"34":1,"36":3,"37":1,"59":1,"60":1,"70":1}}],["docs",{"2":{"8":1,"9":1}}],["dockerignore",{"2":{"20":1}}],["dockerfile",{"2":{"20":2}}],["docker",{"0":{"7":1},"2":{"20":2}}],["domains",{"2":{"4":1}}],["domain",{"2":{"4":6,"9":4,"36":1,"91":2,"115":1}}],["do",{"2":{"3":3,"4":1,"9":1,"19":1,"20":1,"24":1,"25":2,"26":1,"27":2,"28":1,"29":1,"31":1,"32":1,"35":1,"36":4,"37":2,"67":1,"120":1}}],["doe",{"2":{"2":2}}],["doesn",{"2":{"3":1,"20":2,"27":1,"29":1}}],["does",{"2":{"1":1,"2":4,"4":1,"20":2,"24":3,"25":1,"27":1,"37":1,"60":1,"118":1}}],["degree",{"2":{"67":1}}],["dead",{"2":{"37":1}}],["debounce",{"2":{"29":1}}],["debugging",{"2":{"24":1}}],["debuganyway",{"2":{"20":1}}],["debug",{"2":{"20":1}}],["demonstrates",{"2":{"25":1}}],["deno",{"2":{"20":2}}],["desired",{"2":{"67":1}}],["designed",{"2":{"35":1}}],["designer",{"2":{"20":2}}],["design",{"2":{"18":1,"27":1,"36":2,"59":1,"60":1,"69":1,"71":1}}],["desktop",{"2":{"37":1,"72":3,"81":1,"109":1,"111":1}}],["descendant",{"2":{"25":2}}],["describe",{"2":{"34":1,"60":1}}],["describes",{"2":{"8":1}}],["description",{"2":{"8":1,"37":1,"115":3,"117":1}}],["deep",{"2":{"17":1,"108":1}}],["defining",{"2":{"70":1}}],["definitions",{"2":{"28":1}}],["definition",{"2":{"25":1}}],["defined",{"2":{"120":1}}],["define",{"2":{"25":1,"27":1}}],["defineconfig",{"2":{"19":1,"91":1}}],["defineprops",{"2":{"17":1}}],["defaultformatter",{"2":{"20":4}}],["default",{"0":{"106":1},"2":{"1":1,"8":2,"17":6,"19":1,"20":2,"75":1,"91":1,"101":1}}],["detailed",{"2":{"28":1}}],["details",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"11":1,"12":1,"16":1,"33":1,"34":1,"90":1}}],["determined",{"2":{"2":1}}],["determines",{"2":{"2":1}}],["deleting",{"2":{"24":1}}],["delete",{"2":{"2":1,"14":1,"24":1}}],["delivery",{"2":{"6":1}}],["de",{"2":{"5":1,"75":1}}],["deception",{"2":{"37":1}}],["decided",{"2":{"28":3}}],["decides",{"2":{"2":1,"25":1}}],["decomposition",{"2":{"27":1}}],["declensions",{"2":{"24":1,"99":1}}],["declared",{"2":{"4":2,"25":2}}],["declaration",{"2":{"4":1}}],["decade",{"2":{"18":1}}],["devdependencies",{"2":{"19":1,"20":1}}],["dev",{"2":{"8":10,"9":2,"19":1,"25":1,"37":1,"65":1,"66":1,"117":1}}],["devops",{"2":{"6":1}}],["developing",{"2":{"27":1,"28":1,"37":1,"67":1}}],["develop",{"2":{"27":1}}],["developed",{"2":{"10":2}}],["developers",{"2":{"12":1,"26":1,"35":2,"36":1,"60":1,"69":1,"71":2}}],["developer",{"2":{"3":2,"6":1,"25":3,"34":1,"35":1,"36":4,"59":2,"61":1,"67":1,"70":2,"74":1}}],["development",{"0":{"58":1,"107":1},"2":{"4":2,"6":1,"9":1,"10":1,"20":4,"24":1,"26":3,"27":1,"28":1,"35":2,"36":1,"37":1,"42":1,"47":1,"48":1,"70":2,"117":1}}],["devtoolsformatters",{"2":{"24":3}}],["devtools",{"2":{"3":1,"24":2,"25":4,"102":1}}],["deposit",{"2":{"99":1}}],["deposits",{"2":{"2":1}}],["deprecated",{"2":{"25":1}}],["deployed",{"2":{"8":2}}],["deploy",{"0":{"89":1},"1":{"90":1,"91":1},"2":{"8":21,"36":1,"71":1,"90":3,"105":2}}],["deployment",{"0":{"90":1},"2":{"6":1,"8":3,"44":1,"45":2,"90":2,"108":1}}],["depend",{"2":{"27":1}}],["dependency",{"2":{"25":1,"29":1,"35":2,"67":1}}],["dependencies",{"0":{"29":1},"2":{"8":2,"24":1,"27":2,"37":1,"67":1,"100":1,"102":1}}],["depends",{"2":{"4":1}}],["depending",{"2":{"2":1,"16":1,"36":1}}],["rgba",{"2":{"120":6}}],["richfooter",{"0":{"85":1}}],["rip",{"2":{"25":1}}],["rigor",{"2":{"5":1}}],["rights",{"2":{"2":1}}],["right",{"2":{"2":3,"20":2,"24":1,"36":1,"37":1,"79":1,"99":1,"116":1}}],["rspack",{"2":{"20":12}}],["rc",{"2":{"20":1}}],["ruslan",{"2":{"61":2}}],["rush",{"2":{"20":1}}],["rust",{"2":{"20":1}}],["rustfmt",{"2":{"20":2}}],["ruby",{"2":{"20":1}}],["ru",{"2":{"20":3,"60":2}}],["rules",{"2":{"20":2,"27":1,"36":1}}],["running",{"2":{"26":1}}],["runs",{"2":{"8":2}}],["run",{"2":{"3":2,"8":9,"20":3,"37":2,"117":1}}],["r",{"2":{"8":2,"25":1,"60":2}}],["rf",{"2":{"8":4}}],["rm",{"2":{"8":3}}],["range",{"2":{"70":1}}],["raise",{"2":{"34":1}}],["ram",{"2":{"20":1,"102":1}}],["raw",{"2":{"16":2,"18":1,"19":1}}],["rather",{"2":{"3":1,"5":1,"70":1}}],["rarely",{"2":{"2":1}}],["roboto",{"2":{"120":1}}],["robust",{"2":{"27":1}}],["row",{"2":{"72":1}}],["room",{"2":{"37":1}}],["root",{"2":{"8":2,"11":2,"18":1,"120":1}}],["routing",{"0":{"110":1}}],["routine",{"2":{"27":1}}],["router",{"2":{"12":4,"67":1,"110":1}}],["routes",{"2":{"10":1,"12":2,"110":1}}],["roughly",{"2":{"2":1,"4":1,"28":1}}],["rollup",{"2":{"19":2,"20":2}}],["rollback",{"2":{"8":1}}],["roles",{"2":{"2":1,"27":1}}],["role",{"2":{"2":2,"25":1,"27":1,"36":1}}],["rbac",{"2":{"2":1}}],["rtl",{"2":{"24":1,"99":1}}],["rt",{"2":{"2":4,"59":1}}],["rpc",{"0":{"75":1},"2":{"1":1,"5":7,"36":1,"64":1,"74":1,"75":5,"105":1}}],["reusable",{"2":{"71":1}}],["reuse",{"2":{"10":1}}],["reviews",{"2":{"37":1}}],["rehydration",{"2":{"37":1}}],["rewriting",{"2":{"25":1,"26":1}}],["reduces",{"2":{"37":1}}],["reduce",{"2":{"26":1,"35":1}}],["reddit",{"2":{"25":1,"60":1}}],["redis",{"2":{"25":1}}],["registration",{"2":{"108":1}}],["registers",{"2":{"27":1}}],["register",{"2":{"25":1,"36":2}}],["regarding",{"2":{"37":1}}],["regulate",{"2":{"12":1}}],["regular",{"0":{"31":1},"2":{"2":1,"19":1,"37":1}}],["renting",{"2":{"37":1}}],["renaming",{"2":{"31":1}}],["renamed",{"2":{"16":1}}],["renovate",{"2":{"20":2}}],["rendering",{"2":{"37":2}}],["renderwhitespace",{"2":{"20":1}}],["render",{"2":{"9":1}}],["reason",{"2":{"36":1}}],["reasons",{"2":{"35":1}}],["react",{"2":{"27":6,"36":2}}],["reactivity",{"2":{"25":1,"27":7,"99":1}}],["reactive",{"2":{"14":2,"24":9,"25":11,"27":11,"71":1}}],["read",{"2":{"25":2,"36":2,"37":1,"76":1}}],["readable",{"2":{"24":1}}],["ready",{"2":{"20":1,"70":2,"71":2}}],["readme",{"2":{"20":2}}],["reality",{"2":{"29":1}}],["really",{"2":{"18":1,"26":1}}],["real",{"2":{"3":1,"26":1,"36":2}}],["refactoring",{"0":{"31":1},"2":{"31":1}}],["refs",{"2":{"25":2}}],["reference",{"2":{"36":2}}],["refer",{"2":{"16":1}}],["referred",{"2":{"10":1}}],["ref",{"2":{"14":1,"24":7,"25":6,"27":2,"74":1}}],["refreshes",{"2":{"2":1}}],["refresh",{"2":{"2":1,"59":1}}],["repetitive",{"2":{"27":1}}],["replacing",{"2":{"24":1,"27":1}}],["replaced",{"2":{"24":1}}],["replacement",{"2":{"24":2}}],["replace",{"2":{"1":1,"28":1,"30":1,"35":2,"92":1}}],["replit",{"2":{"20":1}}],["repo",{"2":{"20":1}}],["repository",{"0":{"66":1},"2":{"6":1,"8":4,"10":1,"20":1,"36":1,"90":4,"91":1}}],["representation",{"2":{"16":1}}],["recalculate",{"2":{"27":1}}],["recent",{"2":{"24":1,"99":1}}],["recentchange",{"2":{"20":1}}],["receive",{"2":{"37":2}}],["receives",{"2":{"4":1,"37":1}}],["receiving",{"2":{"2":1}}],["recursive",{"2":{"8":1}}],["recognition",{"2":{"119":1}}],["recognized",{"2":{"60":1}}],["recommend",{"2":{"24":1}}],["recommended",{"2":{"8":1,"9":1,"19":1,"20":1,"24":1,"75":1,"102":1,"120":1}}],["reconnection",{"2":{"5":1}}],["re",{"2":{"2":2}}],["remain",{"2":{"25":1,"75":1}}],["remains",{"2":{"1":1}}],["remix",{"2":{"20":2}}],["removed",{"2":{"8":1,"119":1}}],["removed=`ls",{"2":{"8":1}}],["remove",{"2":{"8":2}}],["removes",{"2":{"2":1}}],["remote",{"2":{"8":12,"20":5}}],["reliably",{"2":{"20":1}}],["reliable",{"2":{"2":1,"8":1}}],["relevance",{"2":{"60":1}}],["relevant",{"2":{"3":1,"70":1}}],["release",{"2":{"20":4,"118":1}}],["releaserc",{"2":{"20":2}}],["reload",{"2":{"8":2,"108":1}}],["related",{"2":{"1":1,"2":1,"10":1,"25":1,"28":1}}],["require",{"2":{"9":1,"11":1}}],["requiresauth",{"2":{"12":1}}],["requires",{"2":{"5":1,"9":1,"18":1,"19":1,"24":1,"25":1,"99":1}}],["required",{"2":{"3":1,"8":1}}],["requirements",{"2":{"2":1,"35":1,"37":1}}],["requested",{"2":{"2":1,"4":2}}],["requesting",{"2":{"2":1}}],["requests",{"2":{"1":1,"4":3,"5":1,"20":2,"37":3,"75":1}}],["request",{"2":{"1":2,"2":2,"4":7,"37":2}}],["resume",{"2":{"36":1}}],["result",{"0":{"103":1},"2":{"2":1,"3":1,"8":1,"20":1,"25":1,"65":1,"67":1,"70":1}}],["respect",{"2":{"25":1}}],["response",{"2":{"4":4,"8":2}}],["responsible",{"2":{"2":1,"12":2,"25":2,"27":1,"120":1}}],["resides",{"2":{"25":1}}],["resx",{"2":{"20":2}}],["resolutions",{"2":{"28":1,"79":1,"81":1}}],["resolver",{"2":{"19":1,"20":1}}],["resolve",{"2":{"19":2}}],["resources",{"0":{"16":1},"1":{"17":1,"18":1},"2":{"2":1,"3":1,"4":1,"10":4,"16":7,"19":1,"36":1,"37":3,"102":1,"118":1,"119":1}}],["resource",{"0":{"58":1},"2":{"2":3,"4":6,"10":1,"16":3}}],["reserve",{"2":{"12":1}}],["resets",{"2":{"2":1}}],["restrictions",{"2":{"37":1}}],["rest",{"0":{"5":2,"74":1},"2":{"1":1,"5":2,"64":1,"74":1,"75":2}}],["returns",{"2":{"2":2,"3":1,"16":1,"24":1,"74":1}}],["return",{"2":{"1":1,"4":1,"14":1,"17":2,"18":2,"74":1,"75":1}}],["og",{"2":{"115":6}}],["oop",{"2":{"25":1,"27":1,"28":3}}],["ok",{"2":{"24":2}}],["os",{"2":{"20":1}}],["overriding",{"2":{"120":1}}],["overrides",{"2":{"20":1}}],["overflow",{"2":{"79":1}}],["overwrite",{"2":{"64":3}}],["over",{"0":{"30":1},"2":{"25":1,"27":1,"37":1,"74":1}}],["overview",{"2":{"21":1}}],["overuse",{"2":{"12":2}}],["obtained",{"2":{"99":1}}],["obvious",{"2":{"60":1}}],["obj",{"2":{"24":1}}],["objectives",{"0":{"71":1}}],["objective",{"2":{"60":1}}],["object",{"2":{"18":1,"24":5,"25":1,"27":2,"28":3,"36":1}}],["objects",{"2":{"4":2,"24":4,"25":1,"27":1}}],["observer",{"2":{"24":1}}],["obsolete",{"2":{"19":1,"21":1,"24":1,"25":1,"29":1,"35":1,"70":1}}],["old",{"2":{"8":1,"18":1,"24":2,"36":1}}],["outdated",{"2":{"20":1,"36":1}}],["out",{"2":{"20":2,"21":1,"24":1,"25":1,"27":1,"36":2,"71":1,"111":1}}],["output",{"2":{"20":2,"37":1}}],["outer",{"2":{"12":1}}],["outside",{"2":{"4":1,"25":1}}],["our",{"2":{"8":2}}],["occurs",{"2":{"37":1}}],["occur",{"2":{"4":1}}],["otherwise",{"2":{"24":1}}],["others",{"2":{"12":1,"27":1,"108":1}}],["other",{"2":{"3":2,"4":1,"5":1,"6":1,"8":1,"9":2,"10":2,"16":2,"20":3,"24":1,"25":6,"27":2,"28":2,"34":1,"35":1,"37":3,"70":4,"71":1,"99":1,"108":3}}],["own",{"2":{"3":2,"5":1,"8":3,"10":1,"19":2,"24":1,"25":2,"29":1,"30":1,"35":2,"37":1,"92":1}}],["opinion",{"2":{"60":1}}],["optimization",{"2":{"37":1}}],["optional",{"2":{"58":1}}],["option",{"2":{"2":1,"36":1}}],["options",{"0":{"3":1,"104":1,"105":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"2":1,"8":1,"9":1,"11":1,"19":1,"20":1,"24":2,"64":2,"71":3,"105":1}}],["operation",{"2":{"37":1}}],["operations",{"2":{"24":1}}],["open=",{"2":{"97":1}}],["opened",{"2":{"81":1}}],["opengraph",{"2":{"64":1}}],["openclose",{"2":{"20":1}}],["open",{"2":{"3":1,"36":2,"62":1,"64":1,"69":1,"78":1,"105":1,"115":1}}],["oauth",{"2":{"2":2}}],["onmounted",{"2":{"119":1}}],["ontaskerrors",{"2":{"20":1}}],["onecolumnlayout",{"0":{"111":1}}],["ones",{"2":{"19":1,"36":1,"120":1}}],["one",{"2":{"2":1,"4":1,"8":2,"12":6,"16":2,"19":2,"24":1,"25":8,"26":1,"35":1,"36":1,"37":1,"70":2,"97":1,"100":1}}],["once",{"2":{"2":1,"24":1}}],["onlyenabledextensions",{"2":{"20":1}}],["only",{"2":{"2":1,"3":1,"4":2,"6":1,"11":1,"12":1,"18":1,"20":5,"24":3,"25":3,"27":1,"35":2,"36":2,"64":1,"67":2,"99":1,"102":1}}],["online",{"2":{"2":1,"9":1,"10":1,"19":1,"20":1,"37":1,"70":1,"71":1,"108":1}}],["on",{"2":{"2":9,"3":5,"4":3,"5":5,"6":2,"8":9,"9":4,"10":1,"16":2,"19":2,"20":7,"24":4,"25":10,"26":5,"27":8,"28":5,"32":2,"35":3,"36":13,"37":10,"59":2,"60":1,"64":1,"70":3,"72":1,"79":1,"81":2,"82":1,"99":1,"108":2,"109":1,"117":1,"119":1}}],["org",{"2":{"75":1}}],["organise",{"2":{"12":1}}],["organizing",{"2":{"9":1}}],["organizeimports",{"2":{"20":1}}],["organize",{"2":{"5":1,"27":1}}],["oreilly",{"2":{"36":1}}],["orientation",{"2":{"117":1}}],["oriented",{"2":{"27":2,"28":1}}],["originally",{"2":{"37":1}}],["origin",{"2":{"4":7}}],["ordinary",{"2":{"27":1}}],["orders",{"2":{"37":1}}],["order",{"2":{"2":1,"5":1,"37":1}}],["oracle",{"2":{"3":1,"9":1}}],["or",{"0":{"5":1,"23":1},"2":{"1":2,"2":1,"3":2,"4":4,"5":1,"9":1,"10":1,"11":3,"16":3,"18":1,"19":3,"24":3,"25":11,"27":4,"28":1,"29":1,"30":2,"35":4,"36":6,"37":3,"58":3,"64":1,"67":1,"70":4,"72":1,"74":1,"99":1}}],["often",{"2":{"16":1,"24":1,"26":1,"36":1,"37":1,"99":1}}],["offline",{"2":{"37":2}}],["off",{"2":{"20":2,"25":1,"27":1}}],["officially",{"2":{"25":1}}],["official",{"2":{"12":1,"20":1,"25":1,"60":1}}],["offers",{"2":{"27":1}}],["offer",{"2":{"3":1,"35":1,"36":1}}],["of",{"0":{"30":1,"58":1},"2":{"1":2,"2":12,"3":2,"4":8,"5":5,"6":3,"8":13,"9":1,"10":4,"11":2,"12":1,"16":4,"18":1,"19":5,"20":9,"21":3,"24":20,"25":30,"26":7,"27":17,"28":8,"29":4,"30":1,"32":2,"34":2,"35":12,"36":11,"37":20,"58":1,"59":4,"60":5,"61":1,"64":2,"66":1,"67":1,"69":1,"70":3,"71":6,"74":4,"75":2,"76":1,"78":1,"80":1,"83":1,"90":2,"91":1,"99":7,"100":3,"101":1,"105":3,"107":2,"108":6,"110":1,"111":1,"118":5,"119":1}}],["would",{"2":{"25":2,"36":1,"67":1}}],["word",{"2":{"58":1}}],["wordseparators",{"2":{"20":1}}],["words",{"2":{"6":1,"25":2,"37":1,"70":1}}],["worth",{"2":{"36":1}}],["world",{"2":{"35":1,"37":1}}],["worsens",{"2":{"35":1}}],["workable",{"2":{"70":1}}],["workbox",{"2":{"37":2,"118":1}}],["workbench",{"2":{"20":11}}],["worker",{"0":{"118":1},"2":{"37":3,"59":2,"64":1,"69":1,"78":1,"105":1,"116":1,"118":2}}],["workflow",{"2":{"8":2,"64":1,"105":1}}],["workflows",{"2":{"8":3}}],["workingissueformatscm",{"2":{"20":1}}],["working",{"2":{"3":1,"4":1,"6":2,"16":1,"20":1,"21":1,"22":1,"27":1,"59":2,"67":1}}],["work",{"2":{"2":1,"3":2,"5":1,"8":1,"10":1,"12":1,"20":5,"25":2,"26":1,"29":1,"36":2,"116":1}}],["workspace",{"2":{"20":3}}],["works",{"2":{"2":2,"19":1,"24":3,"36":1,"37":2,"102":1}}],["www",{"2":{"4":1,"8":6,"92":1}}],["walk",{"2":{"37":1}}],["water",{"2":{"36":1}}],["watch",{"2":{"27":1}}],["watchman",{"2":{"20":2}}],["was",{"2":{"24":1,"25":2,"27":2,"35":1,"37":5}}],["warm",{"2":{"20":1}}],["wants",{"2":{"3":1}}],["want",{"2":{"3":2,"11":1,"24":1,"28":2,"36":1,"90":1}}],["ways",{"2":{"36":1}}],["way",{"2":{"2":3,"5":1,"8":2,"12":1,"19":1,"24":1,"25":1,"35":2,"37":2,"58":1}}],["welcome",{"2":{"58":1,"62":1}}],["well",{"2":{"16":1,"20":2,"23":1,"24":1,"27":1,"36":3,"37":2,"70":1,"71":1,"102":1}}],["went",{"2":{"35":1}}],["weight",{"2":{"35":1}}],["were",{"2":{"24":1,"27":1,"35":1,"36":1,"37":1}}],["webapp",{"0":{"64":1,"68":1},"1":{"65":1,"69":1,"70":1},"2":{"40":1,"62":2,"64":7,"66":2,"69":1,"90":2,"91":1,"117":1}}],["webdriverio",{"2":{"26":1}}],["webpack",{"2":{"19":4,"20":13}}],["webp",{"2":{"18":1}}],["webstorm",{"2":{"20":2}}],["website",{"2":{"8":3,"9":9,"10":1,"19":1,"37":2,"59":1,"69":1,"70":1,"71":2,"90":1,"115":1}}],["websocket",{"2":{"5":1}}],["websockets",{"2":{"1":1,"5":3,"36":1,"74":1}}],["webservers",{"2":{"20":1}}],["webserver",{"2":{"4":1,"9":2,"20":1,"37":1}}],["web",{"0":{"65":1},"2":{"4":3,"5":2,"10":1,"20":1,"26":1,"28":1,"35":2,"37":8,"67":2,"70":2,"71":3,"75":1,"117":1}}],["we",{"2":{"2":1,"8":4,"24":2,"28":7,"35":1,"36":1}}],["wrap",{"2":{"28":1,"35":1}}],["wrappers",{"0":{"30":1},"2":{"30":1}}],["wrapper",{"2":{"1":1,"27":1,"37":2,"67":1}}],["writes",{"2":{"37":1}}],["write",{"2":{"3":2,"8":1,"25":2,"27":1,"36":1,"37":1}}],["written",{"2":{"2":1,"3":1,"26":1}}],["writing",{"2":{"2":1,"3":1,"26":1,"36":1,"37":1}}],["while",{"2":{"12":1}}],["which",{"2":{"2":1,"3":1,"4":2,"5":1,"9":1,"10":1,"16":2,"19":1,"20":1,"24":2,"25":6,"27":4,"29":1,"35":1,"37":5,"64":1,"70":2,"90":1,"120":2}}],["why",{"2":{"5":1,"20":1,"25":2,"27":2,"28":1,"35":2}}],["where",{"2":{"2":1,"3":1,"9":1,"12":1,"18":1,"20":1,"25":2,"26":1,"27":4,"31":1,"37":2,"71":1}}],["whether",{"2":{"2":2,"12":1,"25":1,"64":1}}],["when",{"0":{"104":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"2":6,"3":1,"4":2,"5":1,"8":2,"16":1,"20":2,"24":2,"25":3,"27":3,"35":1,"36":1,"37":9,"67":1,"71":1,"76":1,"79":1,"109":1,"111":1}}],["whole",{"2":{"35":2,"37":1}}],["whom",{"2":{"2":1}}],["who",{"2":{"2":1,"27":2,"36":1}}],["whatever",{"2":{"35":1}}],["what",{"2":{"1":1,"2":2,"3":2,"4":1,"5":1,"6":1,"8":1,"10":1,"12":1,"18":1,"20":1,"22":1,"25":3,"26":1,"27":3,"28":1,"35":1,"36":2}}],["wireframe",{"2":{"71":1}}],["wide",{"2":{"70":1}}],["widgets",{"2":{"25":1}}],["width",{"2":{"17":7,"111":2,"120":1}}],["windi",{"2":{"20":10}}],["window",{"2":{"8":1,"10":1,"20":4,"24":3,"67":1,"92":2,"117":1}}],["wise",{"2":{"10":1}}],["within",{"2":{"24":1}}],["without",{"2":{"3":2,"6":1,"11":2,"12":3,"20":1,"24":1,"26":1,"27":2,"35":1,"36":1,"37":1,"64":1,"67":1,"70":1,"74":1,"100":1,"111":1,"116":1,"117":1}}],["with",{"2":{"1":2,"2":7,"3":9,"4":2,"5":4,"8":12,"9":3,"10":2,"11":1,"12":4,"16":2,"18":3,"19":3,"20":6,"21":1,"22":1,"24":3,"25":6,"26":3,"27":2,"28":4,"29":1,"30":1,"32":1,"35":2,"36":8,"37":11,"59":1,"61":1,"64":2,"66":1,"67":2,"69":1,"70":3,"71":8,"72":1,"75":1,"76":2,"82":1,"92":1,"99":2,"102":1,"103":1,"105":1,"106":1,"108":1,"109":1,"118":1}}],["will",{"2":{"1":1,"3":3,"4":3,"5":2,"8":5,"9":1,"16":1,"18":1,"24":3,"25":1,"26":4,"27":3,"29":1,"30":2,"32":1,"34":1,"35":1,"36":2,"37":3,"64":3,"66":2,"71":1,"74":1,"118":1}}],["pwa",{"0":{"37":1,"116":1},"1":{"117":1,"118":1},"2":{"37":12,"59":1,"64":2,"69":2,"71":1,"105":1}}],["pwd",{"2":{"8":1}}],["pc",{"2":{"20":2}}],["pdm",{"2":{"20":2}}],["pdf",{"2":{"16":1,"20":1}}],["python",{"2":{"36":1,"37":1}}],["pyproject",{"2":{"20":2}}],["pyrightconfig",{"2":{"20":2}}],["pinia",{"2":{"25":14,"45":1}}],["picked",{"2":{"20":1}}],["picture",{"2":{"18":1,"37":1}}],["pictures",{"2":{"16":1,"18":1,"37":1}}],["pipelines",{"2":{"20":2}}],["psalm",{"2":{"20":1}}],["pm2",{"2":{"20":4}}],["pm",{"2":{"20":1}}],["px`",{"2":{"17":4}}],["pnp",{"2":{"20":2}}],["pnpm",{"2":{"8":12,"19":2,"20":6,"64":3,"65":2,"66":2,"69":1}}],["png`",{"2":{"16":1}}],["png",{"2":{"16":3,"18":3,"76":1}}],["p",{"2":{"8":1}}],["people",{"2":{"28":1}}],["pet",{"2":{"8":1}}],["perfect",{"2":{"27":1}}],["perfectly",{"2":{"27":1}}],["performant",{"2":{"27":1}}],["performance",{"2":{"24":1,"25":1,"29":1,"37":1}}],["performed",{"2":{"27":1}}],["perform",{"2":{"27":1}}],["percent",{"2":{"24":1,"99":1}}],["perspective",{"2":{"25":2}}],["persistentsessionreviveprocess",{"2":{"20":1}}],["person",{"2":{"2":1,"20":1,"36":2}}],["personal",{"2":{"2":1}}],["pereditorgroup",{"2":{"20":1}}],["per",{"2":{"9":1,"27":1}}],["permissions",{"2":{"2":1,"8":1}}],["permission",{"2":{"2":1}}],["phpcs",{"2":{"20":2}}],["phpunit",{"2":{"20":1}}],["php",{"2":{"3":1,"20":2,"36":1,"37":2}}],["photo",{"2":{"2":1}}],["pure",{"2":{"32":1,"35":1,"67":1}}],["purpose",{"2":{"24":1,"25":1,"37":1}}],["purposes",{"2":{"8":1}}],["pug",{"2":{"24":1}}],["pugtools",{"2":{"20":1}}],["pullapprove",{"2":{"20":2}}],["puppeteer",{"2":{"20":10}}],["publishing",{"2":{"64":1}}],["public",{"2":{"3":1,"16":4,"36":1}}],["pubspec",{"2":{"20":3}}],["pubxml",{"2":{"20":2}}],["push",{"2":{"6":1,"8":4,"27":1,"92":1}}],["put",{"2":{"8":1,"10":1,"16":2,"20":1,"25":2,"36":1,"91":1}}],["putting",{"2":{"3":1}}],["puts",{"2":{"2":1}}],["pleasant",{"2":{"35":1}}],["please",{"2":{"20":1}}],["plenty",{"2":{"3":1}}],["plugging",{"2":{"67":1}}],["plug",{"2":{"29":2}}],["plugin",{"2":{"19":2,"20":1,"37":3,"78":3}}],["plugins",{"2":{"19":4,"20":1,"25":1,"106":1}}],["plus",{"2":{"2":1,"8":1,"25":1}}],["planned",{"0":{"108":1},"2":{"71":1}}],["plans",{"2":{"3":2,"9":2}}],["play",{"2":{"36":1}}],["plays",{"2":{"27":1}}],["played",{"2":{"25":1,"36":1}}],["playground",{"2":{"20":1}}],["playwright",{"2":{"20":10}}],["places",{"2":{"37":1}}],["place",{"2":{"24":1,"27":1}}],["placed",{"2":{"9":1,"16":2}}],["placeholder",{"2":{"3":1}}],["placing",{"2":{"3":1,"37":1}}],["pba",{"2":{"2":1}}],["pops",{"2":{"111":1}}],["populated",{"2":{"25":1}}],["popular",{"2":{"3":1,"8":1,"19":1,"20":1,"24":1,"35":1,"37":1,"71":2,"99":1,"108":1}}],["popups",{"2":{"24":1}}],["polymorphism",{"2":{"28":1}}],["policy",{"2":{"2":2}}],["points",{"2":{"60":1}}],["point",{"2":{"25":1,"37":2,"59":1}}],["poorly",{"2":{"24":1}}],["portfolio",{"2":{"69":1,"70":1,"71":1}}],["port",{"2":{"4":1}}],["portal",{"2":{"2":1}}],["position",{"2":{"27":1,"70":1}}],["postcss",{"2":{"20":10}}],["postcssrc",{"2":{"20":10}}],["postman",{"2":{"4":1,"20":1}}],["postgresql",{"2":{"3":1}}],["possibilities",{"2":{"20":1}}],["possibility",{"2":{"2":1,"26":1,"29":1,"71":2}}],["possibly",{"2":{"3":1,"8":1}}],["possible",{"2":{"2":2,"24":1,"25":1,"27":3,"35":1,"37":2,"64":1,"67":1,"112":1,"120":1}}],["poke",{"2":{"3":1}}],["powerful",{"2":{"12":1}}],["power",{"2":{"2":1,"25":1,"28":1}}],["pr",{"2":{"58":1}}],["practical",{"2":{"36":1}}],["practice",{"2":{"24":1,"25":2,"70":1}}],["practices",{"0":{"12":1},"1":{"13":1,"14":1,"15":1},"2":{"2":1,"35":1,"36":5,"59":1,"60":1,"70":2,"71":2}}],["price",{"2":{"37":1}}],["primitive",{"2":{"25":1}}],["primitives",{"2":{"24":2}}],["primevue",{"2":{"21":1}}],["private",{"2":{"8":6,"10":1,"25":1}}],["print",{"2":{"24":1}}],["printwidth",{"2":{"20":1}}],["printf",{"2":{"8":1}}],["printed",{"2":{"4":1}}],["principle",{"2":{"4":1,"27":1}}],["preserving",{"2":{"99":1}}],["presence",{"2":{"26":1,"27":1}}],["presentation",{"2":{"35":1}}],["present",{"2":{"25":1}}],["preprocessor",{"2":{"67":1}}],["precisely",{"2":{"37":1}}],["prerenderer",{"2":{"37":1}}],["pre",{"2":{"36":1,"37":1}}],["prevent",{"2":{"79":1}}],["prevalent",{"2":{"36":1}}],["prevalence",{"2":{"27":1}}],["previous",{"2":{"36":1}}],["previously",{"2":{"8":1}}],["preview",{"2":{"20":1}}],["pretentious",{"2":{"24":1}}],["prettier",{"2":{"20":14}}],["pretty",{"2":{"3":1,"102":2}}],["preferredtagnamecase",{"2":{"20":1}}],["preloader",{"2":{"12":2,"107":1}}],["promise",{"2":{"74":2}}],["promises",{"2":{"36":1}}],["proven",{"2":{"59":1,"70":1}}],["providing",{"2":{"12":1}}],["provides",{"2":{"4":1}}],["provider",{"2":{"3":2,"28":1}}],["providers",{"2":{"3":1,"5":1,"9":3,"36":1,"108":1}}],["provided",{"2":{"3":2,"110":1}}],["provide",{"2":{"3":3,"9":2,"10":1,"11":1,"12":2,"25":3,"35":1}}],["progressive",{"2":{"37":1}}],["programmatically",{"2":{"24":1}}],["programmers",{"2":{"27":2,"60":1}}],["programmer",{"2":{"24":1,"27":2,"28":1}}],["programming",{"2":{"3":2,"27":3,"36":2}}],["programs",{"2":{"20":1}}],["program",{"2":{"4":1,"24":1,"27":2,"28":1}}],["professional",{"2":{"31":1}}],["pros",{"2":{"25":1,"35":2}}],["procfile",{"2":{"20":2}}],["processed",{"2":{"36":1}}],["processing",{"2":{"28":1}}],["processor",{"2":{"20":1}}],["process",{"2":{"6":1,"8":1,"10":1,"16":1,"26":1,"37":1}}],["proj",{"2":{"20":2}}],["projectname",{"2":{"64":1}}],["projects",{"2":{"8":1,"10":2,"19":1,"26":2,"27":1,"35":1,"36":1,"62":1}}],["project",{"0":{"34":1,"62":1},"2":{"3":1,"6":1,"8":10,"9":1,"10":4,"19":3,"20":1,"25":1,"28":1,"32":1,"34":1,"35":1,"36":1,"59":2,"64":6,"65":1,"69":2,"70":1,"90":1}}],["proposed",{"2":{"37":1}}],["property=",{"2":{"115":7}}],["properties",{"2":{"37":1}}],["proper",{"2":{"35":1}}],["prop",{"2":{"11":1,"12":2,"25":1}}],["props",{"2":{"11":1,"12":1,"15":1,"17":11,"25":2}}],["probability",{"2":{"26":1}}],["probably",{"2":{"10":1,"27":1,"37":1}}],["problems",{"2":{"4":2,"25":1,"37":1}}],["problem",{"2":{"3":1,"8":1,"16":1,"25":1,"36":1,"37":1}}],["prod",{"2":{"8":5}}],["productive",{"2":{"20":1}}],["production",{"2":{"19":1,"26":1}}],["productid",{"2":{"15":1}}],["product",{"2":{"6":1,"10":2,"15":2,"36":1,"37":1}}],["products",{"2":{"1":3,"15":1}}],["proxy",{"2":{"4":2,"5":1,"24":2,"27":2}}],["protocols",{"0":{"5":1},"2":{"5":1,"36":1}}],["protocol",{"2":{"4":1,"9":1,"75":1}}],["protect",{"2":{"4":1}}],["palettes",{"2":{"108":1}}],["paid",{"2":{"36":1}}],["payment",{"2":{"28":1}}],["pascal",{"2":{"20":1}}],["pass",{"2":{"11":1,"25":3}}],["passing",{"2":{"11":1,"12":1}}],["passes",{"2":{"2":1}}],["password",{"2":{"2":1,"25":1}}],["paths",{"2":{"19":2}}],["path",{"2":{"12":4,"17":1,"19":3}}],["pattern",{"2":{"12":1,"24":1,"25":2,"27":1}}],["patterns",{"0":{"10":1},"1":{"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"20":1,"35":1,"36":2,"60":1}}],["packages",{"2":{"19":1,"20":2,"71":1}}],["package",{"2":{"10":1,"19":1,"20":8,"21":1,"24":1,"29":1,"67":2,"102":2}}],["panel",{"2":{"10":1,"110":1}}],["page",{"2":{"4":6,"16":1,"26":1,"37":8,"97":1}}],["pagespeed",{"2":{"37":2}}],["pages",{"0":{"89":1},"1":{"90":1,"91":1},"2":{"4":3,"6":1,"8":11,"9":3,"12":1,"35":1,"36":1,"37":2,"64":1,"90":6,"105":2}}],["paragraphs",{"2":{"36":1,"99":1}}],["parameter",{"2":{"64":1,"91":1,"99":1}}],["parameters",{"2":{"8":1,"64":1,"71":1,"72":1,"108":1}}],["params",{"2":{"1":2,"75":1}}],["particular",{"2":{"99":1}}],["participation",{"0":{"62":1}}],["partially",{"2":{"25":3,"27":2}}],["part",{"2":{"24":1,"25":1,"36":2,"105":2}}],["party",{"0":{"30":1},"2":{"2":1,"4":5,"5":1,"25":1,"29":1,"37":1,"67":2,"118":1}}],["parts",{"2":{"2":1,"108":1}}],["vwa",{"2":{"111":1,"120":11}}],["v1",{"0":{"39":1,"41":1,"43":1,"46":1,"49":1},"1":{"40":1,"42":1,"44":1,"45":1,"47":1,"48":1,"50":1}}],["vulnerability",{"2":{"29":1}}],["vulnerabilities",{"2":{"25":1}}],["vuesence",{"2":{"66":1}}],["vuefaq",{"2":{"61":1}}],["vuetify",{"2":{"35":1}}],["vuejs",{"2":{"25":1,"60":4}}],["vuex",{"2":{"25":6,"45":1}}],["vue",{"0":{"13":1,"25":1,"36":1,"52":1,"64":1,"68":1},"1":{"65":1,"69":1,"70":1},"2":{"8":1,"10":2,"11":1,"12":2,"13":1,"14":1,"16":1,"17":2,"19":4,"20":15,"23":1,"24":7,"25":12,"26":1,"27":17,"35":2,"36":20,"37":1,"40":2,"42":1,"52":1,"58":1,"60":2,"62":2,"64":7,"65":1,"66":2,"67":3,"69":3,"70":4,"71":3,"72":2,"76":2,"90":2,"91":1,"101":1,"102":2,"110":1,"119":1}}],["vetur",{"2":{"20":2}}],["verified",{"2":{"37":1,"60":1}}],["verifies",{"2":{"2":2}}],["vercel",{"2":{"9":1,"20":2,"108":1}}],["versionrc",{"2":{"20":2}}],["versions",{"2":{"20":3}}],["versioning",{"2":{"10":1,"118":1}}],["version",{"2":{"8":8,"20":3,"36":1,"37":1,"74":1,"108":1,"118":2}}],["very",{"2":{"2":3,"3":2,"9":1,"20":3,"24":4,"25":1,"26":1,"34":1,"35":1,"36":2,"37":3,"58":1,"75":1,"99":3}}],["vbproj",{"2":{"20":1}}],["vb",{"2":{"20":6}}],["volar",{"2":{"20":4}}],["v",{"2":{"17":3}}],["vs",{"2":{"10":1,"20":7,"27":1,"102":1}}],["vscode",{"2":{"8":1,"20":9}}],["v4",{"2":{"8":5}}],["v2",{"2":{"8":3}}],["v3",{"2":{"8":4}}],["vars",{"2":{"120":1}}],["various",{"2":{"36":1,"108":1}}],["variations",{"2":{"71":1}}],["variant",{"2":{"5":1,"24":1}}],["variants",{"2":{"2":1,"107":1,"108":3,"112":1}}],["variables",{"2":{"24":1,"25":1,"27":2,"120":2}}],["variable",{"2":{"2":1,"24":2,"25":3,"27":6,"111":1}}],["var",{"2":{"8":4}}],["validation",{"2":{"25":1}}],["validate",{"2":{"20":1}}],["valid",{"2":{"2":2}}],["values",{"2":{"64":1,"115":1}}],["value",{"2":{"1":2,"8":1,"15":1,"20":1,"24":1,"25":1,"27":4,"74":1,"92":1,"101":1,"118":1}}],["visual",{"2":{"27":1,"59":1}}],["visualization",{"2":{"25":1,"27":1,"35":1}}],["visualizer",{"2":{"19":4}}],["visuals",{"2":{"20":1}}],["visible",{"2":{"2":1,"20":1}}],["videos",{"2":{"36":3}}],["video",{"2":{"16":1,"36":1,"37":1}}],["view",{"2":{"12":3,"25":3,"27":2,"59":1,"71":1}}],["views",{"2":{"10":1,"12":1}}],["virtual",{"2":{"3":1,"9":1,"24":1,"36":1}}],["via",{"0":{"64":1},"1":{"65":1},"2":{"1":1,"2":3,"3":1,"5":1,"8":1,"9":1,"12":1,"16":2,"20":1,"24":2,"25":1,"72":1,"78":1,"110":1,"120":1}}],["vitest",{"2":{"20":10,"26":1}}],["vitepress",{"2":{"8":1,"34":1,"36":1,"70":1}}],["vite",{"0":{"91":1},"2":{"1":1,"4":1,"16":1,"17":1,"19":13,"20":3,"37":3,"60":1,"67":1,"75":1,"78":2,"91":1}}],["effective",{"2":{"71":1}}],["effort",{"2":{"28":1}}],["efficiency",{"2":{"24":1}}],["efficiently",{"2":{"27":1,"28":1,"70":1,"71":1}}],["efficient",{"2":{"24":1,"27":1,"37":1,"67":2}}],["e2e2e3",{"2":{"120":2}}],["e2e",{"2":{"26":5}}],["empty",{"2":{"70":1}}],["email",{"2":{"61":1}}],["embla",{"2":{"23":1}}],["emmet",{"2":{"20":2}}],["eex",{"2":{"20":1}}],["eol",{"2":{"20":1}}],["education",{"2":{"117":1}}],["edited",{"2":{"117":1}}],["edit",{"2":{"58":1}}],["editorconfig",{"2":{"20":2}}],["editortab",{"2":{"20":1}}],["editorgroup",{"2":{"20":1}}],["editor",{"2":{"20":31}}],["edge",{"2":{"3":2}}],["element",{"2":{"27":1,"59":1,"72":1}}],["elements",{"2":{"2":1,"6":1,"24":4,"26":1,"27":1,"33":1,"37":2}}],["else",{"2":{"17":1,"20":1,"36":1}}],["e88a22df",{"2":{"16":1}}],["evolution",{"2":{"35":1}}],["evolving",{"2":{"27":1}}],["evan",{"2":{"27":1}}],["evaluate",{"2":{"12":1}}],["ever",{"2":{"11":1}}],["everyone",{"2":{"37":1}}],["everybody",{"2":{"25":1}}],["everything",{"2":{"20":1,"24":2,"27":1,"59":1,"66":1}}],["every",{"2":{"1":1}}],["events",{"2":{"25":1}}],["event",{"2":{"5":1,"20":1,"25":1}}],["even",{"2":{"2":1,"4":1,"18":1,"24":1,"25":2,"27":1,"35":1,"36":3,"99":1}}],["ecosystem",{"2":{"20":1,"24":1,"71":1}}],["economical",{"2":{"3":1}}],["echo",{"2":{"8":8}}],["established",{"2":{"70":1}}],["es6",{"2":{"24":1,"27":1}}],["esbenp",{"2":{"20":4}}],["esbuild",{"2":{"19":1}}],["eslint",{"2":{"19":3,"20":17,"36":1,"67":2}}],["esnext",{"2":{"19":1}}],["especially",{"2":{"5":1,"26":1,"71":1}}],["essence",{"2":{"2":1}}],["errors",{"2":{"20":1}}],["error",{"2":{"4":1,"8":1}}],["e",{"2":{"3":1,"11":1,"16":1,"25":1,"27":1,"37":1,"67":1}}],["etc",{"2":{"3":1,"10":1,"19":1,"26":1,"33":1,"37":1,"59":1,"69":2,"70":1,"71":4,"78":1,"120":1}}],["either",{"2":{"2":1,"16":1,"35":1}}],["enhance",{"2":{"119":1}}],["enough",{"2":{"37":1,"70":1}}],["english",{"2":{"36":1}}],["engines",{"2":{"37":1}}],["engine",{"2":{"24":1,"36":1,"37":1}}],["engineer",{"2":{"6":1,"61":1}}],["encapsulates",{"2":{"27":1}}],["encapsulated",{"2":{"27":1}}],["encoded",{"2":{"16":1}}],["entering",{"2":{"64":1}}],["enter",{"2":{"58":1}}],["enters",{"2":{"27":1}}],["entrance",{"2":{"37":1}}],["entry",{"2":{"27":1,"37":1}}],["entities",{"2":{"27":1}}],["entity",{"2":{"25":3}}],["entirely",{"2":{"119":1}}],["entire",{"2":{"18":1,"24":1,"25":1,"99":1}}],["en",{"2":{"20":3}}],["enablesmartcommit",{"2":{"20":1}}],["enable",{"2":{"20":4,"24":1,"71":2}}],["enabled",{"2":{"2":1,"20":9,"24":1,"66":1}}],["endpoint",{"2":{"3":2}}],["endpoints",{"2":{"3":2}}],["end",{"2":{"2":1,"3":5,"5":1,"6":1,"20":1,"26":4,"27":1,"28":1,"37":1,"71":1}}],["envrc",{"2":{"20":12}}],["envs",{"2":{"8":2}}],["environment",{"2":{"8":3,"20":1,"70":1}}],["environments",{"2":{"8":1,"9":1}}],["env",{"2":{"1":1,"8":26,"20":38,"75":1}}],["earlier",{"2":{"20":1}}],["eager",{"2":{"18":2}}],["easy",{"2":{"9":1,"12":2,"16":1,"36":1,"67":1}}],["easingthemes",{"2":{"8":2}}],["easier",{"2":{"8":1,"27":2,"30":2,"35":1,"37":1}}],["easiest",{"2":{"3":1,"36":1}}],["easily",{"2":{"1":1,"36":1,"74":1}}],["each",{"2":{"2":4,"8":3,"10":4,"19":2,"20":1,"25":3,"27":2,"37":1,"71":1,"72":1,"74":1,"118":1}}],["existing",{"2":{"36":1,"64":1}}],["exist",{"2":{"27":1}}],["exiting",{"2":{"8":1}}],["excellent",{"2":{"36":1}}],["exceptional",{"2":{"37":1}}],["except",{"2":{"25":1}}],["exclude",{"2":{"8":1,"20":1}}],["execution",{"2":{"24":1}}],["executes",{"2":{"37":1}}],["execute",{"2":{"8":1}}],["executed",{"2":{"3":1,"12":1}}],["exs",{"2":{"20":5}}],["extreme",{"2":{"36":1}}],["extractor",{"2":{"20":11}}],["external",{"2":{"25":1}}],["extensibility",{"2":{"35":1}}],["extension",{"2":{"20":1,"27":1,"102":2}}],["extensions",{"0":{"102":1},"2":{"4":1,"20":6,"76":1,"102":1}}],["extend",{"2":{"19":1}}],["ex",{"2":{"20":1}}],["express",{"2":{"37":1}}],["experiment",{"2":{"36":1}}],["experimenting",{"2":{"27":1}}],["experience",{"2":{"5":1,"36":3,"37":1,"59":4,"61":1,"119":1}}],["experienced",{"2":{"5":1,"36":2,"60":2,"70":1,"71":1}}],["expediency",{"2":{"26":1}}],["expanding",{"2":{"108":1}}],["expand",{"2":{"20":1,"36":1}}],["expandmode",{"2":{"20":1}}],["explained",{"2":{"36":1}}],["explorer",{"2":{"20":6}}],["explicitly",{"2":{"67":1,"70":1}}],["explicit",{"2":{"1":1}}],["expires",{"2":{"2":2}}],["expired",{"2":{"2":1}}],["exports",{"2":{"18":1}}],["export",{"2":{"1":2,"12":1,"14":1,"18":1,"19":1,"25":2,"75":2}}],["examples",{"2":{"36":1,"71":1}}],["example",{"2":{"1":2,"2":5,"3":5,"4":2,"6":2,"8":1,"10":3,"12":3,"18":2,"20":2,"25":4,"27":4,"29":1,"30":1,"33":1,"37":1,"101":1,"111":1}}],["hurry",{"2":{"29":1}}],["huskyrc",{"2":{"20":2}}],["huge",{"2":{"18":1}}],["hxx",{"2":{"20":3}}],["hpp",{"2":{"20":3}}],["hmr",{"2":{"19":1}}],["h",{"2":{"8":1,"20":4}}],["hotel",{"2":{"37":1}}],["home",{"2":{"37":1,"64":1,"117":1}}],["horizons",{"2":{"36":1}}],["hood",{"2":{"27":1,"36":1}}],["hooks",{"2":{"20":4}}],["holding",{"2":{"25":2}}],["hoppscotch",{"2":{"20":1}}],["houdini",{"2":{"20":1}}],["hover",{"2":{"20":1}}],["hosts",{"2":{"25":1}}],["hosted",{"2":{"9":1}}],["hosting",{"0":{"9":1},"2":{"9":3,"71":1}}],["host",{"2":{"4":1,"8":10,"9":2}}],["however",{"2":{"21":1,"25":2,"102":1}}],["how",{"2":{"2":1,"3":3,"5":1,"10":1,"12":2,"16":1,"18":1,"19":3,"20":1,"24":1,"25":3,"35":1,"36":3,"37":2,"40":1,"42":1}}],["html5",{"2":{"33":1,"54":1,"67":1}}],["htmlnanorc",{"2":{"20":20}}],["html=",{"2":{"17":1}}],["html",{"0":{"54":1,"78":1},"2":{"4":1,"8":2,"9":1,"16":2,"20":6,"27":3,"36":1,"37":10,"72":1,"78":2,"92":2,"115":2,"119":1}}],["https",{"2":{"4":6,"9":1,"20":2,"37":1,"66":1,"74":1,"75":1,"90":1,"92":1}}],["httponly",{"2":{"2":3}}],["http",{"2":{"1":11,"3":1,"4":3,"16":1,"74":5,"75":4}}],["hello",{"2":{"99":1}}],["helpful",{"0":{"22":1},"1":{"23":1,"24":1},"2":{"48":1}}],["helps",{"2":{"18":1,"36":1,"70":1}}],["help",{"2":{"4":1,"20":1,"35":1,"36":3}}],["heavy",{"2":{"37":1}}],["heavyweight",{"2":{"21":1,"24":1,"99":1}}],["heading",{"2":{"90":1}}],["headless",{"2":{"26":1,"35":1,"71":1}}],["header>",{"2":{"76":1,"97":2}}],["header",{"2":{"10":1,"33":1,"64":2,"71":2,"76":2,"94":1,"95":1,"96":1,"105":1,"108":1,"109":1,"111":1}}],["headers",{"0":{"93":1},"1":{"94":1,"95":1,"96":1,"97":1},"2":{"4":1,"75":1,"93":1,"97":1}}],["heidisql",{"2":{"20":1}}],["height",{"2":{"17":7}}],["heex",{"2":{"20":1}}],["hexcolorlength",{"2":{"20":1}}],["heroku",{"2":{"9":1,"108":1}}],["here",{"2":{"3":1,"5":1,"21":1,"25":3,"36":1,"100":1}}],["he",{"2":{"2":1,"25":1,"27":1}}],["half",{"2":{"100":1}}],["hack",{"2":{"79":1}}],["hamburger",{"2":{"76":1,"81":1,"109":1,"111":1}}],["harmful",{"2":{"36":1}}],["hardware",{"2":{"37":2}}],["hard",{"2":{"19":1}}],["happen",{"2":{"25":1}}],["happened",{"2":{"25":1}}],["had",{"2":{"24":1,"25":1}}],["handled",{"2":{"37":1}}],["handle",{"2":{"36":1,"37":1}}],["handles",{"2":{"27":1}}],["handling",{"2":{"28":1}}],["handy",{"0":{"21":1},"2":{"20":1,"34":1}}],["hand",{"2":{"20":1,"25":1,"70":2}}],["have",{"2":{"2":3,"3":1,"8":1,"11":1,"12":1,"16":1,"20":2,"24":3,"25":4,"27":2,"28":2,"29":1,"35":2,"36":1,"37":1,"70":1,"91":2,"119":1}}],["hash",{"2":{"16":1}}],["hassles",{"2":{"2":1}}],["has",{"2":{"2":7,"3":1,"5":1,"8":2,"10":1,"19":1,"24":3,"25":5,"27":3,"37":1,"90":1,"99":2,"102":1}}],["hide=",{"2":{"97":1}}],["hidden",{"2":{"1":1,"79":1,"109":1}}],["high",{"2":{"67":1}}],["highly",{"2":{"26":1}}],["highlightmodifiedtabs",{"2":{"20":1}}],["hierarchical",{"2":{"35":1}}],["hierarchize",{"2":{"27":1}}],["hierarchy",{"2":{"25":2}}],["hints",{"0":{"22":1},"1":{"23":1,"24":1},"2":{"48":1}}],["himself",{"2":{"25":1,"35":1,"70":1}}],["him",{"2":{"2":1,"6":1,"28":2}}],["historically",{"2":{"25":1}}],["history",{"2":{"20":5}}],["histoire",{"2":{"20":10}}],["his",{"2":{"2":2,"3":1,"20":1}}],["uri",{"2":{"75":1}}],["url",{"2":{"1":1,"16":2,"18":1,"75":1,"115":2,"117":1}}],["ux",{"2":{"37":2,"59":1,"67":1,"82":1,"105":1,"118":1}}],["uis",{"2":{"27":1}}],["ui",{"0":{"30":1,"35":1},"2":{"19":1,"21":2,"26":1,"27":2,"28":2,"30":1,"32":1,"35":9,"59":1,"67":1,"71":1,"76":1,"95":1,"96":1}}],["uuid",{"2":{"14":6,"15":1}}],["u",{"2":{"12":1}}],["utility",{"2":{"25":1,"76":1}}],["utilities",{"0":{"30":1},"2":{"10":2,"30":1}}],["utils",{"2":{"1":3,"10":1,"14":1,"17":2,"74":3,"75":5,"76":2,"78":1,"101":1}}],["upper",{"2":{"72":1}}],["upgrading",{"2":{"37":1}}],["upgrade",{"2":{"35":1}}],["up",{"2":{"8":1,"19":1,"20":3,"24":1,"26":1,"28":2,"35":3,"36":1,"70":1,"75":1,"99":1}}],["updating",{"2":{"8":1,"27":1}}],["updates",{"2":{"27":1}}],["updated",{"2":{"26":1,"27":2}}],["update",{"2":{"8":3,"20":1}}],["upload",{"2":{"8":3,"36":1}}],["ubuntu",{"2":{"8":3,"64":1}}],["usability",{"2":{"59":1}}],["usage",{"0":{"101":1},"2":{"24":1}}],["usual",{"2":{"27":1}}],["usually",{"2":{"5":1,"12":1,"24":1,"25":2,"26":1,"27":1,"36":1,"37":1,"70":1,"99":1}}],["us",{"2":{"20":1}}],["using",{"2":{"3":2,"4":1,"5":1,"8":1,"9":1,"10":1,"16":1,"19":2,"25":3,"27":1,"35":1,"37":2,"58":1,"59":1,"71":1,"107":1}}],["usetouchswipe",{"2":{"82":1}}],["uselessly",{"2":{"36":1}}],["useless",{"2":{"36":1,"102":1}}],["usenewswidget",{"2":{"27":1}}],["useappconfig",{"2":{"76":3}}],["useapploader",{"0":{"14":1},"2":{"13":3,"14":1,"15":3}}],["useauthstore",{"2":{"25":1}}],["useauthservice",{"2":{"25":1}}],["useauth",{"2":{"1":4,"25":1}}],["usei18nlight",{"0":{"100":1},"2":{"101":2}}],["usei18n",{"2":{"10":1,"27":1,"101":4}}],["usescreenwidth",{"2":{"72":6}}],["usescreensize",{"2":{"27":1}}],["useshoppingcart",{"2":{"27":1}}],["uses",{"2":{"8":11,"17":1,"19":1,"24":3,"27":1,"67":2,"76":2,"90":1}}],["usefulness",{"2":{"26":1}}],["useful",{"2":{"6":1,"8":1,"20":4,"25":1,"26":1,"28":1,"36":3,"37":2,"42":1,"66":1,"102":1,"108":1}}],["use",{"0":{"11":1,"30":1,"32":1,"33":1},"2":{"2":1,"3":1,"5":2,"10":3,"16":3,"19":2,"20":2,"24":3,"25":3,"26":1,"27":2,"28":2,"30":2,"32":1,"34":1,"35":2,"36":2,"37":4,"67":3,"71":1,"75":1,"76":1,"90":1,"101":1,"102":2,"118":1}}],["used",{"2":{"2":3,"4":3,"8":2,"10":1,"19":2,"24":2,"25":2,"27":3,"28":1,"36":1,"60":1,"67":3,"72":1,"75":1,"111":1,"118":1}}],["userloggedin",{"2":{"25":1}}],["useraccountview",{"2":{"12":1}}],["username",{"2":{"2":1,"8":2,"25":1}}],["user",{"2":{"1":2,"2":16,"8":8,"10":1,"11":2,"20":3,"24":1,"25":3,"26":1,"27":4,"28":1,"37":3,"59":4,"67":1,"71":1,"97":1,"109":1,"117":1,"119":1,"120":1}}],["userid",{"2":{"1":1}}],["users",{"2":{"1":7,"2":2,"28":1,"37":2}}],["userdata",{"2":{"1":1}}],["unwanted",{"2":{"70":1}}],["unnecessarily",{"2":{"67":1}}],["unnecessary",{"2":{"2":1,"5":1,"25":1}}],["unless",{"2":{"32":1,"67":1}}],["unlike",{"2":{"25":1}}],["unlighthouse",{"2":{"20":2}}],["unequivocally",{"2":{"27":1}}],["unfortunate",{"2":{"25":1}}],["unfortunately",{"2":{"20":1}}],["unoptimized",{"2":{"37":1}}],["unocss",{"2":{"20":10}}],["uno",{"2":{"20":10}}],["untrackedchanges",{"2":{"20":1}}],["unified",{"2":{"35":1}}],["unification",{"2":{"5":1}}],["unit",{"2":{"26":6}}],["unicodehighlight",{"2":{"20":1}}],["universal",{"2":{"16":2}}],["unique",{"2":{"15":1,"25":2}}],["under",{"2":{"6":1,"27":1,"62":1,"90":5}}],["understanding",{"2":{"36":1}}],["understand",{"2":{"12":1,"25":1,"36":2,"37":1}}],["understandable",{"2":{"5":1}}],["understood",{"2":{"2":1}}],["undeservedly",{"2":{"2":1}}],["=+",{"2":{"20":1}}],["==",{"2":{"8":3}}],["=>",{"2":{"8":2,"14":1,"17":2,"101":1}}],["=",{"2":{"1":5,"8":1,"12":3,"13":1,"14":3,"15":2,"17":3,"18":6,"24":6,"25":1,"27":1,"72":1,"74":3,"75":2,"76":2,"92":1,"101":3}}],["fcp",{"2":{"37":1}}],["fnc",{"2":{"21":1,"24":1}}],["fly",{"2":{"37":1,"99":1}}],["flagship",{"2":{"27":1}}],["flake",{"2":{"20":2}}],["flow",{"2":{"24":1,"27":1,"56":1}}],["flowconfig",{"2":{"20":2}}],["fls",{"2":{"20":1}}],["flex",{"2":{"72":3}}],["flexbox",{"2":{"32":1,"33":1,"55":2}}],["flexible",{"2":{"25":1,"27":1}}],["flexibility",{"2":{"5":1,"25":1}}],["fledged",{"2":{"3":2,"67":1}}],["fdb",{"2":{"20":1}}],["feature",{"2":{"27":1}}],["features",{"0":{"33":1},"2":{"3":1,"24":1,"25":1,"37":2,"99":1}}],["fetish",{"2":{"26":1}}],["fetch",{"2":{"1":1,"8":1,"70":1,"74":1}}],["ferferga",{"2":{"25":1}}],["few",{"2":{"4":1,"21":1,"70":1,"71":1}}],["future",{"2":{"71":1}}],["further",{"2":{"69":1,"70":1,"71":1}}],["fundamental",{"2":{"27":1}}],["functional",{"2":{"25":1,"71":2}}],["functionality",{"2":{"24":2,"28":1,"34":1,"35":1,"64":1,"66":2,"67":4,"69":1,"70":1,"71":2,"82":1,"99":2,"100":1,"103":1,"108":1}}],["function",{"2":{"12":1,"14":3,"15":1,"17":1,"18":3,"24":1,"25":3,"28":1,"29":2,"67":1,"72":2,"74":1,"82":1,"92":1,"99":1,"101":1}}],["functions",{"2":{"3":3,"10":1,"12":1,"25":9,"27":2,"28":1}}],["fu",{"2":{"20":1,"67":1}}],["fullstack",{"2":{"5":1,"20":1}}],["fullstackers",{"2":{"5":1}}],["full",{"2":{"3":2,"25":1,"35":1,"61":1,"67":1}}],["frequently",{"2":{"60":2}}],["freezed",{"2":{"20":1}}],["free",{"2":{"3":3,"9":2,"36":3}}],["fragments",{"2":{"71":1,"78":1}}],["frantically",{"2":{"20":1}}],["frameworks",{"0":{"27":1},"2":{"27":3,"45":1,"70":1}}],["framework",{"2":{"4":1,"24":4,"25":1,"27":1,"67":1,"70":2,"99":1,"108":1}}],["friendly",{"2":{"19":1,"36":1}}],["front",{"2":{"2":6,"3":4,"5":1,"6":1,"20":1,"26":2,"27":1,"28":1,"71":1}}],["frontenders",{"0":{"3":1}}],["frontend",{"0":{"27":1,"28":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1},"2":{"2":3,"3":3,"4":1,"5":2,"9":1,"20":1,"25":5,"26":2,"27":5,"28":3,"36":2,"37":1,"40":1,"42":1,"45":2,"60":1,"70":1}}],["from",{"0":{"66":1},"2":{"1":10,"2":1,"3":1,"4":7,"8":3,"9":1,"12":1,"13":1,"14":2,"15":1,"16":9,"17":3,"18":3,"19":3,"20":1,"24":1,"25":8,"26":2,"27":3,"28":1,"31":1,"36":7,"37":7,"59":1,"60":1,"71":1,"72":1,"74":2,"75":5,"76":3,"80":1,"90":1,"91":1,"99":1,"101":2,"109":1,"112":1}}],["fix",{"2":{"20":1,"28":1}}],["fixall",{"2":{"20":2}}],["field",{"2":{"18":2,"25":1,"27":2}}],["finance",{"2":{"99":1}}],["final",{"2":{"28":1,"35":1}}],["finished",{"2":{"36":1}}],["fine",{"2":{"20":1,"71":1}}],["finding",{"2":{"99":1}}],["find",{"2":{"18":1,"20":1,"37":1,"101":1}}],["fingerprint",{"2":{"2":1}}],["filling",{"2":{"69":1,"71":1}}],["fill",{"2":{"17":1}}],["filenesting",{"2":{"20":3}}],["filename",{"2":{"18":10}}],["filelistlayout",{"2":{"20":1}}],["file=",{"2":{"8":1}}],["files",{"2":{"8":3,"9":1,"16":1,"17":1,"19":2,"20":4,"37":2,"76":1,"101":1}}],["file",{"2":{"4":1,"8":9,"17":1,"20":3,"37":2,"64":2,"78":1,"117":1,"120":2}}],["fi",{"2":{"8":2}}],["firesbase",{"2":{"108":1}}],["firestore",{"2":{"36":1}}],["firebase",{"2":{"3":2,"9":2,"20":4,"108":1}}],["fira",{"2":{"20":1}}],["first",{"2":{"2":2,"18":1,"20":1,"25":2,"36":2,"37":4,"60":1,"97":1,"118":1}}],["fight",{"2":{"2":1}}],["follows",{"2":{"74":1}}],["follow",{"2":{"36":1}}],["following",{"2":{"28":1,"83":1,"105":1}}],["folder",{"2":{"8":1,"16":6}}],["found",{"2":{"25":1}}],["four",{"2":{"2":1,"72":1}}],["font",{"2":{"120":1}}],["fonts",{"2":{"118":1}}],["fontweight",{"2":{"20":1}}],["fontligatures",{"2":{"20":1}}],["fontfamily",{"2":{"20":1}}],["fontaliasing",{"2":{"20":1}}],["footers",{"0":{"83":1},"1":{"84":1,"85":1,"86":1,"87":1,"88":1},"2":{"83":1}}],["footer",{"2":{"10":1,"64":2,"71":2,"105":1,"108":1,"109":1}}],["fork",{"2":{"58":1}}],["forgotten",{"2":{"32":1}}],["forget",{"2":{"24":1}}],["foreign",{"2":{"25":1,"35":1}}],["forbidden",{"2":{"2":1}}],["forces",{"2":{"8":1}}],["force",{"2":{"2":1}}],["forms",{"2":{"37":1,"108":1}}],["formulate",{"2":{"20":10}}],["formkit",{"2":{"20":10}}],["formatters",{"2":{"24":2}}],["formatter",{"2":{"20":1}}],["formatting",{"2":{"20":2,"24":1,"37":1,"67":1}}],["formatonsave",{"2":{"20":1}}],["formats",{"2":{"18":1,"20":1}}],["format",{"2":{"3":1,"5":1,"8":3,"18":2,"20":2,"37":2,"64":1}}],["form",{"2":{"2":1,"3":2,"24":1,"25":1,"58":1}}],["forming",{"2":{"1":1}}],["for",{"0":{"3":1},"2":{"2":15,"3":9,"4":2,"5":6,"6":6,"8":6,"9":3,"10":7,"12":8,"16":2,"18":4,"19":5,"20":14,"21":2,"22":1,"23":1,"24":7,"25":13,"26":3,"27":8,"28":2,"29":1,"30":3,"31":1,"32":1,"33":1,"34":1,"35":4,"36":9,"37":16,"60":1,"64":1,"66":1,"67":4,"69":2,"70":6,"71":2,"72":2,"74":1,"75":2,"76":1,"81":2,"92":1,"99":3,"102":2,"105":6,"108":5,"111":1,"115":1,"117":1,"118":3,"120":1}}],["family",{"2":{"120":1}}],["familiarize",{"2":{"70":1,"71":1}}],["facebook",{"2":{"115":1}}],["facilitate",{"2":{"67":1}}],["fact",{"2":{"24":1,"25":1}}],["factor",{"2":{"27":1}}],["facto",{"2":{"5":1,"75":1}}],["fans",{"2":{"20":1}}],["fast",{"2":{"20":1,"35":1}}],["faster",{"2":{"19":2,"20":1,"27":1,"32":1}}],["fall",{"2":{"25":1,"27":1}}],["fallback",{"2":{"18":1}}],["false",{"2":{"1":1,"8":2,"20":27,"25":1,"64":4}}],["fairly",{"2":{"10":1,"36":1}}],["faq",{"2":{"8":1,"60":1}}],["favorite",{"2":{"1":1}}],["msg",{"2":{"101":1}}],["mjs",{"2":{"20":4}}],["mysql",{"2":{"20":1,"36":1}}],["my",{"2":{"19":1,"25":1,"64":3,"65":1,"69":1,"90":2,"91":1}}],["m",{"2":{"8":2}}],["mdsvex",{"2":{"20":1}}],["md",{"2":{"8":1,"20":3}}],["mkdir",{"2":{"8":2}}],["mvp",{"2":{"26":1}}],["mvc",{"2":{"25":1,"27":1}}],["mv",{"2":{"8":1}}],["multithreaded",{"2":{"27":1}}],["multicursormodifier",{"2":{"20":1}}],["multiple",{"2":{"19":1,"24":1,"28":1,"67":1}}],["much",{"2":{"8":1,"19":1,"20":2,"24":1,"25":1,"27":2,"30":2,"35":4,"36":1,"37":3}}],["must",{"2":{"2":1,"8":2,"16":1,"37":1,"117":1}}],["mit",{"2":{"62":1}}],["mitt",{"2":{"5":1}}],["mistake",{"2":{"28":1}}],["middle",{"2":{"28":1}}],["microservices",{"2":{"28":1}}],["microservice",{"2":{"27":1}}],["microsoft",{"2":{"3":1,"9":1,"20":1,"37":1}}],["micro",{"2":{"20":1}}],["mixins",{"2":{"24":4}}],["mix",{"2":{"20":3,"27":1}}],["minutes",{"2":{"36":1,"71":1}}],["mind",{"2":{"25":1}}],["minimalistic",{"2":{"70":1}}],["minimal",{"2":{"67":1}}],["minimum",{"2":{"66":1}}],["miniserver",{"2":{"20":1}}],["mini",{"2":{"20":2}}],["miniature",{"2":{"3":1}}],["minheight",{"2":{"17":1}}],["minwidth",{"2":{"17":1}}],["might",{"2":{"12":1,"20":1,"25":1,"35":1}}],["megabytes",{"2":{"100":1}}],["mention",{"2":{"37":1}}],["mentor",{"2":{"36":2}}],["menus",{"2":{"20":1}}],["menu",{"2":{"10":1,"12":2,"90":1,"105":1}}],["mess",{"2":{"26":1}}],["message",{"2":{"5":1,"58":1,"99":1}}],["messages",{"2":{"5":2}}],["mechanisms",{"2":{"25":1}}],["means",{"2":{"24":1,"35":1,"67":1,"70":1}}],["measures",{"2":{"2":1}}],["me",{"0":{"21":1}}],["metrics",{"2":{"37":2}}],["met",{"2":{"36":1}}],["methods",{"2":{"4":1,"24":1,"25":1,"36":1}}],["method",{"2":{"2":1,"19":1,"37":2,"64":2,"66":1,"75":1}}],["metaframwork",{"2":{"70":1}}],["metadata",{"2":{"20":1}}],["meta",{"2":{"1":1,"12":1,"17":1,"18":2,"64":1,"69":1,"75":1,"76":1,"105":1,"115":15}}],["moves",{"2":{"109":1}}],["moving",{"2":{"31":1}}],["mobile",{"2":{"37":1,"72":4,"81":1,"109":1,"111":1}}],["morgan",{"2":{"36":1}}],["more",{"2":{"2":1,"4":1,"5":2,"8":1,"10":1,"12":2,"16":1,"19":1,"20":4,"24":4,"25":3,"26":1,"27":6,"28":1,"35":1,"36":3,"37":4,"90":1,"117":1}}],["motivation",{"2":{"36":1}}],["moments",{"2":{"26":1,"36":1}}],["moment",{"2":{"21":1,"24":2,"37":1,"112":1}}],["mouse",{"2":{"20":1}}],["mocha",{"2":{"20":10}}],["monitor",{"2":{"20":2,"27":1}}],["monitoring",{"2":{"2":1}}],["money",{"2":{"20":1}}],["monospace",{"2":{"20":1}}],["mono",{"2":{"20":1}}],["modal",{"2":{"67":1}}],["modifiers",{"2":{"25":1}}],["mod",{"2":{"20":1}}],["modes",{"2":{"109":2,"111":2}}],["models",{"2":{"32":1}}],["model",{"2":{"25":3,"27":2,"35":1}}],["mode",{"2":{"20":3,"25":2,"26":1,"72":1,"117":1}}],["modern",{"0":{"33":1},"2":{"9":1,"18":1,"19":1,"20":1,"24":1,"36":1,"67":1,"71":1}}],["modular",{"2":{"10":1}}],["modules",{"2":{"10":1,"18":6,"19":1,"20":2,"25":2,"28":1,"31":1}}],["module",{"0":{"73":1},"1":{"74":1,"75":1},"2":{"1":2,"10":7,"20":1,"25":2,"27":1,"28":1,"69":2,"71":2,"75":1,"105":2,"108":1}}],["mostly",{"2":{"5":1,"70":1}}],["most",{"2":{"2":1,"3":2,"8":1,"10":2,"19":2,"20":1,"26":1,"27":2,"28":1,"36":2,"37":2,"60":1}}],["max",{"2":{"111":1,"120":1}}],["maximum",{"2":{"111":1}}],["margin",{"2":{"79":1}}],["markdownlint",{"2":{"20":2}}],["markdown",{"0":{"57":1},"2":{"20":1,"57":1}}],["magnitude",{"2":{"37":1}}],["magic",{"2":{"24":1}}],["mat",{"2":{"37":1}}],["matter",{"2":{"36":1}}],["match",{"2":{"8":1,"117":1}}],["machine",{"2":{"20":1}}],["macos",{"2":{"20":1}}],["made",{"2":{"20":1,"25":1,"27":1,"37":1,"70":1,"71":1}}],["mailmap",{"2":{"20":1}}],["mainly",{"2":{"25":1,"27":1}}],["mainlayout",{"0":{"109":1},"1":{"110":1},"2":{"12":2,"64":2,"111":1}}],["maintainability",{"2":{"35":1}}],["maintainers",{"2":{"20":1}}],["maintenanceview",{"2":{"12":1}}],["maintenance",{"2":{"12":2}}],["main",{"2":{"1":1,"2":1,"6":1,"8":6,"10":1,"20":1,"25":2,"26":2,"28":1,"34":1,"36":1,"60":1,"79":1,"101":1,"110":1}}],["may",{"2":{"19":1,"25":1,"27":1,"29":2,"36":1,"37":1,"60":1,"70":1}}],["makarov",{"2":{"61":2}}],["making",{"2":{"19":1,"37":1,"58":1}}],["makes",{"2":{"5":1,"8":1,"25":2,"27":2,"90":1}}],["make",{"2":{"1":1,"2":2,"3":2,"10":1,"12":2,"24":2,"25":1,"27":1,"28":1,"29":1,"30":3,"36":1,"37":1,"64":1,"69":1,"118":1}}],["map",{"2":{"18":2,"20":7}}],["mastery",{"2":{"36":1}}],["master",{"2":{"8":3,"20":1}}],["masked",{"2":{"17":1}}],["mask",{"2":{"4":2}}],["major",{"2":{"3":1}}],["mantinelayeredheader",{"0":{"96":1}}],["mantine",{"2":{"95":1,"96":1}}],["mantinerichfooter",{"0":{"87":1},"2":{"64":2}}],["mantinesimplefooter",{"0":{"86":1}}],["mantinesimpleheader",{"0":{"95":1},"2":{"64":2}}],["mantinesimplenavbar",{"0":{"114":1},"2":{"64":2}}],["manifest",{"0":{"117":1},"2":{"37":3,"64":1,"69":1,"105":1,"116":1,"117":2}}],["manipulating",{"2":{"2":1}}],["managing",{"2":{"25":2}}],["manageable",{"2":{"118":1}}],["managed",{"2":{"37":1}}],["manage",{"2":{"27":1}}],["management",{"0":{"25":1},"2":{"25":3}}],["manager",{"2":{"2":3,"8":1}}],["manual",{"2":{"20":1,"36":1}}],["manually",{"2":{"8":1,"20":1,"64":1}}],["many",{"2":{"2":1,"3":1,"9":1,"16":1,"18":1,"20":2,"27":1,"28":1,"36":1,"37":1,"70":1}}],["l",{"2":{"101":2}}],["luxury",{"2":{"37":1}}],["lumps",{"2":{"27":1}}],["lt",{"2":{"20":1}}],["ll",{"2":{"19":1,"36":1}}],["left",{"2":{"109":1}}],["least",{"2":{"20":1,"25":1,"28":1,"34":1,"36":2}}],["learning",{"0":{"36":1},"2":{"35":1,"36":3,"70":1}}],["learn",{"2":{"8":1,"28":1,"32":1,"36":1,"40":1,"42":1,"71":1}}],["lerna",{"2":{"20":2}}],["leex",{"2":{"20":1}}],["less",{"2":{"20":1,"37":1}}],["length",{"2":{"18":2}}],["let",{"2":{"18":1,"28":2,"32":1}}],["leverage",{"0":{"3":1},"2":{"71":1}}],["levels",{"2":{"2":1,"27":1}}],["level",{"2":{"2":2,"11":2,"24":1,"26":1,"28":1,"34":1,"36":3,"60":1,"70":1}}],["lying",{"2":{"6":1}}],["launching",{"0":{"65":1}}],["launch",{"2":{"50":1}}],["launched",{"2":{"26":1,"37":1}}],["lazy",{"2":{"37":1}}],["labor",{"2":{"37":2}}],["laptop",{"2":{"20":1}}],["later",{"2":{"29":1,"37":1,"67":1}}],["latexmk",{"2":{"20":1}}],["latest",{"2":{"8":2}}],["lang=",{"2":{"17":1,"72":1,"76":1,"101":1}}],["languages",{"2":{"11":1,"27":1,"28":2}}],["language",{"0":{"33":1},"2":{"3":2,"4":1,"5":1,"20":1,"24":2,"25":1,"36":1,"99":2}}],["layout",{"2":{"12":2,"32":1,"35":3,"64":2,"67":1,"69":1,"71":1,"105":2,"108":1,"109":1,"111":3,"120":1}}],["layouts",{"2":{"10":1,"12":2,"71":1}}],["layered",{"2":{"96":1}}],["layer",{"2":{"1":1,"35":1,"37":1,"64":1,"74":1,"105":1}}],["lastindexof",{"2":{"18":2}}],["last",{"2":{"8":1,"20":1}}],["lamda",{"2":{"3":1}}],["lambda",{"2":{"3":1}}],["large",{"2":{"3":1,"8":1,"24":2,"26":2,"27":4,"79":1,"99":1}}],["lof",{"2":{"20":1}}],["lock",{"2":{"20":13}}],["located",{"2":{"35":1,"78":2,"101":1,"111":1,"112":1,"119":1}}],["location",{"2":{"8":1}}],["locally",{"2":{"37":1}}],["locale",{"2":{"24":1,"101":3}}],["locales",{"2":{"24":1,"67":1,"99":1,"101":4}}],["localizing",{"2":{"24":1,"99":1}}],["localization",{"2":{"24":2,"99":2}}],["local",{"2":{"20":1,"25":2,"28":1}}],["localstoragename",{"2":{"8":3}}],["localstorage",{"2":{"2":2,"8":3,"120":1}}],["lot",{"2":{"19":1,"20":3,"24":1,"27":2,"36":2,"37":1,"99":1}}],["lose",{"2":{"25":1,"37":1}}],["loss",{"2":{"18":1}}],["losing",{"2":{"2":1}}],["loose",{"2":{"10":1}}],["loosely",{"2":{"10":1}}],["looks",{"2":{"25":1,"37":2}}],["look",{"2":{"1":1,"5":1,"18":1,"20":1,"21":1,"25":1,"36":1,"74":1}}],["loaded",{"2":{"37":1,"119":1}}],["loaderset",{"2":{"14":4}}],["loaderbar",{"2":{"13":1}}],["loader",{"2":{"13":1}}],["loadicons",{"2":{"18":2}}],["loading",{"2":{"1":2,"8":1,"12":1,"13":2,"14":2,"16":1}}],["load",{"2":{"3":1,"37":2}}],["lower",{"2":{"27":1}}],["low",{"2":{"2":1,"70":1}}],["longer",{"2":{"2":1,"20":1,"24":1,"25":1,"29":1}}],["log",{"2":{"8":1,"20":1,"24":1}}],["logically",{"2":{"31":1}}],["logical",{"2":{"10":1,"24":1,"25":1,"37":1}}],["logic",{"2":{"3":3,"25":11,"27":4,"35":2,"74":1}}],["login",{"2":{"2":6,"25":1,"26":1,"108":1}}],["logs",{"2":{"2":2,"8":1,"20":1}}],["logged",{"2":{"2":1,"25":1}}],["logout",{"2":{"1":1,"25":1}}],["light",{"2":{"120":1}}],["lightweight",{"2":{"67":1}}],["lighthouserc",{"2":{"20":20}}],["little",{"2":{"37":3}}],["lives",{"2":{"27":1}}],["lived",{"2":{"2":2}}],["license",{"2":{"20":1,"62":1}}],["limitations",{"2":{"35":1}}],["limit",{"2":{"20":3}}],["lib",{"2":{"20":1}}],["libraries",{"0":{"30":1,"35":1},"2":{"18":1,"19":1,"21":1,"22":1,"32":1,"35":9,"67":1,"70":2,"71":1,"107":1,"118":1}}],["library",{"0":{"21":1},"2":{"1":1,"10":1,"24":1,"25":6,"27":1,"28":1,"29":2,"30":2,"35":2,"67":2,"99":1}}],["lifehack",{"2":{"25":1}}],["life",{"2":{"8":1}}],["lifetime",{"2":{"2":4}}],["linux",{"2":{"20":1}}],["linting",{"2":{"26":1,"67":1}}],["linter",{"2":{"20":1}}],["lintstagedrc",{"2":{"20":2}}],["lint",{"2":{"20":4}}],["linenumbers",{"2":{"20":1}}],["lines",{"2":{"4":1,"29":1,"37":1,"100":1}}],["line",{"2":{"4":1,"19":1,"20":1,"36":1}}],["links",{"2":{"19":1}}],["link",{"0":{"0":1},"1":{"1":1},"2":{"91":1}}],["lists",{"2":{"99":1}}],["listeners",{"2":{"27":1}}],["list",{"2":{"4":2,"19":1,"20":1}}],["lies",{"2":{"3":1}}],["likely",{"2":{"25":1}}],["likelihood",{"2":{"10":1}}],["like",{"2":{"1":1,"4":1,"9":1,"11":1,"16":1,"19":2,"24":2,"25":5,"28":1,"35":5,"36":2,"37":5,"64":1,"70":1,"91":1,"118":1}}],["c2c2c4",{"2":{"120":1}}],["czrc",{"2":{"20":2}}],["cz",{"2":{"20":2}}],["cypress",{"2":{"20":10,"26":1}}],["cmakepresets",{"2":{"20":1}}],["cmake",{"2":{"20":3}}],["cmakelists",{"2":{"20":1}}],["cxx",{"2":{"20":1}}],["cjs",{"2":{"20":4}}],["cc",{"2":{"20":1}}],["c",{"2":{"20":1,"64":1,"120":9}}],["csproj",{"2":{"20":1}}],["cspell",{"2":{"20":2}}],["cshtml",{"2":{"20":2}}],["cs",{"2":{"20":12}}],["csshtml",{"2":{"79":1}}],["css3",{"0":{"32":1},"2":{"32":1,"33":1,"35":1,"67":1}}],["cssnano",{"2":{"20":10}}],["cssnanorc",{"2":{"20":10}}],["css",{"0":{"35":1,"55":1,"79":1},"2":{"9":1,"20":5,"21":1,"27":1,"32":1,"35":9,"36":1,"37":1,"67":1,"71":1,"72":2,"108":1,"111":1,"118":1,"119":1,"120":4}}],["ctrlcmd",{"2":{"20":1}}],["cpu",{"2":{"102":1}}],["cpp",{"2":{"20":1}}],["cp",{"2":{"8":1}}],["curve",{"2":{"35":1}}],["cursorstyle",{"2":{"20":1}}],["cursorsmoothcaretanimation",{"2":{"20":1}}],["cursorblinking",{"2":{"20":1}}],["currently",{"2":{"80":1,"83":1,"105":1}}],["currentcolor",{"2":{"17":2}}],["current",{"2":{"8":1,"24":1,"64":1}}],["customize",{"2":{"120":1}}],["customization",{"2":{"19":1,"20":3,"67":2,"69":1,"71":1,"108":1,"116":1}}],["customer",{"2":{"28":1,"32":1,"37":1}}],["custom",{"2":{"3":1,"9":1,"19":1,"20":2,"24":3,"28":1,"35":2,"91":2,"120":1}}],["cd",{"0":{"6":1},"2":{"6":5,"8":4,"26":1,"36":1,"45":1,"65":1,"66":1,"108":1}}],["citation",{"2":{"20":1}}],["circleci",{"2":{"20":2}}],["ci",{"0":{"6":1},"2":{"6":5,"8":1,"26":1,"36":1,"45":1,"108":1}}],["clone",{"2":{"66":1}}],["close",{"2":{"37":2}}],["closeonfiledelete",{"2":{"20":1}}],["cloud",{"2":{"3":4,"6":1,"9":2,"36":1}}],["clicked",{"2":{"111":1}}],["clicks",{"2":{"109":1}}],["click",{"2":{"90":1}}],["clicking",{"2":{"81":1}}],["click=",{"2":{"76":1,"101":1}}],["clippy",{"2":{"20":2}}],["clipboard",{"2":{"20":4}}],["cli",{"2":{"19":1,"20":2}}],["clients",{"2":{"4":1}}],["client",{"2":{"4":9,"5":2,"20":2,"37":2,"74":2,"118":2}}],["clamps",{"2":{"27":1}}],["clangd",{"2":{"20":1}}],["clang",{"2":{"20":2}}],["classes",{"2":{"25":2,"28":1,"56":1,"71":1,"72":2}}],["classpath",{"2":{"20":1}}],["class",{"2":{"16":1,"20":1,"25":1,"28":1,"35":1,"119":1}}],["class=",{"2":{"13":3,"17":1,"72":4,"76":2}}],["clarity",{"2":{"5":1}}],["clear",{"2":{"12":1,"35":1,"70":1,"118":1}}],["cleared",{"2":{"2":1}}],["clean",{"2":{"8":1,"67":1,"100":1}}],["certified",{"2":{"61":2}}],["certification",{"2":{"36":2}}],["certifications",{"2":{"36":1}}],["certificate",{"2":{"9":3}}],["certificates",{"2":{"9":1}}],["certbot",{"2":{"9":1}}],["certain",{"2":{"2":2,"3":1,"24":1,"25":1,"28":1,"37":1,"67":1,"70":2,"71":1}}],["center",{"2":{"2":1}}],["crm",{"2":{"71":1}}],["crawler",{"2":{"37":1}}],["crowdin",{"2":{"20":2}}],["cross",{"2":{"4":2,"20":1}}],["credits",{"2":{"20":1}}],["credo",{"2":{"20":1}}],["creator",{"2":{"27":1}}],["creation",{"2":{"20":1,"26":1}}],["creating",{"0":{"104":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"4":1,"12":1,"19":1,"20":1,"27":1,"37":1,"67":1,"70":2,"71":1}}],["create",{"0":{"19":1,"64":1},"1":{"65":1},"2":{"12":1,"16":1,"19":2,"25":1,"28":1,"35":1,"58":1,"62":1,"64":5,"69":1,"70":4,"71":2,"90":1,"120":1}}],["created",{"2":{"8":1,"37":2,"60":1,"118":1}}],["creates",{"2":{"2":1,"24":1,"74":1}}],["crud",{"2":{"3":1}}],["critical",{"2":{"2":1}}],["cryptography",{"2":{"2":1}}],["cheat",{"0":{"51":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"52":1,"53":1,"54":1,"55":4}}],["checkout",{"2":{"8":4}}],["check",{"2":{"2":1,"8":1,"20":1,"26":1,"36":2,"37":1,"108":1}}],["checks",{"2":{"2":2,"20":1}}],["checking",{"2":{"2":1,"25":3}}],["chat",{"2":{"60":1}}],["chaff",{"2":{"36":1}}],["changing",{"2":{"27":1,"28":1,"71":1,"74":1,"99":1,"110":1}}],["changelocale",{"2":{"101":2}}],["changelog",{"0":{"38":1},"1":{"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"20":1}}],["changed",{"0":{"40":1,"42":1,"45":1,"48":1},"2":{"16":1,"27":1}}],["changes",{"2":{"6":1,"20":2,"24":2,"25":1,"27":3,"58":1}}],["change",{"2":{"1":1,"2":1,"24":3,"25":1,"27":3,"28":1,"35":1,"67":1,"108":1,"118":1}}],["chromium",{"2":{"24":1}}],["chrome",{"2":{"24":2,"37":1}}],["choosing",{"2":{"36":1}}],["choose",{"2":{"20":1,"71":1,"80":1,"112":1}}],["choice",{"2":{"8":2,"20":1,"69":1,"74":1}}],["children",{"2":{"12":2}}],["chgrp",{"2":{"8":2}}],["came",{"2":{"37":2}}],["calc",{"2":{"79":1}}],["calculations",{"2":{"27":1}}],["call",{"2":{"74":1}}],["calling",{"2":{"25":1}}],["called",{"2":{"3":1,"25":4,"90":1}}],["calls",{"2":{"1":1,"24":1,"74":2,"75":1,"99":1}}],["categories",{"2":{"28":1,"117":1}}],["category",{"2":{"25":1}}],["catch",{"2":{"24":1}}],["catalog",{"2":{"10":1}}],["caches",{"2":{"118":1}}],["cached",{"2":{"37":1}}],["cache",{"2":{"20":1,"108":1,"118":2}}],["caching",{"2":{"8":1,"25":1,"37":1,"118":2}}],["card",{"2":{"70":1,"115":1}}],["car",{"2":{"36":1}}],["carousel",{"0":{"23":1},"2":{"23":1}}],["cargo",{"2":{"20":2}}],["careful",{"2":{"26":1}}],["care",{"2":{"18":1,"27":1}}],["capabilities",{"2":{"19":1,"21":1,"24":1}}],["capture",{"2":{"2":1,"20":95}}],["cause",{"2":{"5":1}}],["cases",{"0":{"11":1},"2":{"2":1,"10":1,"12":2,"21":1,"24":1,"25":2,"37":2,"111":1}}],["case",{"2":{"2":4,"3":1,"8":2,"9":1,"10":1,"19":1,"24":1,"25":1,"26":1,"27":2,"34":1,"36":1,"64":1}}],["cannot",{"2":{"71":1}}],["can",{"2":{"1":1,"2":3,"3":4,"4":3,"5":2,"8":1,"9":3,"10":2,"11":2,"12":5,"16":4,"19":1,"20":4,"24":2,"25":10,"26":1,"27":8,"28":3,"35":3,"36":8,"37":8,"58":1,"64":1,"70":1,"72":2,"74":1,"81":1,"91":1,"97":1,"99":1,"111":1,"118":1,"119":1}}],["covers",{"2":{"60":1}}],["coincides",{"2":{"37":1}}],["cost",{"2":{"37":1}}],["copy",{"2":{"29":1}}],["copying",{"2":{"19":1,"20":1}}],["cop",{"2":{"27":1}}],["coolcosmos",{"2":{"25":1}}],["cooler",{"2":{"20":1}}],["cookie",{"2":{"2":4}}],["collect",{"2":{"71":1}}],["collects",{"2":{"19":1}}],["colleagues",{"2":{"36":1}}],["column",{"2":{"35":1,"72":1}}],["columnar",{"2":{"32":1}}],["colortheme",{"2":{"20":1}}],["color",{"2":{"17":3,"108":1}}],["could",{"2":{"20":1,"70":1}}],["couple",{"2":{"20":1,"24":1,"32":1,"99":1}}],["coupled",{"2":{"11":1}}],["coupling",{"2":{"10":1,"12":1}}],["counterpart",{"2":{"37":1}}],["counterparties",{"2":{"27":1}}],["count`",{"2":{"8":1}}],["count=5",{"2":{"8":1}}],["courses",{"2":{"36":2}}],["course",{"2":{"5":1,"28":1,"36":1,"37":1}}],["corporation",{"2":{"117":1}}],["corrections",{"2":{"58":1}}],["corresponding",{"2":{"8":1,"24":1,"67":1}}],["corridor",{"2":{"37":1}}],["cors",{"0":{"4":1},"2":{"4":8,"42":1}}],["combination",{"2":{"71":1}}],["combustion",{"2":{"36":1}}],["comfort",{"2":{"37":1}}],["comfortable",{"2":{"20":2,"25":1}}],["comfortably",{"2":{"10":1}}],["come",{"2":{"37":1,"60":1}}],["comes",{"2":{"28":1}}],["coming",{"2":{"28":1}}],["com",{"2":{"3":1,"4":9,"8":10,"9":5,"20":2,"61":1,"66":1,"74":1,"91":1,"92":1}}],["command",{"2":{"19":1,"64":1}}],["commands",{"2":{"8":1,"20":1}}],["communicate",{"2":{"12":1,"75":1}}],["communications",{"2":{"5":1}}],["communication",{"2":{"1":2,"5":2,"105":1}}],["commenting",{"2":{"59":1}}],["comments",{"2":{"2":1,"67":1}}],["commercial",{"2":{"8":1,"36":1}}],["commitlint",{"2":{"20":4}}],["commit",{"2":{"6":1}}],["common",{"2":{"2":2,"24":1,"27":1}}],["complicated",{"2":{"37":1}}],["completely",{"2":{"36":1}}],["completion",{"2":{"20":1}}],["complex",{"2":{"2":1,"5":1,"25":1,"27":1,"35":1,"37":1}}],["complexity",{"2":{"1":1,"27":2,"60":1}}],["competent",{"2":{"36":1,"59":1}}],["computations",{"2":{"28":1}}],["computer",{"2":{"19":1,"20":1,"37":1}}],["computed",{"2":{"14":2,"17":3}}],["compile",{"2":{"20":1}}],["compileroptions",{"2":{"19":1}}],["companies",{"2":{"36":1}}],["company",{"2":{"2":1}}],["comparable",{"2":{"26":1}}],["compare",{"2":{"20":6}}],["compression",{"2":{"18":1}}],["compound",{"2":{"99":1}}],["composition",{"2":{"24":3,"25":1,"36":1,"45":1,"67":1}}],["composite",{"2":{"10":1,"25":1}}],["compose",{"2":{"20":1}}],["composer",{"2":{"20":2}}],["composable",{"2":{"12":1,"24":1,"25":14,"27":2,"28":2,"67":1,"72":2,"82":1,"99":1}}],["composables",{"2":{"1":1,"10":1,"13":1,"15":1,"25":2,"72":1,"76":1,"101":2}}],["components",{"0":{"30":1},"2":{"1":1,"10":2,"11":3,"12":3,"19":1,"20":1,"21":1,"25":4,"27":4,"28":2,"30":3,"31":1,"35":5,"64":1,"66":1,"71":1,"76":1,"108":2,"120":1}}],["component",{"0":{"15":1},"2":{"1":1,"11":2,"12":4,"16":1,"18":1,"20":7,"24":1,"25":18,"27":2,"35":3,"71":1,"76":2,"82":1,"101":1,"106":2,"120":1}}],["connoisseurs",{"2":{"20":1}}],["connected",{"2":{"10":1,"16":1}}],["connect",{"2":{"9":1,"10":1,"16":1,"25":1,"71":1}}],["connection",{"2":{"5":1,"20":2,"101":1}}],["conduct",{"2":{"20":1}}],["conditions",{"2":{"16":1}}],["confusing",{"2":{"25":1}}],["conflict",{"2":{"20":1}}],["conf",{"2":{"20":1}}],["confirmsync",{"2":{"20":1}}],["confirmdraganddrop",{"2":{"20":1}}],["confirmdelete",{"2":{"20":1}}],["configs",{"2":{"20":1}}],["config",{"0":{"91":1},"2":{"19":3,"20":226,"64":4,"67":1,"78":1,"91":1,"92":1}}],["configuring",{"0":{"20":1}}],["configure",{"2":{"19":2}}],["configured",{"2":{"4":1,"8":1}}],["configurations",{"2":{"20":1,"37":1}}],["configuration",{"2":{"8":1,"11":2,"20":1,"64":1,"72":1,"78":1,"105":1}}],["consume",{"2":{"102":1}}],["consultant",{"2":{"61":1}}],["cons",{"2":{"25":2,"35":2}}],["consists",{"2":{"76":1}}],["consist",{"2":{"25":1}}],["consistency",{"2":{"25":1}}],["considers",{"2":{"25":1}}],["consider",{"2":{"12":1,"28":1,"37":1}}],["considerations",{"0":{"12":1},"1":{"13":1,"14":1,"15":1}}],["console",{"2":{"8":1,"24":3}}],["constraints",{"2":{"25":1}}],["construct",{"2":{"25":1}}],["constant",{"2":{"2":1}}],["constantly",{"2":{"2":1}}],["const",{"2":{"1":3,"12":2,"13":1,"14":3,"15":1,"17":3,"18":5,"24":1,"25":1,"72":1,"74":2,"75":2,"76":1,"101":2}}],["contacts",{"2":{"58":1}}],["container",{"2":{"33":1,"72":2}}],["contain",{"2":{"4":1,"8":1,"35":1,"97":1}}],["contains",{"2":{"4":2,"25":1}}],["continue",{"2":{"32":1,"67":1}}],["continuous",{"2":{"6":2}}],["controversial",{"2":{"70":1}}],["controlled",{"2":{"82":1,"119":1,"120":1}}],["controller",{"2":{"20":1,"25":3,"27":2}}],["controls",{"2":{"24":1,"27":1}}],["control",{"2":{"2":1,"4":4,"27":1,"56":1}}],["contributions",{"2":{"62":1}}],["contributing",{"2":{"20":1}}],["contribute",{"0":{"58":1}}],["contributors",{"2":{"20":1}}],["content=",{"2":{"115":11}}],["content",{"2":{"37":5,"64":1,"69":1,"71":1,"75":1,"110":1}}],["contentlayer",{"2":{"20":10}}],["contents",{"2":{"8":1}}],["concepts",{"2":{"28":1}}],["concept",{"2":{"2":1,"27":1,"28":1}}],["convenience",{"2":{"1":1,"2":1,"59":2}}],["conveniently",{"2":{"70":1}}],["convenient",{"2":{"1":1,"5":2,"8":1,"9":1,"10":1,"12":1,"20":2,"24":1,"25":2,"35":3,"36":1,"69":1,"75":1}}],["codesandbox",{"2":{"20":1}}],["coder",{"2":{"20":1}}],["codeowners",{"2":{"20":1}}],["codecov",{"2":{"20":10}}],["codelens",{"2":{"20":4}}],["codeaction",{"2":{"20":1}}],["codeactions",{"2":{"20":1}}],["codeactionsonsave",{"2":{"20":2}}],["codeium",{"2":{"20":1}}],["code",{"0":{"78":1},"2":{"1":4,"3":2,"4":1,"5":1,"6":2,"8":2,"10":1,"20":11,"24":1,"25":1,"27":5,"28":1,"29":1,"31":3,"35":3,"36":4,"37":2,"59":1,"64":1,"67":1,"69":1,"70":1,"71":2,"72":1,"74":2,"75":1,"78":2,"90":1,"92":1,"101":4,"102":2,"105":1,"119":1}}],["ignite",{"2":{"119":1}}],["ignoredlocales",{"2":{"20":1}}],["ignore",{"2":{"20":2,"64":1}}],["ignoretrimwhitespace",{"2":{"20":1}}],["ignorerecommendations",{"2":{"20":1}}],["io",{"2":{"90":1}}],["illustration",{"2":{"67":1}}],["illogical",{"2":{"25":1}}],["irretrievably",{"2":{"21":1,"24":1}}],["ie6",{"2":{"35":1}}],["iex",{"2":{"20":1}}],["ie11",{"2":{"18":1}}],["ie",{"2":{"18":1}}],["iconify",{"2":{"18":1,"20":2}}],["icon",{"2":{"16":2,"17":1,"18":1,"37":1,"76":2,"81":1,"106":1,"109":1,"111":1}}],["icons",{"0":{"18":1},"2":{"16":3,"17":2,"18":2,"19":1,"117":1}}],["i18next",{"0":{"99":1,"102":1},"2":{"24":1,"99":1,"100":1,"102":3,"103":1}}],["i18n",{"0":{"98":1},"1":{"99":1,"100":1,"101":1,"102":1,"103":1},"2":{"11":1,"20":3,"24":3,"67":1,"69":1,"71":1,"99":2,"101":1,"102":1,"107":2}}],["imagine",{"2":{"25":1}}],["imageresources",{"2":{"18":3}}],["imageraw",{"2":{"16":1}}],["imagenameinvariable",{"2":{"16":1}}],["image",{"2":{"16":4,"115":4}}],["imageurl",{"2":{"16":1}}],["images",{"2":{"8":1,"16":10,"18":3,"37":2,"76":1,"115":1,"118":1}}],["imgurl",{"2":{"16":2}}],["img",{"2":{"16":6,"17":1}}],["immediately",{"2":{"16":1,"37":2}}],["impression",{"2":{"59":1}}],["improve",{"2":{"36":1,"37":1,"105":1,"118":1}}],["improvement",{"2":{"24":1}}],["improving",{"2":{"31":1}}],["implies",{"2":{"37":1}}],["implemented",{"2":{"72":1,"74":1,"82":1}}],["implements",{"2":{"67":1,"75":1,"120":1}}],["implement",{"2":{"12":1}}],["implementations",{"2":{"24":1}}],["implementation",{"0":{"77":1},"1":{"78":1,"79":1},"2":{"5":1,"24":2,"29":1,"34":1,"100":1,"102":1,"118":1}}],["impose",{"2":{"70":1}}],["impossible",{"2":{"25":1,"36":1}}],["important",{"2":{"26":1,"34":1}}],["importing",{"2":{"16":1}}],["imported",{"2":{"16":1}}],["import",{"2":{"1":7,"13":1,"14":1,"16":4,"17":4,"18":7,"19":3,"20":2,"25":2,"72":1,"74":1,"75":5,"76":3,"101":1}}],["id=g",{"2":{"92":1}}],["idx",{"2":{"20":1}}],["identifiers",{"2":{"76":1}}],["identifying",{"2":{"37":1}}],["ideally",{"2":{"25":1}}],["idea",{"2":{"25":1,"37":1}}],["ide",{"0":{"20":1},"2":{"20":1,"59":1}}],["id",{"2":{"8":2,"15":1,"92":1}}],["i",{"2":{"5":1,"11":1,"16":1,"19":1,"20":2,"25":4,"26":1,"27":1,"28":2,"36":5,"65":1,"66":1}}],["ip",{"2":{"2":1}}],["iphones",{"2":{"2":1}}],["if=",{"2":{"17":1}}],["if",{"2":{"2":5,"3":1,"4":5,"8":5,"9":1,"10":1,"12":1,"16":2,"18":1,"19":3,"20":1,"24":1,"25":5,"29":2,"30":1,"35":2,"36":4,"37":3,"67":1,"71":1,"90":1,"91":2,"102":1,"111":1}}],["inefficient",{"2":{"37":1}}],["inexpensive",{"2":{"9":1}}],["ingredient",{"2":{"26":1}}],["innovation",{"2":{"25":1}}],["inner",{"2":{"12":1}}],["involved",{"2":{"70":1}}],["invented",{"2":{"27":1,"37":1}}],["invents",{"2":{"25":1}}],["invisiblecharacters",{"2":{"20":1}}],["inheritance",{"2":{"24":1,"28":2}}],["inplace",{"2":{"20":1}}],["input",{"2":{"20":1,"27":1}}],["inputs",{"2":{"8":5}}],["inlinesuggest",{"2":{"20":1}}],["insertfinalnewline",{"2":{"20":1}}],["inside",{"2":{"11":1,"20":1,"24":2,"25":1,"105":1,"112":1}}],["instances",{"2":{"25":1}}],["installation",{"0":{"64":1,"66":1},"1":{"65":1},"2":{"37":1,"64":1}}],["installed",{"2":{"8":1,"37":1,"64":1,"66":1}}],["install",{"2":{"3":2,"8":11,"9":1,"20":1,"36":1,"64":1,"117":1}}],["instructions",{"2":{"8":1}}],["instead",{"2":{"4":1,"19":1,"24":1,"25":1,"37":1,"75":2,"119":1}}],["injection",{"2":{"78":2}}],["injections",{"0":{"78":1},"2":{"78":2}}],["injecting",{"2":{"12":1}}],["injected",{"2":{"71":1}}],["inject",{"2":{"10":1,"11":3,"12":2,"25":2}}],["inc",{"2":{"117":1}}],["include",{"2":{"67":1,"108":1}}],["includes",{"2":{"59":1,"67":1}}],["including",{"2":{"19":1,"20":1,"24":1,"35":1,"71":1,"108":1}}],["increasing",{"2":{"28":1}}],["increase",{"2":{"28":1,"60":1}}],["increased",{"2":{"16":1}}],["increases",{"2":{"10":1,"16":1,"29":1,"37":1}}],["inch",{"2":{"20":1}}],["inconvenient",{"2":{"16":1}}],["incoming",{"2":{"5":1}}],["indirect",{"2":{"25":1}}],["individually",{"2":{"2":1}}],["ind",{"2":{"20":1}}],["indent",{"2":{"20":1}}],["independent",{"2":{"25":1,"61":1}}],["independently",{"2":{"10":1}}],["independence",{"2":{"10":1}}],["indexed",{"2":{"37":1}}],["indexing",{"2":{"37":1}}],["index",{"0":{"78":1},"2":{"8":2,"37":3,"78":1,"92":1,"115":1,"119":1}}],["info",{"2":{"4":3}}],["informational",{"2":{"8":1}}],["information",{"2":{"2":2,"8":1,"11":1,"19":1,"36":1,"60":3,"117":1}}],["initi18n",{"2":{"101":2}}],["initialized",{"2":{"76":1}}],["initialization",{"2":{"75":1,"92":1,"101":1}}],["initializing",{"0":{"65":1}}],["initial",{"2":{"50":1}}],["initially",{"2":{"10":1}}],["initiating",{"2":{"4":1}}],["init",{"2":{"1":1,"8":2,"75":1}}],["introduction",{"0":{"60":1},"1":{"61":1}}],["introduce",{"2":{"29":1}}],["introduced",{"2":{"24":2,"25":1,"27":2}}],["intl",{"2":{"21":1,"24":1}}],["intensive",{"2":{"37":1}}],["intended",{"2":{"36":1}}],["integrate",{"2":{"71":2}}],["integrated",{"2":{"20":5,"116":1}}],["integrating",{"2":{"67":1}}],["integration",{"2":{"6":1,"25":1,"26":1,"67":1,"105":1,"108":1}}],["interaction",{"2":{"28":1}}],["interactivity",{"2":{"27":1}}],["intermediate",{"2":{"27":1,"36":1}}],["intermediary",{"2":{"4":1}}],["intersection",{"2":{"24":1}}],["interval",{"2":{"20":1}}],["internal",{"2":{"27":1,"36":1}}],["internally",{"2":{"16":1}}],["internationalization",{"2":{"11":1,"24":3,"99":2,"107":1}}],["internet",{"2":{"3":3,"4":3,"36":3}}],["interesting",{"2":{"8":1,"25":1,"60":1}}],["interfaces",{"2":{"56":1}}],["interface",{"2":{"3":1,"26":1,"59":1}}],["interceptors",{"2":{"1":1,"74":2,"75":1}}],["into",{"2":{"1":3,"2":1,"6":1,"10":3,"11":2,"16":1,"19":1,"27":2,"35":2,"37":2,"78":1,"116":1}}],["in",{"0":{"25":1,"78":1,"91":1,"107":1},"2":{"1":3,"2":19,"3":13,"4":3,"5":2,"6":2,"8":7,"9":1,"10":4,"11":2,"12":3,"16":11,"18":4,"19":9,"20":14,"21":2,"24":18,"25":32,"26":6,"27":15,"28":5,"29":3,"35":4,"36":9,"37":22,"59":1,"60":2,"61":1,"64":3,"65":1,"67":6,"70":2,"71":1,"72":3,"74":2,"75":1,"76":1,"78":1,"79":1,"90":2,"91":1,"95":1,"96":1,"99":2,"100":1,"101":3,"102":3,"105":1,"109":3,"111":4,"117":1,"118":2,"119":2,"120":3}}],["isdraweropen",{"2":{"76":3}}],["isn",{"2":{"25":2}}],["isauthenticated",{"2":{"25":1}}],["ist",{"2":{"20":1}}],["issues",{"2":{"108":1}}],["issuenumberlabel",{"2":{"20":1}}],["issued",{"2":{"2":1}}],["is",{"2":{"1":4,"2":25,"3":11,"4":12,"5":4,"6":2,"8":6,"9":2,"10":6,"12":6,"16":4,"18":3,"19":8,"20":13,"21":2,"23":1,"24":10,"25":35,"26":5,"27":13,"28":5,"29":2,"31":1,"32":1,"34":1,"35":5,"36":15,"37":21,"58":1,"60":1,"64":1,"66":1,"67":5,"70":3,"71":1,"72":1,"74":2,"75":3,"78":1,"79":1,"81":1,"82":2,"91":1,"99":1,"100":1,"102":3,"103":2,"109":1,"110":1,"111":3,"112":2,"118":2,"119":3,"120":4}}],["itself",{"2":{"8":1,"24":2,"25":1,"26":1,"31":1,"37":1,"70":1}}],["its",{"2":{"2":3,"3":2,"4":1,"8":3,"10":1,"16":1,"19":2,"20":1,"24":1,"25":2,"27":3,"29":1,"34":1,"35":1,"36":1,"37":8,"59":1}}],["item",{"2":{"2":1}}],["it",{"2":{"1":1,"2":24,"3":7,"4":2,"5":5,"8":7,"9":2,"10":4,"11":3,"12":4,"18":1,"19":4,"20":11,"24":6,"25":19,"26":1,"27":11,"28":7,"29":5,"30":1,"32":3,"35":3,"36":11,"37":17,"64":4,"66":1,"67":2,"69":1,"70":5,"71":2,"78":1,"81":1,"99":3,"102":2,"112":1,"117":2,"119":1,"120":1}}],["twitter",{"2":{"61":1,"115":8}}],["twenty",{"2":{"36":1}}],["two",{"2":{"2":2,"10":1,"12":1,"28":1,"36":3,"37":3,"80":1,"97":1,"112":1}}],["tune",{"2":{"71":1}}],["tutorial",{"2":{"36":3}}],["turn",{"2":{"25":1}}],["turned",{"2":{"20":1}}],["turbo",{"2":{"20":2}}],["txt",{"2":{"20":1}}],["tmp",{"2":{"20":1}}],["tsup",{"2":{"20":2}}],["tslint",{"2":{"20":2}}],["tsdoc",{"2":{"20":11}}],["tsdk",{"2":{"20":1}}],["tsx",{"2":{"20":3}}],["tsconfig",{"2":{"19":2,"20":11}}],["tsc",{"2":{"19":1}}],["tsimport",{"2":{"14":1}}],["ts",{"0":{"14":1},"2":{"20":33,"25":1,"72":1,"74":1,"75":1,"76":3,"78":1,"91":1,"101":2}}],["title",{"2":{"36":1,"115":4}}],["titlebarstyle",{"2":{"20":1}}],["tied",{"2":{"32":1}}],["tips",{"2":{"28":1,"42":1}}],["tip",{"2":{"24":1,"27":1,"36":1,"75":1}}],["tidy",{"2":{"20":1}}],["tight",{"2":{"12":1}}],["tightly",{"2":{"11":1,"27":1}}],["times",{"2":{"19":2,"25":2,"37":1}}],["timestamp",{"2":{"8":1}}],["time",{"0":{"24":1},"2":{"2":2,"5":1,"8":1,"10":1,"20":1,"24":2,"25":1,"26":6,"28":1,"29":1,"31":2,"36":2,"70":1,"99":1}}],["tapping",{"2":{"81":1}}],["tablet",{"2":{"72":4,"81":1,"109":1,"111":1}}],["tabs",{"2":{"20":1}}],["tabsize",{"2":{"20":1}}],["tags",{"2":{"64":1,"69":1,"105":1,"115":4}}],["tag",{"2":{"35":1,"92":2,"119":1}}],["taking",{"2":{"27":1,"36":1}}],["taken",{"2":{"27":1}}],["takes",{"2":{"25":1}}],["take",{"2":{"5":1,"20":1,"24":1,"26":2,"37":1,"70":1,"99":1}}],["task",{"2":{"20":1,"27":1,"71":1}}],["tasks",{"2":{"20":2,"70":3}}],["tazerc",{"2":{"20":2}}],["tailwind",{"2":{"20":10,"32":1,"35":2}}],["tail",{"2":{"8":1}}],["target",{"2":{"8":15,"19":1}}],["type=",{"2":{"101":1}}],["typedoc",{"2":{"20":2}}],["types",{"2":{"19":1,"25":2,"26":1,"56":1,"80":1,"83":1,"118":1}}],["typescript",{"0":{"56":1},"2":{"5":1,"12":1,"19":3,"20":6,"25":2,"56":4,"67":1}}],["type",{"2":{"8":1,"12":1,"17":7,"25":1,"35":1,"75":1,"115":1}}],["typicode",{"2":{"3":1,"74":1}}],["t",{"2":{"3":1,"8":1,"12":1,"16":1,"19":3,"20":2,"25":2,"27":3,"28":1,"29":3,"30":1,"37":2,"67":1,"91":1,"99":2,"101":2,"102":1}}],["telegram",{"2":{"60":1}}],["tells",{"2":{"64":1}}],["tell",{"0":{"21":1}}],["team",{"2":{"37":1}}],["teams",{"2":{"27":1}}],["teaches",{"2":{"36":2}}],["teacher",{"2":{"36":1}}],["techniques",{"2":{"71":1}}],["technical",{"2":{"34":1}}],["technologies",{"2":{"19":1,"24":1,"36":1,"70":2}}],["technology",{"2":{"6":1}}],["terserrc",{"2":{"20":10}}],["terminal",{"2":{"20":5}}],["terms",{"2":{"3":1,"24":1,"35":1,"37":1}}],["tex",{"2":{"20":1}}],["textbooks",{"2":{"36":1}}],["textbook",{"2":{"36":1}}],["textlint",{"2":{"20":2}}],["text",{"2":{"11":1,"37":4,"99":1,"120":6}}],["temporarily",{"2":{"24":1}}],["temporary",{"2":{"4":1}}],["templates",{"2":{"37":1,"70":1,"108":1}}],["template>",{"2":{"12":6,"13":2,"17":2,"35":2,"76":2,"97":2,"101":2}}],["template",{"2":{"10":1,"16":1,"27":1,"35":1,"67":1,"69":2,"71":1,"97":3,"105":2}}],["testnet",{"2":{"75":1}}],["testjsonrpc",{"2":{"75":1}}],["testrest",{"2":{"74":2}}],["tests",{"2":{"25":1,"26":11,"37":1}}],["testing",{"0":{"26":1},"2":{"3":1,"6":1,"26":6,"66":1,"108":1}}],["test",{"2":{"3":1,"8":1,"20":1,"26":1,"71":1,"101":1}}],["tricks",{"0":{"79":1}}],["tries",{"2":{"20":1}}],["triggerexpansionontab",{"2":{"20":1}}],["training",{"2":{"36":2}}],["traffic",{"2":{"36":1}}],["tragedy",{"2":{"35":1}}],["tracking",{"2":{"24":1}}],["tracks",{"2":{"24":1}}],["track",{"2":{"24":3,"27":1}}],["travis",{"2":{"20":2}}],["transactions",{"2":{"99":1}}],["transmission",{"2":{"36":1}}],["transform",{"2":{"27":1}}],["transformer",{"2":{"20":1}}],["transfer",{"2":{"8":1,"20":1}}],["translation",{"2":{"11":1,"99":2}}],["translate",{"2":{"5":1}}],["transition",{"2":{"6":1}}],["transpile",{"2":{"19":1}}],["transparently",{"2":{"10":1}}],["transparent",{"2":{"2":1,"8":1,"12":1,"18":1}}],["transport",{"2":{"1":1,"5":1,"36":1,"74":3}}],["trend",{"2":{"35":1}}],["tree",{"2":{"18":1,"20":3,"25":3,"29":1}}],["trevis",{"2":{"6":1}}],["trying",{"2":{"28":1}}],["try",{"2":{"18":2,"20":1,"28":1,"32":1,"36":3}}],["trusted",{"2":{"4":2}}],["true",{"2":{"1":1,"8":1,"12":1,"18":2,"20":61,"64":4}}],["those",{"2":{"71":1}}],["thorough",{"2":{"25":1}}],["than",{"2":{"19":2,"24":1,"25":3,"27":1,"32":1,"35":1,"37":2,"103":1}}],["that",{"2":{"2":5,"3":3,"4":4,"9":1,"10":3,"11":5,"12":1,"16":1,"19":1,"20":1,"24":2,"25":20,"26":3,"27":5,"28":1,"35":3,"36":7,"37":6,"60":1,"67":4,"70":4,"71":1,"72":1,"74":1,"91":1,"99":1}}],["threshold",{"2":{"27":1,"97":2}}],["thread",{"2":{"27":1}}],["three",{"2":{"8":2,"118":1}}],["throw",{"2":{"8":1}}],["throughout",{"2":{"10":1,"25":1}}],["through",{"2":{"2":1,"11":1,"12":1,"19":1,"35":1,"36":1,"67":1}}],["thus",{"2":{"3":1}}],["think",{"2":{"25":1,"28":1}}],["thinner",{"2":{"24":1}}],["thing",{"2":{"5":1,"35":1}}],["things",{"2":{"3":1,"20":1,"24":2,"28":1,"37":1,"99":2}}],["third",{"0":{"30":1},"2":{"2":1,"4":5,"5":1,"25":1,"29":1,"37":1,"67":2,"118":1}}],["this",{"0":{"58":1},"2":{"1":1,"2":4,"3":1,"4":1,"8":4,"9":2,"10":2,"12":1,"16":2,"19":2,"20":5,"21":1,"24":3,"25":11,"26":3,"27":13,"28":4,"30":1,"31":1,"34":1,"35":2,"36":6,"37":7,"59":1,"60":1,"64":3,"66":1,"71":1,"91":1,"99":1,"118":2}}],["theoretical",{"2":{"28":1}}],["themetoggle",{"2":{"120":1}}],["themes",{"0":{"120":1},"2":{"11":1,"28":1,"69":1,"71":2,"108":2,"120":4}}],["theme",{"2":{"11":1,"106":2,"120":2}}],["themselves",{"2":{"9":1,"27":1,"70":1,"71":1,"78":1}}],["them",{"2":{"8":1,"11":4,"12":4,"16":3,"19":1,"20":2,"24":1,"25":4,"26":1,"28":1,"30":3,"31":1,"35":1,"36":1,"37":1,"67":1,"102":1}}],["these",{"2":{"3":2,"4":1,"24":1,"25":1,"26":1,"37":1}}],["theft",{"2":{"2":1}}],["they",{"2":{"2":1,"8":1,"16":4,"19":1,"24":1,"25":2,"27":2,"31":1,"35":1,"36":1,"37":1}}],["their",{"2":{"2":1,"3":3,"16":1,"19":1,"21":1,"25":1,"26":1,"27":1,"35":1,"36":1,"37":1,"71":1,"76":1}}],["therefore",{"2":{"35":1}}],["there",{"2":{"2":3,"3":4,"8":2,"10":2,"12":1,"16":1,"18":1,"20":3,"21":3,"25":6,"26":2,"27":2,"28":1,"29":1,"35":1,"36":4,"37":2,"70":2,"78":1,"80":1,"102":1,"103":1}}],["then",{"2":{"1":1,"2":2,"3":1,"8":4,"18":1,"19":1,"25":3,"37":6}}],["the",{"0":{"20":1,"34":1,"58":1,"61":1,"66":1,"78":1},"2":{"1":11,"2":67,"3":16,"4":40,"5":13,"6":2,"8":43,"9":4,"10":11,"11":3,"12":11,"16":22,"17":1,"18":5,"19":9,"20":16,"21":2,"23":1,"24":35,"25":50,"26":17,"27":41,"28":14,"29":3,"30":2,"31":2,"32":1,"34":2,"35":20,"36":28,"37":55,"58":2,"59":6,"60":9,"62":1,"64":9,"67":12,"70":7,"71":12,"72":2,"74":9,"75":6,"76":4,"78":3,"79":2,"81":1,"83":1,"90":10,"91":3,"92":1,"97":3,"99":10,"100":1,"102":2,"103":2,"105":5,"106":1,"107":1,"108":3,"109":3,"110":2,"111":7,"112":3,"116":1,"117":2,"118":5,"119":7,"120":6}}],["touch",{"2":{"82":2}}],["touchslideoutdrawer",{"0":{"82":1},"2":{"82":1}}],["touched",{"2":{"60":1}}],["toggle",{"2":{"76":1,"106":1}}],["together",{"2":{"27":1,"29":1}}],["todos",{"2":{"74":1}}],["toaster",{"2":{"67":1}}],["top",{"2":{"60":1,"105":1}}],["topics",{"2":{"60":1}}],["topic",{"2":{"26":1}}],["too",{"2":{"36":1,"37":1}}],["took",{"2":{"28":1}}],["toolchain",{"2":{"20":1}}],["tool",{"2":{"19":1,"20":3,"34":1,"70":1}}],["tools",{"2":{"6":1,"24":1,"26":1,"37":1,"70":1}}],["toml",{"2":{"20":10}}],["toc",{"2":{"20":1}}],["tokens",{"2":{"2":2,"11":1,"108":1}}],["token",{"2":{"1":1,"2":15,"59":4}}],["to",{"0":{"3":1,"5":2,"58":1,"89":2},"1":{"90":2,"91":2},"2":{"1":7,"2":33,"3":15,"4":11,"5":8,"6":1,"8":30,"9":8,"10":9,"11":4,"12":7,"15":1,"16":8,"17":1,"18":3,"19":12,"20":12,"24":6,"25":26,"26":5,"27":19,"28":17,"29":3,"30":2,"31":2,"32":5,"35":7,"36":21,"37":26,"40":1,"42":1,"58":1,"64":2,"67":4,"70":8,"71":11,"74":3,"75":2,"76":2,"78":1,"79":1,"80":1,"82":1,"90":3,"91":1,"102":2,"105":3,"106":1,"108":3,"111":1,"112":1,"117":2,"118":1,"119":1,"120":2}}],["aesthetics",{"2":{"59":1}}],["afraid",{"2":{"36":1}}],["affects",{"2":{"29":1}}],["after",{"2":{"5":1,"6":1,"8":3,"9":1,"37":2,"97":1,"103":1,"119":1}}],["agnostic",{"2":{"74":1}}],["ago",{"2":{"24":1}}],["against",{"2":{"8":1,"100":1}}],["again",{"2":{"5":1,"36":1}}],["azure",{"2":{"20":2}}],["air",{"2":{"20":1}}],["ava",{"2":{"20":10}}],["available",{"0":{"105":1,"106":1},"2":{"16":1,"18":1,"25":2,"37":1,"66":1,"71":1,"83":1,"90":1,"105":1}}],["avoids",{"2":{"27":1}}],["avoided",{"2":{"24":1}}],["avoid",{"0":{"29":1},"2":{"12":1,"78":1,"108":1}}],["aux",{"2":{"20":1}}],["audio",{"2":{"16":1}}],["autocompleterefs",{"2":{"20":1}}],["autodetection",{"2":{"20":1}}],["autodetectcolorscheme",{"2":{"20":1}}],["autofetch",{"2":{"20":1}}],["autoupdate",{"2":{"20":1}}],["auto",{"2":{"8":1,"17":1,"20":1,"117":1}}],["automatically",{"2":{"8":1,"27":1,"90":1}}],["automation",{"2":{"8":1,"36":1,"90":1}}],["automating",{"2":{"6":1}}],["automate",{"2":{"8":1}}],["author",{"0":{"61":1},"2":{"60":1}}],["authors",{"2":{"20":3}}],["authorization",{"0":{"2":1},"2":{"2":6}}],["authentication",{"0":{"2":1},"2":{"2":7,"3":1,"11":3,"25":1,"59":2,"108":1}}],["authinterceptor",{"2":{"1":2}}],["auth",{"2":{"1":3,"69":1,"71":1,"108":2}}],["away",{"2":{"116":1}}],["await",{"2":{"1":2,"15":1,"74":1}}],["aws",{"2":{"3":1,"61":1}}],["abbreviations",{"0":{"59":1}}],["above",{"2":{"37":1,"91":1,"100":1}}],["about",{"0":{"27":1,"61":1},"2":{"18":1,"24":1,"25":2,"36":1,"37":1,"45":1,"117":1}}],["able",{"2":{"8":1,"27":1,"32":1,"71":1}}],["ability",{"2":{"3":4,"9":1,"36":1,"71":3,"106":1,"108":1}}],["absolutely",{"2":{"36":2}}],["absolute",{"2":{"3":1}}],["abstracting",{"2":{"1":1}}],["abstraction",{"0":{"0":1},"1":{"1":1},"2":{"74":1,"105":1}}],["among",{"2":{"26":1}}],["amount",{"2":{"2":1,"28":1}}],["ambiguous",{"2":{"25":1}}],["amazon",{"2":{"3":2,"9":2}}],["along",{"2":{"26":1,"37":1}}],["alg",{"2":{"20":1}}],["alias",{"2":{"19":5}}],["always",{"2":{"11":1,"16":1,"25":2,"29":1,"81":1}}],["alternative",{"2":{"3":1,"12":1}}],["already",{"2":{"3":1,"8":1,"26":1,"27":1,"28":1,"36":1}}],["also",{"2":{"2":3,"3":2,"6":1,"8":1,"9":2,"12":1,"19":3,"20":1,"25":4,"26":1,"27":4,"30":1,"35":2,"36":4,"37":2,"58":1,"64":1,"74":1,"78":1,"111":1}}],["ally",{"2":{"20":3,"102":2}}],["allowcompoundwords",{"2":{"20":1}}],["allowing",{"2":{"6":1}}],["allowed",{"2":{"4":1,"37":1}}],["allows",{"2":{"4":4,"10":2,"20":2,"25":1,"27":1,"28":1,"37":2,"74":1,"76":1,"117":1,"118":1}}],["allow",{"2":{"2":2,"4":4,"9":1,"19":1,"70":1}}],["all",{"2":{"1":1,"2":1,"4":4,"20":1,"25":3,"27":6,"28":2,"35":1,"36":2,"37":4,"66":1,"76":1,"93":1,"106":1,"111":2,"118":1,"119":1,"120":1}}],["attribute",{"2":{"76":1}}],["attributes",{"2":{"35":1}}],["attempt",{"2":{"5":1}}],["at",{"2":{"2":10,"4":1,"5":2,"8":1,"10":1,"11":2,"20":3,"24":2,"25":2,"26":4,"27":1,"28":2,"34":1,"36":5,"37":3,"59":1,"70":1,"74":1,"90":1,"99":1,"112":1}}],["aside",{"2":{"33":1}}],["aspect",{"2":{"26":1,"27":1}}],["aspx",{"2":{"20":1}}],["astro",{"2":{"20":1,"70":1}}],["ashx",{"2":{"20":1}}],["ascx",{"2":{"20":1}}],["asax",{"2":{"20":1}}],["associated",{"2":{"25":1}}],["assets",{"2":{"10":1,"16":5,"18":2,"76":1,"118":1}}],["assigned",{"2":{"2":1}}],["asked",{"2":{"60":1}}],["ask",{"2":{"2":1}}],["as",{"0":{"103":1},"2":{"2":5,"3":1,"4":2,"5":1,"10":3,"11":2,"16":4,"18":3,"19":1,"20":4,"24":2,"25":5,"26":1,"27":2,"34":1,"35":5,"36":2,"37":10,"60":1,"67":3,"70":4,"71":5,"74":1,"76":1,"91":1,"102":1}}],["asynchronous",{"2":{"12":1,"74":1}}],["async",{"2":{"1":1,"74":1,"75":1,"92":1}}],["arguments",{"2":{"92":1}}],["architect",{"2":{"61":1}}],["architecture",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1,"34":1},"2":{"10":2,"28":2,"59":1,"71":1}}],["architecturally",{"2":{"25":1}}],["architectural",{"0":{"10":1},"1":{"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"24":1}}],["arrays",{"2":{"99":1}}],["array",{"2":{"24":6,"27":2,"36":1}}],["articles",{"2":{"35":1}}],["article",{"2":{"21":1,"24":1,"26":1,"33":1}}],["artisan",{"2":{"20":1}}],["area",{"2":{"25":1}}],["are",{"2":{"2":6,"3":3,"4":2,"6":1,"8":4,"9":1,"10":3,"12":3,"16":6,"19":2,"20":4,"21":2,"22":1,"24":5,"25":8,"26":7,"27":5,"28":5,"35":2,"36":6,"37":6,"60":1,"62":2,"70":1,"72":1,"78":2,"80":1,"83":1,"93":1,"101":1,"105":1,"116":1,"118":1,"120":2}}],["around",{"2":{"1":1,"3":1,"25":1,"36":1,"37":1}}],["adaptive",{"2":{"70":1,"93":1}}],["adapter",{"2":{"64":1,"75":2,"105":1}}],["adaptability",{"0":{"72":1},"2":{"28":1,"32":1,"35":1,"72":1}}],["advent",{"2":{"37":1}}],["advertising",{"2":{"29":1}}],["advance",{"2":{"37":1}}],["advantage",{"2":{"25":1}}],["advisable",{"2":{"36":1}}],["adding",{"2":{"24":1,"27":1,"67":1}}],["additional",{"2":{"6":1,"37":1}}],["addition",{"2":{"5":1,"8":2,"10":1,"27":1,"37":2,"105":1}}],["addextraspaceontop",{"2":{"20":1}}],["added",{"2":{"16":1,"37":1}}],["add",{"2":{"4":1,"8":1,"14":1,"20":1,"28":3,"35":1,"58":1,"64":6,"69":3}}],["adds",{"2":{"4":1,"35":1,"64":1,"69":1,"82":1,"92":1,"115":1}}],["addresponseinterceptor",{"2":{"1":2,"75":1}}],["admin",{"2":{"2":2,"10":1}}],["answers",{"2":{"60":3}}],["answer",{"2":{"36":1,"58":1}}],["angular",{"2":{"27":2}}],["analytics",{"0":{"92":1,"115":1},"2":{"64":1,"69":1,"78":1,"105":2}}],["analysis",{"2":{"20":1,"56":1}}],["analogy",{"2":{"28":1,"36":1}}],["analogs",{"2":{"25":1}}],["analog",{"2":{"25":2}}],["annotations",{"2":{"20":1}}],["antony",{"2":{"20":1,"67":1}}],["antfu",{"2":{"20":3}}],["antialiased",{"2":{"20":1}}],["anti",{"2":{"12":1}}],["animation",{"2":{"12":1,"37":1}}],["another",{"2":{"8":1,"25":5,"28":1,"30":1,"36":1,"37":1,"70":1,"74":1}}],["anyone",{"2":{"25":1}}],["anywhere",{"2":{"25":1}}],["anything",{"2":{"8":1}}],["any",{"2":{"2":2,"3":1,"4":2,"5":2,"11":1,"15":1,"16":1,"25":3,"27":1,"32":1,"35":1,"37":1,"58":1,"100":1,"117":1}}],["an",{"0":{"19":1,"104":1},"1":{"105":1,"106":1,"107":1,"108":1},"2":{"2":3,"3":2,"4":4,"5":3,"8":2,"9":1,"10":1,"11":1,"12":3,"16":1,"19":3,"24":4,"25":8,"27":4,"28":2,"35":1,"36":7,"37":3,"70":3,"74":1,"76":1,"99":1,"102":2}}],["and",{"0":{"2":1,"12":1,"19":1,"24":1,"30":1,"33":1,"35":1,"37":1,"59":1,"65":1},"1":{"13":1,"14":1,"15":1},"2":{"1":3,"2":24,"3":13,"4":3,"5":3,"6":1,"8":22,"9":4,"10":8,"11":2,"12":7,"16":6,"19":6,"20":18,"21":3,"24":20,"25":39,"26":5,"27":22,"28":9,"29":3,"30":1,"31":4,"32":4,"33":1,"34":2,"35":20,"36":37,"37":31,"45":1,"58":1,"59":2,"60":8,"62":1,"64":3,"66":1,"67":5,"69":3,"70":7,"71":10,"72":2,"75":1,"76":3,"81":3,"82":1,"90":5,"99":2,"100":1,"101":1,"102":2,"105":2,"108":8,"109":4,"111":2,"116":2,"117":1,"118":3,"119":1,"120":2}}],["acme",{"2":{"117":3}}],["acr",{"2":{"20":1}}],["across",{"2":{"12":1}}],["acn",{"2":{"20":1}}],["act",{"2":{"71":1}}],["activitybar",{"2":{"20":1}}],["actively",{"2":{"27":1}}],["active",{"2":{"13":1,"20":1}}],["actions",{"0":{"8":1,"89":1},"1":{"90":1,"91":1},"2":{"2":1,"6":2,"8":12,"20":1,"26":1,"36":1,"44":1,"71":1,"90":1,"105":1,"108":1}}],["action",{"2":{"2":2,"8":9,"20":1,"64":1,"90":2}}],["actually",{"2":{"70":1}}],["actual",{"2":{"8":1,"37":1}}],["accepts",{"2":{"64":1}}],["accessing",{"2":{"20":1,"37":2}}],["accessibility",{"2":{"35":1}}],["accessibilitysupport",{"2":{"20":1}}],["accessible",{"2":{"9":1}}],["accesses",{"2":{"3":1}}],["accessed",{"2":{"3":1,"4":1,"16":1,"91":1}}],["access",{"2":{"1":1,"2":14,"3":5,"4":13,"8":1,"11":1,"25":2,"59":1,"74":1}}],["accomplish",{"2":{"28":1}}],["accompanying",{"2":{"25":1}}],["according",{"2":{"25":1}}],["accordingly",{"2":{"4":1,"37":1}}],["accordian",{"2":{"11":1}}],["accordianpanel",{"2":{"11":1}}],["accountroutes",{"2":{"12":2}}],["account",{"2":{"1":1,"2":2,"10":1,"12":2,"16":1,"18":1,"37":1}}],["axios",{"2":{"1":1,"70":1,"74":1}}],["apollo",{"2":{"20":2}}],["apache",{"2":{"9":1}}],["appveyor",{"2":{"20":2}}],["appsettings",{"2":{"20":2}}],["appsidebar",{"2":{"12":1}}],["apparent",{"2":{"18":1}}],["appfooter",{"2":{"12":2}}],["appheader>",{"2":{"97":1}}],["appheadersecond",{"2":{"97":1}}],["appheaderfirst",{"2":{"97":1}}],["appheader",{"2":{"12":2,"97":1}}],["approaches",{"2":{"27":1}}],["approach",{"2":{"12":1,"35":1,"37":1,"70":1}}],["app",{"2":{"10":1,"12":3,"13":1,"14":1,"15":1,"17":2,"37":3,"64":1,"72":1,"119":1}}],["applied",{"2":{"79":1}}],["applicants",{"2":{"27":1}}],["applications",{"2":{"2":1,"37":3,"70":1,"71":1}}],["application",{"0":{"16":1,"19":1,"28":1,"65":1,"104":1},"1":{"17":1,"18":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"105":1,"106":1,"107":1,"108":1},"2":{"1":1,"3":2,"5":1,"8":1,"10":4,"11":1,"12":2,"16":4,"19":3,"24":1,"25":4,"26":1,"27":1,"28":2,"29":1,"35":1,"36":1,"37":8,"59":3,"64":1,"67":4,"70":3,"71":7,"74":2,"75":2,"76":1,"79":1,"105":6,"107":1,"108":4,"116":1,"117":2,"118":1,"119":3,"120":1}}],["applying",{"2":{"67":1}}],["apploader",{"0":{"13":1}}],["appleboy",{"2":{"8":3}}],["appears",{"2":{"11":1,"26":1,"79":1,"97":1}}],["appear",{"2":{"4":1,"20":1,"37":1}}],["apidata",{"2":{"74":2}}],["apis",{"2":{"3":1,"5":1,"36":1}}],["api",{"0":{"1":1,"73":1,"74":1},"1":{"74":1,"75":1},"2":{"1":10,"3":4,"5":1,"9":2,"10":2,"15":1,"20":14,"24":4,"25":2,"27":1,"36":2,"37":1,"45":1,"64":2,"67":1,"69":1,"71":2,"74":5,"75":6,"105":3}}],["a",{"0":{"21":1,"65":1,"68":1,"103":1},"1":{"69":1,"70":1},"2":{"1":4,"2":12,"3":24,"4":11,"5":6,"6":8,"8":9,"9":9,"10":11,"11":1,"12":3,"15":1,"16":3,"18":4,"19":7,"20":15,"21":2,"24":19,"25":33,"26":5,"27":23,"28":11,"29":6,"32":2,"34":2,"35":6,"36":29,"37":33,"58":2,"64":2,"65":1,"66":1,"67":6,"69":2,"70":13,"71":8,"74":2,"75":1,"79":1,"82":1,"90":3,"91":2,"99":6,"100":2,"101":1,"106":1,"117":1,"118":1,"119":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexru.5-E4-aJx.js b/assets/chunks/@localSearchIndexru.5-E4-aJx.js new file mode 100644 index 000000000..a9abc2857 --- /dev/null +++ b/assets/chunks/@localSearchIndexru.5-E4-aJx.js @@ -0,0 +1 @@ +const t='{"documentCount":558,"nextId":558,"documentIds":{"0":"/ru/articles/#наши-статьи-на-других-ресурсах","1":"/ru/arty-crafty/analysis/architecture-and-design.html#архитектура-и-дизаин","2":"/ru/arty-crafty/analysis/architecture-and-design.html#упрощение-сложного","3":"/ru/arty-crafty/analysis/architecture-and-design.html#абстракция-и-инкапсуляция","4":"/ru/arty-crafty/analysis/architecture-and-design.html#разбиение-проекта-на-подсистемы","5":"/ru/arty-crafty/analysis/architecture-and-design.html#package-diagram","6":"/ru/arty-crafty/analysis/architecture-and-design.html#клиент-серверная-архитектура","7":"/ru/arty-crafty/analysis/architecture-and-design.html#routing","8":"/ru/arty-crafty/analysis/business-analysis.html#бизнес-анализ","9":"/ru/arty-crafty/analysis/business-analysis.html#границы-проекта","10":"/ru/arty-crafty/analysis/business-analysis.html#существующие-решения","11":"/ru/arty-crafty/analysis/business-analysis.html#витрина","12":"/ru/arty-crafty/analysis/business-analysis.html#магазин","13":"/ru/arty-crafty/analysis/business-analysis.html#маркетплеис","14":"/ru/arty-crafty/analysis/business-analysis.html#use-case-диаграмма","15":"/ru/arty-crafty/analysis/data-model.html#модель-данных","16":"/ru/arty-crafty/analysis/data-model.html#категория-и-товар","17":"/ru/arty-crafty/analysis/data-model.html#типы-баз-данных","18":"/ru/arty-crafty/analysis/data-model.html#_1-json","19":"/ru/arty-crafty/analysis/data-model.html#_1-json-1","20":"/ru/arty-crafty/analysis/research.html#анализ-рынка","21":"/ru/arty-crafty/analysis/research.html#изучение-конкурентов","22":"/ru/arty-crafty/analysis/research.html#саиты-аналоги","23":"/ru/arty-crafty/analysis/tech-stack.html#техническии-стек-проекта","24":"/ru/arty-crafty/analysis/ui-design.html#ui-дизаин","25":"/ru/arty-crafty/analysis/ui-design.html#дизаин-саита","26":"/ru/arty-crafty/analysis/ui-design.html#творческие-способности","27":"/ru/arty-crafty/analysis/ui-layout.html#ui-макет","28":"/ru/arty-crafty/analysis/ui-layout.html#основные-компоненты-страницы","29":"/ru/arty-crafty/analysis/ui-layout.html#header","30":"/ru/arty-crafty/analysis/ui-layout.html#sidebar","31":"/ru/arty-crafty/analysis/ui-layout.html#main-panel","32":"/ru/arty-crafty/analysis/ui-layout.html#footer","33":"/ru/arty-crafty/analysis/ui-layout.html#мобильная-версия","34":"/ru/arty-crafty/analysis/ui-layout.html#слабая-связанность","35":"/ru/arty-crafty/analysis/ui-layout.html#адаптивность","36":"/ru/arty-crafty/analysis/ui-layout.html#вывод","37":"/ru/arty-crafty/backend/baas-choosing.html#выбор-baas-или-cms","38":"/ru/arty-crafty/backend/baas-choosing.html#json-фаилы-товаров","39":"/ru/arty-crafty/backend/baas-choosing.html#выбор-cms","40":"/ru/arty-crafty/backend/baas-choosing.html#сервисы-supabase","41":"/ru/arty-crafty/backend/baas-choosing.html#адаптеры","42":"/ru/arty-crafty/backend/db-data-model.html#модель-данных-в-базе-данных","43":"/ru/arty-crafty/backend/db-data-model.html#сущности","44":"/ru/arty-crafty/backend/db-data-model.html#данные","45":"/ru/arty-crafty/backend/db-data-model.html#categories-table","46":"/ru/arty-crafty/backend/db-data-model.html#products-table","47":"/ru/arty-crafty/backend/db-data-model.html#category-product-join-table","48":"/ru/arty-crafty/backend/db-data-model.html#поиск-по-json-полям","49":"/ru/arty-crafty/backend/supabase-api.html#supabase-rest-api","50":"/ru/arty-crafty/backend/supabase-api.html#supabase-sdk","51":"/ru/arty-crafty/backend/supabase-api.html#установка","52":"/ru/arty-crafty/backend/supabase-api.html#использование","53":"/ru/arty-crafty/backend/supabase-api.html#supabase-rest-api-1","54":"/ru/arty-crafty/backend/hoppscotch.html#hoppscotch","55":"/ru/arty-crafty/backend/hoppscotch.html#работа-с-api","56":"/ru/arty-crafty/backend/hoppscotch.html#endpoints","57":"/ru/arty-crafty/backend/supabase.html#supabase","58":"/ru/arty-crafty/backend/supabase.html#создание-проекта","59":"/ru/arty-crafty/backend/supabase.html#безопасность-и-доступ","60":"/ru/arty-crafty/#онлаин-маркетплеис","61":"/ru/arty-crafty/#проект-arty-crafty","62":"/ru/arty-crafty/#причины","63":"/ru/arty-crafty/#цель","64":"/ru/arty-crafty/#что-здесь-будет","65":"/ru/arty-crafty/#для-чего","66":"/ru/arty-crafty/introduction/development-stages.html#план-работы","67":"/ru/arty-crafty/introduction/development-stages.html#стадии-разработки-по","68":"/ru/arty-crafty/introduction/development-stages.html#бизнес-анализ","69":"/ru/arty-crafty/introduction/development-stages.html#архитектура-и-дизаин","70":"/ru/arty-crafty/introduction/development-stages.html#разработка","71":"/ru/arty-crafty/introduction/development-stages.html#развертывание","72":"/ru/arty-crafty/introduction/development-stages.html#тестирование-и-qa","73":"/ru/arty-crafty/introduction/development-stages.html#документирование","74":"/ru/arty-crafty/introduction/development-stages.html#поддержка","75":"/ru/arty-crafty/introduction/goals.html#цели-и-задачи-проекта","76":"/ru/arty-crafty/introduction/goals.html#цели-данного-проекта","77":"/ru/arty-crafty/introduction/goals.html#нефункциональные-требования-software-quality-attributes","78":"/ru/arty-crafty/introduction/goals.html#общие-функциональные-требования","79":"/ru/arty-crafty/introduction/goals.html#этапы-развития-приложения-приблизительно","80":"/ru/arty-crafty/introduction/repository.html#репозитории-и-саит-проекта","81":"/ru/arty-crafty/showcase-data/api-service-adapter.html#работа-с-api-на-фронтенде","82":"/ru/arty-crafty/showcase-data/api-service-adapter.html#supabase-адаптер","83":"/ru/arty-crafty/showcase-data/api-service-adapter.html#api-products-ts","84":"/ru/arty-crafty/showcase-data/mobile-menu.html#мобильное-меню-css","85":"/ru/arty-crafty/showcase-data/mobile-menu.html#iconbutton","86":"/ru/arty-crafty/showcase-data/mobile-menu.html#scss-css","87":"/ru/arty-crafty/showcase-data/mobile-menu.html#tag-и-cmv","88":"/ru/arty-crafty/showcase/codeium.html#codeium","89":"/ru/arty-crafty/showcase/codeium.html#автокомплит","90":"/ru/arty-crafty/showcase/codeium.html#чат-бот","91":"/ru/arty-crafty/showcase/codeium.html#explain-refactor-jsdoc","92":"/ru/arty-crafty/showcase/codeium.html#explain-problem","93":"/ru/arty-crafty/showcase/codeium.html#вывод","94":"/ru/arty-crafty/showcase/customization.html#кастомизация","95":"/ru/arty-crafty/showcase/customization.html#персонализация","96":"/ru/arty-crafty/showcase/customization.html#views","97":"/ru/arty-crafty/showcase/customization.html#routes","98":"/ru/arty-crafty/showcase/customization.html#header","99":"/ru/arty-crafty/showcase/customization.html#sidebar","100":"/ru/arty-crafty/showcase/customization.html#небольшои-рефакторинг","101":"/ru/arty-crafty/showcase/favourites.html#избранное","102":"/ru/arty-crafty/showcase/favourites.html#иконка-на-карточке-товара","103":"/ru/arty-crafty/showcase/favourites.html#композабл-usefavourites","104":"/ru/arty-crafty/showcase/favourites.html#сохранение-между-сессиями","105":"/ru/arty-crafty/showcase/favourites.html#бэджик","106":"/ru/arty-crafty/showcase/favourites.html#tag-и-cmv","107":"/ru/arty-crafty/showcase/product-category.html#категория-товаров","108":"/ru/arty-crafty/showcase/product-category.html#layout","109":"/ru/arty-crafty/showcase/product-category.html#данные-и-api","110":"/ru/arty-crafty/showcase/project-setup.html#создание-проекта","111":"/ru/arty-crafty/showcase/project-setup.html#репозитории-на-github","112":"/ru/arty-crafty/showcase/project-setup.html#vue-webapp","113":"/ru/backend/api.html#абстракция-канала-связи-с-бэкендом","114":"/ru/backend/api.html#api-сервис","115":"/ru/backend/auth.html#аутентификация-и-авторизация","116":"/ru/backend/backend.html#варианты-задеиствовать-свои-бэкенд-для-фронтендера","117":"/ru/backend/cors.html#cors","118":"/ru/backend/protocols.html#протоколы-to-rest-или-не-rest","119":"/ru/book/Appendix__Migrating_from_Vue_2.html#приложение-миграция-с-vue-2","120":"/ru/book/Appendix__Migrating_from_Vue_2.html#другои-способ-загрузки-и-запуска-приложения","121":"/ru/book/Appendix__Migrating_from_Vue_2.html#регистрация-глобальных-компонентов-плагинов-и-так-далее","122":"/ru/book/Appendix__Migrating_from_Vue_2.html#своиство-data-теперь-всегда-является-функциеи","123":"/ru/book/Appendix__Migrating_from_Vue_2.html#больше-реактивных-возможностеи","124":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-v-model-props-и-events","125":"/ru/book/Appendix__Migrating_from_Vue_2.html#удалена-совместимость-со-старыми-браузерами","126":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-организации-каталогов-и-фаилов","127":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-роутере-и-state-manager","128":"/ru/book/Appendix__Migrating_from_Vue_2.html#новые-компоненты-и-другие-изменения","129":"/ru/book/Appendix__Migrating_from_Vue_2.html#другие-изменения","130":"/ru/book/Appendix__Migrating_from_Vue_2.html#итог","131":"/ru/book/Chapter_10__Deploying_Your_Application.html#развертывание-приложения","132":"/ru/book/Chapter_10__Deploying_Your_Application.html#технические-требования","133":"/ru/book/Chapter_10__Deploying_Your_Application.html#что-включает-в-себя-публикация-веб-приложения","134":"/ru/book/Chapter_10__Deploying_Your_Application.html#домены-серверы-доменных-имен-dns-и-записи-dns","135":"/ru/book/Chapter_10__Deploying_Your_Application.html#размышления-о-создании-приложения-для-развертывания","136":"/ru/book/Chapter_10__Deploying_Your_Application.html#chapter-5-to-do-spa-src-router-index-js","137":"/ru/book/Chapter_10__Deploying_Your_Application.html#опции-и-конфигурации-веб-сервера","138":"/ru/book/Chapter_10__Deploying_Your_Application.html#конфигурация-http-сервера-apache","139":"/ru/book/Chapter_10__Deploying_Your_Application.html#htaccess","140":"/ru/book/Chapter_10__Deploying_Your_Application.html#настроика-сервера-nginx","141":"/ru/book/Chapter_10__Deploying_Your_Application.html#etc-nginx-sites-available-default","142":"/ru/book/Chapter_10__Deploying_Your_Application.html#другие-серверы","143":"/ru/book/Chapter_10__Deploying_Your_Application.html#перенос-фаилов-на-сервер","144":"/ru/book/Chapter_10__Deploying_Your_Application.html#защита-веб-приложения-с-помощью-let-s-encrypt","145":"/ru/book/Chapter_10__Deploying_Your_Application.html#подведение-итогов","146":"/ru/book/Chapter_10__Deploying_Your_Application.html#вопросы-для-проверки","147":"/ru/book/Chapter_1__The_Vue_3_Framework.html#фреимворк-vue-3","148":"/ru/book/Chapter_1__The_Vue_3_Framework.html#прогрессивныи-фреимворк","149":"/ru/book/Chapter_1__The_Vue_3_Framework.html#использование-vue-в-веб-приложении","150":"/ru/book/Chapter_1__The_Vue_3_Framework.html#путь-сборщика-лучшии-путь","151":"/ru/book/Chapter_1__The_Vue_3_Framework.html#понимание-однофаиловых-компонентов","152":"/ru/book/Chapter_1__The_Vue_3_Framework.html#разные-варианты-options-composition-и-script-setup-api","153":"/ru/book/Chapter_1__The_Vue_3_Framework.html#изучение-встроенных-директив-в-vue-3","154":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-bind-сокращение","155":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-show","156":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-if-v-else-и-v-else-if","157":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-for-и-key","158":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-model","159":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-on-и-сокращение","160":"/ru/book/Chapter_1__The_Vue_3_Framework.html#встроенные-компоненты","161":"/ru/book/Chapter_1__The_Vue_3_Framework.html#кодовые-соглашения-code-conventions-в-книге","162":"/ru/book/Chapter_1__The_Vue_3_Framework.html#переменные-и-пропсы","163":"/ru/book/Chapter_1__The_Vue_3_Framework.html#константы","164":"/ru/book/Chapter_1__The_Vue_3_Framework.html#имена-классов-и-компонентов","165":"/ru/book/Chapter_1__The_Vue_3_Framework.html#функции-методы-события-и-имена-фаилов","166":"/ru/book/Chapter_1__The_Vue_3_Framework.html#экземпляры","167":"/ru/book/Chapter_1__The_Vue_3_Framework.html#подведение-итогов","168":"/ru/book/Chapter_1__The_Vue_3_Framework.html#вопросы-для-проверки","169":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#бонусная-глава-шаблоны-ux","170":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#технические-требования","171":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#ui-дизаин-против-ux-дизаина","172":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#принципы-проектирования-пользовательского-интерфеиса","173":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#достаточныи-контраст-или-различие-между-элементами","174":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#стимулировать-повторение-и-быть-последовательным","175":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#внимательно-следите-за-выравниванием-и-направлением","176":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#используите-близость-и-расстояние-чтобы-показать-естественные-группы","177":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#законы-проектирования-пользовательского-интерфеиса","178":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#закон-фитта","179":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#закон-хика","180":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#восемь-правил-бена-шнаидермана","181":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#принципы-проектирования-ux","182":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-работы-с-данными","183":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#элементы-ввода-html","184":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#чекбоксы-радиокнопки-и-тумблеры","185":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#чипы-таблетки-или-теги","186":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#подсказки-tooltips","187":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#уведомляющие-точки-пузырьки-метки-или-значки","188":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#тостовые-уведомления","189":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#карусель-или-слаидеры-изображении","190":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#панели-прогресса-progress-bars-и-спиннеры","191":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#components-spinner-vue","192":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#пагинация-пеиджер-и-бесконечныи-скроллер","193":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#src-components-infinitescroller-vue","194":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-взаимодеиствия-и-навигации","195":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#размещение-меню","196":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#хлебные-крошки-breadcrumbs","197":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#модальные-диалоги","198":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#иконки-меню","199":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#аккордеонные-меню","200":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#мегаменю","201":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#выпадающие-меню","202":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-организации-контента","203":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#отзывчивые-responsive-приложения","204":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#домашняя-ссылка","205":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#главная-hero-секция-призыв-к-деиствию-call-to-action-и-иконки-социальных-сетеи","206":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#другие-шаблоны","207":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#темные-шаблоны","208":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#вопросы-с-подвохом","209":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#проникновение-в-корзину","210":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#приманка-для-тараканов-roach-motels","211":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#privacy-zuckering","212":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#предотвращение-сравнения-цен","213":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#ненаправленность","214":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#скрытые-расходы","215":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#приманка-и-подмена","216":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#подтверждение-позора-confirm-shaming","217":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#замаскированная-реклама","218":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#дружественныи-спам","219":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#подведение-итогов","220":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#вопросы-для-проверки","221":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#установка-рабочего-проекта","222":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#технические-требования","223":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#настроика-проекта-и-инструменты","224":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#структура-папок-и-ее-модификации","225":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#интеграция-с-css-фреимворками","226":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#фреимворк-w3-css","227":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#fontawesome-это-просто-замечательно","228":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#опции-конфигурации-vite","229":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#приложение-to-do","230":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#app-vue","231":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#todos-vue","232":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#краткая-критика-нашего-приложения-to-do","233":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#подведение-итогов","234":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#вопросы-для-проверки","235":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#композиция-пользовательского-интерфеиса-с-помощью-компонентов","236":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#технические-требования","237":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#составление-страницы-с-помощью-компонентов","238":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#этап-1-определение-макетов-и-элементов-пользовательского-интерфеиса","239":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-2-определение-связеи-потока-данных-взаимодеиствии-и-событии","240":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-3-определение-элементов-пользовательскои-интерактивности-входов-диалогов-уведомлении-и-т-д","241":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-4-выявление-шаблонов-проектирования-и-компромиссов","242":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#компоненты-в-деталях","243":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#локальные-и-глобальные-компоненты","244":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#статическии-асинхронныи-и-динамическии-импорт","245":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#пропсы-события-и-директива-v-model","246":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#настраиваемые-контроллеры-ввода","247":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#инъекция-зависимости-с-помощью-provide-и-inject","248":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#специальные-компоненты","249":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#слоты-слоты-и-еще-раз-слоты","250":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#композабл-функции-composables-и-миксины","251":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#динамические-компоненты-с-помощью-component-is","252":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реальныи-пример-плагин-модалов","253":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#настроика-нашего-проекта","254":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#конструкция","255":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реализация","256":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реализация-нашего-нового-приложения-to-do","257":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#небольшая-критика-нашего-нового-приложения-to-do","258":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#подведение-итогов","259":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#вопросы-для-проверки","260":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#принципы-и-шаблоны-проектирования-программного-обеспечения","261":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#каковы-принципы-проектирования-программного-обеспечения","262":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#неполныи-список-принципов-проектирования","263":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#separation-of-concerns-разделение-ответственности","264":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#composition-over-inheritance-композиция-над-наследованием","265":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#single-responsibility-principle-принцип-единои-ответственности","266":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#encapsulation-инкапсуляция","267":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#kic-keep-it-clean","268":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#dry-–-don-t-repeat-yourself-не-повторяися","269":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#kiss-keep-it-simple-and-short-держи-это-простым-и-коротким","270":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#code-for-the-next-пиши-код-для-следующего","271":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#что-такое-шаблон-проектирования-программного-обеспечения","272":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#краткии-справочныи-список-шаблонов","273":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#порождающие-шаблоны","274":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#поведенческие-шаблоны","275":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#структурные-шаблоны","276":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#асинхронные-шаблоны","277":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-singleton","278":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#когда-его-использовать","279":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#реализация","280":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#метод-1","281":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#метод-2","282":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-dependency-injection-инъекция-зависимостеи","283":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-1-js","284":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-2-js","285":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-3-js","286":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-4-js","287":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-5-js","288":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-6-js","289":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-7-js","290":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-factory-фабрика","291":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-observer-наблюдатель","292":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-observer-1-js","293":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-command-команда","294":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-command-1-js","295":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-proxy","296":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-proxy-1-js","297":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-decorator-декоратор","298":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-decorator-1-vue","299":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-decorator-2-vue","300":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-facade-фасад","301":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-callback-обратныи-вызов","302":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-callback-1-js-синхронныи-фибоначчи","303":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-promise-обещаниe","304":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#подведение-итогов","305":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#вопросы-для-проверки","306":"/ru/book/Chapter_6__Progressive_Web_Applications.html#прогрессивные-веб-приложения","307":"/ru/book/Chapter_6__Progressive_Web_Applications.html#технические-требования","308":"/ru/book/Chapter_6__Progressive_Web_Applications.html#pwa-или-устанавливаемые-spa","309":"/ru/book/Chapter_6__Progressive_Web_Applications.html#увеличение-spa-до-уровня-pwa","310":"/ru/book/Chapter_6__Progressive_Web_Applications.html#фаил-манифеста","311":"/ru/book/Chapter_6__Progressive_Web_Applications.html#необходимо","312":"/ru/book/Chapter_6__Progressive_Web_Applications.html#рекомендуется","313":"/ru/book/Chapter_6__Progressive_Web_Applications.html#описательные","314":"/ru/book/Chapter_6__Progressive_Web_Applications.html#тестирование-манифеста","315":"/ru/book/Chapter_6__Progressive_Web_Applications.html#подсказка-к-установке-install-prompt","316":"/ru/book/Chapter_6__Progressive_Web_Applications.html#service-workers","317":"/ru/book/Chapter_6__Progressive_Web_Applications.html#плагин-vite-pwa","318":"/ru/book/Chapter_6__Progressive_Web_Applications.html#тестирование-показателеи-pwa-с-помощью-google-lighthouse","319":"/ru/book/Chapter_6__Progressive_Web_Applications.html#подведение-итогов","320":"/ru/book/Chapter_6__Progressive_Web_Applications.html#вопросы-для-проверки","321":"/ru/book/Chapter_7__Data_Flow_Management.html#управление-потоками-данных","322":"/ru/book/Chapter_7__Data_Flow_Management.html#технические-требования","323":"/ru/book/Chapter_7__Data_Flow_Management.html#основное-взаимодеиствие-компонентов","324":"/ru/book/Chapter_7__Data_Flow_Management.html#basic-parentbasic-vue","325":"/ru/book/Chapter_7__Data_Flow_Management.html#basic-child-vue","326":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-шины-событии-с-помощью-шаблонов-singleton-и-observer","327":"/ru/book/Chapter_7__Data_Flow_Management.html#services-messagebus-js","328":"/ru/book/Chapter_7__Data_Flow_Management.html#bus-child-vue","329":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-базового-реактивного-состояния","330":"/ru/book/Chapter_7__Data_Flow_Management.html#service-simplestate-js","331":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-мощного-реактивного-стора-с-помощью-pinia","332":"/ru/book/Chapter_7__Data_Flow_Management.html#options-api-basic-store","333":"/ru/book/Chapter_7__Data_Flow_Management.html#stores-counter-js","334":"/ru/book/Chapter_7__Data_Flow_Management.html#main-js","335":"/ru/book/Chapter_7__Data_Flow_Management.html#pinia-childpinia-vue","336":"/ru/book/Chapter_7__Data_Flow_Management.html#хранилища-данных-браузера-сессионные-локальные-и-indexeddb","337":"/ru/book/Chapter_7__Data_Flow_Management.html#экспериментируем-с-шаблонами-reactivity-и-proxies","338":"/ru/book/Chapter_7__Data_Flow_Management.html#services-sessionstorage-js","339":"/ru/book/Chapter_7__Data_Flow_Management.html#session-storage-childsession-vue","340":"/ru/book/Chapter_7__Data_Flow_Management.html#подведение-итогов","341":"/ru/book/Chapter_7__Data_Flow_Management.html#вопросы-для-проверки","342":"/ru/book/Chapter_5__Single-Page_Applications.html#одностраничные-приложения","343":"/ru/book/Chapter_5__Single-Page_Applications.html#технические-требования","344":"/ru/book/Chapter_5__Single-Page_Applications.html#что-такое-spa","345":"/ru/book/Chapter_5__Single-Page_Applications.html#vue-3-роутер","346":"/ru/book/Chapter_5__Single-Page_Applications.html#установка","347":"/ru/book/Chapter_5__Single-Page_Applications.html#новое-приложение-to-do","348":"/ru/book/Chapter_5__Single-Page_Applications.html#определение-маршрутов-и-объект-router","349":"/ru/book/Chapter_5__Single-Page_Applications.html#src-router-index-js","350":"/ru/book/Chapter_5__Single-Page_Applications.html#src-main-js","351":"/ru/book/Chapter_5__Single-Page_Applications.html#шаблонные-компоненты-маршрутизатора","352":"/ru/book/Chapter_5__Single-Page_Applications.html#app-vue","353":"/ru/book/Chapter_5__Single-Page_Applications.html#вложенные-маршруты-именованные-представления-и-программная-навигация","354":"/ru/book/Chapter_5__Single-Page_Applications.html#определение-вложенных-маршрутов","355":"/ru/book/Chapter_5__Single-Page_Applications.html#src-views-directory-vue-component-lines-13-18","356":"/ru/book/Chapter_5__Single-Page_Applications.html#push","357":"/ru/book/Chapter_5__Single-Page_Applications.html#replace","358":"/ru/book/Chapter_5__Single-Page_Applications.html#go","359":"/ru/book/Chapter_5__Single-Page_Applications.html#исследование-шаблонов-аутентификации","360":"/ru/book/Chapter_5__Single-Page_Applications.html#простая-аутентификация-по-имени-пользователя-и-паролю","361":"/ru/book/Chapter_5__Single-Page_Applications.html#openid-и-сторонняя-аутентификация","362":"/ru/book/Chapter_5__Single-Page_Applications.html#_1","363":"/ru/book/Chapter_5__Single-Page_Applications.html#_2","364":"/ru/book/Chapter_5__Single-Page_Applications.html#_3","365":"/ru/book/Chapter_5__Single-Page_Applications.html#беспарольная-аутентификация-или-аутентификация-по-одноразовому-паролю-otp","366":"/ru/book/Chapter_5__Single-Page_Applications.html#_2fa-двухфакторная-аутентификация","367":"/ru/book/Chapter_5__Single-Page_Applications.html#web3-аутентификация","368":"/ru/book/Chapter_5__Single-Page_Applications.html#подведение-итогов","369":"/ru/book/Chapter_5__Single-Page_Applications.html#вопросы-для-проверки","370":"/ru/book/Chapter_9__Testing_and_Source_Control.html#тестирование-и-системы-контроля-версии","371":"/ru/book/Chapter_9__Testing_and_Source_Control.html#технические-требования","372":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-такое-тестирование-и-tdd","373":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-тестировать","374":"/ru/book/Chapter_9__Testing_and_Source_Control.html#наш-базовыи-пример-приложения","375":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-и-использование-vitest","376":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonacci-test-js","377":"/ru/book/Chapter_9__Testing_and_Source_Control.html#специальныи-случаи-утверждения-намеренная-ошибка","378":"/ru/book/Chapter_9__Testing_and_Source_Control.html#специальныи-случаи-утверждения-асинхронныи-код","379":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-vue-test-utils","380":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonaccioutput-test-js","381":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonacciinput-test-js","382":"/ru/book/Chapter_9__Testing_and_Source_Control.html#in-source-тестирование","383":"/ru/book/Chapter_9__Testing_and_Source_Control.html#покрытие","384":"/ru/book/Chapter_9__Testing_and_Source_Control.html#интерфеис-vitest","385":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-такое-source-control-и-зачем-он-нужен","386":"/ru/book/Chapter_9__Testing_and_Source_Control.html#управление-исходными-текстами-с-помощью-git","387":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-windows","388":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-linux","389":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-macos","390":"/ru/book/Chapter_9__Testing_and_Source_Control.html#использование-git","391":"/ru/book/Chapter_9__Testing_and_Source_Control.html#chapter-10-gitignore","392":"/ru/book/Chapter_9__Testing_and_Source_Control.html#управление-ветвями-и-слияниями","393":"/ru/book/Chapter_9__Testing_and_Source_Control.html#конфликты-при-слиянии","394":"/ru/book/Chapter_9__Testing_and_Source_Control.html#работа-с-удаленными-репозиториями","395":"/ru/book/Chapter_9__Testing_and_Source_Control.html#непрерывная-интеграция-и-доставка","396":"/ru/book/Chapter_9__Testing_and_Source_Control.html#подведение-итогов","397":"/ru/book/Chapter_9__Testing_and_Source_Control.html#вопросы-для-проверки","398":"/ru/book/#vue-js-3-шаблоны-проектирования-и-лучшие-практики","399":"/ru/book/#здесь-представлен-перевод-книги-vue-js-3-design-patterns-and-best-practices-на-русскии-язык","400":"/ru/book/#предисловие","401":"/ru/book/#для-кого-эта-книга","402":"/ru/book/#чтобы-получить-максимальную-пользу-от-этои-книги","403":"/ru/book/#купить-книгу","404":"/ru/book/#скачать-фаилы-кода-примеров","405":"/ru/book/#код-в-деиствии","406":"/ru/book/summary.html#что-включает-в-себя-эта-книга","407":"/ru/book/summary.html#глава-1-фреимворк-vue-3","408":"/ru/book/summary.html#глава-2-принципы-и-шаблоны-проектирования-программного-обеспечения","409":"/ru/book/summary.html#глава-3-создание-рабочего-проекта","410":"/ru/book/summary.html#глава-4-композиция-пользовательского-интерфеиса-с-помощью-компонентов","411":"/ru/book/summary.html#глава-5-одностраничные-приложения","412":"/ru/book/summary.html#глава-6-прогрессивные-веб-приложения","413":"/ru/book/summary.html#глава-7-управление-потоками-данных","414":"/ru/book/summary.html#глава-8-многопоточность-с-помощью-web-workers","415":"/ru/book/summary.html#глава-9-тестирование-и-контроль-исходных-текстов","416":"/ru/book/summary.html#глава-10-развертывание-приложения","417":"/ru/book/summary.html#глава-11-ux-patterns","418":"/ru/book/summary.html#приложение-миграция-с-vue-2-на-vue-3","419":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#многопоточность-с-web-workers","420":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#технические-требования","421":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#введение-в-web-workers","422":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#реализация-web-worker","423":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#my-worker-js","424":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#main-js","425":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#шаблон-business-delegate","426":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#шаблон-dispatcher","427":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#установка-конвеиера-взаимодеиствия-с-веб-рабочим","428":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#services-webworker-js","429":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-index-js","430":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-services-test-js","431":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#получение-доступа-к-indexeddb-с-помощью-dexiejs-в-web-worker","432":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-components-dbnotes-vue","433":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-webworker-services-dbservice-js","434":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-webworker-index-js","435":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-services-network-js","436":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-index-js-1","437":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-components-networkcommunication-vue","438":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#простои-nodejs-сервер-для-тестирования","439":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#server-index-js","440":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#подведение-итогов","441":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#вопросы-для-проверки","442":"/ru/deployment/ci-cd.html#ci-cd","443":"/ru/deployment/docker.html#docker","444":"/ru/deployment/hosting.html#хостинг","445":"/ru/development/architectural-patterns.html#архитектурные-решения","446":"/ru/development/architectural-patterns.html#use-cases","447":"/ru/development/architectural-patterns.html#лучшие-практики-и-соображения","448":"/ru/development/architectural-patterns.html#apploader-vue","449":"/ru/development/architectural-patterns.html#useapploader-ts","450":"/ru/development/architectural-patterns.html#somecomponent","451":"/ru/deployment/github-actions.html#github-actions","452":"/ru/development/assets.html#ресурсы-приложения","453":"/ru/development/assets.html#baseicon","454":"/ru/development/assets.html#icons-js","455":"/ru/development/building.html#создание-и-сборка-приложения","456":"/ru/development/libraries.html#подскажите-удобную-библиотеку","457":"/ru/development/ide.html#настроика-ide","458":"/ru/development/misc.html#полезные-советы","459":"/ru/development/misc.html#карусель-или-слаидер","460":"/ru/development/misc.html#дата-и-время","461":"/ru/development/testing.html#тестирование","462":"/ru/frontend/about-frameworks.html#о-фронтенд-фреимворках","463":"/ru/development/stores.html#state-management-во-vue-3","464":"/ru/frontend/architecture.html#архитектура-фронтэнд-приложении","465":"/ru/frontend/architecture.html#избегаите-зависимостеи","466":"/ru/frontend/architecture.html#используите-обертки-над-компонентами-ui-библиотек-и-сторонних-утилит","467":"/ru/frontend/architecture.html#регулярныи-рефакторинг","468":"/ru/frontend/architecture.html#используите-css3","469":"/ru/frontend/architecture.html#используите-современные-стандарты-и-возможности-языков","470":"/ru/frontend/architecture.html#документируите-проект","471":"/ru/frontend/css-ui-libs.html#css-и-ui-библиотеки","472":"/ru/frontend/learning.html#изучение-vue","473":"/ru/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-и-seo","474":"/ru/misc/CHANGELOG.html#история-изменении","475":"/ru/misc/CHANGELOG.html#v1-4-24-11-2023","476":"/ru/misc/CHANGELOG.html#новое","477":"/ru/misc/CHANGELOG.html#изменено","478":"/ru/misc/CHANGELOG.html#v1-3-10-10-2023","479":"/ru/misc/CHANGELOG.html#изменено-1","480":"/ru/misc/CHANGELOG.html#v1-2-27-09-2023","481":"/ru/misc/CHANGELOG.html#новое-1","482":"/ru/misc/CHANGELOG.html#изменено-2","483":"/ru/misc/CHANGELOG.html#v1-1-15-09-2023","484":"/ru/misc/CHANGELOG.html#новое-2","485":"/ru/misc/CHANGELOG.html#изменено-3","486":"/ru/misc/CHANGELOG.html#v1-0-11-09-2023","487":"/ru/misc/CHANGELOG.html#новое-3","488":"/ru/misc/cheat-sheets.html#шпаргалки-cheat-sheet","489":"/ru/misc/cheat-sheets.html#vue","490":"/ru/misc/cheat-sheets.html#javascript","491":"/ru/misc/cheat-sheets.html#html","492":"/ru/misc/cheat-sheets.html#css","493":"/ru/misc/cheat-sheets.html#typescript","494":"/ru/misc/cheat-sheets.html#markdown","495":"/ru/misc/contribute.html#внесите-лепту-в-развитие-данного-ресурса","496":"/ru/misc/glossary.html#глоссарии-и-сокращения","497":"/ru/misc/introduction.html#предисловие","498":"/ru/misc/introduction.html#у-нас-есть-телеграм-канал","499":"/ru/vue-webapp/contribution.html#участие-в-проекте","500":"/ru/vue-webapp/getting-started.html#установка","501":"/ru/vue-webapp/getting-started.html#установка-через-create-vue-webapp","502":"/ru/vue-webapp/getting-started.html#инициализация-и-запуск-веб-приложения","503":"/ru/vue-webapp/getting-started.html#установка-из-репозитория","504":"/ru/vue-webapp/guidelines.html#принципы","505":"/ru/vue-webapp/#vue-3-webapp-билдер","506":"/ru/vue-webapp/#краткое-описание","507":"/ru/vue-webapp/#обоснование","508":"/ru/vue-webapp/objectives.html#цели","509":"/ru/vue-webapp/options/adaptability.html#адаптивность","510":"/ru/vue-webapp/options/api.html#api-модуль","511":"/ru/vue-webapp/options/api.html#api-rest","512":"/ru/vue-webapp/options/api.html#json-rpc","513":"/ru/vue-webapp/options/baseIcon.html#baseicon","514":"/ru/vue-webapp/options/description.html#детали-реализации","515":"/ru/vue-webapp/options/description.html#инъекции-кода-в-index-html","516":"/ru/vue-webapp/options/description.html#css-tricks","517":"/ru/vue-webapp/options/drawer.html#navigation-drawers","518":"/ru/vue-webapp/options/drawer.html#simpledrawer","519":"/ru/vue-webapp/options/drawer.html#touchslideoutdrawer","520":"/ru/vue-webapp/options/footer.html#footers","521":"/ru/vue-webapp/options/footer.html#simplefooter","522":"/ru/vue-webapp/options/footer.html#richfooter","523":"/ru/vue-webapp/options/footer.html#mantinesimplefooter","524":"/ru/vue-webapp/options/footer.html#mantinerichfooter","525":"/ru/vue-webapp/options/footer.html#distributedfooter","526":"/ru/vue-webapp/options/ga-gp.html#github-actions-сценарии-для-развертывания-на-github-pages","527":"/ru/vue-webapp/options/ga-gp.html#deployment","528":"/ru/vue-webapp/options/ga-gp.html#настроика-base-в-vite-конфиге","529":"/ru/vue-webapp/options/google-analytics.html#google-analytics","530":"/ru/vue-webapp/options/header.html#headers","531":"/ru/vue-webapp/options/header.html#simpleheader","532":"/ru/vue-webapp/options/header.html#mantinesimpleheader","533":"/ru/vue-webapp/options/header.html#mantinelayeredheader","534":"/ru/vue-webapp/options/header.html#slidingheader","535":"/ru/vue-webapp/options/i18n.html#i18n","536":"/ru/vue-webapp/options/i18n.html#i18next","537":"/ru/vue-webapp/options/i18n.html#usei18nlight","538":"/ru/vue-webapp/options/i18n.html#использование","539":"/ru/vue-webapp/options/i18n.html#i18next-расширения","540":"/ru/vue-webapp/options/i18n.html#в-итоге","541":"/ru/vue-webapp/options/#опции-при-создании-приложения","542":"/ru/vue-webapp/options/#доступные-опции","543":"/ru/vue-webapp/options/#доступно-по-умолчанию","544":"/ru/vue-webapp/options/#в-разработке","545":"/ru/vue-webapp/options/#в-планах","546":"/ru/vue-webapp/options/layout-main.html#mainlayout","547":"/ru/vue-webapp/options/layout-main.html#routing","548":"/ru/vue-webapp/options/layout-one-column.html#onecolumnlayout","549":"/ru/vue-webapp/options/navbar.html#navbar","550":"/ru/vue-webapp/options/navbar.html#simplenavbar","551":"/ru/vue-webapp/options/navbar.html#mantinesimplenavbar","552":"/ru/vue-webapp/options/open-graph.html#google-analytics","553":"/ru/vue-webapp/options/pwa.html#pwa","554":"/ru/vue-webapp/options/pwa.html#manifest-json","555":"/ru/vue-webapp/options/pwa.html#service-worker","556":"/ru/vue-webapp/options/splash-screen.html#splash-screen","557":"/ru/vue-webapp/options/themes.html#темы"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,6],"1":[3,1,1],"2":[2,3,97],"3":[3,3,119],"4":[4,3,99],"5":[2,3,13],"6":[3,3,40],"7":[1,3,34],"8":[2,1,1],"9":[2,2,62],"10":[2,2,41],"11":[1,2,95],"12":[1,2,119],"13":[1,2,36],"14":[3,2,36],"15":[2,1,1],"16":[3,2,78],"17":[3,2,132],"18":[2,5,33],"19":[2,5,10],"20":[2,1,1],"21":[2,2,13],"22":[2,2,136],"23":[3,1,119],"24":[2,1,1],"25":[2,2,36],"26":[2,2,81],"27":[2,1,21],"28":[3,2,16],"29":[1,5,47],"30":[1,5,25],"31":[2,5,13],"32":[1,5,16],"33":[2,2,34],"34":[2,2,44],"35":[1,2,31],"36":[1,2,43],"37":[4,1,1],"38":[3,4,33],"39":[2,4,107],"40":[2,4,79],"41":[1,4,149],"42":[4,1,1],"43":[1,4,49],"44":[1,4,46],"45":[2,6,1],"46":[2,6,1],"47":[4,6,92],"48":[4,4,81],"49":[3,1,1],"50":[2,3,16],"51":[2,5,6],"52":[2,5,37],"53":[3,3,99],"54":[1,1,1],"55":[3,1,58],"56":[1,1,70],"57":[1,1,1],"58":[2,1,32],"59":[3,1,116],"60":[2,1,1],"61":[3,2,32],"62":[1,2,81],"63":[1,2,47],"64":[4,2,44],"65":[3,2,53],"66":[2,1,1],"67":[3,2,46],"68":[2,2,116],"69":[3,2,130],"70":[1,2,9],"71":[1,2,18],"72":[3,2,10],"73":[1,2,10],"74":[1,2,23],"75":[4,1,1],"76":[4,4,68],"77":[6,4,14],"78":[3,4,15],"79":[5,4,86],"80":[4,1,13],"81":[5,1,1],"82":[2,5,29],"83":[3,8,91],"84":[3,1,1],"85":[1,3,59],"86":[4,3,114],"87":[3,3,12],"88":[1,1,1],"89":[1,1,89],"90":[2,1,10],"91":[3,1,95],"92":[2,1,30],"93":[1,1,13],"94":[1,1,1],"95":[1,1,94],"96":[1,1,38],"97":[1,1,73],"98":[1,1,66],"99":[1,1,16],"100":[2,1,18],"101":[1,1,1],"102":[4,1,96],"103":[2,1,106],"104":[3,1,75],"105":[1,1,126],"106":[3,1,12],"107":[2,1,1],"108":[1,2,58],"109":[3,2,62],"110":[2,1,1],"111":[3,2,16],"112":[2,2,174],"113":[5,1,1],"114":[2,5,122],"115":[3,1,399],"116":[6,1,258],"117":[1,1,228],"118":[6,1,153],"119":[5,1,148],"120":[6,5,82],"121":[7,5,81],"122":[6,5,97],"123":[3,5,187],"124":[7,5,121],"125":[5,5,175],"126":[6,5,58],"127":[6,5,86],"128":[6,5,50],"129":[2,5,21],"130":[1,5,73],"131":[2,1,85],"132":[2,2,23],"133":[8,2,73],"134":[7,9,463],"135":[6,2,151],"136":[10,15,143],"137":[5,2,276],"138":[4,7,51],"139":[2,11,69],"140":[3,7,92],"141":[6,10,98],"142":[2,7,44],"143":[4,2,167],"144":[8,2,253],"145":[2,2,112],"146":[3,2,55],"147":[3,1,278],"148":[2,3,474],"149":[5,3,269],"150":[5,7,231],"151":[3,3,292],"152":[8,3,542],"153":[6,3,48],"154":[5,7,58],"155":[2,7,67],"156":[4,7,97],"157":[4,7,95],"158":[2,7,91],"159":[5,7,134],"160":[2,3,267],"161":[6,3,46],"162":[3,9,18],"163":[1,9,44],"164":[4,9,17],"165":[6,9,9],"166":[1,9,119],"167":[2,3,49],"168":[3,3,68],"169":[4,1,168],"170":[2,4,59],"171":[5,4,223],"172":[4,4,172],"173":[6,8,150],"174":[6,8,180],"175":[6,8,116],"176":[8,8,145],"177":[4,8,35],"178":[2,8,139],"179":[2,8,120],"180":[4,8,211],"181":[3,8,118],"182":[6,4,45],"183":[3,10,101],"184":[4,13,145],"185":[4,13,122],"186":[3,13,141],"187":[6,13,96],"188":[2,13,117],"189":[4,13,159],"190":[6,13,211],"191":[4,19,79],"192":[5,13,243],"193":[5,18,240],"194":[6,4,29],"195":[2,13,118],"196":[4,13,103],"197":[2,13,81],"198":[2,13,152],"199":[2,13,76],"200":[1,13,194],"201":[2,13,77],"202":[5,4,12],"203":[3,9,236],"204":[2,9,136],"205":[13,9,205],"206":[2,9,56],"207":[2,4,78],"208":[3,6,88],"209":[3,6,106],"210":[6,6,74],"211":[2,6,82],"212":[3,6,50],"213":[1,6,57],"214":[2,6,39],"215":[3,6,53],"216":[5,6,82],"217":[2,6,108],"218":[2,6,72],"219":[2,4,97],"220":[3,4,42],"221":[3,1,164],"222":[2,3,292],"223":[4,3,363],"224":[5,3,470],"225":[4,3,278],"226":[3,7,153],"227":[4,3,323],"228":[3,3,255],"229":[3,3,165],"230":[2,9,187],"231":[2,9,583],"232":[6,9,207],"233":[2,3,75],"234":[3,3,59],"235":[6,1,160],"236":[2,6,30],"237":[5,6,114],"238":[8,8,172],"239":[9,8,233],"240":[13,8,131],"241":[7,8,168],"242":[3,6,31],"243":[4,9,159],"244":[5,9,305],"245":[6,9,170],"246":[3,9,239],"247":[7,9,274],"248":[2,6,48],"249":[6,8,367],"250":[5,6,283],"251":[8,11,203],"252":[4,6,99],"253":[3,10,36],"254":[1,10,80],"255":[1,10,456],"256":[6,6,422],"257":[7,6,88],"258":[2,6,95],"259":[3,6,61],"260":[6,1,198],"261":[6,6,64],"262":[4,6,25],"263":[6,9,195],"264":[7,9,123],"265":[7,9,210],"266":[3,9,104],"267":[4,9,274],"268":[8,9,182],"269":[12,9,128],"270":[9,9,167],"271":[7,6,185],"272":[4,6,39],"273":[2,19,16],"274":[2,19,14],"275":[2,19,18],"276":[2,19,70],"277":[2,10,50],"278":[3,12,52],"279":[1,12,37],"280":[2,13,78],"281":[2,13,151],"282":[6,10,78],"283":[7,16,39],"284":[6,16,93],"285":[7,16,38],"286":[7,16,101],"287":[7,16,193],"288":[7,16,115],"289":[7,16,137],"290":[4,10,83],"291":[4,10,175],"292":[6,14,231],"293":[4,10,129],"294":[6,14,133],"295":[2,10,267],"296":[6,12,257],"297":[4,10,303],"298":[6,14,112],"299":[5,14,90],"300":[4,10,274],"301":[5,10,210],"302":[8,15,238],"303":[4,10,419],"304":[2,6,92],"305":[3,6,42],"306":[3,1,167],"307":[2,3,52],"308":[4,3,459],"309":[5,3,39],"310":[2,8,172],"311":[2,10,112],"312":[2,10,56],"313":[2,10,140],"314":[2,8,69],"315":[6,8,391],"316":[2,3,360],"317":[3,3,230],"318":[7,3,138],"319":[2,3,79],"320":[3,3,55],"321":[3,1,150],"322":[2,3,79],"323":[3,3,235],"324":[4,7,94],"325":[4,7,188],"326":[9,3,153],"327":[4,13,46],"328":[4,13,259],"329":[4,3,127],"330":[4,8,253],"331":[7,3,178],"332":[4,11,174],"333":[4,11,162],"334":[3,11,45],"335":[4,11,260],"336":[7,3,476],"337":[6,3,110],"338":[4,10,215],"339":[5,10,127],"340":[2,3,71],"341":[3,3,52],"342":[2,1,108],"343":[2,2,33],"344":[4,2,397],"345":[3,2,124],"346":[1,5,150],"347":[4,5,158],"348":[5,5,24],"349":[5,10,345],"350":[4,10,46],"351":[3,5,81],"352":[2,5,439],"353":[7,5,170],"354":[3,12,101],"355":[9,12,354],"356":[2,5,57],"357":[2,5,15],"358":[2,5,258],"359":[3,2,222],"360":[7,5,315],"361":[4,5,469],"362":[2,5,106],"363":[2,5,118],"364":[2,5,207],"365":[8,5,321],"366":[3,5,288],"367":[2,5,459],"368":[2,2,109],"369":[3,2,64],"370":[5,1,191],"371":[2,5,46],"372":[5,5,296],"373":[2,5,232],"374":[4,5,183],"375":[4,5,266],"376":[6,9,392],"377":[5,5,107],"378":[5,5,149],"379":[4,5,150],"380":[6,10,182],"381":[6,10,331],"382":[3,5,154],"383":[1,5,194],"384":[2,5,127],"385":[9,5,203],"386":[6,5,163],"387":[4,5,75],"388":[4,5,86],"389":[4,5,39],"390":[2,5,191],"391":[4,8,215],"392":[4,5,65],"393":[3,5,231],"394":[4,5,267],"395":[4,5,141],"396":[2,5,87],"397":[3,5,63],"398":[8,1,4],"399":[16,9,1],"400":[1,8,124],"401":[4,8,50],"402":[7,8,144],"403":[2,8,14],"404":[4,8,24],"405":[3,8,41],"406":[6,1,1],"407":[5,7,20],"408":[8,7,26],"409":[5,7,32],"410":[8,7,22],"411":[4,7,15],"412":[5,7,19],"413":[5,7,26],"414":[7,7,28],"415":[7,7,32],"416":[4,7,27],"417":[4,7,29],"418":[7,7,16],"419":[4,1,149],"420":[2,4,57],"421":[4,4,516],"422":[3,7,162],"423":[4,11,133],"424":[3,11,121],"425":[3,4,216],"426":[2,4,113],"427":[6,4,142],"428":[4,13,234],"429":[4,13,174],"430":[5,13,153],"431":[11,4,197],"432":[5,15,251],"433":[6,15,216],"434":[5,15,241],"435":[5,15,178],"436":[4,15,69],"437":[5,15,158],"438":[5,4,75],"439":[4,13,280],"440":[2,4,115],"441":[3,4,50],"442":[2,1,64],"443":[1,1,1],"444":[1,1,137],"445":[2,1,163],"446":[2,3,78],"447":[4,3,184],"448":[2,7,22],"449":[2,7,32],"450":[1,7,24],"451":[2,1,450],"452":[2,1,201],"453":[1,3,71],"454":[2,3,118],"455":[4,1,216],"456":[3,1,42],"457":[2,1,863],"458":[2,1,8],"459":[3,3,15],"460":[3,3,347],"461":[1,1,162],"462":[3,1,414],"463":[5,1,587],"464":[3,1,197],"465":[2,4,78],"466":[9,4,41],"467":[2,4,29],"468":[2,4,47],"469":[6,4,18],"470":[2,4,30],"471":[4,1,223],"472":[2,1,501],"473":[6,1,538],"474":[2,1,1],"475":[6,2,1],"476":[1,8,13],"477":[1,8,5],"478":[5,2,1],"479":[1,7,12],"480":[6,2,1],"481":[1,8,6],"482":[1,8,24],"483":[6,2,1],"484":[1,8,3],"485":[1,8,4],"486":[6,2,1],"487":[1,8,3],"488":[4,1,1],"489":[1,4,5],"490":[1,4,4],"491":[1,4,4],"492":[1,4,6],"493":[1,4,8],"494":[1,4,2],"495":[6,1,36],"496":[3,1,66],"497":[1,1,80],"498":[5,2,23],"499":[3,1,17],"500":[1,1,1],"501":[5,1,128],"502":[5,5,13],"503":[3,1,38],"504":[1,1,144],"505":[4,1,1],"506":[2,4,70],"507":[1,4,175],"508":[1,1,171],"509":[1,1,81],"510":[2,1,1],"511":[3,2,103],"512":[2,2,89],"513":[1,1,67],"514":[2,1,1],"515":[5,2,41],"516":[2,2,27],"517":[2,1,11],"518":[1,2,21],"519":[1,2,22],"520":[1,1,9],"521":[1,1,1],"522":[1,1,1],"523":[1,1,1],"524":[1,1,1],"525":[1,1,1],"526":[7,1,1],"527":[1,7,78],"528":[5,7,38],"529":[2,1,41],"530":[1,1,4],"531":[1,1,4],"532":[1,1,8],"533":[1,1,9],"534":[1,1,32],"535":[1,1,1],"536":[1,1,97],"537":[1,1,16],"538":[1,1,54],"539":[2,1,52],"540":[2,1,16],"541":[4,1,1],"542":[2,4,77],"543":[3,4,21],"544":[2,4,11],"545":[2,4,80],"546":[1,1,27],"547":[1,1,10],"548":[1,1,43],"549":[1,1,13],"550":[1,1,1],"551":[1,1,1],"552":[2,1,34],"553":[1,1,13],"554":[2,1,54],"555":[2,1,60],"556":[2,1,44],"557":[1,1,80]},"averageFieldLength":[3.4336917562724016,5.2168458781362,112.50537634408599],"storedFields":{"0":{"title":"Наши статьи на других ресурсах","titles":[]},"1":{"title":"Архитектура и дизайн","titles":[]},"2":{"title":"Упрощение сложного","titles":["Архитектура и дизайн"]},"3":{"title":"Абстракция и инкапсуляция","titles":["Архитектура и дизайн"]},"4":{"title":"Разбиение проекта на подсистемы","titles":["Архитектура и дизайн"]},"5":{"title":"Package Diagram","titles":["Архитектура и дизайн"]},"6":{"title":"Клиент-серверная архитектура","titles":["Архитектура и дизайн"]},"7":{"title":"Routing","titles":["Архитектура и дизайн"]},"8":{"title":"Бизнес-анализ","titles":[]},"9":{"title":"Границы проекта","titles":["Бизнес-анализ"]},"10":{"title":"Существующие решения","titles":["Бизнес-анализ"]},"11":{"title":"Витрина","titles":["Бизнес-анализ"]},"12":{"title":"Магазин","titles":["Бизнес-анализ"]},"13":{"title":"Маркетплейс","titles":["Бизнес-анализ"]},"14":{"title":"Use case диаграмма","titles":["Бизнес-анализ"]},"15":{"title":"Модель данных","titles":[]},"16":{"title":"Категория и товар","titles":["Модель данных"]},"17":{"title":"Типы баз данных","titles":["Модель данных"]},"18":{"title":"1.json","titles":["Модель данных","Типы баз данных",null,null,null]},"19":{"title":"1.json","titles":["Модель данных","Типы баз данных",null,null,null]},"20":{"title":"Анализ рынка","titles":[]},"21":{"title":"Изучение конкурентов","titles":["Анализ рынка"]},"22":{"title":"Сайты-аналоги","titles":["Анализ рынка"]},"23":{"title":"Технический стек проекта","titles":[]},"24":{"title":"UI дизайн","titles":[]},"25":{"title":"Дизайн сайта","titles":["UI дизайн"]},"26":{"title":"Творческие способности","titles":["UI дизайн"]},"27":{"title":"UI макет","titles":[]},"28":{"title":"Основные компоненты страницы","titles":["UI макет"]},"29":{"title":"Header","titles":["UI макет","Основные компоненты страницы"]},"30":{"title":"Sidebar","titles":["UI макет","Основные компоненты страницы"]},"31":{"title":"Main panel","titles":["UI макет","Основные компоненты страницы"]},"32":{"title":"Footer","titles":["UI макет","Основные компоненты страницы"]},"33":{"title":"Мобильная версия","titles":["UI макет"]},"34":{"title":"Слабая связанность","titles":["UI макет"]},"35":{"title":"Адаптивность","titles":["UI макет"]},"36":{"title":"Вывод","titles":["UI макет"]},"37":{"title":"Выбор BaaS или CMS","titles":[]},"38":{"title":"JSON файлы товаров","titles":["Выбор BaaS или CMS"]},"39":{"title":"Выбор CMS","titles":["Выбор BaaS или CMS"]},"40":{"title":"Сервисы Supabase","titles":["Выбор BaaS или CMS"]},"41":{"title":"Адаптеры","titles":["Выбор BaaS или CMS"]},"42":{"title":"Модель данных в базе данных","titles":[]},"43":{"title":"Сущности","titles":["Модель данных в базе данных"]},"44":{"title":"Данные","titles":["Модель данных в базе данных"]},"45":{"title":"Categories table","titles":["Модель данных в базе данных","Данные",null]},"46":{"title":"Products table","titles":["Модель данных в базе данных","Данные",null]},"47":{"title":"Category-product join table","titles":["Модель данных в базе данных","Данные",null]},"48":{"title":"Поиск по json полям","titles":["Модель данных в базе данных"]},"49":{"title":"Supabase REST API","titles":[]},"50":{"title":"Supabase SDK","titles":["Supabase REST API"]},"51":{"title":"Установка:","titles":["Supabase REST API","Supabase SDK",null]},"52":{"title":"Использование:","titles":["Supabase REST API","Supabase SDK",null]},"53":{"title":"Supabase REST API","titles":["Supabase REST API"]},"54":{"title":"Hoppscotch","titles":[]},"55":{"title":"Работа с API","titles":["Hoppscotch"]},"56":{"title":"Endpoints","titles":["Hoppscotch"]},"57":{"title":"Supabase","titles":[]},"58":{"title":"Создание проекта","titles":["Supabase"]},"59":{"title":"Безопасность и доступ","titles":["Supabase"]},"60":{"title":"Онлайн маркетплейс","titles":[]},"61":{"title":"Проект Arty-Crafty","titles":["Онлайн маркетплейс"]},"62":{"title":"Причины","titles":["Онлайн маркетплейс"]},"63":{"title":"Цель","titles":["Онлайн маркетплейс"]},"64":{"title":"Что здесь будет?","titles":["Онлайн маркетплейс"]},"65":{"title":"Для чего?","titles":["Онлайн маркетплейс"]},"66":{"title":"План работы","titles":[]},"67":{"title":"Стадии разработки ПО","titles":["План работы"]},"68":{"title":"Бизнес-анализ","titles":["План работы"]},"69":{"title":"Архитектура и дизайн","titles":["План работы"]},"70":{"title":"Разработка","titles":["План работы"]},"71":{"title":"Развертывание","titles":["План работы"]},"72":{"title":"Тестирование и QA","titles":["План работы"]},"73":{"title":"Документирование","titles":["План работы"]},"74":{"title":"Поддержка","titles":["План работы"]},"75":{"title":"Цели и задачи проекта","titles":[]},"76":{"title":"Цели данного проекта:","titles":["Цели и задачи проекта"]},"77":{"title":"Нефункциональные требования (software quality attributes)","titles":["Цели и задачи проекта"]},"78":{"title":"Общие функциональные требования","titles":["Цели и задачи проекта"]},"79":{"title":"Этапы развития приложения (приблизительно)","titles":["Цели и задачи проекта"]},"80":{"title":"Репозиторий и сайт проекта","titles":[]},"81":{"title":"Работа с API на фронтенде","titles":[]},"82":{"title":"Supabase адаптер","titles":["Работа с API на фронтенде"]},"83":{"title":"api/products.ts","titles":["Работа с API на фронтенде","Supabase адаптер",null,null,null]},"84":{"title":"Мобильное меню, CSS","titles":[]},"85":{"title":"IconButton","titles":["Мобильное меню, CSS"]},"86":{"title":"SCSS => CSS","titles":["Мобильное меню, CSS"]},"87":{"title":"Tag и CMV","titles":["Мобильное меню, CSS"]},"88":{"title":"Codeium","titles":[]},"89":{"title":"Автокомплит","titles":["Codeium"]},"90":{"title":"Чат-бот","titles":["Codeium"]},"91":{"title":"Explain, Refactor, JSDoc","titles":["Codeium"]},"92":{"title":"Explain problem","titles":["Codeium"]},"93":{"title":"Вывод","titles":["Codeium"]},"94":{"title":"Кастомизация","titles":[]},"95":{"title":"Персонализация","titles":["Кастомизация"]},"96":{"title":"Views","titles":["Кастомизация"]},"97":{"title":"Routes","titles":["Кастомизация"]},"98":{"title":"Header","titles":["Кастомизация"]},"99":{"title":"Sidebar","titles":["Кастомизация"]},"100":{"title":"Небольшой рефакторинг","titles":["Кастомизация"]},"101":{"title":"Избранное","titles":[]},"102":{"title":"Иконка на карточке товара","titles":["Избранное"]},"103":{"title":"Композабл useFavourites","titles":["Избранное"]},"104":{"title":"Сохранение между сессиями","titles":["Избранное"]},"105":{"title":"Бэджик","titles":["Избранное"]},"106":{"title":"Tag и CMV","titles":["Избранное"]},"107":{"title":"Категория товаров","titles":[]},"108":{"title":"Layout","titles":["Категория товаров"]},"109":{"title":"Данные и API","titles":["Категория товаров"]},"110":{"title":"Создание проекта","titles":[]},"111":{"title":"Репозиторий на GitHub","titles":["Создание проекта"]},"112":{"title":"vue-webapp","titles":["Создание проекта"]},"113":{"title":"Абстракция канала связи с бэкендом","titles":[]},"114":{"title":"API сервис","titles":["Абстракция канала связи с бэкендом"]},"115":{"title":"Аутентификация и авторизация","titles":[]},"116":{"title":"Варианты задействовать свой бэкенд для фронтендера","titles":[]},"117":{"title":"CORS","titles":[]},"118":{"title":"Протоколы. To REST или не REST?","titles":[]},"119":{"title":"Приложение: Миграция с Vue 2","titles":[]},"120":{"title":"Другой способ загрузки и запуска приложения","titles":["Приложение: Миграция с Vue 2"]},"121":{"title":"Регистрация глобальных компонентов, плагинов и так далее","titles":["Приложение: Миграция с Vue 2"]},"122":{"title":"Свойство data теперь всегда является функцией","titles":["Приложение: Миграция с Vue 2"]},"123":{"title":"Больше реактивных возможностей","titles":["Приложение: Миграция с Vue 2"]},"124":{"title":"Изменения в v-model, props и events","titles":["Приложение: Миграция с Vue 2"]},"125":{"title":"Удалена совместимость со старыми браузерами","titles":["Приложение: Миграция с Vue 2"]},"126":{"title":"Изменения в организации каталогов и файлов","titles":["Приложение: Миграция с Vue 2"]},"127":{"title":"Изменения в роутере и state manager","titles":["Приложение: Миграция с Vue 2"]},"128":{"title":"Новые компоненты и другие изменения.","titles":["Приложение: Миграция с Vue 2"]},"129":{"title":"Другие изменения","titles":["Приложение: Миграция с Vue 2"]},"130":{"title":"Итог","titles":["Приложение: Миграция с Vue 2"]},"131":{"title":"Развертывание приложения","titles":[]},"132":{"title":"Технические требования","titles":["Развертывание приложения"]},"133":{"title":"Что включает в себя публикация веб-приложения?","titles":["Развертывание приложения"]},"134":{"title":"Домены, серверы доменных имен (DNS) и записи DNS","titles":["Развертывание приложения","Что включает в себя публикация веб-приложения?"]},"135":{"title":"Размышления о создании приложения для развертывания","titles":["Развертывание приложения"]},"136":{"title":"/chapter 5/to-do SPA/src/router/index.js","titles":["Развертывание приложения","Размышления о создании приложения для развертывания","Домены, серверы доменных имен (DNS) и записи DNS",null]},"137":{"title":"Опции и конфигурации веб-сервера","titles":["Развертывание приложения"]},"138":{"title":"Конфигурация HTTP-сервера Apache","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"139":{"title":"/.htaccess","titles":["Развертывание приложения","Опции и конфигурации веб-сервера","Конфигурация HTTP-сервера Apache",null]},"140":{"title":"Настройка сервера Nginx","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"141":{"title":"/etc/nginx/sites-available/default","titles":["Развертывание приложения","Опции и конфигурации веб-сервера","Настройка сервера Nginx",null]},"142":{"title":"Другие серверы","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"143":{"title":"Перенос файлов на сервер","titles":["Развертывание приложения"]},"144":{"title":"Защита веб-приложения с помощью Let\'s Encrypt","titles":["Развертывание приложения"]},"145":{"title":"Подведение итогов","titles":["Развертывание приложения"]},"146":{"title":"Вопросы для проверки","titles":["Развертывание приложения"]},"147":{"title":"Фреймворк Vue 3","titles":[]},"148":{"title":"Прогрессивный фреймворк","titles":["Фреймворк Vue 3"]},"149":{"title":"Использование Vue в веб-приложении","titles":["Фреймворк Vue 3"]},"150":{"title":"Путь сборщика, лучший путь...","titles":["Фреймворк Vue 3","Использование Vue в веб-приложении"]},"151":{"title":"Понимание однофайловых компонентов","titles":["Фреймворк Vue 3"]},"152":{"title":"Разные варианты - options, composition, и script setup API","titles":["Фреймворк Vue 3"]},"153":{"title":"Изучение встроенных директив в Vue 3","titles":["Фреймворк Vue 3"]},"154":{"title":"v-bind: (сокращение ":")","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"155":{"title":"v-show","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"156":{"title":"v-if, v-else и v-else-if","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"157":{"title":"v-for и :key","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"158":{"title":"v-model","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"159":{"title":"v-on: (и сокращение @)","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"160":{"title":"Встроенные компоненты","titles":["Фреймворк Vue 3"]},"161":{"title":"Кодовые соглашения (code conventions) в книге","titles":["Фреймворк Vue 3"]},"162":{"title":"Переменные и пропсы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"163":{"title":"Константы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"164":{"title":"Имена классов и компонентов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"165":{"title":"Функции, методы, события и имена файлов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"166":{"title":"Экземпляры","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"167":{"title":"Подведение итогов","titles":["Фреймворк Vue 3"]},"168":{"title":"Вопросы для проверки","titles":["Фреймворк Vue 3"]},"169":{"title":"Бонусная глава - Шаблоны UX","titles":[]},"170":{"title":"Технические требования","titles":["Бонусная глава - Шаблоны UX"]},"171":{"title":"UI-дизайн против UX-дизайна","titles":["Бонусная глава - Шаблоны UX"]},"172":{"title":"Принципы проектирования пользовательского интерфейса","titles":["Бонусная глава - Шаблоны UX"]},"173":{"title":"Достаточный контраст или различие между элементами","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"174":{"title":"Стимулировать повторение и быть последовательным.","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"175":{"title":"Внимательно следите за выравниванием и направлением","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"176":{"title":"Используйте близость и расстояние, чтобы показать естественные группы","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"177":{"title":"Законы проектирования пользовательского интерфейса","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"178":{"title":"Закон Фитта","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"179":{"title":"Закон Хика","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"180":{"title":"Восемь правил Бена Шнайдермана","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"181":{"title":"Принципы проектирования UX","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"182":{"title":"Общие шаблоны для работы с данными","titles":["Бонусная глава - Шаблоны UX"]},"183":{"title":"Элементы ввода HTML","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными"]},"184":{"title":"Чекбоксы, радиокнопки и тумблеры","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"185":{"title":"Чипы, таблетки или теги","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"186":{"title":"Подсказки (tooltips)","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"187":{"title":"Уведомляющие точки, пузырьки, метки или значки","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"188":{"title":"Тостовые уведомления","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"189":{"title":"Карусель или слайдеры изображений","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"190":{"title":"Панели прогресса (progress bars) и спиннеры","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"191":{"title":"./components/Spinner.vue","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML","Панели прогресса (progress bars) и спиннеры"]},"192":{"title":"Пагинация (пейджер) и бесконечный скроллер","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"193":{"title":"./src/components/InfiniteScroller.vue","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML","Пагинация (пейджер) и бесконечный скроллер"]},"194":{"title":"Общие шаблоны для взаимодействия и навигации","titles":["Бонусная глава - Шаблоны UX"]},"195":{"title":"Размещение меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"196":{"title":"Хлебные крошки (breadcrumbs)","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"197":{"title":"Модальные диалоги","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"198":{"title":"Иконки меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"199":{"title":"Аккордеонные меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"200":{"title":"Мегаменю","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"201":{"title":"Выпадающие меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"202":{"title":"Общие шаблоны для организации контента","titles":["Бонусная глава - Шаблоны UX"]},"203":{"title":"Отзывчивые (responsive) приложения","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"204":{"title":"Домашняя ссылка","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"205":{"title":"Главная (hero) секция, призыв к действию (call to action) и иконки социальных сетей","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"206":{"title":"Другие шаблоны","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"207":{"title":"Темные шаблоны","titles":["Бонусная глава - Шаблоны UX"]},"208":{"title":"Вопросы с подвохом","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"209":{"title":"Проникновение в корзину","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"210":{"title":"Приманка для тараканов (Roach motels)","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"211":{"title":"Privacy Zuckering","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"212":{"title":"Предотвращение сравнения цен","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"213":{"title":"Ненаправленность","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"214":{"title":"Скрытые расходы","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"215":{"title":"Приманка и подмена","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"216":{"title":"Подтверждение позора (Confirm shaming)","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"217":{"title":"Замаскированная реклама","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"218":{"title":"Дружественный спам","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"219":{"title":"Подведение итогов","titles":["Бонусная глава - Шаблоны UX"]},"220":{"title":"Вопросы для проверки","titles":["Бонусная глава - Шаблоны UX"]},"221":{"title":"Установка рабочего проекта","titles":[]},"222":{"title":"Технические требования","titles":["Установка рабочего проекта"]},"223":{"title":"Настройка проекта и инструменты","titles":["Установка рабочего проекта"]},"224":{"title":"Структура папок и её модификации","titles":["Установка рабочего проекта"]},"225":{"title":"Интеграция с CSS-фреймворками","titles":["Установка рабочего проекта"]},"226":{"title":"Фреймворк w3.css","titles":["Установка рабочего проекта","Интеграция с CSS-фреймворками"]},"227":{"title":"FontAwesome - это просто замечательно","titles":["Установка рабочего проекта"]},"228":{"title":"Опции конфигурации Vite","titles":["Установка рабочего проекта"]},"229":{"title":"Приложение To-Do","titles":["Установка рабочего проекта"]},"230":{"title":"App.vue","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"231":{"title":"ToDos.vue","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"232":{"title":"Краткая критика нашего приложения To-Do","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"233":{"title":"Подведение итогов","titles":["Установка рабочего проекта"]},"234":{"title":"Вопросы для проверки","titles":["Установка рабочего проекта"]},"235":{"title":"Композиция пользовательского интерфейса с помощью компонентов","titles":[]},"236":{"title":"Технические требования","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"237":{"title":"Составление страницы с помощью компонентов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"238":{"title":"Этап 1 - определение макетов и элементов пользовательского интерфейса","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"239":{"title":"Шаг 2 - определение связей, потока данных, взаимодействий и событий","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"240":{"title":"Шаг 3 - определение элементов пользовательской интерактивности (входов, диалогов, уведомлений и т.д.)","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"241":{"title":"Шаг 4 - выявление шаблонов проектирования и компромиссов","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"242":{"title":"Компоненты в деталях","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"243":{"title":"Локальные и глобальные компоненты","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"244":{"title":"Статический, асинхронный и динамический импорт","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"245":{"title":"Пропсы, события и директива v-model","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"246":{"title":"Настраиваемые контроллеры ввода","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"247":{"title":"Инъекция зависимости с помощью Provide и Inject","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"248":{"title":"Специальные компоненты","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"249":{"title":"Слоты, слоты и еще раз слоты...","titles":["Композиция пользовательского интерфейса с помощью компонентов","Специальные компоненты"]},"250":{"title":"Композабл функции (composables) и миксины","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"251":{"title":"Динамические компоненты с помощью "component :is"","titles":["Композиция пользовательского интерфейса с помощью компонентов","Композабл функции (composables) и миксины"]},"252":{"title":"Реальный пример - плагин модалов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"253":{"title":"Настройка нашего проекта","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"254":{"title":"Конструкция","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"255":{"title":"Реализация","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"256":{"title":"Реализация нашего нового приложения To-Do","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"257":{"title":"Небольшая критика нашего нового приложения To-Do","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"258":{"title":"Подведение итогов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"259":{"title":"Вопросы для проверки","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"260":{"title":"Принципы и шаблоны проектирования программного обеспечения","titles":[]},"261":{"title":"Каковы принципы проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"262":{"title":"Неполный список принципов проектирования","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"263":{"title":"Separation of concerns (Разделение ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"264":{"title":"Composition over inheritance (Композиция над наследованием)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"265":{"title":"Single responsibility principle (Принцип единой ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"266":{"title":"Encapsulation (Инкапсуляция)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"267":{"title":"KIC - keep it clean","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"268":{"title":"DRY – don’t repeat yourself (не повторяйся)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"269":{"title":"KISS - keep it simple and short (держи это простым и коротким)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"270":{"title":"Code for the next (Пиши код для следующего)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"271":{"title":"Что такое шаблон проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"272":{"title":"Краткий справочный список шаблонов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"273":{"title":"Порождающие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"274":{"title":"Поведенческие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"275":{"title":"Структурные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"276":{"title":"Асинхронные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"277":{"title":"Шаблон Singleton","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"278":{"title":"Когда его использовать","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"279":{"title":"Реализация","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"280":{"title":"Метод 1","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"281":{"title":"Метод 2","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"282":{"title":"Шаблон Dependency injection (инъекция зависимостей)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"283":{"title":"./chapter 2/dependency-injection-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"284":{"title":"./chapter 2/dependency-injection-2.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"285":{"title":"./chapter 2/dependency-injection-3.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"286":{"title":"./chapter 2/dependency-injection-4.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"287":{"title":"./chapter 2/dependency-injection-5.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"288":{"title":"./chapter 2/dependency-injection-6.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"289":{"title":"./chapter 2/dependency-injection-7.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"290":{"title":"Шаблон factory (фабрика)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"291":{"title":"Шаблон Observer (наблюдатель)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"292":{"title":"./chapter 2/Observer-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Observer (наблюдатель)"]},"293":{"title":"Шаблон Command (команда)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"294":{"title":"./chapter 2/Command-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Command (команда)"]},"295":{"title":"Шаблон Proxy","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"296":{"title":"./chapter 2/proxy-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Proxy"]},"297":{"title":"Шаблон Decorator (декоратор)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"298":{"title":"./chapter 2/decorator-1.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"299":{"title":"./chapter 2/decorator-2.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"300":{"title":"Шаблон Façade (фасад)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"301":{"title":"Шаблон Callback (обратный вызов)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"302":{"title":"./chapter 2/callback-1.js - Синхронный Фибоначчи","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Callback (обратный вызов)"]},"303":{"title":"Шаблон Promise (обещаниe)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"304":{"title":"Подведение итогов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"305":{"title":"Вопросы для проверки","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"306":{"title":"Прогрессивные веб-приложения","titles":[]},"307":{"title":"Технические требования","titles":["Прогрессивные веб-приложения"]},"308":{"title":"PWA или устанавливаемые SPA","titles":["Прогрессивные веб-приложения"]},"309":{"title":"Увеличение SPA до уровня PWA","titles":["Прогрессивные веб-приложения"]},"310":{"title":"Файл манифеста","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"311":{"title":"Необходимо:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"312":{"title":"Рекомендуется:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"313":{"title":"Описательные:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"314":{"title":"Тестирование манифеста","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"315":{"title":"Подсказка к установке (Install prompt)","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"316":{"title":"Service workers","titles":["Прогрессивные веб-приложения"]},"317":{"title":"Плагин Vite-PWA","titles":["Прогрессивные веб-приложения"]},"318":{"title":"Тестирование показателей PWA с помощью Google Lighthouse","titles":["Прогрессивные веб-приложения"]},"319":{"title":"Подведение итогов","titles":["Прогрессивные веб-приложения"]},"320":{"title":"Вопросы для проверки","titles":["Прогрессивные веб-приложения"]},"321":{"title":"Управление потоками данных","titles":[]},"322":{"title":"Технические требования","titles":["Управление потоками данных"]},"323":{"title":"Основное взаимодействие компонентов","titles":["Управление потоками данных"]},"324":{"title":"/basic/ParentBasic.vue","titles":["Управление потоками данных","Основное взаимодействие компонентов",null,null,null]},"325":{"title":"/basic/Child.vue","titles":["Управление потоками данных","Основное взаимодействие компонентов",null,null,null]},"326":{"title":"Реализация шины событий с помощью шаблонов Singleton и Observer","titles":["Управление потоками данных"]},"327":{"title":"/services/MessageBus.js","titles":["Управление потоками данных","Реализация шины событий с помощью шаблонов Singleton и Observer",null,null]},"328":{"title":"/bus/Child.vue","titles":["Управление потоками данных","Реализация шины событий с помощью шаблонов Singleton и Observer",null,null]},"329":{"title":"Реализация базового реактивного состояния","titles":["Управление потоками данных"]},"330":{"title":"/service/SimpleState.js","titles":["Управление потоками данных","Реализация базового реактивного состояния",null,null]},"331":{"title":"Реализация мощного реактивного стора с помощью Pinia","titles":["Управление потоками данных"]},"332":{"title":"Options API basic store","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"333":{"title":"/stores/counter.js","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"334":{"title":"./main.js","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"335":{"title":"/pinia/ChildPinia.vue","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"336":{"title":"Хранилища данных браузера - сессионные, локальные и IndexedDB","titles":["Управление потоками данных"]},"337":{"title":"Экспериментируем с шаблонами reactivity и Proxies","titles":["Управление потоками данных"]},"338":{"title":"/services/sessionStorage.js","titles":["Управление потоками данных","Экспериментируем с шаблонами reactivity и Proxies",null,null]},"339":{"title":"/session_storage/ChildSession.vue","titles":["Управление потоками данных","Экспериментируем с шаблонами reactivity и Proxies",null,null]},"340":{"title":"Подведение итогов","titles":["Управление потоками данных"]},"341":{"title":"Вопросы для проверки","titles":["Управление потоками данных"]},"342":{"title":"Одностраничные приложения","titles":[]},"343":{"title":"Технические требования","titles":["Одностраничные приложения"]},"344":{"title":"Что такое SPA?","titles":["Одностраничные приложения"]},"345":{"title":"Vue 3 роутер","titles":["Одностраничные приложения"]},"346":{"title":"Установка","titles":["Одностраничные приложения","Vue 3 роутер"]},"347":{"title":"Новое приложение To-Do","titles":["Одностраничные приложения","Vue 3 роутер"]},"348":{"title":"Определение маршрутов и объект Router","titles":["Одностраничные приложения","Vue 3 роутер"]},"349":{"title":"/src/router/index.js","titles":["Одностраничные приложения","Vue 3 роутер","Определение маршрутов и объект Router"]},"350":{"title":"/src/main.js","titles":["Одностраничные приложения","Vue 3 роутер","Определение маршрутов и объект Router"]},"351":{"title":"Шаблонные компоненты маршрутизатора","titles":["Одностраничные приложения","Vue 3 роутер"]},"352":{"title":"App.vue","titles":["Одностраничные приложения","Vue 3 роутер"]},"353":{"title":"Вложенные маршруты, именованные представления и программная навигация","titles":["Одностраничные приложения","Vue 3 роутер"]},"354":{"title":"Определение вложенных маршрутов","titles":["Одностраничные приложения","Vue 3 роутер","Вложенные маршруты, именованные представления и программная навигация"]},"355":{"title":"/src/views/Directory.vue component, lines 13-18","titles":["Одностраничные приложения","Vue 3 роутер","Вложенные маршруты, именованные представления и программная навигация"]},"356":{"title":".push()","titles":["Одностраничные приложения","Vue 3 роутер"]},"357":{"title":".replace()","titles":["Одностраничные приложения","Vue 3 роутер"]},"358":{"title":".go()","titles":["Одностраничные приложения","Vue 3 роутер"]},"359":{"title":"Исследование шаблонов аутентификации","titles":["Одностраничные приложения"]},"360":{"title":"Простая аутентификация по имени пользователя и паролю","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"361":{"title":"OpenID и сторонняя аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"362":{"title":"1.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"363":{"title":"2.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"364":{"title":"3.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"365":{"title":"Беспарольная аутентификация или аутентификация по одноразовому паролю (OTP)","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"366":{"title":"2FA - двухфакторная аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"367":{"title":"Web3-аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"368":{"title":"Подведение итогов","titles":["Одностраничные приложения"]},"369":{"title":"Вопросы для проверки","titles":["Одностраничные приложения"]},"370":{"title":"Тестирование и системы контроля версий","titles":[]},"371":{"title":"Технические требования","titles":["Тестирование и системы контроля версий"]},"372":{"title":"Что такое тестирование и TDD","titles":["Тестирование и системы контроля версий"]},"373":{"title":"Что тестировать","titles":["Тестирование и системы контроля версий"]},"374":{"title":"Наш базовый пример приложения","titles":["Тестирование и системы контроля версий"]},"375":{"title":"Установка и использование Vitest","titles":["Тестирование и системы контроля версий"]},"376":{"title":"/src/tests/Fibonacci.test.js","titles":["Тестирование и системы контроля версий","Установка и использование Vitest",null,null]},"377":{"title":"Специальный случай утверждения - намеренная ошибка","titles":["Тестирование и системы контроля версий"]},"378":{"title":"Специальный случай утверждения - асинхронный код","titles":["Тестирование и системы контроля версий"]},"379":{"title":"Установка Vue Test Utils","titles":["Тестирование и системы контроля версий"]},"380":{"title":"/src/tests/FibonacciOutput.test.js","titles":["Тестирование и системы контроля версий","Установка Vue Test Utils",null,null]},"381":{"title":"/src/tests/FibonacciInput.test.js","titles":["Тестирование и системы контроля версий","Установка Vue Test Utils",null,null]},"382":{"title":"In-source тестирование","titles":["Тестирование и системы контроля версий"]},"383":{"title":"Покрытие","titles":["Тестирование и системы контроля версий"]},"384":{"title":"Интерфейс Vitest","titles":["Тестирование и системы контроля версий"]},"385":{"title":"Что такое source control и зачем он нужен?","titles":["Тестирование и системы контроля версий"]},"386":{"title":"Управление исходными текстами с помощью Git","titles":["Тестирование и системы контроля версий"]},"387":{"title":"Установка в системах Windows","titles":["Тестирование и системы контроля версий"]},"388":{"title":"Установка в системах Linux","titles":["Тестирование и системы контроля версий"]},"389":{"title":"Установка в системах macOS","titles":["Тестирование и системы контроля версий"]},"390":{"title":"Использование Git","titles":["Тестирование и системы контроля версий"]},"391":{"title":"/chapter 10/.gitignore","titles":["Тестирование и системы контроля версий","Использование Git",null,null]},"392":{"title":"Управление ветвями и слияниями","titles":["Тестирование и системы контроля версий"]},"393":{"title":"Конфликты при слиянии","titles":["Тестирование и системы контроля версий"]},"394":{"title":"Работа с удаленными репозиториями","titles":["Тестирование и системы контроля версий"]},"395":{"title":"Непрерывная интеграция и доставка","titles":["Тестирование и системы контроля версий"]},"396":{"title":"Подведение итогов","titles":["Тестирование и системы контроля версий"]},"397":{"title":"Вопросы для проверки","titles":["Тестирование и системы контроля версий"]},"398":{"title":"Vue.js 3 - Шаблоны проектирования и лучшие практики","titles":[]},"399":{"title":"Здесь представлен перевод книги "Vue.js 3 - Design Patterns and Best Practices" на русский язык","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики",null,null]},"400":{"title":"Предисловие","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"401":{"title":"Для кого эта книга","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"402":{"title":"Чтобы получить максимальную пользу от этой книги","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"403":{"title":"Купить книгу","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"404":{"title":"Скачать файлы кода примеров","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"405":{"title":"Код в действии","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"406":{"title":"Что включает в себя эта книга","titles":[]},"407":{"title":"Глава 1, Фреймворк Vue 3","titles":["Что включает в себя эта книга",null]},"408":{"title":"Глава 2, Принципы и шаблоны проектирования программного обеспечения","titles":["Что включает в себя эта книга",null]},"409":{"title":"Глава 3, Создание рабочего проекта","titles":["Что включает в себя эта книга",null]},"410":{"title":"Глава 4, Композиция пользовательского интерфейса с помощью компонентов","titles":["Что включает в себя эта книга",null]},"411":{"title":"Глава 5, Одностраничные приложения","titles":["Что включает в себя эта книга",null]},"412":{"title":"Глава 6, Прогрессивные веб-приложения","titles":["Что включает в себя эта книга",null]},"413":{"title":"Глава 7, Управление потоками данных","titles":["Что включает в себя эта книга",null]},"414":{"title":"Глава 8, Многопоточность с помощью web-workers","titles":["Что включает в себя эта книга",null]},"415":{"title":"Глава 9, Тестирование и контроль исходных текстов","titles":["Что включает в себя эта книга",null]},"416":{"title":"Глава 10, Развертывание приложения","titles":["Что включает в себя эта книга",null]},"417":{"title":"Глава 11, UX Patterns","titles":["Что включает в себя эта книга",null]},"418":{"title":"Приложение: Миграция с Vue 2 на Vue 3","titles":["Что включает в себя эта книга",null]},"419":{"title":"Многопоточность с Web Workers","titles":[]},"420":{"title":"Технические требования","titles":["Многопоточность с Web Workers"]},"421":{"title":"Введение в Web workers","titles":["Многопоточность с Web Workers"]},"422":{"title":"Реализация web worker","titles":["Многопоточность с Web Workers","Введение в Web workers"]},"423":{"title":"./my_worker.js","titles":["Многопоточность с Web Workers","Введение в Web workers","Реализация web worker",null]},"424":{"title":"./main.js","titles":["Многопоточность с Web Workers","Введение в Web workers","Реализация web worker",null]},"425":{"title":"Шаблон Business delegate","titles":["Многопоточность с Web Workers"]},"426":{"title":"Шаблон Dispatcher","titles":["Многопоточность с Web Workers"]},"427":{"title":"Установка конвейера взаимодействия с веб-рабочим","titles":["Многопоточность с Web Workers"]},"428":{"title":"./services/WebWorker.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"429":{"title":"./webworker/index.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"430":{"title":"./webworker/services/test.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"431":{"title":"Получение доступа к IndexedDB с помощью DexieJS в web worker.","titles":["Многопоточность с Web Workers"]},"432":{"title":"/src/components/DbNotes.vue","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"433":{"title":"./src/webworker/services/dbService.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"434":{"title":"./src/webworker/index.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"435":{"title":"./webworker/services/network.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"436":{"title":"./webworker/index.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"437":{"title":"./src/components/NetworkCommunication.vue","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"438":{"title":"Простой NodeJS-сервер для тестирования","titles":["Многопоточность с Web Workers"]},"439":{"title":"./server/index.js","titles":["Многопоточность с Web Workers","Простой NodeJS-сервер для тестирования","Реализация web worker",null]},"440":{"title":"Подведение итогов","titles":["Многопоточность с Web Workers"]},"441":{"title":"Вопросы для проверки","titles":["Многопоточность с Web Workers"]},"442":{"title":"CI/CD","titles":[]},"443":{"title":"Docker","titles":[]},"444":{"title":"Хостинг","titles":[]},"445":{"title":"Архитектурные решения","titles":[]},"446":{"title":"Use cases","titles":["Архитектурные решения",null]},"447":{"title":"Лучшие практики и соображения","titles":["Архитектурные решения",null]},"448":{"title":"AppLoader.vue","titles":["Архитектурные решения",null,"Лучшие практики и соображения",null]},"449":{"title":"useAppLoader.ts","titles":["Архитектурные решения",null,"Лучшие практики и соображения",null]},"450":{"title":"SomeComponent","titles":["Архитектурные решения",null,"Лучшие практики и соображения",null]},"451":{"title":"Github Actions","titles":[]},"452":{"title":"Ресурсы приложения","titles":[]},"453":{"title":"BaseIcon","titles":["Ресурсы приложения",null,null]},"454":{"title":"icons.js","titles":["Ресурсы приложения",null,null]},"455":{"title":"Создание и сборка приложения","titles":[]},"456":{"title":"Подскажите удобную библиотеку","titles":[]},"457":{"title":"Настройка IDE","titles":[]},"458":{"title":"Полезные советы","titles":[]},"459":{"title":"Карусель или слайдер","titles":["Полезные советы",null]},"460":{"title":"Дата и время","titles":["Полезные советы",null]},"461":{"title":"Тестирование","titles":[]},"462":{"title":"О фронтенд фреймворках","titles":[]},"463":{"title":"State management во Vue 3","titles":[]},"464":{"title":"Архитектура фронтэнд приложений","titles":[]},"465":{"title":"Избегайте зависимостей","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"466":{"title":"Используйте обертки над компонентами UI библиотек и сторонних утилит","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"467":{"title":"Регулярный рефакторинг","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"468":{"title":"Используйте CSS3","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"469":{"title":"Используйте современные стандарты и возможности языков","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"470":{"title":"Документируйте проект","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"471":{"title":"CSS и UI библиотеки","titles":[]},"472":{"title":"Изучение Vue","titles":[]},"473":{"title":"SPA, PWA, SSG, SSR и SEO","titles":[]},"474":{"title":"История изменений","titles":[]},"475":{"title":"v1.4 (24-11-2023)","titles":["История изменений"]},"476":{"title":"Новое","titles":["История изменений","v1.4 (24-11-2023)",null]},"477":{"title":"Изменено","titles":["История изменений","v1.4 (24-11-2023)",null]},"478":{"title":"v1.3 (10-10-2023)","titles":["История изменений"]},"479":{"title":"Изменено","titles":["История изменений","v1.3 (10-10-2023)",null]},"480":{"title":"v1.2 (27-09-2023)","titles":["История изменений"]},"481":{"title":"Новое","titles":["История изменений","v1.2 (27-09-2023)",null]},"482":{"title":"Изменено","titles":["История изменений","v1.2 (27-09-2023)",null]},"483":{"title":"v1.1 (15-09-2023)","titles":["История изменений"]},"484":{"title":"Новое","titles":["История изменений","v1.1 (15-09-2023)"]},"485":{"title":"Изменено","titles":["История изменений","v1.1 (15-09-2023)"]},"486":{"title":"v1.0 (11-09-2023)","titles":["История изменений"]},"487":{"title":"Новое","titles":["История изменений","v1.0 (11-09-2023)"]},"488":{"title":"Шпаргалки (Cheat Sheet)","titles":[]},"489":{"title":"Vue","titles":["Шпаргалки (Cheat Sheet)",null]},"490":{"title":"JavaScript","titles":["Шпаргалки (Cheat Sheet)",null]},"491":{"title":"HTML","titles":["Шпаргалки (Cheat Sheet)",null]},"492":{"title":"CSS","titles":["Шпаргалки (Cheat Sheet)",null]},"493":{"title":"Typescript","titles":["Шпаргалки (Cheat Sheet)",null]},"494":{"title":"Markdown","titles":["Шпаргалки (Cheat Sheet)",null]},"495":{"title":"Внесите лепту в развитие данного ресурса","titles":[]},"496":{"title":"Глоссарий и сокращения","titles":[]},"497":{"title":"Предисловие","titles":[]},"498":{"title":"У нас есть Телеграм канал","titles":["Предисловие",null]},"499":{"title":"Участие в проекте","titles":[]},"500":{"title":"Установка","titles":[]},"501":{"title":"Установка через create vue-webapp","titles":["Установка"]},"502":{"title":"Инициализация и запуск веб приложения","titles":["Установка","Установка через create vue-webapp"]},"503":{"title":"Установка из репозитория","titles":["Установка"]},"504":{"title":"Принципы","titles":[]},"505":{"title":"Vue 3 webapp билдер","titles":[]},"506":{"title":"Краткое описание","titles":["Vue 3 webapp билдер"]},"507":{"title":"Обоснование","titles":["Vue 3 webapp билдер"]},"508":{"title":"Цели","titles":[]},"509":{"title":"Адаптивность","titles":[]},"510":{"title":"API модуль","titles":[]},"511":{"title":"API (REST)","titles":["API модуль"]},"512":{"title":"JSON-RPC","titles":["API модуль"]},"513":{"title":"BaseIcon","titles":[]},"514":{"title":"Детали реализации","titles":[]},"515":{"title":"Инъекции кода в index.html","titles":["Детали реализации"]},"516":{"title":"CSS tricks","titles":["Детали реализации"]},"517":{"title":"Navigation drawers","titles":[]},"518":{"title":"SimpleDrawer","titles":["Navigation drawers"]},"519":{"title":"TouchSlideoutDrawer","titles":["Navigation drawers"]},"520":{"title":"Footers","titles":[]},"521":{"title":"SimpleFooter","titles":["Footers"]},"522":{"title":"RichFooter","titles":["Footers"]},"523":{"title":"MantineSimpleFooter","titles":["Footers"]},"524":{"title":"MantineRichFooter","titles":["Footers"]},"525":{"title":"DistributedFooter","titles":["Footers"]},"526":{"title":"Github Actions сценарий для развертывания на Github Pages","titles":[]},"527":{"title":"Deployment","titles":["Github Actions сценарий для развертывания на Github Pages"]},"528":{"title":"Настройка base в Vite конфиге","titles":["Github Actions сценарий для развертывания на Github Pages"]},"529":{"title":"Google analytics","titles":[]},"530":{"title":"Headers","titles":[]},"531":{"title":"SimpleHeader","titles":["Headers"]},"532":{"title":"MantineSimpleHeader","titles":["Headers"]},"533":{"title":"MantineLayeredHeader","titles":["Headers"]},"534":{"title":"SlidingHeader","titles":["Headers"]},"535":{"title":"i18n","titles":[]},"536":{"title":"i18next","titles":["i18n"]},"537":{"title":"useI18nLight","titles":["i18n"]},"538":{"title":"Использование","titles":["i18n"]},"539":{"title":"i18next расширения","titles":["i18n"]},"540":{"title":"В итоге","titles":["i18n"]},"541":{"title":"Опции при создании приложения","titles":[]},"542":{"title":"Доступные опции","titles":["Опции при создании приложения"]},"543":{"title":"Доступно по умолчанию","titles":["Опции при создании приложения"]},"544":{"title":"В разработке","titles":["Опции при создании приложения"]},"545":{"title":"В планах","titles":["Опции при создании приложения"]},"546":{"title":"MainLayout","titles":[]},"547":{"title":"Routing","titles":["MainLayout"]},"548":{"title":"OneColumnLayout","titles":[]},"549":{"title":"Navbar","titles":[]},"550":{"title":"SimpleNavbar","titles":["Navbar"]},"551":{"title":"MantineSimpleNavbar","titles":["Navbar"]},"552":{"title":"Google analytics","titles":[]},"553":{"title":"PWA","titles":[]},"554":{"title":"manifest.json","titles":["PWA"]},"555":{"title":"Service worker","titles":["PWA"]},"556":{"title":"Splash screen","titles":[]},"557":{"title":"Темы","titles":[]}},"dirtCount":0,"index":[["^",{"2":{"457":1}}],["^20",{"2":{"455":1}}],["^index",{"2":{"139":1}}],["||",{"2":{"529":1}}],["|",{"2":{"451":4,"457":1}}],["🚀",{"2":{"451":1}}],["🛎️",{"2":{"451":1}}],["ютюбе",{"2":{"472":1}}],["ютюба",{"2":{"472":1}}],["ю",{"2":{"462":1}}],["юнит",{"2":{"378":1,"380":1}}],["юридическую",{"2":{"360":1}}],["юзер",{"2":{"115":1}}],["└────",{"2":{"196":1}}],["└──",{"2":{"196":3}}],["86",{"2":{"557":1}}],["8",{"0":{"414":1},"2":{"186":1,"222":1,"268":1,"271":1,"294":1,"296":3,"300":2,"302":2,"306":1,"318":1,"336":2,"359":1,"366":1,"390":1,"420":1,"421":3,"425":1,"427":1,"428":2,"430":1,"431":1,"436":2,"439":2,"451":2}}],["800",{"2":{"180":1}}],["80",{"2":{"89":1,"141":1}}],["щелкает",{"2":{"313":1}}],["щелкать",{"2":{"229":1}}],["щелкнуть",{"2":{"229":1}}],["щелчку",{"2":{"365":1}}],["щелчке",{"2":{"256":1,"347":1}}],["щелчком",{"2":{"200":1,"201":1,"256":1}}],["щелчок",{"2":{"186":1,"256":1,"432":1}}],["щепоткой",{"2":{"148":1}}],["№",{"2":{"185":1}}],["zero",{"2":{"457":1}}],["zip",{"2":{"227":2}}],["zuckering",{"0":{"211":1}}],["z",{"2":{"180":1,"204":1}}],["56",{"2":{"557":1}}],["58",{"2":{"457":1}}],["55",{"2":{"376":3,"378":1,"380":2}}],["512x512",{"2":{"317":2}}],["5rem",{"2":{"230":1}}],["50кб",{"2":{"460":1}}],["50",{"2":{"191":1,"328":1,"336":1,"376":1,"540":1}}],["5",{"0":{"136":1,"287":1,"411":1},"2":{"127":1,"135":2,"157":2,"180":1,"184":1,"193":2,"197":1,"227":1,"231":4,"244":1,"249":1,"250":2,"251":2,"255":2,"288":1,"292":1,"293":1,"296":1,"303":1,"315":1,"328":2,"331":1,"332":2,"333":2,"336":1,"338":2,"344":1,"347":3,"349":2,"353":1,"355":1,"358":1,"360":4,"361":1,"364":1,"365":2,"366":1,"377":2,"381":2,"383":1,"394":1,"417":1,"427":1,"428":2,"429":2,"432":1,"433":2,"435":1,"439":2,"451":3}}],["67",{"2":{"421":1,"557":3}}],["64",{"2":{"222":1,"387":1}}],["60000",{"2":{"244":1}}],["600",{"2":{"203":1}}],["600px",{"2":{"203":1}}],["60",{"2":{"173":2,"269":1,"365":1,"366":1,"421":1,"557":6}}],["6",{"0":{"288":1,"412":1},"2":{"125":1,"134":1,"184":1,"229":1,"231":4,"250":2,"254":1,"288":1,"289":2,"295":1,"296":1,"313":2,"314":1,"315":4,"316":2,"317":4,"318":3,"328":2,"333":2,"338":2,"339":1,"344":1,"361":1,"381":2,"384":1,"428":2,"429":2,"430":1,"432":2,"433":2,"439":2,"557":1}}],["78",{"2":{"557":1}}],["78919d98ece0",{"2":{"308":1}}],["767",{"2":{"509":1}}],["70",{"2":{"472":2,"537":1}}],["77",{"2":{"296":1}}],["7",{"0":{"289":1,"413":1},"2":{"125":2,"127":1,"152":1,"185":1,"239":1,"249":1,"256":1,"282":1,"288":1,"289":1,"296":2,"297":1,"306":1,"315":1,"318":1,"323":2,"326":1,"328":1,"329":1,"331":1,"339":3,"352":1,"365":1,"387":1,"428":2,"429":2,"431":1,"439":2}}],["7542",{"2":{"97":1}}],["9",{"0":{"415":1},"2":{"143":1,"186":1,"198":1,"222":1,"224":1,"296":1,"302":2,"303":1,"374":2,"383":3,"384":1,"387":1,"390":1,"391":3,"393":1,"428":2,"439":2}}],["99",{"2":{"118":1,"463":3}}],["95",{"2":{"115":1,"456":1,"460":1}}],["90",{"2":{"86":1,"318":1}}],["ждать",{"2":{"365":2,"366":1,"376":1}}],["жив",{"2":{"430":2}}],["живом",{"2":{"416":1}}],["живой",{"2":{"224":1,"382":1}}],["живого",{"2":{"223":1,"380":1,"384":1}}],["живущий",{"2":{"115":1}}],["жирным",{"2":{"208":1}}],["жирный",{"2":{"175":1}}],["жизненно",{"2":{"270":1}}],["жизненного",{"2":{"152":1,"250":1,"267":2,"287":1,"328":1,"352":1}}],["жизненный",{"2":{"267":1,"316":1}}],["жизнь",{"2":{"224":1,"451":1,"462":1}}],["жизни",{"2":{"115":4,"336":1}}],["жить",{"2":{"148":1}}],["железу",{"2":{"473":1}}],["железо",{"2":{"473":1}}],["желающих",{"2":{"499":1}}],["желаю",{"2":{"405":1}}],["желаемым",{"2":{"370":1}}],["желаемых",{"2":{"231":1}}],["желательно",{"2":{"104":1,"222":1,"328":1,"472":1}}],["желании",{"2":{"40":1,"504":1,"508":1,"511":1}}],["желание",{"2":{"25":1}}],["жесткие",{"2":{"455":1}}],["жестким",{"2":{"144":1}}],["жестко",{"2":{"289":1,"462":1}}],["жесткое",{"2":{"284":1,"336":1}}],["же",{"2":{"3":1,"11":1,"12":1,"16":1,"23":1,"26":2,"33":1,"35":1,"41":1,"44":1,"48":1,"53":1,"62":1,"82":1,"97":1,"102":2,"103":1,"115":2,"123":1,"124":1,"125":2,"131":1,"134":3,"135":1,"136":1,"137":1,"148":4,"150":1,"152":3,"156":1,"158":1,"169":2,"171":1,"174":2,"175":1,"176":1,"178":2,"180":1,"182":1,"185":1,"189":1,"198":1,"201":1,"203":1,"208":1,"224":1,"227":1,"230":1,"231":3,"236":1,"247":1,"249":1,"252":1,"261":1,"263":2,"265":1,"268":2,"270":2,"280":1,"281":1,"283":1,"284":1,"286":1,"287":2,"290":1,"292":3,"295":5,"296":2,"297":4,"298":1,"299":1,"300":1,"302":1,"303":1,"306":1,"308":2,"310":1,"315":1,"323":1,"325":1,"326":2,"328":2,"329":1,"330":2,"332":1,"333":3,"336":5,"338":1,"339":1,"344":1,"345":1,"349":1,"357":1,"359":1,"360":1,"361":1,"367":3,"372":1,"373":1,"375":2,"376":1,"378":1,"379":1,"381":3,"383":1,"385":2,"386":1,"394":2,"419":1,"421":2,"424":1,"439":2,"444":1,"445":2,"451":1,"457":1,"460":1,"461":2,"462":1,"463":3,"464":1,"466":1,"472":1,"473":1,"507":1,"511":1,"512":1,"515":1,"527":1,"536":1}}],["yandex",{"2":{"473":1}}],["yamllint",{"2":{"457":2}}],["yaml",{"2":{"451":7,"457":7}}],["yarnrc",{"2":{"457":2}}],["yarn",{"2":{"391":2,"455":1,"457":4}}],["yellow",{"2":{"352":1}}],["yes",{"2":{"112":6,"501":8,"506":4}}],["y=ref",{"2":{"250":1}}],["y",{"2":{"223":1,"250":4,"451":1}}],["yougithubusername",{"2":{"527":1}}],["youtube",{"2":{"64":1,"344":1,"421":2}}],["yourname",{"2":{"528":1}}],["yourself",{"0":{"268":1},"2":{"250":1,"260":1,"457":1}}],["your",{"2":{"52":1,"231":1,"451":13,"463":2}}],["√",{"2":{"112":15,"501":13,"506":5}}],[">save",{"2":{"432":1}}],[">search",{"2":{"352":1}}],[">send",{"2":{"328":1,"437":1}}],[">home",{"2":{"352":1}}],[">decrement",{"2":{"330":1,"335":1}}],[">increment",{"2":{"330":1}}],[">install",{"2":{"315":1}}],[">cancel",{"2":{"255":1}}],[">completed",{"2":{"231":1}}],[">accept",{"2":{"255":1}}],[">no",{"2":{"231":1}}],[">pending",{"2":{"231":1}}],[">print",{"2":{"159":2}}],[">edit",{"2":{"160":1}}],[">",{"2":{"103":2,"105":3,"149":2,"154":1,"155":1,"157":1,"158":1,"160":1,"191":1,"193":2,"196":4,"226":1,"227":4,"230":2,"231":20,"246":2,"249":12,"251":2,"255":3,"292":1,"299":2,"310":1,"315":2,"324":4,"325":2,"335":2,"352":3,"355":4,"432":5,"437":3,"447":8,"448":2,"449":1,"451":1,"452":4,"453":2,"457":1,"471":2,"495":2,"509":5,"513":3,"529":2,"534":3,"538":2,"552":15}}],[">>",{"2":{"103":1,"104":1,"451":5}}],["⌥",{"2":{"89":2}}],["+page",{"2":{"457":6}}],["+layout",{"2":{"457":7}}],["+$backups",{"2":{"451":1}}],["++id",{"2":{"433":1}}],["+f",{"2":{"301":1}}],["+=",{"2":{"193":1}}],["+",{"2":{"89":4,"148":1,"180":1,"223":1,"296":1,"302":2,"303":7,"318":1,"361":2,"362":2,"364":1,"402":1,"439":1,"451":1,"454":2}}],["400",{"2":{"534":1}}],["401",{"2":{"115":2}}],["480",{"2":{"509":1}}],["4",{"0":{"241":1,"286":1,"410":1,"475":1},"1":{"476":1,"477":1},"2":{"87":1,"124":1,"134":1,"141":2,"151":2,"157":1,"158":1,"176":2,"178":1,"180":1,"193":2,"226":1,"229":1,"231":6,"238":2,"239":1,"240":1,"247":2,"249":1,"250":2,"254":1,"255":6,"256":3,"264":1,"267":1,"288":1,"289":1,"291":1,"292":1,"296":1,"297":1,"298":1,"303":3,"315":1,"324":2,"325":3,"328":2,"329":1,"332":2,"333":2,"335":2,"338":2,"345":1,"346":1,"349":2,"355":1,"364":1,"380":2,"381":2,"383":1,"394":1,"401":1,"402":1,"425":1,"428":2,"429":2,"432":1,"433":2,"439":2,"454":2,"457":1,"472":1}}],["09",{"0":{"480":1,"483":1,"486":1},"1":{"481":1,"482":1,"484":1,"485":1,"487":1}}],["04",{"2":{"222":1,"457":1}}],["0deg",{"2":{"191":1}}],["06c9c9",{"2":{"191":1}}],["000",{"2":{"313":1}}],["0001",{"2":{"134":1}}],["000000",{"2":{"317":1}}],["0000",{"2":{"134":7}}],["0",{"0":{"486":1},"1":{"487":1},"2":{"83":2,"118":1,"134":12,"191":1,"222":1,"231":4,"251":1,"291":1,"292":1,"296":1,"301":2,"302":2,"303":1,"324":1,"330":1,"332":2,"333":2,"344":3,"349":1,"361":2,"365":1,"367":1,"376":2,"381":6,"449":1,"451":5,"473":2,"512":2,"557":5}}],["$dirs",{"2":{"451":1}}],["$backup",{"2":{"451":6}}],["$env",{"2":{"451":1}}],["$emit=defineemits",{"2":{"325":1}}],["$emit",{"2":{"124":1,"245":1,"246":2,"325":1}}],["$project",{"2":{"451":3}}],["$props=defineprops",{"2":{"325":1,"328":1}}],["$props",{"2":{"124":1,"191":2,"245":3,"246":2,"255":3,"298":2,"299":2,"325":2,"328":2,"352":1}}],["$github",{"2":{"451":5}}],["$target",{"2":{"451":8}}],["$sessionstorage",{"2":{"339":3}}],["$service",{"2":{"247":2}}],["$store",{"2":{"335":5}}],["$store=usecounterstore",{"2":{"335":1}}],["$store=usestore",{"2":{"163":1}}],["$state",{"2":{"330":4}}],["$root",{"2":{"451":3}}],["$route",{"2":{"355":2,"358":3,"363":3}}],["$router",{"2":{"163":1,"355":3,"356":4,"358":4}}],["$received",{"2":{"247":1}}],["$notifications",{"2":{"163":1}}],["$modals",{"2":{"163":1,"255":11,"256":1}}],["$uri",{"2":{"141":2}}],["$",{"2":{"83":3,"112":2,"163":1,"326":1,"328":1,"331":1,"388":2,"389":2,"392":6,"393":5,"451":15,"452":1,"457":96,"502":2,"503":3}}],["$apikey$",{"2":{"56":6}}],["`~",{"2":{"457":1}}],["`sent",{"2":{"328":1}}],["`$",{"2":{"83":3,"453":4}}],["`",{"2":{"83":3,"328":1,"451":3,"452":1}}],["qbutton",{"2":{"471":1}}],["qa",{"0":{"72":1},"2":{"67":1}}],["quiet",{"2":{"457":1}}],["quicktime",{"2":{"147":1}}],["quasar",{"2":{"456":1,"457":2}}],["quality",{"0":{"77":1}}],["questions",{"2":{"497":1}}],["queue",{"2":{"428":9}}],["queuebuilder",{"2":{"164":1}}],["queryselector",{"2":{"381":1}}],["query",{"2":{"23":1,"356":2,"358":2,"362":4,"363":2,"439":2,"469":1}}],["quot",{"0":{"154":2,"251":2,"399":2},"2":{"2":4,"4":2,"9":2,"11":2,"22":2,"41":6,"59":2,"64":2,"65":4,"86":4,"92":2,"95":2,"102":10,"103":2,"104":4,"105":4,"112":2,"115":2,"116":4,"124":6,"125":2,"134":6,"135":4,"137":4,"148":6,"149":6,"150":2,"151":4,"152":8,"160":4,"168":2,"169":2,"172":2,"173":6,"174":8,"176":6,"177":2,"178":2,"179":2,"180":4,"181":4,"184":6,"185":4,"186":2,"188":2,"189":2,"190":12,"192":2,"193":2,"195":4,"196":2,"200":2,"201":2,"203":4,"204":4,"205":4,"209":6,"210":2,"218":2,"219":2,"222":2,"224":2,"227":8,"229":4,"231":2,"232":6,"241":2,"244":2,"247":8,"249":2,"250":2,"255":4,"256":2,"260":2,"266":2,"270":2,"271":2,"283":2,"291":4,"293":4,"295":2,"296":2,"297":2,"300":2,"302":6,"303":2,"308":8,"316":2,"317":4,"318":2,"323":4,"344":4,"349":8,"352":2,"353":6,"355":4,"358":2,"361":30,"365":4,"366":4,"367":8,"372":4,"373":4,"376":4,"377":4,"380":2,"382":2,"385":4,"390":2,"393":2,"400":2,"419":2,"421":14,"426":2,"428":4,"431":2,"439":2,"460":6,"462":4,"463":8,"464":4,"468":2,"472":5,"473":6,"501":8,"504":2,"507":2,"518":2,"527":14,"536":8,"546":2,"548":2}}],["ы",{"2":{"56":1}}],["xshell",{"2":{"457":1}}],["xss",{"2":{"115":1}}],["xo",{"2":{"457":4}}],["xaml",{"2":{"457":2}}],["xdv",{"2":{"457":1}}],["xcode",{"2":{"389":1}}],["xyz",{"2":{"244":1}}],["xmlhttprequest",{"2":{"359":1,"473":1}}],["xml",{"2":{"139":1,"300":1,"359":1,"457":4}}],["xhr",{"2":{"114":1,"511":1}}],["x3c",{"2":{"91":2,"103":8,"104":2,"105":4,"123":9,"139":4,"149":12,"151":8,"152":8,"154":1,"155":2,"157":2,"158":1,"159":4,"160":8,"191":10,"193":8,"226":1,"227":5,"230":9,"231":46,"246":4,"249":54,"251":6,"255":22,"267":2,"292":1,"298":8,"299":7,"302":4,"303":3,"310":1,"315":6,"324":20,"325":10,"328":12,"330":15,"335":14,"339":6,"352":20,"355":12,"365":1,"432":33,"435":2,"437":29,"447":20,"448":7,"449":1,"452":4,"453":8,"457":1,"471":4,"509":10,"513":7,"529":5,"534":8,"538":8,"552":15}}],["x26",{"2":{"56":2,"83":2,"231":2,"315":2,"365":2,"432":2,"435":4,"451":4,"457":1,"509":2}}],["x",{"2":{"53":2,"130":1,"172":1,"178":1,"185":1,"215":1,"432":1,"460":2,"516":1}}],["=+",{"2":{"457":1}}],["==",{"2":{"231":3,"255":1,"451":3}}],["=>return",{"2":{"333":1}}],["=>",{"2":{"193":1,"231":4,"244":5,"250":2,"255":6,"267":2,"292":1,"302":1,"303":16,"315":1,"316":2,"328":2,"332":3,"333":2,"338":1,"349":1,"352":3,"353":3,"355":3,"364":1,"365":1,"367":2,"376":2,"377":2,"378":1,"380":2,"381":2,"422":2,"423":2,"424":1,"428":2,"429":4,"430":4,"432":5,"433":3,"435":4,"437":1,"439":3,"449":1,"451":2,"453":2,"538":1}}],["=",{"0":{"86":1},"2":{"52":4,"61":2,"83":3,"97":1,"103":2,"104":2,"114":5,"120":2,"121":2,"123":6,"124":2,"136":1,"148":1,"149":1,"152":3,"160":2,"191":1,"193":3,"231":5,"244":4,"245":4,"246":4,"247":4,"250":1,"251":1,"255":18,"280":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":3,"288":2,"289":1,"290":2,"292":6,"296":7,"298":1,"299":1,"301":3,"302":12,"303":14,"315":7,"316":4,"324":1,"327":1,"330":2,"332":1,"333":3,"334":1,"338":5,"339":1,"349":2,"352":1,"355":2,"360":2,"362":2,"363":1,"364":1,"376":2,"380":1,"382":1,"422":4,"423":1,"424":2,"428":7,"429":2,"430":1,"433":2,"434":1,"435":1,"436":1,"437":3,"439":6,"447":3,"448":1,"449":3,"450":2,"451":1,"453":3,"454":6,"460":6,"462":1,"463":1,"509":1,"511":3,"512":2,"513":2,"529":1,"538":3}}],["jl65gwrnqq",{"2":{"529":2}}],["j",{"2":{"455":1}}],["jpg",{"2":{"454":1}}],["jpeg",{"2":{"444":1}}],["jenkins",{"2":{"442":1,"457":2}}],["jest",{"2":{"376":1,"457":10,"461":1}}],["jetbrains",{"2":{"222":1}}],["justify",{"2":{"230":1}}],["jasmine",{"2":{"457":10}}],["jamesives",{"2":{"451":3,"527":1}}],["javascirpt",{"2":{"401":1}}],["javascript",{"0":{"490":1},"2":{"44":1,"116":1,"123":1,"125":1,"147":3,"148":2,"149":3,"150":4,"151":5,"152":4,"154":1,"156":1,"157":1,"158":2,"159":2,"166":1,"192":1,"193":1,"203":1,"221":1,"222":1,"223":2,"224":2,"225":4,"228":2,"231":1,"244":3,"249":1,"264":3,"265":1,"266":1,"267":2,"268":1,"277":1,"279":3,"280":2,"288":1,"291":1,"295":1,"297":1,"300":1,"301":2,"303":1,"304":1,"316":1,"329":1,"330":1,"336":1,"338":3,"340":1,"344":2,"346":1,"355":1,"359":1,"361":1,"367":2,"369":1,"375":1,"376":2,"377":1,"378":2,"379":1,"382":2,"402":1,"408":1,"415":1,"419":1,"421":9,"422":1,"428":1,"433":1,"434":1,"441":1,"452":1,"455":2,"456":1,"457":2,"460":4,"462":1,"463":2,"464":1,"471":3,"472":7,"473":4,"490":1,"504":1,"509":1,"540":1}}],["java",{"2":{"147":1,"152":1,"279":1,"457":1}}],["jane",{"2":{"123":1}}],["jobs",{"2":{"451":2}}],["jo",{"2":{"361":1}}],["john",{"2":{"123":1,"245":1,"536":1}}],["join",{"0":{"47":1},"2":{"48":1,"56":2}}],["jwts",{"2":{"361":1}}],["jwt",{"2":{"115":4,"361":8,"496":2,"545":1}}],["jsself",{"2":{"423":1}}],["jsscripts",{"2":{"384":1}}],["jstest",{"2":{"377":1,"378":1,"383":1}}],["jsethereum",{"2":{"367":1}}],["jseventbus",{"2":{"352":1}}],["jsexport",{"2":{"122":1,"228":1,"379":1,"382":2,"447":1,"528":1}}],["jslint",{"2":{"457":2}}],["jslocation",{"2":{"362":1}}],["jslocalstorage",{"2":{"336":1}}],["jslet",{"2":{"296":1,"303":3,"336":1,"422":1}}],["jsif",{"2":{"316":1,"382":1,"422":1}}],["jsimport",{"2":{"52":1,"114":3,"120":2,"121":3,"136":1,"228":2,"231":1,"243":2,"244":1,"247":4,"250":2,"255":3,"281":1,"283":1,"286":1,"287":1,"289":2,"292":2,"315":1,"317":1,"327":1,"330":1,"332":1,"334":1,"338":1,"349":1,"350":1,"352":1,"355":1,"359":1,"360":1,"363":1,"364":1,"376":1,"380":1,"381":1,"424":1,"428":1,"429":1,"430":1,"433":1,"434":1,"435":1,"436":1,"450":1,"452":1,"455":1,"511":1,"538":1}}],["jsmyfunction",{"2":{"303":1}}],["jsfibonaccisync",{"2":{"302":1}}],["jsf",{"2":{"301":1}}],["jsfunction",{"2":{"290":1,"302":2,"303":1}}],["jsdom",{"2":{"379":3}}],["jsdoc",{"0":{"91":1},"2":{"91":2}}],["jsdescribe",{"2":{"376":1}}],["jsdispatcher",{"2":{"292":1}}],["js$",{"2":{"359":1}}],["js$props",{"2":{"352":1}}],["js$modals",{"2":{"255":1}}],["js$emit",{"2":{"245":1}}],["jsx",{"2":{"249":1,"457":3}}],["jspending",{"2":{"231":1}}],["jsconfig",{"2":{"457":11}}],["jsconsole",{"2":{"297":1,"302":2,"303":1}}],["jsconst",{"2":{"83":1,"97":1,"104":1,"124":1,"244":3,"245":4,"246":2,"247":1,"255":1,"280":1,"284":1,"285":1,"288":1,"362":1,"365":1,"430":1,"439":1,"451":1,"454":1,"460":2}}],["jsclass",{"2":{"281":1,"287":1,"292":1,"294":1}}],["jscreateapp",{"2":{"122":1}}],["jsasync",{"2":{"83":2,"303":1}}],["js",{"0":{"136":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"292":1,"294":1,"296":1,"302":1,"327":1,"330":1,"333":1,"334":1,"338":1,"349":1,"350":1,"376":1,"380":1,"381":1,"398":1,"399":1,"423":1,"424":1,"428":1,"429":1,"430":1,"433":1,"434":1,"435":1,"436":1,"439":1,"454":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1},"2":{"12":1,"51":1,"52":1,"76":1,"91":1,"98":1,"103":1,"112":3,"114":4,"115":1,"116":3,"120":1,"122":1,"150":2,"152":1,"170":1,"222":5,"223":1,"224":4,"225":2,"228":5,"231":2,"235":1,"243":3,"250":3,"255":8,"256":6,"282":1,"284":1,"286":2,"287":5,"292":2,"307":1,"316":3,"317":2,"322":1,"333":2,"336":1,"343":1,"348":1,"349":2,"353":1,"355":1,"356":1,"358":1,"371":1,"374":2,"375":5,"376":2,"378":2,"379":1,"382":2,"383":1,"400":1,"402":1,"404":1,"419":2,"420":1,"422":4,"423":1,"424":1,"428":2,"430":1,"432":1,"437":2,"438":4,"444":1,"446":1,"452":4,"454":1,"455":3,"456":2,"457":21,"459":1,"460":3,"462":3,"463":1,"464":1,"472":4,"473":1,"476":1,"497":1,"498":1,"508":1,"509":1,"511":1,"512":2,"529":3,"555":3}}],["jsonrpc",{"2":{"501":1,"512":6}}],["json5",{"2":{"457":1}}],["jsonc",{"2":{"457":1}}],["jsonp",{"2":{"439":3}}],["jsonplaceholder",{"2":{"116":1,"511":1}}],["jsonmounted",{"2":{"352":1}}],["json`",{"2":{"83":1}}],["json",{"0":{"18":1,"19":1,"38":1,"48":1,"512":1,"554":1},"2":{"6":1,"11":1,"17":5,"18":2,"19":1,"38":1,"47":2,"48":2,"53":1,"76":1,"95":1,"104":2,"109":2,"112":2,"114":1,"116":1,"118":9,"224":3,"280":1,"281":1,"286":1,"310":4,"313":2,"336":2,"360":1,"361":2,"375":3,"383":4,"384":1,"391":1,"429":1,"432":4,"433":1,"434":1,"435":1,"438":1,"439":5,"451":4,"452":1,"454":4,"455":4,"457":50,"472":1,"473":2,"501":5,"504":1,"511":1,"512":6,"538":1,"539":1,"542":1,"554":2}}],["rgba",{"2":{"557":6}}],["richfooter",{"0":{"522":1}}],["right",{"2":{"516":1}}],["rip",{"2":{"463":1}}],["rspack",{"2":{"457":12}}],["rc",{"2":{"457":1}}],["r",{"2":{"451":2,"463":1,"497":2}}],["rf",{"2":{"451":4}}],["rm",{"2":{"451":3}}],["rxdb",{"2":{"431":1}}],["raw",{"2":{"452":2,"454":1,"455":1}}],["ram",{"2":{"402":1}}],["range=ref",{"2":{"333":1}}],["range",{"2":{"332":1,"335":3,"377":1}}],["randomuuid",{"2":{"428":1}}],["random",{"2":{"251":1}}],["radius",{"2":{"191":1}}],["radio",{"2":{"184":1,"437":2}}],["rush",{"2":{"457":1}}],["rust",{"2":{"457":1}}],["rustfmt",{"2":{"457":2}}],["ruby",{"2":{"457":1}}],["ru",{"2":{"457":3,"472":1,"497":2}}],["rules",{"2":{"457":2}}],["rule",{"2":{"173":1}}],["runs",{"2":{"451":2}}],["runcommand",{"2":{"294":1}}],["runlog",{"2":{"247":2}}],["run",{"2":{"136":1,"223":1,"224":4,"226":1,"231":1,"374":1,"375":3,"376":4,"383":1,"384":1,"451":9}}],["roboto",{"2":{"557":1}}],["robots",{"2":{"224":1}}],["rollupjs",{"2":{"228":1}}],["rollup",{"2":{"228":1,"455":2,"457":2}}],["role",{"2":{"115":1}}],["roach",{"0":{"210":1}}],["row",{"2":{"203":1,"509":1}}],["rotate",{"2":{"191":4}}],["root",{"2":{"141":1,"451":1,"454":1,"557":1}}],["route",{"2":{"356":6}}],["routeview",{"2":{"354":3,"355":1}}],["routes",{"0":{"97":1},"2":{"97":2,"136":1,"346":1,"349":3,"445":1,"447":1}}],["routerlink>",{"2":{"352":3,"355":1}}],["routerlink",{"2":{"351":1,"352":4,"354":1,"355":2,"356":1}}],["routerview>",{"2":{"355":4}}],["routerview",{"2":{"351":1,"355":3}}],["routerecordraw",{"2":{"97":1}}],["router",{"0":{"136":1,"348":1,"349":1},"1":{"349":1,"350":1},"2":{"3":1,"23":1,"34":1,"119":1,"135":2,"136":2,"137":1,"139":1,"142":1,"145":1,"146":1,"244":3,"251":1,"342":2,"345":1,"346":2,"348":1,"349":7,"350":3,"352":4,"355":2,"358":2,"363":1,"401":1,"402":1,"411":1,"425":1,"447":4,"504":1,"547":1}}],["routing",{"0":{"7":1,"547":1},"2":{"11":1}}],["rbac",{"2":{"115":1}}],["rtl",{"2":{"460":1,"536":1}}],["rt",{"2":{"115":4,"496":1}}],["rpc",{"0":{"512":1},"2":{"112":1,"114":1,"118":9,"472":1,"501":1,"511":1,"512":5,"542":1}}],["rehydration",{"2":{"473":1}}],["remix",{"2":{"457":2}}],["remote",{"2":{"394":1,"451":7,"457":5}}],["removed",{"2":{"451":1}}],["removed=`ls",{"2":{"451":1}}],["remove",{"2":{"451":2}}],["removeroute",{"2":{"358":1}}],["removeitem",{"2":{"336":1}}],["removeeventlistener",{"2":{"250":1,"267":1}}],["renovate",{"2":{"457":2}}],["rendering",{"2":{"473":1}}],["renderwhitespace",{"2":{"457":1}}],["render",{"2":{"444":1}}],["renderer",{"2":{"421":1}}],["recentchange",{"2":{"457":1}}],["received",{"2":{"437":5}}],["receiver",{"2":{"338":1}}],["recursive",{"2":{"451":1}}],["req",{"2":{"439":5}}],["requiresauth",{"2":{"447":1}}],["require",{"2":{"439":2}}],["required",{"2":{"363":1,"451":1}}],["requirements",{"2":{"69":1}}],["requestaccounts",{"2":{"367":1}}],["requestotp",{"2":{"365":1}}],["request",{"2":{"56":3,"114":1,"139":2,"316":3,"363":1,"367":1,"428":2,"430":2,"432":3,"437":1,"439":2}}],["reilly",{"2":{"403":1}}],["reddit",{"2":{"463":1,"497":1}}],["redis",{"2":{"463":1}}],["redirect",{"2":{"362":1}}],["red",{"2":{"335":3}}],["registertype",{"2":{"317":1}}],["register",{"2":{"316":1,"463":1}}],["re",{"2":{"261":1}}],["representation",{"2":{"452":1}}],["representational",{"2":{"359":1,"434":1}}],["replit",{"2":{"457":1}}],["reply=>",{"2":{"437":1}}],["replace",{"0":{"357":1}}],["replacement",{"2":{"223":1}}],["repo",{"2":{"457":1}}],["repository",{"2":{"388":1}}],["reporter",{"2":{"383":1}}],["repeat",{"0":{"268":1},"2":{"260":1,"294":1}}],["rejects",{"2":{"378":1}}],["reject",{"2":{"241":1,"244":1,"255":6,"303":7,"428":6,"430":1,"433":6,"435":6}}],["readme",{"2":{"457":2}}],["ready",{"2":{"315":4}}],["read",{"2":{"240":1,"463":1}}],["reactivity",{"0":{"337":1},"1":{"338":1,"339":1},"2":{"462":2,"463":1}}],["reactive",{"2":{"123":7,"255":6,"295":1,"321":1,"329":1,"330":3,"338":3,"449":2,"460":6,"462":2,"463":6}}],["react",{"2":{"148":1,"344":1,"462":6,"472":2}}],["release",{"2":{"457":4}}],["releaserc",{"2":{"457":2}}],["related",{"2":{"317":1}}],["relative",{"2":{"105":1}}],["rel",{"2":{"310":1}}],["rel=",{"2":{"226":1,"227":3,"310":1}}],["reload",{"2":{"224":1,"451":1}}],["rewritecond",{"2":{"139":2}}],["rewriterule",{"2":{"139":2}}],["rewritebase",{"2":{"139":2}}],["rewriteengine",{"2":{"139":1}}],["rewrite",{"2":{"139":1}}],["resx",{"2":{"457":2}}],["res",{"2":{"439":6}}],["response=>",{"2":{"360":1}}],["response",{"2":{"316":3,"360":2,"362":1,"451":2}}],["responsibility",{"0":{"265":1},"2":{"260":1}}],["responsive",{"0":{"203":1},"2":{"308":1}}],["respondwith",{"2":{"316":1}}],["result=await",{"2":{"433":1}}],["result=>",{"2":{"364":1,"365":2,"435":2}}],["results",{"2":{"376":2}}],["result",{"2":{"303":8,"364":1,"365":2,"367":2,"376":2,"429":2,"433":3,"435":6}}],["resize",{"2":{"267":3}}],["resolver",{"2":{"455":1,"457":1}}],["resolves",{"2":{"378":3}}],["resolve",{"2":{"228":2,"241":1,"244":3,"255":6,"303":9,"378":1,"428":6,"430":2,"433":6,"435":4,"455":2}}],["resource",{"2":{"117":1,"452":2}}],["restful",{"2":{"359":1,"434":2}}],["rest",{"0":{"49":1,"53":1,"118":2,"511":1},"1":{"50":1,"51":1,"52":1,"53":1},"2":{"40":1,"53":4,"55":1,"56":3,"58":1,"59":2,"109":1,"112":1,"114":1,"118":2,"359":1,"501":1,"511":1,"512":2}}],["ref=",{"2":{"193":1}}],["refresh",{"2":{"115":1,"496":1}}],["ref",{"2":{"103":2,"104":1,"123":6,"152":7,"160":2,"193":3,"231":5,"250":1,"295":1,"315":4,"324":2,"328":1,"333":2,"360":3,"432":1,"437":4,"449":1,"460":7,"462":2,"463":5,"511":1}}],["refactor",{"0":{"91":1},"2":{"91":1}}],["returns",{"2":{"91":4}}],["return",{"2":{"83":4,"91":2,"103":3,"114":1,"122":2,"149":1,"152":2,"231":2,"244":1,"250":1,"251":1,"255":3,"256":3,"281":2,"283":1,"284":1,"285":1,"288":2,"290":2,"292":1,"296":3,"302":1,"303":7,"316":2,"330":1,"332":3,"333":4,"338":5,"349":1,"428":1,"430":1,"433":3,"435":2,"449":1,"453":2,"454":2,"511":1,"512":1}}],["return=minimal",{"2":{"53":1}}],["rdbms",{"2":{"39":1}}],["fcp",{"2":{"473":1}}],["ferferga",{"2":{"463":1}}],["fetish",{"2":{"461":1}}],["fetch",{"2":{"41":1,"114":1,"316":2,"359":1,"451":1,"507":1,"511":1}}],["fdb",{"2":{"457":1}}],["fps",{"2":{"421":2}}],["ftcms",{"2":{"405":1}}],["ftp",{"2":{"143":2}}],["f12",{"2":{"318":2}}],["fnc",{"2":{"456":1,"460":1}}],["fn",{"2":{"292":4,"318":1}}],["frequently",{"2":{"497":1}}],["freezed",{"2":{"457":1}}],["free",{"2":{"173":1}}],["framework",{"2":{"295":1,"402":1}}],["frontier",{"2":{"144":1}}],["from",{"2":{"52":4,"91":2,"103":3,"114":9,"120":2,"121":6,"123":1,"136":1,"152":2,"160":3,"193":1,"228":2,"230":1,"231":1,"243":4,"244":4,"247":4,"250":2,"251":2,"255":8,"267":1,"281":2,"283":1,"286":2,"287":4,"289":5,"292":2,"299":1,"315":1,"317":3,"324":2,"327":1,"328":2,"330":2,"332":1,"333":2,"334":3,"335":1,"338":1,"339":1,"349":3,"350":5,"352":2,"355":1,"359":1,"360":2,"363":1,"364":1,"376":3,"380":3,"381":3,"424":2,"428":1,"429":1,"430":1,"432":2,"433":1,"434":1,"435":1,"436":1,"437":2,"448":1,"449":2,"450":1,"452":3,"453":2,"454":2,"455":2,"509":1,"511":2,"512":5,"513":2,"527":1,"538":2}}],["flow",{"2":{"493":1}}],["flowconfig",{"2":{"457":2}}],["flake",{"2":{"457":2}}],["flash",{"2":{"147":1}}],["fls",{"2":{"457":1}}],["flipcoin",{"2":{"251":3}}],["flex",{"2":{"108":1,"203":4,"230":2,"231":3,"509":3}}],["flexbox",{"2":{"35":1,"108":1,"203":1,"469":1,"492":2}}],["f",{"2":{"139":1,"301":3}}],["family",{"2":{"557":1}}],["fallback",{"2":{"454":1}}],["false",{"2":{"114":1,"184":2,"231":2,"255":2,"315":2,"317":1,"332":1,"365":1,"429":1,"451":2,"457":27,"463":1,"501":4}}],["fail",{"2":{"377":1}}],["fahrenheit",{"2":{"296":7}}],["factory",{"0":{"290":1},"2":{"273":1}}],["facebook",{"2":{"148":1,"364":1,"552":1}}],["façade",{"0":{"300":1},"2":{"260":1,"275":1,"300":1,"303":1,"336":1}}],["fa",{"2":{"227":2,"231":6}}],["favicon",{"2":{"224":1}}],["favourites",{"2":{"91":2,"97":3,"103":7,"104":3,"105":1}}],["favorite",{"2":{"91":3}}],["faq",{"2":{"199":1,"451":1,"497":1}}],["fix",{"2":{"457":1}}],["fixall",{"2":{"457":2}}],["field",{"2":{"454":2}}],["finance",{"2":{"536":1}}],["finally",{"2":{"303":2,"432":2}}],["find",{"2":{"381":4,"457":1,"538":1}}],["fingerprint",{"2":{"115":1}}],["fibonaccioutput",{"0":{"380":1},"2":{"374":2,"379":1,"380":3}}],["fibonacciinput",{"0":{"381":1},"2":{"374":2,"381":3}}],["fibonacci",{"0":{"376":1},"2":{"374":2,"375":3,"376":12,"377":2}}],["fibonaccipromise",{"2":{"303":2,"376":2,"378":2}}],["fibonacciasync",{"2":{"302":2}}],["fibonaccisync",{"2":{"302":3}}],["fill",{"2":{"453":1}}],["filter",{"2":{"231":2,"256":1}}],["filenesting",{"2":{"457":3}}],["filename2",{"2":{"390":1}}],["filename1",{"2":{"390":1}}],["filename",{"2":{"139":2,"244":1,"422":1,"454":10}}],["filelistlayout",{"2":{"457":1}}],["file=",{"2":{"451":1}}],["filehippo",{"2":{"217":2}}],["filezilla",{"2":{"143":1}}],["file",{"2":{"143":1,"174":1,"390":1,"451":2,"457":2}}],["files",{"2":{"112":1,"141":1,"224":1,"451":1,"457":3}}],["fi",{"2":{"200":1,"451":2}}],["fitts",{"2":{"178":1}}],["fira",{"2":{"457":1}}],["first",{"2":{"163":1,"203":1,"457":1,"534":1,"555":1}}],["firstname",{"2":{"47":1}}],["firesbase",{"2":{"545":1}}],["firestore",{"2":{"472":1}}],["firefox",{"2":{"125":1,"222":1,"402":1,"421":1}}],["firebase",{"2":{"39":2,"41":1,"116":2,"444":2,"457":4,"545":1}}],["font",{"2":{"557":1}}],["fontweight",{"2":{"457":1}}],["fontligatures",{"2":{"457":1}}],["fontfamily",{"2":{"457":1}}],["fontaliasing",{"2":{"457":1}}],["fontawesome",{"0":{"227":1},"2":{"227":6}}],["fonts",{"2":{"317":1,"555":1}}],["found",{"2":{"316":3}}],["foundation",{"2":{"144":1}}],["foot",{"2":{"308":1}}],["footers",{"0":{"520":1},"1":{"521":1,"522":1,"523":1,"524":1,"525":1}}],["footer>",{"2":{"255":2}}],["footer",{"0":{"32":1},"2":{"28":1,"112":1,"501":2,"508":2,"542":1,"545":1}}],["folder",{"2":{"451":1}}],["fold",{"2":{"205":1}}],["fork",{"2":{"495":1}}],["foreign",{"2":{"463":1}}],["foreach",{"2":{"429":1}}],["formulate",{"2":{"457":10}}],["formkit",{"2":{"457":10}}],["formatters",{"2":{"460":2}}],["formatter",{"2":{"457":1}}],["formatting",{"2":{"457":1,"460":1}}],["formatonsave",{"2":{"457":1}}],["format",{"2":{"451":3,"457":2}}],["forward",{"2":{"358":1}}],["for=",{"2":{"157":1,"193":1,"231":2,"352":1,"355":1,"432":1}}],["for",{"0":{"157":1,"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"52":1,"112":1,"134":1,"157":1,"160":1,"173":1,"180":1,"193":1,"203":2,"231":2,"260":1,"292":1,"302":2,"303":1,"451":1,"454":2,"457":1,"473":1,"501":1}}],["fullpath",{"2":{"358":1}}],["fullscreen",{"2":{"311":2}}],["function",{"2":{"91":4,"103":4,"193":1,"231":2,"247":1,"250":2,"251":1,"255":1,"256":1,"267":1,"296":2,"303":1,"315":3,"324":1,"325":1,"328":2,"330":1,"333":2,"338":2,"360":1,"364":1,"365":3,"376":2,"429":1,"432":4,"437":1,"449":3,"454":3,"529":1,"538":1}}],["functions",{"2":{"40":1,"116":2,"463":1}}],["fu",{"2":{"23":1,"457":1,"504":1}}],["l",{"2":{"139":2,"204":1,"292":2,"538":2}}],["learn",{"2":{"472":1}}],["learning",{"2":{"173":1}}],["leex",{"2":{"457":1}}],["less",{"2":{"457":1}}],["lerna",{"2":{"391":1,"457":2}}],["level",{"2":{"196":6}}],["let",{"0":{"144":1},"2":{"131":1,"144":3,"145":1,"290":1,"292":2,"302":4,"303":3,"309":1,"338":2,"365":1,"376":1,"381":2,"416":1,"422":1,"428":2,"433":2,"454":1}}],["length==0",{"2":{"231":1}}],["length",{"2":{"103":1,"105":1,"231":6,"292":1,"454":2}}],["left",{"2":{"56":1,"231":2}}],["lts",{"2":{"222":1,"402":1}}],["lt",{"2":{"91":1,"122":1,"224":1,"230":1,"251":1,"333":1,"352":3,"393":4,"457":1}}],["license",{"2":{"457":1}}],["limit",{"2":{"457":3}}],["lib",{"2":{"457":1}}],["live",{"2":{"382":1}}],["lintstagedrc",{"2":{"457":2}}],["lint",{"2":{"457":4}}],["line",{"2":{"457":1}}],["linenumbers",{"2":{"457":1}}],["lineno",{"2":{"422":1}}],["lines",{"0":{"355":1}}],["linear",{"2":{"191":1}}],["link",{"2":{"226":2,"227":3,"310":1,"405":1}}],["linux",{"0":{"388":1},"2":{"137":2,"140":3,"143":1,"186":1,"222":2,"308":1,"318":1,"386":2,"388":1,"402":5,"421":1,"457":1}}],["life",{"2":{"152":1}}],["lifecycle",{"2":{"67":1}}],["lighthouserc",{"2":{"457":20}}],["lighthouse",{"0":{"318":1},"2":{"306":1,"318":3,"319":1}}],["light",{"2":{"112":1,"231":1,"249":1}}],["like",{"2":{"91":1,"463":2}}],["listening",{"2":{"439":1}}],["listen",{"2":{"141":1,"439":1}}],["list",{"2":{"91":3,"229":1,"231":8,"455":1,"457":1}}],["listfavourites",{"2":{"91":3,"103":5,"104":1,"105":1}}],["latexmk",{"2":{"457":1}}],["latest",{"2":{"223":1,"451":2}}],["landing",{"2":{"349":5,"352":1}}],["lang",{"2":{"312":1}}],["language",{"2":{"163":1,"239":1,"457":1}}],["lang=",{"2":{"86":1,"103":1,"151":1,"453":1,"509":1,"513":1,"538":1}}],["lastindexof",{"2":{"454":2}}],["last",{"2":{"245":2,"457":1}}],["lastname",{"2":{"47":1}}],["label+",{"2":{"299":1}}],["label",{"2":{"231":3,"298":4,"299":1}}],["label>",{"2":{"231":4,"437":4}}],["law",{"2":{"178":1}}],["lamda",{"2":{"116":1}}],["lambda",{"2":{"116":1}}],["layer",{"2":{"112":1,"360":1,"501":1}}],["layouts",{"2":{"445":1}}],["layout",{"0":{"108":1},"2":{"27":1,"36":1,"112":1,"249":1,"355":1,"501":2,"542":1,"545":1,"548":1,"557":1}}],["lot",{"2":{"457":1}}],["lof",{"2":{"457":1}}],["loadicons",{"2":{"454":2}}],["loadingerror",{"2":{"244":2}}],["loadingcomponent",{"2":{"244":3}}],["loading",{"2":{"114":2,"155":3,"448":2,"449":2}}],["loadnotes",{"2":{"432":4}}],["loadproject",{"2":{"352":2}}],["loaderset",{"2":{"449":4}}],["loaderbar",{"2":{"448":1}}],["loader",{"2":{"244":2,"448":1}}],["lock",{"2":{"224":1,"457":13}}],["location",{"2":{"141":2,"362":1,"451":1}}],["locale",{"2":{"538":3}}],["locales",{"2":{"538":3}}],["local",{"2":{"391":1}}],["localstore",{"2":{"336":1}}],["localstoragename",{"2":{"451":3}}],["localstorage",{"2":{"104":4,"115":2,"315":1,"336":4,"341":2,"347":1,"352":1,"451":3,"557":1}}],["localhost",{"2":{"134":1,"223":1,"316":1,"435":1,"439":2}}],["lookup",{"2":{"425":1}}],["loopback",{"2":{"134":3}}],["loosely",{"2":{"2":1}}],["logic",{"2":{"463":2}}],["login",{"2":{"97":1,"463":1}}],["logs",{"2":{"451":1,"457":1}}],["log",{"2":{"247":1,"281":1,"296":1,"297":1,"302":7,"303":8,"360":2,"367":2,"391":6,"422":1,"423":1,"439":1,"451":1,"457":1,"460":1}}],["logmessage",{"2":{"247":2}}],["logout",{"2":{"114":1,"463":1}}],["low",{"2":{"39":1}}],["шпаргалки",{"0":{"488":1},"1":{"489":1,"490":1,"491":1,"492":1,"493":1,"494":1}}],["шкалы",{"2":{"421":1}}],["шкале",{"2":{"297":1}}],["шлюз",{"2":{"278":1}}],["шлюза",{"2":{"277":1}}],["шнайдермане",{"2":{"180":1}}],["шнайдерман",{"2":{"180":1}}],["шнайдермана",{"0":{"180":1}}],["шестнадцатеричных",{"2":{"134":1}}],["шифрующая",{"2":{"361":1}}],["шифрованного",{"2":{"360":1}}],["шифрования",{"2":{"144":2,"361":1}}],["шиной",{"2":{"326":1,"352":1}}],["шину",{"2":{"325":1,"326":1}}],["шины",{"0":{"326":1},"1":{"327":1,"328":1},"2":{"321":1,"326":1,"327":1,"329":1}}],["шина",{"2":{"118":1,"326":1,"341":1}}],["широкие",{"2":{"359":1}}],["широкий",{"2":{"171":2,"282":1}}],["широком",{"2":{"294":1,"425":1}}],["широкое",{"2":{"169":1,"227":1}}],["широко",{"2":{"137":1,"138":1,"199":1,"204":1,"215":1,"276":1,"303":1,"360":1}}],["широкого",{"2":{"41":1,"198":1,"507":1}}],["ширина",{"2":{"548":1}}],["ширине",{"2":{"203":1}}],["ширину",{"2":{"108":1,"195":1,"231":1}}],["ширины",{"2":{"108":1}}],["шторки",{"2":{"542":1}}],["шторка",{"2":{"542":1}}],["шторок",{"2":{"517":1}}],["штраф",{"2":{"434":1}}],["штатном",{"2":{"457":1}}],["штатную",{"2":{"95":1}}],["штата",{"2":{"353":1}}],["штатов",{"2":{"353":1}}],["штат",{"2":{"353":1}}],["штабелируемыми",{"2":{"297":1}}],["штука",{"2":{"118":1}}],["штукатурки",{"2":{"26":1}}],["шаге",{"2":{"240":1,"297":1,"361":1,"363":1,"364":1}}],["шагу",{"2":{"238":1}}],["шагом",{"2":{"223":1,"226":1,"230":1,"237":1,"240":1,"306":1,"362":1,"365":1,"390":1,"409":1,"428":1,"431":1}}],["шагов",{"2":{"67":1,"131":1,"144":1,"190":1,"222":1,"360":1,"364":1,"367":1,"394":1}}],["шаги",{"2":{"221":1,"222":2,"223":1,"226":1,"234":1,"255":1,"361":1,"393":1,"394":2}}],["шаг",{"0":{"239":1,"240":1,"241":1},"2":{"134":1,"169":1,"204":1,"223":1,"232":1,"237":1,"238":1,"239":1,"240":1,"241":1,"256":1,"297":1,"334":1,"364":1,"366":2,"393":1,"409":1,"421":1,"473":1}}],["шагах",{"2":{"180":1}}],["шагами",{"2":{"144":1}}],["шага",{"2":{"67":1}}],["шаблонная",{"2":{"375":1}}],["шаблонные",{"0":{"351":1}}],["шаблонным",{"2":{"205":1}}],["шаблону",{"2":{"204":1,"254":1,"256":1,"300":1,"315":1,"426":1,"427":1,"463":1}}],["шаблоном",{"2":{"189":1,"255":1,"291":1,"295":1,"305":1,"340":1,"355":1}}],["шаблонов",{"0":{"241":1,"272":1,"326":1,"359":1},"1":{"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"327":1,"328":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1},"2":{"169":3,"172":1,"185":2,"194":1,"200":2,"205":1,"206":1,"218":1,"219":1,"220":2,"221":1,"235":1,"238":1,"240":1,"241":1,"247":1,"248":1,"260":3,"270":1,"271":2,"272":2,"276":2,"281":1,"289":1,"306":1,"315":1,"321":1,"336":1,"337":1,"344":1,"366":1,"400":1,"425":1}}],["шаблонам",{"2":{"172":1,"182":1,"319":1,"323":1,"473":1}}],["шаблонами",{"0":{"337":1},"1":{"338":1,"339":1},"2":{"169":1,"181":1,"207":1,"216":1,"276":1,"278":1,"290":1,"296":1,"303":1,"321":1,"419":1,"440":1}}],["шаблонах",{"2":{"172":1,"226":1,"230":1,"235":1,"300":1,"400":1}}],["шаблона",{"2":{"152":1,"186":1,"187":1,"190":1,"192":3,"193":1,"204":2,"221":1,"225":1,"231":1,"247":2,"249":5,"251":2,"255":1,"271":1,"279":2,"291":1,"293":2,"294":1,"295":2,"297":2,"299":1,"300":2,"302":2,"324":1,"326":1,"328":1,"329":1,"336":1,"337":1,"352":1,"365":1,"391":1,"419":1,"424":1,"425":2,"426":1,"441":1,"506":1,"508":1,"545":1}}],["шаблоны",{"0":{"169":1,"182":1,"194":1,"202":1,"206":1,"207":1,"260":1,"273":1,"274":1,"275":1,"276":1,"398":1,"408":1},"1":{"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":2,"184":2,"185":2,"186":2,"187":2,"188":2,"189":2,"190":2,"191":2,"192":2,"193":2,"194":1,"195":2,"196":2,"197":2,"198":2,"199":2,"200":2,"201":2,"202":1,"203":2,"204":2,"205":2,"206":2,"207":1,"208":2,"209":2,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":1,"220":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1},"2":{"128":1,"147":1,"160":1,"169":1,"172":1,"176":1,"181":2,"185":2,"190":1,"194":1,"202":1,"206":4,"207":1,"220":2,"235":1,"237":1,"241":4,"243":1,"249":1,"250":1,"256":1,"258":2,"259":1,"260":1,"271":2,"272":1,"275":1,"296":1,"304":4,"305":2,"321":1,"322":1,"326":1,"335":1,"337":1,"346":1,"358":1,"359":1,"369":1,"400":1,"408":1,"417":1,"424":1,"425":1,"426":1,"427":1,"428":1}}],["шаблоне",{"2":{"86":1,"152":5,"193":1,"218":1,"232":1,"250":1,"255":1,"256":1,"297":3,"300":1,"315":1,"325":1,"328":1,"330":1,"351":1,"358":1,"426":1,"427":1,"437":1,"452":1,"504":1}}],["шаблон",{"0":{"271":1,"277":1,"282":1,"290":1,"291":1,"293":1,"295":1,"297":1,"300":1,"301":1,"303":1,"425":1,"426":1},"1":{"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"292":1,"294":1,"296":1,"298":1,"299":1,"302":1},"2":{"41":1,"103":1,"152":1,"183":1,"185":1,"186":3,"187":1,"188":1,"189":2,"195":1,"199":2,"200":5,"203":1,"204":4,"208":1,"209":1,"210":1,"213":2,"216":1,"221":1,"227":1,"230":1,"231":2,"241":2,"246":3,"248":1,"252":1,"271":2,"273":3,"274":2,"275":3,"276":2,"277":1,"278":1,"281":2,"282":1,"287":1,"289":1,"290":1,"291":2,"292":1,"293":1,"294":2,"295":3,"296":2,"297":3,"299":2,"300":4,"301":3,"302":1,"303":2,"305":1,"325":2,"326":2,"328":2,"329":1,"331":1,"339":1,"365":3,"380":1,"419":1,"425":7,"426":1,"437":1,"445":1,"462":2,"463":1,"471":1}}],["шрифта",{"2":{"226":1}}],["шрифтами",{"2":{"175":1,"227":1}}],["шрифты",{"2":{"224":1,"227":5,"233":1}}],["шрифтом",{"2":{"208":1,"231":1}}],["шрифтовых",{"2":{"227":1}}],["шрифтов",{"2":{"175":1,"225":3,"227":3,"229":1}}],["шрифт",{"2":{"26":1,"175":1}}],["цукерберг",{"2":{"462":1}}],["цветом",{"2":{"318":1,"376":1}}],["цветовой",{"2":{"173":1}}],["цветов",{"2":{"171":1,"173":1,"183":1,"308":1}}],["цветовые",{"2":{"26":1,"545":1}}],["цвет",{"2":{"173":2,"184":1,"191":1,"227":1,"230":1,"312":2}}],["цветами",{"2":{"227":1,"315":1}}],["цветах",{"2":{"184":1}}],["цвета",{"2":{"173":2,"174":1,"183":1,"308":1,"376":1}}],["цитата",{"2":{"471":1}}],["цифровыми",{"2":{"367":1}}],["цифрой",{"2":{"187":1,"192":1}}],["цифра",{"2":{"187":1}}],["цифры",{"2":{"134":1}}],["цикле",{"2":{"421":1}}],["цикл",{"2":{"157":1,"267":1,"316":1}}],["циклу",{"2":{"157":1}}],["цикла",{"2":{"152":1,"157":1,"250":1,"267":2,"287":1,"328":1,"352":1,"355":1}}],["царька",{"2":{"102":1}}],["цепляемыми",{"2":{"297":1}}],["цепочечный",{"2":{"376":1}}],["цепочечными",{"2":{"121":1,"376":1}}],["цепочку",{"2":{"288":1,"302":1,"303":2}}],["цепочке",{"2":{"149":1,"303":1}}],["ценность",{"2":{"396":1,"397":1}}],["цене",{"2":{"367":1}}],["ценовые",{"2":{"213":1}}],["цена",{"2":{"212":1}}],["цен",{"0":{"212":1}}],["центов",{"2":{"134":1}}],["централизованным",{"2":{"330":1}}],["централизованное",{"2":{"341":1}}],["централизованного",{"2":{"321":1,"330":2}}],["централизованному",{"2":{"249":1,"352":1}}],["центральный",{"2":{"331":1,"337":1,"395":1}}],["центральном",{"2":{"395":1}}],["центрального",{"2":{"335":1,"340":1}}],["центральное",{"2":{"235":1,"331":2,"335":1}}],["центральной",{"2":{"31":1,"547":1}}],["центральную",{"2":{"173":1}}],["центральная",{"2":{"28":1}}],["центрирования",{"2":{"230":1}}],["центре",{"2":{"223":1}}],["центру",{"2":{"188":1,"230":1}}],["центр",{"2":{"115":1}}],["цены",{"2":{"134":1,"212":1,"213":1}}],["целях",{"2":{"434":1}}],["целями",{"2":{"69":1,"178":1}}],["целям",{"2":{"68":1,"223":1}}],["целый",{"2":{"308":1,"394":1,"395":1}}],["целые",{"2":{"271":1,"372":1}}],["целая",{"2":{"276":1}}],["целостного",{"2":{"385":1}}],["целого",{"2":{"193":1}}],["целое",{"2":{"150":1,"266":1,"358":1,"372":1,"374":1}}],["целом",{"2":{"68":1,"144":1,"232":1,"238":1,"255":1,"270":1,"300":1,"308":1,"366":1,"425":1,"457":1,"471":1,"472":1,"473":2}}],["целесообразность",{"2":{"461":1}}],["целесообразно",{"2":{"441":1,"445":1}}],["целесообразным",{"2":{"438":1}}],["целевую",{"2":{"352":1}}],["целевые",{"2":{"313":1}}],["целевым",{"2":{"295":1}}],["целевых",{"2":{"203":1,"308":1}}],["целевая",{"2":{"295":1,"347":2}}],["целевого",{"2":{"297":1,"298":2,"299":1}}],["целевому",{"2":{"186":1,"295":1,"297":1,"299":1,"367":1}}],["целевом",{"2":{"186":1}}],["целевое",{"2":{"136":1}}],["целевой",{"2":{"134":1,"295":4,"296":2,"297":1,"367":1,"393":1}}],["целей",{"2":{"147":1,"171":2,"172":1,"227":2,"271":1,"335":1,"336":1,"359":1,"367":1,"424":1,"425":1}}],["цели",{"0":{"75":1,"76":1,"508":1},"1":{"76":1,"77":1,"78":1,"79":1},"2":{"178":5,"181":1,"263":1,"451":1,"463":1}}],["целиком",{"2":{"26":1}}],["цельсия",{"2":{"295":1}}],["целью",{"2":{"74":1,"207":1,"209":1,"213":1,"217":1,"218":1,"296":1,"328":1,"355":1,"372":1,"374":1}}],["цель",{"0":{"63":1},"2":{"65":1,"68":1,"131":1,"149":1,"171":2,"181":1,"190":1,"200":1,"229":1,"295":2,"297":3,"352":1,"381":1}}],["bzl",{"2":{"457":1}}],["bbl",{"2":{"457":1}}],["bit",{"2":{"463":1}}],["bitkeeper",{"2":{"385":1,"386":1}}],["binance",{"2":{"367":1}}],["bind",{"0":{"154":1},"2":{"154":1}}],["by",{"2":{"328":1,"376":2,"451":1}}],["blg",{"2":{"457":1}}],["blame",{"2":{"457":3}}],["black",{"2":{"231":1}}],["blue",{"2":{"230":1,"231":4}}],["bloc",{"2":{"457":1}}],["blockchain",{"2":{"367":1}}],["block",{"2":{"191":1}}],["blog",{"2":{"125":1}}],["b",{"2":{"148":3,"303":7,"392":1,"393":1,"460":2}}],["built",{"2":{"159":1,"160":2,"251":1}}],["builddata",{"2":{"451":4}}],["build",{"2":{"125":1,"136":1,"224":1,"375":2,"451":10,"455":1,"457":4,"527":2}}],["button>вариант",{"2":{"249":2}}],["button>option",{"2":{"249":2}}],["button>",{"2":{"159":2,"160":1,"231":2,"249":4,"255":2,"315":1,"324":1,"325":1,"328":1,"330":2,"335":2,"432":1,"437":1,"538":1}}],["button",{"2":{"159":2,"160":1,"184":1,"231":4,"255":2,"315":1,"324":1,"325":1,"328":1,"330":2,"335":2,"381":2,"432":1,"437":1,"471":1,"538":2}}],["bundleconfig",{"2":{"457":2}}],["bundle",{"2":{"150":1,"455":3}}],["bundler",{"2":{"150":1}}],["business",{"0":{"425":1},"2":{"419":1,"424":1,"425":5,"427":1,"441":1,"463":2}}],["bus",{"0":{"328":1},"2":{"118":1,"325":2}}],["brew",{"2":{"389":1}}],["break",{"2":{"294":3,"296":2}}],["breaking",{"2":{"129":1}}],["breadcrumbs",{"0":{"196":1},"2":{"108":1}}],["bracketpairs",{"2":{"457":1}}],["branches",{"2":{"451":2}}],["branching",{"2":{"391":1}}],["branch",{"2":{"386":1,"391":1,"392":8,"393":1,"451":1,"527":2}}],["brands",{"2":{"227":3}}],["brave",{"2":{"222":1}}],["br>",{"2":{"123":1,"330":1}}],["browserslist",{"2":{"457":2}}],["browser",{"2":{"115":1,"311":1,"402":1,"457":1}}],["box",{"2":{"509":4}}],["boilerplate",{"2":{"508":1}}],["bound",{"2":{"463":2}}],["boundary",{"2":{"457":1}}],["bower",{"2":{"457":3}}],["bottombar",{"2":{"231":1}}],["bootstrap",{"2":{"225":1}}],["boolean",{"2":{"103":1,"231":1,"428":1}}],["border",{"2":{"191":3,"231":2,"249":1,"509":1,"557":1}}],["body>",{"2":{"149":2}}],["body",{"2":{"23":1,"149":2,"224":1,"225":1,"439":1,"509":1,"556":1}}],["be",{"2":{"451":2,"457":1,"509":1}}],["beforeinstallprompt",{"2":{"315":3}}],["before",{"2":{"302":4,"303":2}}],["below",{"2":{"205":1}}],["bento",{"2":{"198":1}}],["bearer",{"2":{"53":3,"56":3,"364":2}}],["best",{"0":{"399":1},"2":{"22":1,"170":1,"235":1,"255":1,"256":1,"307":1,"322":1,"343":1,"371":1,"404":1,"420":1,"472":2,"476":1,"497":1}}],["babel",{"2":{"457":10}}],["babelrc",{"2":{"457":10}}],["bazelproject",{"2":{"457":1}}],["bazelignore",{"2":{"457":1}}],["bazelrc",{"2":{"457":1}}],["bazel",{"2":{"457":3}}],["banner",{"2":{"452":1}}],["band",{"2":{"176":1}}],["bash$",{"2":{"501":1}}],["bashpnpm",{"2":{"501":1}}],["basic",{"0":{"324":1,"325":1,"332":1}}],["basetoggle",{"2":{"543":1}}],["baseurl",{"2":{"512":1}}],["baseurl=",{"2":{"435":1}}],["baseinput",{"2":{"466":1}}],["baseicon",{"0":{"453":1,"513":1},"2":{"98":1,"105":3,"452":2,"455":2,"513":5,"543":1}}],["baseiconbutton",{"2":{"85":2}}],["basebutton",{"2":{"445":1,"466":1,"471":2}}],["base64urlencode",{"2":{"361":2}}],["base64",{"2":{"361":3,"452":1}}],["based",{"2":{"115":3,"431":1}}],["base",{"0":{"528":1},"2":{"112":1,"453":1,"528":2,"557":1}}],["bar",{"2":{"249":1}}],["bars",{"0":{"190":1},"1":{"191":1},"2":{"195":2}}],["backers",{"2":{"457":1}}],["backend",{"2":{"39":1,"116":1,"361":1}}],["backups",{"2":{"451":1}}],["backup",{"2":{"451":8}}],["backroute",{"2":{"447":1}}],["background",{"2":{"312":1,"313":1,"317":1}}],["back",{"2":{"196":1,"358":1}}],["badge",{"2":{"85":1,"103":1,"187":1,"325":1}}],["baas",{"0":{"37":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"39":1,"116":5}}],["two",{"2":{"473":1}}],["twitter",{"2":{"364":1,"552":8}}],["turbo",{"2":{"457":2}}],["tmp",{"2":{"457":1}}],["tdd",{"0":{"372":1},"2":{"370":1,"372":2,"374":1}}],["ttf",{"2":{"317":1}}],["t",{"0":{"268":1},"2":{"204":1,"260":1,"455":3,"463":2,"498":1,"504":1,"536":2,"538":2}}],["trevis",{"2":{"442":1}}],["tree",{"2":{"170":1,"307":1,"322":1,"343":1,"371":1,"420":1,"454":1,"457":3,"463":2,"465":1}}],["tr",{"2":{"310":1}}],["travis",{"2":{"457":2}}],["traffic",{"2":{"308":1}}],["transactions",{"2":{"536":1}}],["transport",{"2":{"511":1}}],["translate",{"2":{"472":1}}],["transformer",{"2":{"457":1}}],["transform",{"2":{"191":2,"462":1}}],["transfer",{"2":{"143":1,"144":1,"359":1,"434":1,"451":1}}],["transitiongroup",{"2":{"160":1}}],["transition",{"2":{"160":1}}],["tricks",{"0":{"516":1}}],["triggerexpansionontab",{"2":{"457":1}}],["triggerevent",{"2":{"193":4}}],["trigger",{"2":{"381":1}}],["trivago",{"2":{"308":1}}],["try",{"2":{"141":1,"173":1,"287":1,"303":2,"377":1,"433":3}}],["true",{"2":{"114":1,"155":2,"184":1,"231":1,"244":1,"255":1,"315":2,"317":1,"333":1,"338":1,"349":2,"353":2,"429":1,"447":1,"451":1,"454":2,"457":61,"501":4}}],["txtlogs",{"2":{"391":1}}],["txthome",{"2":{"196":2}}],["txtserver",{"2":{"141":1}}],["txt",{"2":{"134":1,"224":1,"457":1}}],["typ",{"2":{"361":1}}],["typicode",{"2":{"116":1,"511":1}}],["types",{"2":{"455":1,"493":1}}],["typescript",{"0":{"493":1},"2":{"23":2,"92":1,"118":1,"151":1,"223":1,"335":1,"455":3,"457":6,"463":2,"493":4,"504":1}}],["type=",{"2":{"158":1,"231":3,"432":1,"437":3,"538":1}}],["typedoc",{"2":{"457":2}}],["typed",{"2":{"91":1}}],["type",{"2":{"53":1,"91":1,"183":1,"231":1,"245":2,"255":2,"290":2,"313":1,"317":3,"362":1,"451":1,"453":7,"512":1,"552":1}}],["terserrc",{"2":{"457":10}}],["terminal",{"2":{"222":1,"457":5}}],["tex",{"2":{"457":1}}],["textlint",{"2":{"457":2}}],["text=abc",{"2":{"352":1}}],["text",{"2":{"158":1,"222":1,"231":12,"249":2,"352":1,"380":1,"383":2,"432":5,"437":1,"557":6}}],["textarea>",{"2":{"432":1}}],["textarea",{"2":{"158":1,"183":1,"432":1}}],["testnet",{"2":{"512":1}}],["testjsonrpc",{"2":{"512":1}}],["testrest",{"2":{"511":2}}],["testservice",{"2":{"429":4,"434":1,"436":1}}],["tests",{"0":{"376":1,"380":1,"381":1},"2":{"375":4}}],["testing",{"2":{"370":1,"372":2,"374":1,"402":1}}],["test",{"0":{"376":1,"379":1,"380":1,"381":1,"430":1},"1":{"380":1,"381":1},"2":{"370":1,"373":1,"375":7,"376":10,"378":2,"379":5,"380":5,"381":3,"382":2,"383":1,"384":2,"429":1,"430":2,"437":1,"439":2,"457":1,"461":1,"538":1}}],["temperature",{"2":{"296":5}}],["template",{"2":{"105":1,"151":1,"249":8,"534":3}}],["template>",{"2":{"103":2,"123":2,"151":2,"160":2,"191":2,"193":2,"230":2,"249":9,"251":2,"255":2,"298":2,"299":2,"324":2,"325":2,"328":2,"330":2,"335":2,"339":2,"352":2,"432":2,"437":2,"447":6,"448":2,"453":2,"471":2,"513":2,"534":2,"538":2}}],["team",{"2":{"176":1}}],["teleport",{"2":{"128":1,"160":1}}],["telegram",{"2":{"64":1,"344":1}}],["threshold",{"2":{"534":2}}],["throw",{"2":{"287":1,"376":1,"377":1,"451":1}}],["that",{"2":{"91":2,"463":4}}],["there",{"2":{"424":1,"463":1}}],["themetoggle",{"2":{"557":1}}],["themes",{"2":{"508":1,"545":1}}],["theme",{"2":{"312":1,"313":1,"317":1,"543":1}}],["thenable",{"2":{"303":1}}],["then",{"2":{"255":1,"303":13,"360":1,"364":1,"365":2,"367":1,"429":1,"430":1,"432":2,"435":2,"437":1,"451":4}}],["the",{"0":{"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"91":5,"180":1,"205":1,"260":1,"295":1,"376":4,"451":2,"452":2,"454":1,"457":1,"473":1}}],["this",{"2":{"91":2,"151":1,"152":6,"281":2,"285":1,"287":1,"288":3,"292":9,"332":4,"338":3,"358":2,"457":3}}],["tazerc",{"2":{"457":2}}],["tauri",{"2":{"349":1}}],["target",{"2":{"296":6,"338":7,"451":15,"455":1}}],["tail",{"2":{"451":1}}],["tails",{"2":{"251":4}}],["tailwind",{"2":{"225":2,"457":10,"471":2}}],["tasks",{"2":{"231":2,"457":2}}],["task",{"2":{"164":1,"231":1}}],["tabs",{"2":{"457":1}}],["tabsize",{"2":{"457":1}}],["tab",{"2":{"89":1}}],["table",{"0":{"45":1,"46":1,"47":1}}],["tablet",{"2":{"23":1,"95":1,"509":4,"546":2,"548":1}}],["tags",{"2":{"112":1,"501":1,"506":1,"552":2}}],["tag",{"0":{"87":1,"106":1},"2":{"529":2}}],["tsup",{"2":{"457":2}}],["tslint",{"2":{"457":2}}],["tsdoc",{"2":{"457":11}}],["tsdk",{"2":{"457":1}}],["tsx",{"2":{"457":3}}],["tsconfig",{"2":{"455":2,"457":11}}],["tsc",{"2":{"455":1}}],["tsimport",{"2":{"449":1}}],["ts",{"0":{"83":1,"449":1},"2":{"103":2,"104":1,"112":1,"151":1,"382":1,"457":33,"463":1,"509":1,"511":1,"512":2,"513":3,"515":1,"528":1,"538":2}}],["tip",{"2":{"460":1,"462":1}}],["tidy",{"2":{"457":1}}],["tinder",{"2":{"308":2}}],["time",{"2":{"361":1,"365":1}}],["timeout",{"2":{"244":3}}],["times",{"2":{"231":1}}],["timestamp",{"2":{"47":1}}],["titlebarstyle",{"2":{"457":1}}],["title=",{"2":{"246":1,"255":1,"299":1,"324":3}}],["title",{"2":{"0":1,"17":1,"18":1,"19":1,"56":3,"83":4,"246":2,"255":4,"325":2,"328":3,"432":5,"433":2,"552":4}}],["toml",{"2":{"457":10}}],["toc",{"2":{"457":1}}],["tocontain",{"2":{"380":1}}],["toarray",{"2":{"433":2}}],["tool",{"2":{"457":3}}],["toolchain",{"2":{"457":1}}],["tools",{"2":{"402":1}}],["tooltips",{"0":{"186":1}}],["tothrow",{"2":{"377":1}}],["total",{"2":{"162":1,"163":1}}],["toequal",{"2":{"376":1,"381":1}}],["tobegreaterthan",{"2":{"376":1}}],["tobe",{"2":{"376":8,"378":1,"381":2}}],["tostring",{"2":{"362":1}}],["to=",{"2":{"352":3,"355":1}}],["todolist",{"2":{"239":1,"240":1}}],["todofilter",{"2":{"239":1}}],["todoproject",{"2":{"238":1,"239":2,"240":2,"256":3,"347":1,"349":1,"352":3}}],["todo",{"2":{"231":26,"256":3}}],["todoservice",{"2":{"256":1}}],["todosummary",{"2":{"239":1,"256":1}}],["todos",{"0":{"231":1},"2":{"230":7,"511":1}}],["top",{"2":{"191":1,"349":1}}],["togglestatus",{"2":{"256":2}}],["toggle",{"2":{"184":2,"513":1}}],["togglefavourite",{"2":{"103":3}}],["tokens",{"2":{"361":1,"435":1}}],["token",{"2":{"114":1,"115":5,"363":2,"364":3,"496":2}}],["touchslideoutdrawer",{"0":{"519":1},"2":{"112":1,"519":1}}],["to",{"0":{"118":1,"136":1,"205":1,"229":1,"232":1,"256":1,"257":1,"347":1},"1":{"230":1,"231":1,"232":1},"2":{"43":1,"91":1,"112":1,"114":1,"205":1,"221":1,"223":1,"228":1,"229":2,"230":1,"231":2,"232":1,"233":1,"238":1,"251":1,"255":1,"256":3,"257":1,"259":1,"342":2,"347":1,"349":1,"352":2,"356":4,"372":1,"373":1,"376":1,"437":3,"451":2,"452":1,"457":2,"461":1,"463":3}}],["agnostic",{"2":{"511":1}}],["age",{"2":{"245":1}}],["azure",{"2":{"457":2}}],["ava",{"2":{"457":10}}],["available",{"0":{"141":1},"2":{"140":1}}],["aux",{"2":{"457":1}}],["automation",{"2":{"527":1}}],["autocompleterefs",{"2":{"457":1}}],["autodetection",{"2":{"457":1}}],["autodetectcolorscheme",{"2":{"457":1}}],["autofetch",{"2":{"457":1}}],["autofocus",{"2":{"231":1}}],["auto",{"2":{"317":1,"453":1,"457":1,"554":1}}],["autoupdate",{"2":{"317":1,"457":1}}],["authors",{"2":{"457":3}}],["authorization",{"2":{"53":3,"56":3,"115":2,"364":2}}],["authenticator",{"2":{"366":1}}],["auth0",{"2":{"364":1}}],["authinterceptor",{"2":{"114":2}}],["auth",{"2":{"114":3,"362":1,"506":1,"508":1,"545":2}}],["a>",{"2":{"432":2}}],["abc",{"2":{"352":1}}],["ajax",{"2":{"300":1,"344":1,"359":2}}],["after",{"2":{"250":1,"302":5,"303":2,"451":1}}],["aaaa",{"2":{"134":2}}],["awesome",{"2":{"228":1}}],["aws",{"2":{"116":1}}],["await",{"2":{"52":3,"83":2,"114":2,"303":8,"316":3,"378":3,"433":1,"450":1,"511":1}}],["amd",{"2":{"402":1}}],["amazon",{"2":{"116":2,"189":5,"308":1,"444":2}}],["amplify",{"2":{"39":1}}],["at",{"2":{"115":6,"361":1,"457":1,"496":1}}],["attributes",{"0":{"77":1}}],["ad",{"2":{"193":1}}],["admin",{"2":{"134":1,"247":1}}],["adapter",{"2":{"112":1,"501":1}}],["addnote",{"2":{"432":1,"433":2}}],["addextraspaceontop",{"2":{"457":1}}],["added",{"2":{"393":1}}],["addeventlistener",{"2":{"250":1,"267":1,"315":2,"316":1}}],["addroute",{"2":{"358":1}}],["addresponseinterceptor",{"2":{"114":2,"512":1}}],["addyosmani",{"2":{"308":1}}],["addcommand",{"2":{"294":1}}],["addtodo",{"2":{"231":6}}],["adds",{"2":{"112":1,"501":1,"506":1}}],["add",{"2":{"51":1,"103":1,"112":7,"388":1,"390":2,"393":1,"394":1,"433":1,"449":1,"501":6,"506":3}}],["acme",{"2":{"554":3}}],["acr",{"2":{"457":1}}],["acn",{"2":{"457":1}}],["activitybar",{"2":{"457":1}}],["active",{"2":{"255":3,"352":1,"355":1,"448":1,"457":1}}],["actions",{"0":{"451":1,"526":1},"1":{"527":1,"528":1},"2":{"112":1,"331":1,"332":4,"333":1,"442":1,"451":12,"457":1,"472":1,"481":1,"508":1,"527":1,"542":1,"545":1}}],["action",{"0":{"205":1},"2":{"112":1,"160":4,"205":1,"294":2,"381":1,"451":9,"457":1,"501":1,"527":2}}],["accordian",{"2":{"446":1}}],["accordianpanel",{"2":{"446":1}}],["according",{"2":{"376":1}}],["accountroutes",{"2":{"447":2}}],["account",{"2":{"114":1,"447":2,"452":1,"454":1}}],["accept",{"2":{"255":5}}],["accessibility",{"2":{"471":1}}],["accessibilitysupport",{"2":{"457":1}}],["access",{"2":{"115":5,"117":4,"496":1}}],["ac",{"2":{"104":2}}],["arguments",{"2":{"529":1}}],["args",{"2":{"338":2}}],["article",{"2":{"469":1}}],["artisan",{"2":{"457":1}}],["arty",{"0":{"61":1},"2":{"80":2,"83":1,"95":1,"111":1,"112":5}}],["array",{"2":{"91":8,"103":1,"245":1}}],["always",{"2":{"463":1}}],["alg",{"2":{"361":1,"457":1}}],["ally",{"2":{"457":3,"539":2}}],["all",{"2":{"303":1,"457":1}}],["allowcompoundwords",{"2":{"457":1}}],["allows",{"2":{"457":1}}],["allow",{"2":{"117":4}}],["alert",{"2":{"302":1}}],["alexa",{"2":{"171":1}}],["alias",{"2":{"228":1,"455":1}}],["align",{"2":{"191":1}}],["alibris",{"2":{"22":1}}],["alt",{"2":{"89":2}}],["air",{"2":{"457":1}}],["ai",{"2":{"89":1}}],["analysis",{"2":{"457":1,"493":1}}],["analytics",{"0":{"529":1,"552":1},"2":{"112":1,"501":1,"506":1,"515":1,"542":1}}],["antfu",{"2":{"457":3}}],["antialiased",{"2":{"457":1}}],["antony",{"2":{"23":1,"457":1,"504":1}}],["any",{"2":{"402":1,"554":1}}],["angular",{"2":{"344":1,"462":2}}],["anothercomponent",{"2":{"244":3}}],["anon",{"2":{"52":1,"53":6}}],["animation",{"2":{"191":1}}],["android",{"2":{"308":2,"315":1}}],["and",{"0":{"269":1,"399":1},"2":{"112":2,"134":1,"170":1,"203":1,"235":1,"255":1,"256":1,"307":1,"322":1,"343":1,"359":1,"371":1,"377":1,"380":2,"381":2,"404":1,"420":1,"451":4,"463":4,"472":2,"476":1,"497":1,"501":1,"506":1,"527":3}}],["an",{"2":{"91":1,"356":1,"377":1,"463":2}}],["annotations",{"2":{"457":1}}],["annotation",{"2":{"91":1}}],["axios",{"2":{"41":1,"114":1,"300":1,"359":4,"360":4,"364":5,"365":3,"434":4,"435":5,"439":2,"507":1,"511":1}}],["apollo",{"2":{"457":2}}],["apt",{"2":{"388":4}}],["apache",{"0":{"138":1},"1":{"139":1},"2":{"137":1,"138":1,"140":1,"402":1,"431":1,"444":1}}],["appveyor",{"2":{"457":2}}],["appsettings",{"2":{"457":2}}],["appsearchbar",{"2":{"98":1}}],["appsidebar",{"2":{"447":1,"546":1}}],["appfooter",{"2":{"447":2}}],["appinstalled",{"2":{"315":2}}],["appmanifest",{"2":{"310":1}}],["apploader",{"0":{"448":1}}],["appleboy",{"2":{"451":3}}],["apple",{"2":{"308":2}}],["applications",{"2":{"317":1}}],["application",{"2":{"53":1,"112":1,"310":1,"314":1,"400":1,"473":2,"501":1,"512":1}}],["approach",{"2":{"203":1}}],["app",{"0":{"230":1,"352":1},"2":{"95":2,"98":1,"105":1,"120":5,"121":5,"134":1,"135":1,"136":3,"141":2,"149":6,"150":1,"151":2,"224":2,"229":1,"230":3,"238":2,"243":6,"247":2,"255":8,"256":1,"308":2,"310":1,"315":5,"318":1,"334":7,"350":4,"351":1,"352":2,"374":2,"430":1,"439":6,"445":1,"447":1,"448":1,"449":1,"450":1,"453":2,"473":1,"509":1,"556":1}}],["appheader>",{"2":{"534":1}}],["appheadersecond",{"2":{"534":1}}],["appheaderfirst",{"2":{"534":1}}],["appheader",{"2":{"85":1,"100":1,"102":1,"105":1,"447":2,"534":1}}],["appwrite",{"2":{"39":1}}],["apidata",{"2":{"511":2}}],["apikey",{"2":{"53":3,"56":3}}],["api",{"0":{"49":1,"53":1,"55":1,"81":1,"83":1,"109":1,"114":1,"152":1,"332":1,"510":1,"511":1},"1":{"50":1,"51":1,"52":1,"53":1,"82":1,"83":1,"511":1,"512":1},"2":{"23":1,"40":2,"41":9,"53":1,"55":1,"58":2,"59":1,"83":1,"102":1,"109":2,"112":1,"114":10,"116":5,"118":2,"119":3,"121":2,"122":1,"123":1,"125":4,"130":1,"152":16,"159":1,"160":2,"247":1,"250":2,"251":1,"254":1,"255":9,"256":1,"266":2,"268":2,"278":1,"282":2,"284":1,"295":8,"296":1,"297":5,"298":2,"300":7,"303":1,"306":1,"308":2,"316":1,"329":1,"331":3,"332":2,"333":3,"335":3,"336":2,"337":1,"338":1,"358":4,"359":2,"360":4,"362":1,"380":1,"419":3,"421":2,"422":1,"423":1,"431":2,"434":5,"437":1,"439":2,"444":2,"445":2,"450":1,"457":14,"460":4,"462":1,"463":3,"472":3,"473":1,"482":1,"501":2,"504":1,"506":1,"508":2,"511":4,"512":7,"542":3}}],["a",{"2":{"39":1,"52":1,"91":5,"112":1,"116":1,"134":2,"148":2,"292":2,"303":10,"308":1,"352":2,"356":4,"376":1,"393":1,"432":2,"454":1,"457":1,"460":2,"463":3,"464":1,"472":1,"473":1,"501":1,"506":1,"527":1}}],["asked",{"2":{"497":1}}],["aside",{"2":{"469":1}}],["astro",{"2":{"457":1,"507":1}}],["ashx",{"2":{"457":1}}],["ascx",{"2":{"457":1}}],["asax",{"2":{"457":1}}],["aspx",{"2":{"457":1}}],["asp",{"2":{"226":1}}],["assign",{"2":{"362":1}}],["assigned",{"2":{"134":1}}],["assets",{"2":{"224":2,"350":1,"445":1,"452":5,"454":2,"513":1,"555":1}}],["asynchronous",{"2":{"359":1}}],["async",{"2":{"83":1,"114":1,"241":1,"254":1,"303":3,"316":1,"378":3,"433":3,"511":1,"512":1,"529":1}}],["as",{"2":{"39":1,"116":1,"376":1,"454":3}}],["38",{"2":{"557":1}}],["39",{"2":{"390":1}}],["365",{"2":{"344":1}}],["360deg",{"2":{"191":1}}],["333333",{"2":{"317":1}}],["34",{"2":{"302":3,"303":1}}],["32",{"2":{"296":3,"387":1}}],["3x3",{"2":{"198":1}}],["3000",{"2":{"423":1,"430":1,"435":1,"439":3}}],["300",{"2":{"365":1,"435":2,"457":1}}],["30rem",{"2":{"231":1}}],["30",{"2":{"173":2,"193":1,"217":1,"457":1}}],["3",{"0":{"147":1,"153":1,"240":1,"285":1,"345":1,"364":1,"398":1,"399":1,"407":1,"409":1,"418":1,"463":1,"478":1,"505":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":2,"155":2,"156":2,"157":2,"158":2,"159":2,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"479":1,"506":1,"507":1},"2":{"23":1,"98":1,"102":1,"103":1,"106":1,"109":1,"117":1,"118":1,"119":3,"120":4,"121":2,"122":1,"124":2,"125":2,"126":2,"127":1,"128":2,"130":5,"133":1,"137":3,"141":2,"144":2,"145":1,"147":3,"148":1,"149":2,"150":3,"151":2,"152":4,"157":1,"159":1,"160":2,"161":1,"167":1,"170":2,"175":1,"193":2,"196":2,"197":1,"220":1,"221":2,"222":2,"223":4,"224":5,"226":1,"227":1,"228":1,"229":1,"231":4,"234":2,"235":2,"236":1,"237":1,"240":1,"242":1,"243":1,"244":3,"246":1,"249":1,"250":3,"251":1,"252":1,"253":1,"255":8,"256":1,"260":1,"264":1,"265":1,"266":1,"267":2,"271":2,"288":1,"289":2,"291":1,"292":2,"294":2,"295":2,"296":2,"297":1,"299":3,"300":1,"303":4,"304":1,"307":1,"315":2,"321":1,"322":2,"324":3,"325":2,"328":3,"329":1,"330":4,"332":2,"333":2,"335":3,"338":3,"340":1,"342":2,"343":1,"344":2,"345":1,"349":3,"353":1,"360":1,"361":3,"364":1,"367":1,"371":1,"376":1,"380":3,"381":4,"383":1,"393":1,"394":1,"400":2,"402":2,"404":1,"407":1,"408":1,"413":1,"415":1,"416":1,"420":1,"421":2,"423":1,"428":2,"429":2,"430":2,"432":2,"433":1,"439":2,"445":2,"455":1,"457":2,"460":3,"462":3,"463":9,"471":1,"472":6,"476":1,"489":1,"497":2,"504":2,"506":1,"508":1,"512":1,"557":2}}],["huskyrc",{"2":{"457":2}}],["human",{"2":{"180":1}}],["hxx",{"2":{"457":3}}],["hpp",{"2":{"457":3}}],["hmacsha256",{"2":{"361":1}}],["hmr",{"2":{"223":1,"455":1}}],["hs256",{"2":{"361":3}}],["href",{"2":{"352":1}}],["href=",{"2":{"226":1,"227":3,"310":1}}],["h4>данные",{"2":{"437":1}}],["h4>текст",{"2":{"437":1}}],["h4>child",{"2":{"335":1}}],["h4>",{"2":{"328":2,"335":1,"437":2}}],["h3>selected",{"2":{"432":1}}],["h3>notes",{"2":{"432":1}}],["h3>new",{"2":{"432":1}}],["h3>",{"2":{"325":2,"432":3}}],["hamburger",{"2":{"513":1}}],["handleappinstalled",{"2":{"315":2}}],["handler",{"2":{"296":3,"338":3}}],["hasroute",{"2":{"358":1}}],["hash",{"2":{"141":1,"349":2,"358":1}}],["has",{"2":{"91":1,"103":2}}],["haskell",{"2":{"53":1}}],["hide=",{"2":{"534":1}}],["hidden",{"2":{"516":1}}],["histoire",{"2":{"457":10}}],["history",{"2":{"135":1,"136":1,"349":7,"457":5}}],["highlightmodifiedtabs",{"2":{"457":1}}],["hi",{"2":{"247":1,"424":1}}],["hyvinkaa",{"2":{"200":1}}],["hypertext",{"2":{"144":1}}],["h1",{"2":{"151":1,"297":1,"298":1}}],["h1>",{"2":{"151":1,"231":2,"298":2}}],["h1>hello",{"2":{"151":1}}],["holding",{"2":{"463":2}}],["houdini",{"2":{"457":1}}],["hover",{"2":{"457":1}}],["hot",{"2":{"223":1,"224":1}}],["hooks",{"2":{"152":1,"457":4}}],["homebrew",{"2":{"389":1}}],["home",{"2":{"141":1,"176":1,"347":1,"501":1}}],["homeview",{"2":{"96":1}}],["hosts",{"2":{"463":1}}],["host",{"2":{"117":1,"451":7}}],["how",{"2":{"112":1}}],["hopscotch",{"2":{"55":1}}],["hoppscotch",{"0":{"54":1},"1":{"55":1,"56":1},"2":{"56":1,"82":1,"457":1}}],["h",{"2":{"53":8,"451":1,"457":4}}],["htaccess",{"0":{"139":1},"2":{"140":1}}],["httponly",{"2":{"115":3}}],["http",{"0":{"138":1},"1":{"139":1},"2":{"53":2,"83":4,"114":11,"116":1,"117":3,"137":1,"138":1,"144":1,"359":2,"419":1,"434":2,"435":3,"436":1,"439":2,"452":1,"511":5,"512":4}}],["https",{"2":{"52":1,"53":3,"56":3,"80":2,"111":1,"112":1,"117":6,"125":3,"129":1,"144":3,"145":1,"149":1,"159":1,"160":2,"170":1,"178":1,"199":1,"222":2,"226":2,"227":1,"228":5,"235":1,"249":1,"250":1,"251":1,"255":1,"256":1,"269":1,"292":1,"307":1,"308":2,"310":1,"322":1,"326":1,"335":1,"336":1,"343":1,"358":1,"360":1,"361":3,"362":2,"365":2,"371":1,"404":1,"405":1,"420":1,"444":1,"457":2,"473":1,"498":1,"503":1,"511":1,"512":1,"527":1,"529":1}}],["htmlnanorc",{"2":{"457":20}}],["html=",{"2":{"453":1}}],["html>",{"2":{"149":2}}],["html5",{"2":{"145":1,"147":1,"349":1,"469":1,"491":1,"504":1}}],["html$",{"2":{"139":1}}],["html",{"0":{"183":1,"491":1,"515":1},"1":{"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1},"2":{"22":1,"112":1,"117":1,"120":1,"125":2,"126":1,"135":2,"136":2,"137":1,"139":2,"141":3,"147":5,"148":1,"149":3,"150":2,"151":6,"152":1,"153":2,"154":4,"158":2,"159":4,"160":4,"172":1,"182":1,"183":1,"184":2,"185":2,"190":1,"193":1,"201":1,"224":3,"225":3,"226":2,"227":3,"230":3,"231":5,"243":2,"246":1,"249":5,"251":1,"258":1,"266":1,"296":1,"310":2,"314":1,"317":1,"358":1,"361":1,"373":2,"378":1,"380":3,"383":3,"393":5,"402":1,"417":1,"444":1,"451":2,"452":2,"457":6,"462":3,"472":1,"473":10,"509":1,"515":2,"529":2,"552":2,"556":1}}],["heidisql",{"2":{"457":1}}],["height",{"2":{"18":1,"191":1,"230":1,"453":7}}],["heex",{"2":{"457":1}}],["hexcolorlength",{"2":{"457":1}}],["helps",{"2":{"454":1}}],["helloworld",{"2":{"224":1}}],["hello=",{"2":{"152":1}}],["hello",{"2":{"149":1,"152":10,"221":1,"232":1,"536":1}}],["heavycomponent",{"2":{"244":2}}],["heads",{"2":{"251":4}}],["head",{"2":{"149":1,"225":1,"310":1}}],["head>",{"2":{"149":2}}],["headers",{"0":{"530":1},"1":{"531":1,"532":1,"533":1,"534":1},"2":{"364":1,"512":1}}],["headerh1",{"2":{"299":2}}],["header=",{"2":{"249":1}}],["header>",{"2":{"249":3,"255":2,"513":1,"534":2}}],["header",{"0":{"29":1,"98":1},"2":{"28":1,"56":6,"112":1,"249":3,"255":1,"355":2,"361":4,"469":1,"501":2,"508":2,"513":2,"531":1,"532":1,"533":1,"534":1,"542":1,"545":1}}],["headless",{"2":{"6":1,"12":2,"62":1,"76":1,"79":1,"461":1,"471":1,"508":1}}],["heroku",{"2":{"444":1,"545":1}}],["hero",{"0":{"205":1},"2":{"205":2}}],["here",{"2":{"151":1,"231":1}}],["white",{"2":{"231":1}}],["w3css",{"2":{"226":3}}],["w3schools",{"2":{"226":3}}],["w3",{"0":{"226":1},"1":{"230":1,"231":1,"232":1},"2":{"226":4,"230":2,"231":28,"249":4,"310":1,"344":1,"352":2}}],["way",{"2":{"495":1}}],["wait",{"2":{"365":5}}],["watchman",{"2":{"457":2}}],["watch",{"2":{"352":4,"462":1}}],["watcher",{"2":{"193":6}}],["walmart",{"2":{"22":1}}],["write",{"2":{"151":1,"451":1,"463":1}}],["wrap",{"2":{"108":1}}],["wrapper=mount",{"2":{"381":1}}],["wrapper",{"2":{"105":1,"249":1,"255":2,"380":2,"381":2}}],["will",{"2":{"460":1}}],["wild",{"2":{"144":1}}],["windi",{"2":{"457":10}}],["window",{"2":{"225":1,"250":1,"267":2,"315":2,"336":3,"338":2,"367":1,"421":1,"422":3,"451":1,"457":4,"460":3,"529":2}}],["windows",{"0":{"387":1},"2":{"137":1,"140":1,"143":1,"186":1,"222":3,"308":1,"311":1,"318":1,"367":1,"378":1,"387":2,"402":5}}],["width",{"2":{"191":1,"203":1,"230":1,"231":2,"453":7,"548":1,"557":1}}],["wide",{"2":{"134":1,"147":1,"344":1}}],["wiki",{"2":{"178":1,"269":1,"336":1}}],["wikipedia",{"2":{"178":1,"269":1,"336":1}}],["without",{"2":{"460":1}}],["with",{"2":{"52":1,"356":2,"439":1,"451":8,"454":1,"457":1}}],["words",{"2":{"463":1}}],["wordseparators",{"2":{"457":1}}],["world",{"2":{"134":1,"147":1,"149":1,"151":1,"152":4,"221":1,"232":1,"344":1}}],["workspace",{"2":{"457":3}}],["workingissueformatscm",{"2":{"457":1}}],["workbench",{"2":{"457":11}}],["workbox",{"2":{"316":1,"317":4,"473":2,"555":1}}],["work",{"2":{"451":1,"457":2}}],["workflows",{"2":{"451":3}}],["workflow",{"2":{"112":2,"451":2,"501":1,"542":1}}],["workerу",{"2":{"428":1}}],["workers",{"0":{"316":1,"414":1,"419":1,"421":1},"1":{"420":1,"421":1,"422":2,"423":2,"424":2,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1},"2":{"268":1,"271":1,"278":1,"294":1,"300":2,"306":3,"315":1,"316":1,"336":2,"340":1,"359":1,"401":1,"414":1,"419":2,"420":1,"421":10,"423":2,"424":3,"425":1,"426":1,"427":1,"428":1,"440":4,"441":4}}],["worker",{"0":{"422":1,"423":1,"431":1,"555":1},"1":{"423":1,"424":1,"428":1,"429":1,"430":1,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"439":1},"2":{"112":2,"308":1,"316":4,"317":1,"320":1,"419":1,"421":2,"422":21,"423":4,"424":5,"425":2,"427":2,"428":11,"429":1,"430":4,"431":1,"432":5,"433":2,"434":3,"435":1,"436":1,"473":3,"496":1,"501":1,"506":1,"515":1,"542":1,"553":1,"555":2}}],["www",{"2":{"117":1,"125":1,"134":1,"141":2,"189":1,"199":1,"200":1,"226":2,"228":1,"292":1,"310":1,"344":1,"405":1,"451":6,"529":1}}],["we",{"2":{"151":1}}],["webdriverio",{"2":{"461":1}}],["webp",{"2":{"454":1}}],["webpack",{"2":{"119":1,"126":1,"127":1,"455":4,"457":13}}],["webworker",{"0":{"428":1,"429":1,"430":1,"433":1,"434":1,"435":1,"436":1},"2":{"428":4,"430":3,"432":5,"437":4}}],["webhooks",{"2":{"394":1}}],["web3js",{"2":{"367":1}}],["web3",{"0":{"367":1},"2":{"366":1,"367":2,"368":1}}],["webmanifest",{"2":{"310":2}}],["webfonts",{"2":{"227":2}}],["website",{"2":{"444":5,"451":1,"552":1}}],["webstorm",{"2":{"222":1,"457":2}}],["websocket",{"2":{"118":1}}],["websockets",{"2":{"114":1,"118":3,"472":1,"511":1}}],["web",{"0":{"414":1,"419":1,"421":1,"422":1,"431":1},"1":{"420":1,"421":1,"422":2,"423":3,"424":3,"425":1,"426":1,"427":1,"428":2,"429":2,"430":2,"431":1,"432":3,"433":3,"434":3,"435":3,"436":3,"437":3,"438":1,"439":2,"440":1,"441":1},"2":{"118":1,"134":1,"135":1,"141":1,"147":1,"227":1,"268":1,"271":1,"278":1,"294":1,"300":2,"306":2,"308":1,"318":1,"336":2,"339":1,"340":1,"344":5,"349":4,"359":1,"361":1,"362":1,"382":1,"400":1,"401":1,"402":1,"414":1,"419":3,"420":1,"421":12,"422":8,"423":6,"424":5,"425":3,"426":1,"427":3,"428":8,"429":1,"430":4,"431":1,"432":5,"433":2,"434":3,"435":2,"436":1,"440":4,"441":4,"473":4,"512":1,"554":1}}],["webapp",{"0":{"112":1,"501":1,"505":1},"1":{"502":1,"506":1,"507":1},"2":{"112":5,"476":1,"499":2,"501":7,"503":2,"506":1,"527":2,"528":1,"554":1}}],["webapi",{"2":{"109":1}}],["weight",{"2":{"18":1}}],["msg",{"2":{"538":1}}],["mjs",{"2":{"457":4}}],["mdsvex",{"2":{"457":1}}],["md",{"2":{"451":1,"457":3}}],["mdn",{"2":{"338":1}}],["mkdir",{"2":{"451":2}}],["mvc",{"2":{"462":1,"463":1}}],["mvp",{"2":{"461":1}}],["mv",{"2":{"451":1}}],["m",{"2":{"391":1,"393":1,"451":2}}],["mpr551xpscgmizp8ezuscoy7t7iqnpp",{"2":{"361":1}}],["mpa",{"2":{"308":1,"344":5,"345":2,"369":1}}],["myworker",{"2":{"424":5}}],["myprocessfunction",{"2":{"303":3}}],["myfuncc",{"2":{"303":3}}],["myfuncb",{"2":{"303":3}}],["myfunca",{"2":{"303":5}}],["myfunction",{"2":{"267":3,"281":3,"292":2}}],["myfile2",{"2":{"289":1}}],["myfile1",{"2":{"289":1}}],["mydata",{"2":{"336":2}}],["mydependency2",{"2":{"289":2}}],["mydependency1",{"2":{"289":2}}],["mydomain",{"2":{"134":1,"135":2,"136":2,"141":3}}],["mycache",{"2":{"316":1}}],["myclass",{"2":{"281":5}}],["mycomponent>",{"2":{"246":1}}],["mycomponent",{"2":{"121":12,"228":2,"243":7,"244":4,"246":3}}],["mymodal",{"2":{"255":2}}],["mymenubar>",{"2":{"249":2}}],["mymenubar",{"2":{"249":3}}],["mymethod",{"2":{"152":1}}],["mylayout>",{"2":{"249":2}}],["mylayout",{"2":{"249":2}}],["my",{"0":{"423":1},"2":{"154":3,"280":2,"281":4,"356":2,"360":1,"422":9,"424":1,"501":3,"502":1,"506":1,"527":2,"528":1}}],["mysql",{"2":{"40":1,"48":1,"457":1,"472":1}}],["mocha",{"2":{"457":10}}],["monospace",{"2":{"457":1}}],["mono",{"2":{"457":1}}],["moment",{"2":{"456":1,"460":1}}],["motels",{"0":{"210":1}}],["modern",{"2":{"457":1}}],["mode",{"2":{"349":1,"457":1}}],["modeling",{"2":{"239":1}}],["model=",{"2":{"158":1,"231":3,"246":2,"432":2,"437":3}}],["modelperson",{"2":{"124":4}}],["modelvalue",{"2":{"124":4,"246":9}}],["model",{"0":{"124":1,"158":1,"245":1},"2":{"119":1,"124":3,"155":1,"166":1,"231":2,"246":6,"251":1,"267":1,"462":1,"463":1}}],["modal>",{"2":{"255":1}}],["modal",{"2":{"255":14}}],["modals",{"2":{"253":1,"255":6,"256":3,"350":3}}],["module",{"2":{"223":1,"457":1}}],["modules",{"2":{"223":1,"224":2,"346":1,"391":1,"454":6,"455":1,"457":2}}],["mod",{"2":{"139":2,"457":1}}],["mozilla",{"2":{"125":1,"222":1,"316":1,"336":1,"362":1,"402":1,"424":1}}],["mount",{"2":{"120":1,"121":2,"149":2,"243":1,"255":1,"334":1,"350":1,"380":4,"381":1}}],["mobile",{"2":{"23":1,"203":2,"318":1,"509":4,"546":2,"548":1}}],["mit",{"2":{"499":1}}],["mitt",{"2":{"118":1,"292":2,"300":1,"326":4,"327":3}}],["mix",{"2":{"457":3}}],["mixin",{"2":{"250":1}}],["might",{"2":{"457":1}}],["migration",{"2":{"125":2,"129":1}}],["mime",{"2":{"310":1,"313":1}}],["missing",{"2":{"287":1}}],["minheight",{"2":{"453":1}}],["minwidth",{"2":{"453":1}}],["minimal",{"2":{"311":1}}],["min",{"2":{"227":3,"230":1,"231":1}}],["middleware",{"2":{"297":1}}],["middle",{"2":{"191":1}}],["mil",{"2":{"134":1}}],["microsoft",{"2":{"116":1,"176":1,"222":3,"308":1,"364":1,"402":1,"444":1,"457":1}}],["must",{"2":{"377":1}}],["music",{"2":{"64":1,"87":1,"106":1}}],["multicursormodifier",{"2":{"457":1}}],["multipurpose",{"2":{"310":1}}],["multiviews",{"2":{"139":1}}],["muzhskaya",{"2":{"97":1}}],["map",{"2":{"454":2,"457":7}}],["mastery",{"2":{"472":1}}],["master",{"2":{"391":3,"393":4,"394":5,"451":3,"457":1}}],["match",{"2":{"316":1}}],["math",{"2":{"251":1}}],["material",{"2":{"18":1,"198":1,"225":3,"226":1}}],["max",{"2":{"193":3,"203":1,"231":1,"548":1,"557":1}}],["macports",{"2":{"389":1}}],["mac",{"2":{"318":1}}],["macromedia",{"2":{"147":1}}],["macos",{"0":{"389":1},"2":{"143":1,"222":3,"308":1,"389":1,"402":4,"457":1}}],["mailmap",{"2":{"457":1}}],["mail",{"2":{"134":1,"310":1}}],["maintainers",{"2":{"457":1}}],["maintainability",{"2":{"261":1}}],["maintenanceview",{"2":{"447":1}}],["maintenance",{"2":{"447":2}}],["mainheader",{"2":{"256":1}}],["main>",{"2":{"249":2,"255":2,"352":2}}],["mainlayout",{"0":{"546":1},"1":{"547":1},"2":{"36":1,"112":1,"447":2,"501":2,"548":1}}],["main",{"0":{"31":1,"334":1,"350":1,"424":1},"2":{"120":1,"122":1,"150":1,"170":1,"224":3,"225":2,"243":3,"255":2,"256":1,"307":1,"316":1,"322":1,"333":1,"343":1,"349":1,"355":1,"371":1,"420":1,"423":1,"451":6,"538":1}}],["markdownlint",{"2":{"457":2}}],["markdown",{"0":{"494":1},"2":{"457":1,"494":1}}],["marketplace",{"2":{"22":1}}],["margin",{"2":{"231":3,"516":1}}],["mary",{"2":{"123":1}}],["mantinelayeredheader",{"0":{"533":1}}],["mantine",{"2":{"532":1,"533":1}}],["mantinerichfooter",{"0":{"524":1},"2":{"501":2}}],["mantinesimplefooter",{"0":{"523":1},"2":{"112":1}}],["mantinesimplenavbar",{"0":{"551":1},"2":{"112":1,"501":2}}],["mantinesimpleheader",{"0":{"532":1},"2":{"100":1,"112":1,"501":2}}],["manually",{"2":{"457":1}}],["management",{"0":{"463":1},"2":{"385":1,"463":2}}],["manager",{"0":{"127":1},"2":{"102":1,"119":1,"222":1,"337":1}}],["man",{"2":{"176":1}}],["manifest+json",{"2":{"310":1}}],["manifest",{"0":{"554":1},"2":{"112":2,"224":1,"310":5,"313":1,"317":1,"501":1,"506":1,"553":1,"554":1}}],["many",{"2":{"43":2}}],["make",{"2":{"91":1,"112":1,"501":1,"506":1}}],["magento",{"2":{"41":1,"47":1,"109":1}}],["me",{"2":{"498":1}}],["merge",{"2":{"386":1,"392":1,"393":2}}],["mercurial",{"2":{"385":1}}],["merchants",{"2":{"12":1}}],["memory",{"2":{"349":2}}],["meatball",{"2":{"198":1}}],["menus",{"2":{"457":1}}],["menu",{"2":{"195":1}}],["message=ref",{"2":{"328":1}}],["messagebus",{"0":{"327":1},"2":{"327":2,"328":6}}],["message",{"2":{"149":4,"325":1,"328":8,"422":2,"428":3,"536":1}}],["metadata",{"2":{"457":1}}],["metamask",{"2":{"367":5}}],["meta",{"2":{"112":1,"114":1,"382":3,"447":1,"453":1,"454":2,"501":1,"506":1,"512":1,"513":1,"552":13}}],["method2",{"2":{"281":2}}],["method1",{"2":{"281":2}}],["methods",{"2":{"152":1}}],["method",{"2":{"91":1,"367":1,"437":9,"512":1}}],["medium",{"2":{"308":1}}],["media",{"2":{"23":1,"203":1,"217":1}}],["medusajs",{"2":{"62":1}}],["medusa",{"2":{"12":1}}],["gql",{"2":{"457":2}}],["gz",{"2":{"457":1}}],["gls",{"2":{"457":1}}],["glo",{"2":{"457":1}}],["global",{"2":{"463":1}}],["glob",{"2":{"453":1,"454":2,"513":1}}],["globpatterns",{"2":{"317":1}}],["glg",{"2":{"457":1}}],["g",{"2":{"457":1,"529":1}}],["gb",{"2":{"402":2}}],["gutter",{"2":{"557":1}}],["gui",{"2":{"462":1}}],["guides",{"2":{"457":1}}],["guide",{"2":{"69":1,"249":1,"472":2}}],["gulp",{"2":{"457":2}}],["guards",{"2":{"349":3,"360":1}}],["go",{"0":{"358":1},"2":{"358":4,"457":6}}],["governance",{"2":{"457":1}}],["gov",{"2":{"134":1}}],["googletagmanager",{"2":{"529":1}}],["googleanalytics",{"2":{"501":1}}],["google",{"0":{"318":1,"529":1,"552":1},"2":{"17":1,"112":1,"115":8,"116":2,"198":1,"204":4,"222":1,"225":1,"226":1,"306":1,"314":2,"316":1,"344":1,"364":1,"366":1,"444":1,"460":1,"472":1,"473":4,"501":1,"506":1,"515":1,"529":2,"542":1}}],["gatsby",{"2":{"457":5}}],["gateway",{"2":{"116":1}}],["garaguso",{"2":{"361":1,"398":1}}],["garfield",{"2":{"18":2}}],["gmail",{"2":{"115":1,"359":1}}],["ghz",{"2":{"402":1}}],["gh",{"2":{"112":1,"451":2,"527":3}}],["grpc",{"2":{"511":1}}],["grunt",{"2":{"457":2}}],["great",{"2":{"457":1}}],["grey",{"2":{"249":1}}],["gray",{"2":{"230":1,"231":2,"509":1}}],["graphql",{"2":{"511":1}}],["graphgl",{"2":{"118":1}}],["graph",{"2":{"112":1,"501":1,"506":1,"515":1,"542":1,"552":1}}],["grid",{"2":{"108":1,"469":1,"492":2}}],["gitpod",{"2":{"457":2}}],["gitmessage",{"2":{"457":1}}],["gitmodules",{"2":{"457":1}}],["gitattributes",{"2":{"457":1}}],["gitlens",{"2":{"457":4}}],["gitlab",{"2":{"143":1,"370":1,"391":1,"394":2,"395":1,"397":1,"442":1,"457":2}}],["gitignore",{"0":{"391":1},"2":{"224":1,"390":1,"451":1,"457":1}}],["git",{"0":{"386":1,"390":1},"1":{"391":1},"2":{"111":2,"143":2,"222":3,"224":2,"370":1,"384":1,"385":3,"386":4,"387":3,"388":6,"389":4,"390":9,"391":7,"392":7,"393":9,"394":12,"395":1,"396":1,"397":2,"415":1,"442":1,"445":1,"451":3,"457":10,"503":2}}],["githubactionsgithubpagesworkflow",{"2":{"501":1}}],["githubpullrequests",{"2":{"457":1}}],["githubissues",{"2":{"457":1}}],["github",{"0":{"111":1,"451":1,"526":2},"1":{"527":2,"528":2},"2":{"80":2,"95":1,"111":2,"112":6,"125":1,"143":1,"170":1,"222":1,"228":2,"235":2,"236":1,"255":2,"256":2,"307":1,"315":1,"322":1,"326":1,"339":1,"343":2,"352":1,"358":1,"364":1,"370":1,"371":1,"391":1,"394":6,"395":1,"397":1,"404":2,"420":2,"427":1,"442":2,"444":3,"451":23,"457":7,"472":2,"481":1,"495":1,"501":2,"503":1,"506":1,"508":1,"527":5,"542":3,"545":1}}],["gemfile",{"2":{"457":2}}],["generation",{"2":{"473":1}}],["generate",{"2":{"91":1}}],["generalroutes",{"2":{"447":2}}],["getbestblockhash",{"2":{"512":1}}],["getsvgicon",{"2":{"453":3,"454":2}}],["gets",{"2":{"452":2}}],["getnotes",{"2":{"432":1,"433":2}}],["getroutes",{"2":{"358":1}}],["gettimestamp",{"2":{"297":2}}],["getters",{"2":{"331":1,"332":4}}],["getter",{"2":{"296":1}}],["gettoken",{"2":{"114":1}}],["getall",{"2":{"283":1,"284":1,"285":1}}],["getallprojects",{"2":{"283":1,"284":1,"285":1,"286":1}}],["getimageurl",{"2":{"453":2,"454":2}}],["getinstance",{"2":{"279":1}}],["getitem",{"2":{"104":1,"336":2,"338":1,"451":1}}],["getelementbyid",{"2":{"193":1}}],["getuserdata",{"2":{"114":2}}],["get",{"2":{"56":3,"83":4,"114":1,"117":1,"296":2,"338":2,"359":2,"434":3,"435":2,"436":1,"437":3,"439":3,"454":2,"511":1}}],["gtag",{"2":{"529":5}}],["gt",{"0":{"86":1},"2":{"61":2,"91":2,"122":1,"196":1,"200":2,"224":1,"230":1,"251":1,"333":1,"352":3,"393":4,"451":1,"457":1,"473":2}}],["1px",{"2":{"509":1}}],["192x192",{"2":{"317":2}}],["19",{"2":{"198":1}}],["1986",{"2":{"180":1}}],["18",{"0":{"355":1},"2":{"197":1}}],["17",{"2":{"192":1,"193":1}}],["16гб",{"2":{"457":1}}],["16",{"2":{"192":1,"222":2,"336":2,"421":1}}],["1516239022",{"2":{"361":1}}],["15",{"0":{"483":1},"1":{"484":1,"485":1},"2":{"192":1,"465":1}}],["1s",{"2":{"191":1}}],["1rem",{"2":{"191":2}}],["1443",{"2":{"512":1}}],["14",{"2":{"190":1}}],["13",{"0":{"355":1},"2":{"190":1}}],["1280px",{"2":{"557":1}}],["1234567890",{"2":{"361":1}}],["12",{"2":{"189":1,"472":1}}],["127",{"2":{"134":2}}],["1199",{"2":{"509":1}}],["11",{"0":{"417":1,"475":1,"486":1},"1":{"476":1,"477":1,"487":1},"2":{"173":1,"174":1,"175":1,"176":1,"178":1,"184":2,"185":1,"186":2,"188":1,"189":3,"190":2,"192":3,"193":1,"197":1,"198":1,"199":1,"200":2,"203":1,"204":4,"205":1,"208":1,"209":1,"216":1,"217":1,"393":3}}],["10000",{"2":{"509":1}}],["1000",{"2":{"328":1,"365":1,"463":1}}],["100vh",{"2":{"230":1}}],["100vw",{"2":{"230":1,"516":1}}],["100",{"2":{"191":1,"231":1,"328":1,"373":1,"383":1,"453":2,"473":1,"516":1}}],["10",{"0":{"391":1,"416":1,"478":2},"1":{"479":2},"2":{"134":2,"137":1,"144":1,"173":2,"188":1,"228":1,"309":1,"349":1,"376":3,"378":1,"380":2,"381":6,"391":1,"402":1,"428":2,"439":2,"457":1,"460":1,"471":1,"472":2}}],["1",{"0":{"18":1,"19":1,"238":1,"280":1,"283":1,"292":1,"294":1,"296":1,"298":1,"302":1,"362":1,"407":1,"483":1},"1":{"484":1,"485":1},"2":{"18":2,"19":1,"95":1,"117":6,"118":1,"123":1,"134":6,"139":2,"141":2,"150":2,"157":1,"173":1,"193":2,"196":2,"223":1,"224":1,"231":4,"238":1,"240":1,"242":1,"244":1,"249":2,"250":2,"255":6,"256":1,"263":1,"281":1,"288":1,"291":1,"292":3,"294":1,"295":1,"296":3,"298":2,"299":3,"301":3,"302":10,"303":9,"310":2,"313":1,"314":1,"323":2,"324":3,"325":2,"328":2,"330":4,"332":2,"333":2,"335":2,"338":2,"344":2,"347":2,"349":2,"358":2,"360":1,"361":2,"374":1,"376":3,"380":2,"381":2,"394":1,"402":1,"421":4,"428":2,"429":2,"432":2,"433":3,"437":2,"439":2,"454":2,"455":1,"460":2,"463":1,"472":2,"473":1,"511":1,"512":1,"516":1,"557":2}}],["хватает",{"2":{"311":1,"385":1,"456":1}}],["хвастовство",{"2":{"223":1}}],["х",{"2":{"269":1}}],["хак",{"2":{"516":1}}],["хау",{"2":{"385":1}}],["ханту",{"2":{"268":1}}],["характеристик",{"2":{"212":1}}],["характеристики",{"2":{"212":1,"342":1}}],["характер",{"2":{"132":1,"170":1,"216":1,"219":1,"396":1}}],["хювинкяя",{"2":{"200":1}}],["хювинкяа",{"2":{"200":1}}],["художественных",{"2":{"196":1}}],["хуже",{"2":{"180":1}}],["хлебным",{"2":{"196":1}}],["хлебные",{"0":{"196":1},"2":{"196":2}}],["хика",{"0":{"179":1},"2":{"180":1}}],["хеша",{"2":{"136":1}}],["хеш",{"2":{"136":1}}],["хеши",{"2":{"136":1}}],["хеширования",{"2":{"136":2}}],["хедеры",{"2":{"530":1}}],["хедере",{"2":{"85":1,"95":1,"103":1}}],["хедером",{"2":{"35":1,"445":1,"546":1}}],["хедера",{"2":{"29":2}}],["хедер",{"2":{"29":2,"98":1,"548":1}}],["хэш",{"2":{"136":1,"349":1,"452":1}}],["хэша",{"2":{"127":1,"136":1,"358":1}}],["хранят",{"2":{"367":1}}],["хранятся",{"2":{"17":1,"336":3,"360":1,"472":1}}],["хранящуюся",{"2":{"360":1}}],["хранящиеся",{"2":{"336":1}}],["хранящей",{"2":{"329":1}}],["хранению",{"2":{"336":2}}],["хранения",{"2":{"287":1,"288":1,"321":1,"336":4,"344":1,"391":1,"428":1,"431":1,"432":1,"437":1}}],["хранением",{"2":{"340":1}}],["хранение",{"2":{"48":1,"390":1}}],["храним",{"2":{"338":1}}],["хранилищу",{"2":{"339":1,"431":1}}],["хранилищ",{"2":{"336":3}}],["хранилищами",{"2":{"340":1}}],["хранилищах",{"2":{"336":1}}],["хранилища",{"0":{"336":1},"2":{"137":1,"141":1,"315":1,"321":2,"335":3,"336":6,"339":1,"367":1}}],["хранилищем",{"2":{"330":1,"338":1}}],["хранилище",{"2":{"135":1,"140":1,"306":1,"336":1,"337":1,"339":2,"390":1}}],["храните",{"2":{"446":1}}],["хранится",{"2":{"255":1,"341":1}}],["хранить",{"2":{"115":1,"231":1,"239":1,"308":1,"451":1,"463":1}}],["храниться",{"2":{"47":1,"323":1,"428":1}}],["хранит",{"2":{"43":1,"328":1,"336":1,"460":1}}],["хочу",{"2":{"464":2,"472":1}}],["хочется",{"2":{"270":1}}],["хочет",{"2":{"68":1,"116":2,"190":1,"208":1}}],["холсте",{"2":{"290":1}}],["ходе",{"2":{"190":2,"385":1}}],["ходу",{"2":{"17":1}}],["хост",{"2":{"451":2}}],["хостите",{"2":{"444":1}}],["хостингом",{"2":{"144":1}}],["хостинговым",{"2":{"137":1}}],["хостинг",{"0":{"444":1},"2":{"137":1,"138":2,"144":2,"209":1,"444":1}}],["хостинги",{"2":{"134":1,"508":1}}],["хостинга",{"2":{"131":2,"133":1,"137":3,"143":1,"145":1}}],["хостинге",{"2":{"112":1,"137":1,"146":1}}],["хостеры",{"2":{"444":1}}],["хосте",{"2":{"134":1,"451":1}}],["хотим",{"2":{"232":1,"241":2,"249":1,"297":1,"315":1,"328":1,"334":1,"337":1,"346":1,"353":3,"361":1,"362":1,"363":1,"376":1,"383":1,"390":1,"425":1,"427":1,"430":1,"439":1}}],["хотите",{"2":{"143":2,"148":1,"151":2,"208":1,"223":2,"376":1,"390":1,"424":1,"446":1,"460":1}}],["хотел",{"2":{"216":1}}],["хотя",{"2":{"119":1,"131":1,"134":1,"144":1,"145":1,"175":1,"190":1,"203":1,"216":1,"219":1,"222":2,"223":1,"228":1,"231":1,"235":1,"251":1,"264":1,"281":1,"301":1,"310":1,"315":2,"344":1,"358":1,"359":1,"360":1,"376":1,"396":1,"421":2,"447":1,"472":1}}],["хоть",{"2":{"105":1,"462":2}}],["хорош",{"2":{"465":1}}],["хороша",{"2":{"308":1}}],["хорошая",{"2":{"69":1,"151":1,"228":1,"461":1,"464":2}}],["хорошего",{"2":{"267":1,"373":1,"421":1}}],["хорошее",{"2":{"181":1,"296":1,"335":1}}],["хорошему",{"2":{"172":1,"181":1}}],["хорошей",{"2":{"161":1,"234":1,"235":1,"247":1,"323":1,"352":1,"354":1,"382":1,"408":1,"463":1}}],["хороших",{"2":{"227":1,"257":1}}],["хорошими",{"2":{"344":1}}],["хорошим",{"2":{"189":1,"204":2,"365":1,"472":2}}],["хорошие",{"2":{"142":1,"181":1,"458":1,"462":1,"471":2,"472":1}}],["хороший",{"2":{"25":1,"148":1,"219":1,"255":1,"264":1,"267":1,"328":1,"332":1,"392":1,"457":1}}],["хорошую",{"2":{"26":1,"222":1,"227":1}}],["хорошо",{"2":{"3":1,"39":2,"44":1,"63":1,"65":1,"137":1,"147":1,"152":1,"175":1,"181":1,"182":1,"192":1,"199":1,"200":1,"203":1,"256":1,"300":2,"328":1,"361":1,"364":1,"367":1,"425":1,"428":1,"431":2,"440":1,"457":1,"459":1,"471":1}}],["nls",{"2":{"457":2}}],["nx",{"2":{"457":2}}],["nvmrc",{"2":{"457":2}}],["nix",{"2":{"457":3}}],["npx",{"2":{"455":2}}],["npmjs",{"2":{"292":1}}],["npm",{"2":{"136":1,"222":1,"223":4,"224":6,"225":1,"226":1,"231":1,"317":1,"326":1,"331":1,"346":1,"359":1,"374":2,"375":3,"376":3,"379":2,"383":1,"384":3,"391":1,"431":2,"434":1,"438":2,"445":1,"455":1,"457":4,"460":1,"465":1,"508":1,"536":1}}],["njsproj",{"2":{"391":1}}],["ntvs",{"2":{"391":1}}],["nw",{"2":{"336":1,"349":1}}],["n>=2",{"2":{"301":1}}],["n",{"2":{"291":1,"301":3,"302":9,"303":5,"432":5,"451":1,"457":1}}],["nginx",{"0":{"140":1,"141":1},"1":{"141":1},"2":{"116":1,"137":1,"140":2,"141":1,"144":1,"402":1,"444":1}}],["nativetabs",{"2":{"457":1}}],["naruto",{"2":{"125":1}}],["navigate",{"2":{"356":4}}],["navigator",{"2":{"316":2}}],["navigationdrawer",{"2":{"501":1,"549":1}}],["navigation",{"0":{"517":1},"1":{"518":1,"519":1},"2":{"112":1,"195":1,"349":2,"501":1,"508":1}}],["navbar",{"0":{"549":1},"1":{"550":1,"551":1},"2":{"112":1,"501":2,"542":1,"549":1}}],["named",{"2":{"454":1}}],["names",{"2":{"134":1}}],["name=",{"2":{"105":1,"249":3,"255":1,"355":2,"437":2,"452":1,"513":1,"552":4}}],["name",{"2":{"97":3,"112":1,"123":6,"141":1,"152":3,"158":2,"245":5,"246":1,"247":5,"249":1,"255":10,"288":4,"292":13,"311":2,"313":2,"316":2,"317":2,"336":5,"349":3,"352":4,"353":3,"355":4,"356":4,"358":2,"361":1,"392":5,"447":2,"451":12,"452":2,"453":4,"454":8,"501":1,"506":1,"554":2}}],["nest",{"2":{"457":2}}],["nesting",{"2":{"86":5,"457":2}}],["never",{"2":{"457":1}}],["next",{"0":{"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"260":1,"457":2}}],["negotiation",{"2":{"139":1}}],["netlify",{"2":{"444":1,"457":2}}],["netservice",{"2":{"436":2}}],["netflix",{"2":{"344":1}}],["netbeans",{"2":{"222":1}}],["net",{"2":{"134":1,"361":1}}],["networks",{"2":{"512":1}}],["networkcommunication",{"0":{"437":1}}],["network",{"0":{"435":1},"2":{"116":1,"316":1,"336":1,"424":1,"436":1}}],["newitem",{"2":{"462":3}}],["new",{"2":{"103":1,"104":1,"120":1,"121":1,"193":1,"231":1,"244":1,"255":1,"281":1,"287":1,"290":2,"296":1,"303":6,"338":1,"362":1,"422":2,"424":1,"428":2,"430":1,"433":4,"435":2,"449":1,"451":2,"454":2,"509":1,"529":1}}],["num=",{"2":{"105":1}}],["numbers",{"2":{"91":1,"134":1}}],["number>",{"2":{"91":2}}],["number",{"2":{"83":1,"91":1,"103":3,"104":1,"245":1,"380":2}}],["null",{"2":{"83":1,"193":3,"255":2,"287":1,"288":2,"315":2,"336":1,"457":1}}],["nuxt",{"2":{"10":1,"148":1,"457":2,"507":1}}],["nodе",{"2":{"457":1}}],["nodemon",{"2":{"457":4}}],["nodes",{"2":{"367":1}}],["nodejs",{"0":{"438":1},"1":{"439":1},"2":{"222":1}}],["node",{"2":{"116":2,"222":6,"223":2,"224":2,"228":2,"346":1,"378":2,"391":1,"402":1,"419":2,"437":2,"438":2,"451":2,"455":3,"457":6,"472":1,"473":1}}],["now",{"2":{"173":1}}],["note=",{"2":{"433":1}}],["note=ref",{"2":{"432":1}}],["notes",{"2":{"432":4,"433":8}}],["notes=ref",{"2":{"432":1}}],["note",{"2":{"432":13,"433":1}}],["notebook",{"2":{"23":1,"509":3,"518":1,"546":2,"548":1}}],["notation",{"2":{"280":1}}],["notificationinterceptor",{"2":{"114":2,"512":2}}],["not",{"2":{"112":1,"256":2,"376":1,"457":1,"460":1}}],["no",{"2":{"112":2,"231":1,"501":8,"506":4}}],["nosql",{"2":{"17":2,"39":1,"116":1,"431":1,"463":1}}],["uuid",{"2":{"449":6,"450":1}}],["u",{"2":{"447":1}}],["uri",{"2":{"352":1,"362":1,"363":1,"435":1,"512":1}}],["urlsearchparams",{"2":{"362":3}}],["urls",{"2":{"349":1}}],["url",{"2":{"0":1,"56":3,"114":1,"183":1,"205":1,"224":1,"311":2,"313":3,"315":1,"316":1,"317":1,"345":1,"347":1,"349":5,"352":3,"353":2,"354":1,"355":1,"356":4,"357":1,"358":4,"360":1,"361":1,"362":1,"364":1,"365":2,"394":2,"435":2,"437":1,"439":2,"452":2,"454":1,"512":1,"552":2,"554":1}}],["us",{"2":{"362":1,"457":1}}],["using",{"2":{"356":1}}],["usage",{"2":{"326":1}}],["usability",{"2":{"261":1}}],["usb",{"2":{"308":1,"366":1}}],["usetouchswipe",{"2":{"519":1}}],["usenewswidget",{"2":{"462":1}}],["usei18nlight",{"0":{"537":1},"2":{"538":2}}],["usei18n",{"2":{"445":1,"462":1,"538":4}}],["usecounterstore=definestore",{"2":{"333":1}}],["usecounterstore",{"2":{"332":2,"335":1}}],["usedocumentscroll",{"2":{"250":5}}],["usewindowsevents",{"2":{"250":1}}],["useappconfig",{"2":{"513":3}}],["useapploader",{"0":{"449":1},"2":{"448":3,"449":1,"450":3}}],["useadmin",{"2":{"250":1}}],["useauthservice",{"2":{"463":1}}],["useauthstore",{"2":{"463":1}}],["useauth",{"2":{"114":4,"463":1}}],["userloggedin",{"2":{"463":1}}],["useraccountview",{"2":{"447":1}}],["username",{"2":{"360":3,"451":2,"463":1}}],["userouter",{"2":{"355":3,"358":1}}],["useroute",{"2":{"355":3,"358":1,"363":2}}],["user",{"2":{"114":2,"141":1,"171":2,"180":1,"239":1,"247":1,"365":2,"451":6,"457":3,"496":2}}],["userid",{"2":{"114":1}}],["users",{"2":{"114":7,"247":1}}],["userdata",{"2":{"114":1}}],["usescreenwidth",{"2":{"509":6}}],["usescreensize",{"2":{"462":1}}],["useshoppingcart",{"2":{"462":1}}],["usesessionstorage",{"2":{"338":3,"339":2}}],["usestate",{"2":{"330":6}}],["usestore",{"2":{"250":1}}],["uses",{"2":{"91":1,"451":10}}],["usefavourites",{"0":{"103":1},"2":{"89":1,"103":6,"104":1}}],["use",{"0":{"14":1,"446":1},"2":{"14":4,"121":1,"163":1,"239":1,"250":1,"255":2,"256":1,"334":1,"350":2,"439":2,"457":1,"470":1}}],["up",{"2":{"451":1,"457":1}}],["updating",{"2":{"451":1}}],["updateprojects",{"2":{"352":5}}],["update",{"2":{"124":5,"240":1,"246":6,"250":4,"388":1,"451":1,"457":1}}],["upstream",{"2":{"394":1}}],["upwardprop",{"2":{"249":5}}],["unlighthouse",{"2":{"457":2}}],["unocss",{"2":{"457":10}}],["uno",{"2":{"457":10}}],["untrackedchanges",{"2":{"457":1}}],["undefined",{"2":{"382":1}}],["unique",{"2":{"463":1}}],["unicodehighlight",{"2":{"457":1}}],["unit",{"2":{"370":1,"372":1,"461":6}}],["universal",{"2":{"239":1}}],["unpkg",{"2":{"149":1}}],["utf",{"2":{"222":1,"336":2}}],["utils",{"0":{"379":1},"1":{"380":1,"381":1},"2":{"114":3,"370":1,"373":1,"374":1,"378":1,"379":3,"380":2,"381":1,"445":1,"449":1,"453":2,"511":3,"512":5,"513":2,"515":1,"538":1}}],["ubuntu",{"2":{"144":1,"222":1,"339":1,"388":1,"451":3,"501":1}}],["ux",{"0":{"169":1,"171":1,"181":1,"417":1},"1":{"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1},"2":{"77":1,"79":1,"97":1,"169":6,"171":2,"172":2,"181":2,"193":1,"220":2,"473":2,"496":1,"504":1,"519":1,"542":1,"556":1}}],["ui",{"0":{"24":1,"27":1,"171":1,"466":1,"471":1},"1":{"25":1,"26":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1},"2":{"23":2,"26":1,"68":1,"79":1,"85":1,"105":1,"169":3,"171":2,"220":1,"261":1,"266":1,"311":1,"382":1,"384":4,"421":1,"455":1,"456":2,"461":1,"462":3,"464":2,"466":1,"468":1,"471":10,"496":1,"504":1,"508":1,"513":1,"532":1,"533":1}}],["uml",{"2":{"14":1,"239":2}}],["og",{"2":{"552":6}}],["old",{"2":{"460":2}}],["ok",{"2":{"460":2}}],["okta",{"2":{"364":1}}],["o",{"2":{"403":1}}],["otp",{"0":{"365":1},"2":{"365":5,"366":2,"368":1}}],["othervalue",{"2":{"52":1,"53":1}}],["other",{"2":{"52":1,"53":1,"463":1}}],["output",{"2":{"380":1,"457":1}}],["out",{"2":{"377":1,"457":2,"460":1}}],["outlook",{"2":{"359":1}}],["our",{"2":{"151":1}}],["overflow",{"2":{"516":1}}],["overwrite",{"2":{"501":2}}],["overrides",{"2":{"457":1}}],["over",{"0":{"264":1},"2":{"260":1}}],["obj",{"2":{"460":1}}],["object",{"2":{"91":1,"155":1,"245":1,"267":1,"280":1,"356":1,"454":1}}],["observe",{"2":{"193":1}}],["observerclass",{"2":{"292":3}}],["observerpattern",{"2":{"292":1}}],["observer",{"0":{"291":1,"292":1,"326":1},"1":{"292":1,"327":1,"328":1},"2":{"192":1,"193":2,"260":1,"274":1,"296":2,"300":1,"321":1,"326":1,"328":1,"460":1}}],["opera",{"2":{"222":1}}],["open=",{"2":{"534":1}}],["opengraph",{"2":{"501":1}}],["openclose",{"2":{"457":1}}],["opencart",{"2":{"16":2,"62":1}}],["opennote",{"2":{"432":2}}],["openid",{"0":{"361":1},"2":{"361":6,"362":2,"366":1}}],["open",{"2":{"12":1,"39":1,"62":1,"112":1,"300":1,"316":1,"499":1,"501":1,"506":1,"515":1,"542":1,"552":1}}],["option",{"2":{"163":1}}],["options",{"0":{"152":1,"332":1},"2":{"119":1,"121":1,"122":1,"139":1,"152":6,"255":1,"331":2,"332":1,"335":1,"349":1,"358":1,"359":1,"451":1,"457":1,"460":1}}],["ontaskerrors",{"2":{"457":1}}],["onmesssage",{"2":{"423":1}}],["onmessage=",{"2":{"429":1}}],["onmessage",{"2":{"422":2,"423":2,"424":1,"426":1,"428":1,"429":1}}],["onmounted",{"2":{"193":2,"250":2,"267":3,"315":2,"328":3,"556":1}}],["once",{"2":{"375":1,"376":1}}],["onbeforeunmount",{"2":{"267":3,"315":1,"328":3,"352":1}}],["onboarding",{"2":{"206":1}}],["onunmounted",{"2":{"250":2}}],["onlyenabledextensions",{"2":{"457":1}}],["only",{"2":{"203":1,"457":2}}],["online",{"2":{"14":1,"344":1}}],["onecolumnlayout",{"0":{"548":1}}],["onecomponent",{"2":{"244":3}}],["onerror",{"2":{"422":2}}],["one",{"2":{"176":1,"358":2,"473":1}}],["on",{"0":{"159":1},"2":{"112":1,"115":1,"139":1,"159":2,"292":3,"328":1,"352":1,"381":1,"439":1,"451":5,"457":2,"501":1}}],["oreilly",{"2":{"472":1}}],["orientation",{"2":{"312":1,"313":1,"317":1,"554":1}}],["origins",{"2":{"439":1}}],["origin",{"2":{"117":7,"336":2,"394":5,"439":2}}],["or",{"2":{"247":1,"402":5,"501":1,"509":1}}],["oracle",{"2":{"116":1,"444":1}}],["organizeimports",{"2":{"457":1}}],["org",{"2":{"98":1,"125":2,"129":1,"134":1,"159":1,"160":2,"178":1,"222":1,"228":1,"249":1,"250":1,"251":1,"269":1,"310":1,"335":1,"336":1,"358":1,"362":1,"512":1}}],["orders",{"2":{"12":1}}],["odezhda",{"2":{"97":1}}],["official",{"2":{"402":1}}],["office",{"2":{"176":1,"344":1}}],["off",{"2":{"292":4,"328":1,"352":1,"457":1,"463":1}}],["of",{"0":{"263":1},"2":{"91":5,"112":1,"246":1,"260":1,"376":1,"377":1,"452":1,"457":1,"473":1}}],["oauth",{"2":{"40":1,"115":2,"361":1,"368":1}}],["ozon",{"2":{"22":1}}],["eex",{"2":{"457":1}}],["eol",{"2":{"457":1}}],["e88a22df",{"2":{"452":1}}],["echo",{"2":{"451":8}}],["ecosystem",{"2":{"402":1}}],["ecommerce",{"2":{"41":1}}],["eager",{"2":{"454":2}}],["easingthemes",{"2":{"451":2}}],["eat",{"2":{"294":1}}],["eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6ilbhymxviequiedhcmfndxnviiwiawf0ijoxnte2mjm5mdiyfq",{"2":{"361":1}}],["eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9",{"2":{"361":1}}],["err=>",{"2":{"360":1,"365":2,"432":1}}],["err",{"2":{"303":1,"367":2,"422":1,"429":2,"430":1,"433":1}}],["errorcomponent",{"2":{"244":3}}],["error",{"2":{"52":3,"303":1,"363":2,"376":1,"377":1,"391":1,"437":1,"451":1}}],["esbenp",{"2":{"457":4}}],["esbuild",{"2":{"228":2,"455":1}}],["esnext",{"2":{"455":1}}],["es6",{"2":{"280":1,"460":1,"462":1}}],["eslint",{"2":{"23":1,"92":1,"455":3,"457":17,"472":1,"504":2}}],["education",{"2":{"554":1}}],["editorconfig",{"2":{"457":2}}],["editortab",{"2":{"457":1}}],["editorgroup",{"2":{"457":1}}],["editor",{"2":{"457":29}}],["edit",{"2":{"160":1,"240":1,"495":1}}],["edititem",{"2":{"160":4}}],["edge",{"2":{"40":1,"116":2,"222":1,"402":1}}],["effective",{"2":{"180":1}}],["eff",{"2":{"144":2}}],["eth",{"2":{"367":1}}],["ethjs",{"2":{"367":1}}],["ethereum",{"2":{"367":4}}],["etc",{"0":{"141":1},"2":{"140":1,"557":1}}],["etsy",{"2":{"22":1}}],["eventbus",{"2":{"352":3}}],["event",{"2":{"292":13,"315":3,"316":5,"325":1,"381":2,"422":4,"423":2,"424":1,"428":2,"429":2,"457":1}}],["eventname",{"2":{"245":2}}],["events",{"0":{"124":1},"2":{"245":1,"292":9,"373":2}}],["everybody",{"2":{"463":1}}],["every",{"2":{"114":1}}],["electron",{"2":{"349":1}}],["electronic",{"2":{"144":1}}],["element",{"2":{"193":1}}],["elements",{"2":{"160":1,"251":1}}],["elem",{"2":{"193":3}}],["el",{"2":{"120":1}}],["else",{"0":{"156":2},"2":{"103":1,"244":1,"287":1,"302":2,"303":2,"316":1,"332":1,"333":1,"338":1,"363":1,"365":2,"428":1,"435":2,"453":1}}],["embla",{"2":{"459":1}}],["emmet",{"2":{"457":2}}],["emma",{"2":{"123":1}}],["email",{"2":{"365":3}}],["email=ref",{"2":{"365":1}}],["emitted",{"2":{"381":1}}],["emit",{"2":{"124":1,"292":3,"328":1,"352":1,"381":1}}],["emits",{"2":{"119":1,"124":1,"152":1,"246":1,"323":2}}],["empty",{"2":{"112":1}}],["engine",{"2":{"460":1}}],["enablesmartcommit",{"2":{"457":1}}],["enable",{"2":{"457":3,"460":1}}],["enabled",{"2":{"317":1,"457":9}}],["end",{"2":{"372":2,"373":2,"461":2}}],["endpoint",{"2":{"360":1,"362":1}}],["endpoints",{"0":{"56":1},"2":{"361":1}}],["entity",{"2":{"463":2}}],["entire",{"2":{"454":1}}],["entry",{"2":{"358":2}}],["enter=",{"2":{"231":2}}],["enter",{"2":{"223":2,"229":1,"231":1,"381":1}}],["encapsulation",{"0":{"266":1},"2":{"260":1}}],["encryption",{"2":{"361":1}}],["encrypt",{"0":{"144":1},"2":{"131":1,"144":3,"145":1,"309":1,"416":1}}],["en",{"2":{"178":1,"269":1,"336":1,"362":1,"457":3}}],["envrc",{"2":{"457":12}}],["envs",{"2":{"451":2}}],["environments",{"2":{"444":1}}],["environment",{"2":{"379":1,"451":1}}],["env",{"2":{"114":1,"451":26,"457":38,"512":1}}],["e2e2e3",{"2":{"557":2}}],["e2e",{"2":{"72":1,"372":1,"461":5}}],["eq",{"2":{"52":1}}],["exs",{"2":{"457":5}}],["ex",{"2":{"457":1}}],["exclude",{"2":{"451":1,"457":1}}],["exiting",{"2":{"451":1}}],["extractor",{"2":{"457":11}}],["extractdomain",{"2":{"0":1}}],["extension",{"2":{"457":1}}],["extensions",{"2":{"310":1,"391":1,"457":3}}],["expand",{"2":{"457":1}}],["expandmode",{"2":{"457":1}}],["express",{"2":{"438":2,"439":7,"473":1}}],["expected",{"2":{"376":1}}],["expect",{"2":{"376":12,"377":1,"378":3,"380":2,"381":4,"382":1}}],["experience",{"2":{"171":1,"373":1,"496":2}}],["explorer",{"2":{"224":1,"390":1,"457":6}}],["explain",{"0":{"91":1,"92":1},"2":{"91":1,"92":1}}],["exports",{"2":{"454":1}}],["export",{"2":{"103":1,"114":2,"152":2,"250":1,"255":2,"280":1,"281":1,"283":1,"284":1,"285":1,"288":1,"317":1,"327":1,"330":1,"332":1,"338":1,"349":1,"428":1,"430":1,"433":1,"435":1,"447":1,"449":1,"454":1,"455":1,"463":1,"512":2}}],["examplecomponent",{"2":{"244":1}}],["example",{"2":{"14":1,"454":2}}],["e",{"2":{"12":2,"16":1,"62":1,"63":1,"76":1,"79":1}}],["2fa",{"0":{"366":1},"2":{"365":1,"366":4}}],["299",{"2":{"360":1}}],["2979ff",{"2":{"313":1}}],["29",{"2":{"216":1,"457":1}}],["28",{"2":{"209":1}}],["27",{"0":{"480":1},"1":{"481":1,"482":1},"2":{"208":1}}],["26",{"2":{"205":1,"452":1}}],["25",{"2":{"204":1,"296":2}}],["255",{"2":{"134":1,"557":2}}],["245",{"2":{"557":3}}],["24",{"0":{"475":1},"1":{"476":1,"477":1},"2":{"204":1,"453":2}}],["235",{"2":{"557":4}}],["23",{"2":{"203":1}}],["22+",{"2":{"457":1}}],["22",{"2":{"200":1,"204":1,"222":1}}],["21",{"2":{"200":1,"204":1,"302":2}}],["2px",{"2":{"191":1}}],["2022",{"2":{"497":1}}],["2023",{"0":{"475":1,"478":1,"480":1,"483":1,"486":1},"1":{"476":1,"477":1,"479":1,"481":1,"482":1,"484":1,"485":1,"487":1},"2":{"457":1,"472":1,"497":1}}],["2016",{"2":{"472":1}}],["20~30",{"2":{"455":1}}],["20",{"2":{"105":1,"144":1,"193":1,"199":1,"451":1,"463":1,"472":1}}],["200",{"2":{"47":1,"244":1,"360":1,"444":1,"457":1,"473":1,"534":1}}],["2",{"0":{"119":1,"239":1,"281":1,"283":1,"284":2,"285":1,"286":1,"287":1,"288":1,"289":1,"292":1,"294":1,"296":1,"298":1,"299":2,"302":1,"363":1,"408":1,"418":1,"480":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"481":1,"482":1},"2":{"10":1,"56":2,"98":1,"100":1,"117":1,"118":1,"119":2,"120":2,"121":1,"122":1,"124":2,"125":6,"126":1,"128":1,"130":2,"137":1,"141":2,"144":1,"147":1,"152":4,"157":1,"174":1,"193":1,"196":2,"223":1,"225":1,"229":1,"231":4,"235":1,"238":1,"239":1,"243":1,"249":2,"250":4,"255":6,"256":1,"263":1,"265":2,"288":1,"291":2,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":2,"299":2,"300":1,"301":1,"302":10,"303":10,"310":1,"315":1,"324":3,"325":2,"326":2,"328":1,"330":4,"332":3,"333":3,"335":3,"336":1,"337":1,"338":2,"344":1,"347":1,"349":3,"361":2,"374":2,"376":4,"380":2,"381":4,"390":2,"418":1,"421":2,"425":1,"426":1,"428":2,"429":2,"432":2,"433":2,"439":2,"457":3,"460":5,"462":1,"463":2,"471":1,"472":3,"473":1,"492":2,"512":1,"557":2}}],["c2c2c4",{"2":{"557":1}}],["czrc",{"2":{"457":2}}],["cz",{"2":{"457":2}}],["cxx",{"2":{"457":1}}],["cjs",{"2":{"457":4}}],["cc",{"2":{"457":1}}],["csproj",{"2":{"457":1}}],["cspell",{"2":{"457":2}}],["cshtml",{"2":{"457":2}}],["cs",{"2":{"457":12}}],["csshtml",{"2":{"516":1}}],["cssnano",{"2":{"457":10}}],["cssnanorc",{"2":{"457":10}}],["css",{"0":{"84":1,"86":1,"225":1,"226":1,"471":1,"492":1,"516":1},"1":{"85":1,"86":1,"87":1,"226":1,"230":1,"231":1,"232":1},"2":{"23":2,"35":3,"86":6,"147":4,"149":1,"150":1,"151":4,"155":1,"160":1,"183":1,"184":1,"185":1,"190":1,"203":3,"221":1,"224":4,"225":5,"226":9,"227":9,"230":2,"231":4,"233":1,"234":1,"249":1,"266":1,"308":1,"312":1,"317":3,"350":1,"402":1,"432":1,"444":1,"456":1,"457":5,"462":1,"468":1,"471":9,"472":1,"473":1,"504":1,"508":1,"545":1,"548":1,"555":1,"556":1,"557":4}}],["css3",{"0":{"468":1},"2":{"23":1,"468":1,"469":1,"471":1,"504":1}}],["cpp",{"2":{"457":1}}],["cp",{"2":{"451":1}}],["cpu",{"2":{"402":1}}],["cypress",{"2":{"381":1,"457":10,"461":1}}],["cycle",{"2":{"152":1}}],["c++",{"2":{"267":1}}],["certification",{"2":{"472":1}}],["certbot",{"2":{"144":6,"146":1,"444":1}}],["central",{"2":{"337":1}}],["center",{"2":{"230":1}}],["celsius",{"2":{"296":9}}],["ctrlcmd",{"2":{"457":1}}],["ctrl",{"2":{"180":1}}],["c>",{"2":{"139":2}}],["cname",{"2":{"134":1}}],["cheat",{"0":{"488":1},"1":{"489":1,"490":1,"491":1,"492":1,"493":1,"494":1},"2":{"489":1,"490":1,"491":1,"492":4}}],["checkout",{"2":{"392":2,"393":2,"451":4}}],["checkotp",{"2":{"365":3}}],["check",{"2":{"380":1,"381":1,"457":1}}],["checkbox",{"2":{"231":2}}],["checked",{"2":{"231":6}}],["chgrp",{"2":{"451":2}}],["choice",{"2":{"451":1}}],["choose",{"2":{"112":1}}],["chia",{"2":{"376":1}}],["children",{"2":{"353":2,"354":1,"447":2}}],["childsession",{"0":{"339":1}}],["childsimple",{"2":{"330":1}}],["childpinia",{"0":{"335":1}}],["child",{"0":{"325":1,"328":1},"2":{"246":1,"324":4}}],["childcomponent>",{"2":{"246":1,"324":3}}],["childcomponent",{"2":{"246":1,"324":4}}],["chrome",{"2":{"222":1,"314":2,"318":1,"336":1,"339":1,"402":2,"460":2,"473":1}}],["chromium",{"2":{"125":1,"222":1,"402":1,"460":1}}],["changelocale",{"2":{"538":2}}],["changelog",{"2":{"457":1}}],["changes",{"2":{"129":1}}],["chain",{"2":{"367":1}}],["chainable",{"2":{"297":1}}],["chapter08",{"2":{"420":1}}],["chapter09",{"2":{"371":1}}],["chapter05",{"2":{"343":1}}],["chapter07",{"2":{"322":1}}],["chapter06",{"2":{"307":1}}],["chapter11",{"2":{"170":1}}],["chapter",{"0":{"136":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"292":1,"294":1,"296":1,"298":1,"299":1,"302":1,"391":1},"2":{"223":1,"317":3}}],["clangd",{"2":{"457":1}}],["clang",{"2":{"457":2}}],["classes",{"2":{"493":1}}],["classpath",{"2":{"457":1}}],["class",{"2":{"281":1,"457":1}}],["class=",{"2":{"103":1,"105":2,"191":1,"227":1,"230":1,"231":17,"249":3,"255":2,"325":1,"335":1,"352":3,"355":1,"448":3,"453":1,"509":4,"513":2}}],["clearcase",{"2":{"385":1}}],["clearinterval",{"2":{"365":1}}],["clear",{"2":{"336":1}}],["cleartodo",{"2":{"231":3}}],["clean",{"0":{"267":1},"2":{"250":1,"260":1,"267":1,"292":1,"451":1}}],["clippy",{"2":{"457":2}}],["clipboard",{"2":{"231":1,"457":4}}],["click=",{"2":{"159":2,"160":1,"231":3,"255":2,"315":1,"324":1,"325":1,"328":1,"330":2,"335":2,"432":3,"437":1,"513":1,"538":1}}],["click",{"2":{"159":2,"255":1,"324":1,"381":3}}],["cli",{"2":{"126":1,"455":1,"457":2}}],["client",{"2":{"52":2,"53":9,"56":3,"117":6,"361":1,"362":1,"511":1}}],["closeonfiledelete",{"2":{"457":1}}],["closemodal",{"2":{"255":3}}],["cloud",{"2":{"116":2,"472":1}}],["clone",{"2":{"111":1,"316":1,"503":1}}],["custom",{"2":{"457":2,"460":3,"557":1}}],["customer",{"2":{"79":1}}],["cursorstyle",{"2":{"457":1}}],["cursorsmoothcaretanimation",{"2":{"457":1}}],["cursorblinking",{"2":{"457":1}}],["cursor",{"2":{"231":1}}],["currentcolor",{"2":{"453":2}}],["current",{"2":{"112":1,"196":2,"255":11}}],["curl",{"2":{"53":2,"56":2}}],["cdn",{"2":{"149":1}}],["cd",{"0":{"442":1},"2":{"71":1,"112":1,"395":2,"396":1,"397":1,"442":5,"451":4,"461":1,"472":1,"482":1,"502":1,"503":1,"545":1}}],["citation",{"2":{"457":1}}],["city",{"2":{"353":1,"355":1}}],["cities",{"2":{"353":1}}],["circleci",{"2":{"457":2}}],["circle",{"2":{"290":4}}],["ci",{"0":{"442":1},"2":{"71":1,"395":3,"396":1,"397":1,"442":5,"451":1,"461":1,"472":1,"482":1,"545":1}}],["cmakepresets",{"2":{"457":1}}],["cmake",{"2":{"457":3}}],["cmakelists",{"2":{"457":1}}],["cmv",{"0":{"87":1,"106":1},"2":{"64":1}}],["cms",{"0":{"37":1,"39":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"6":1,"12":2,"39":1,"63":1}}],["crm",{"2":{"508":1}}],["crowdin",{"2":{"457":2}}],["cross",{"2":{"117":1,"439":1,"457":1}}],["credits",{"2":{"457":1}}],["credo",{"2":{"457":1}}],["creator",{"2":{"135":1}}],["created",{"2":{"393":1}}],["createpinia",{"2":{"334":2}}],["createshape",{"2":{"290":3}}],["createrouter",{"2":{"136":1,"349":3}}],["creatememoryhistory",{"2":{"127":1}}],["createwebhistory",{"2":{"127":1,"136":3}}],["createwebhashhistory",{"2":{"127":1,"136":1,"349":3}}],["createapp",{"2":{"120":2,"121":4,"149":4,"243":2,"247":1,"255":2,"334":2,"350":2}}],["create",{"0":{"501":1},"1":{"502":1},"2":{"52":1,"112":1,"223":1,"240":1,"455":1,"495":1,"499":1,"501":4,"506":1,"507":1}}],["createclient",{"2":{"52":2}}],["crypto",{"2":{"428":1}}],["crafty",{"0":{"61":1},"2":{"80":2,"83":1,"95":1,"111":1,"112":5}}],["crud",{"2":{"59":1,"116":1,"240":2,"267":1,"282":1,"431":2,"432":1,"434":2}}],["c",{"2":{"17":1,"148":3,"152":1,"267":1,"303":7,"355":4,"457":1,"501":1,"508":1,"557":9}}],["capture",{"2":{"457":95}}],["caption",{"2":{"191":2}}],["capacitor",{"2":{"349":1}}],["caches",{"2":{"316":2}}],["cache",{"2":{"316":4,"457":1,"555":1}}],["calc",{"2":{"516":1}}],["calculation",{"2":{"376":1}}],["calculatecelsius",{"2":{"296":2}}],["calculatefahrenheit",{"2":{"296":2}}],["callback",{"0":{"301":1,"302":1},"1":{"302":1},"2":{"301":1,"302":7,"303":1,"422":2}}],["callbacks",{"2":{"260":1,"276":1}}],["call",{"0":{"205":1},"2":{"205":1}}],["called",{"2":{"91":1}}],["catch",{"2":{"287":1,"303":5,"360":1,"364":1,"365":2,"377":1,"433":3,"435":2}}],["categories",{"0":{"45":1},"2":{"43":1,"56":3,"83":3,"554":1}}],["categoryproducts",{"2":{"83":1}}],["category",{"0":{"47":1},"2":{"18":1,"83":1,"97":4,"109":1}}],["categoryid",{"2":{"18":1,"83":3,"97":2}}],["can",{"2":{"463":1,"509":1}}],["cancel",{"2":{"255":3}}],["caniuse",{"2":{"125":1}}],["carousel",{"2":{"459":1}}],["cargo",{"2":{"457":2}}],["card",{"2":{"231":1,"552":1}}],["cart",{"2":{"12":1,"97":1}}],["camelcase",{"2":{"165":1,"250":1}}],["cases",{"0":{"446":1}}],["case",{"0":{"14":1},"2":{"14":4,"44":1,"163":1,"239":1,"256":3,"290":2,"294":3,"296":2,"308":1,"470":1}}],["coolcosmos",{"2":{"463":1}}],["cookies",{"2":{"336":2}}],["cookie",{"2":{"115":3,"315":1}}],["copying",{"2":{"457":1}}],["copilot",{"2":{"89":1}}],["coverage",{"2":{"375":2,"383":4}}],["coinflip",{"2":{"251":1}}],["couchdb",{"2":{"431":2}}],["count`",{"2":{"451":1}}],["count=5",{"2":{"451":1}}],["countries",{"2":{"355":1}}],["country",{"2":{"353":1,"355":3}}],["count++",{"2":{"332":1}}],["count>=0",{"2":{"332":2}}],["counter++",{"2":{"330":1}}],["counter=",{"2":{"324":3}}],["counter",{"0":{"333":1},"2":{"324":8,"325":3,"330":2,"332":1,"333":1,"335":1,"339":2}}],["count",{"2":{"162":1,"332":3,"333":7}}],["coupled",{"2":{"2":1}}],["colortheme",{"2":{"457":1}}],["color",{"2":{"151":1,"173":1,"191":1,"299":2,"312":2,"313":2,"317":2,"335":1,"453":3}}],["column=eq",{"2":{"53":1}}],["column",{"2":{"52":3,"53":2,"203":1,"509":1}}],["core",{"2":{"361":1,"388":1}}],["cordova",{"2":{"349":1}}],["corporation",{"2":{"134":1,"554":1}}],["cors",{"0":{"117":1},"2":{"117":10,"438":1,"439":5,"479":1}}],["coding",{"2":{"64":1,"87":1,"106":1}}],["codesandbox",{"2":{"457":1}}],["codeowners",{"2":{"457":1}}],["codecov",{"2":{"457":10}}],["codelens",{"2":{"457":4}}],["codeaction",{"2":{"457":1}}],["codeactions",{"2":{"457":1}}],["codeactionsonsave",{"2":{"457":2}}],["code=ref",{"2":{"365":2}}],["code>",{"2":{"335":1}}],["codeium",{"0":{"88":1},"1":{"89":1,"90":1,"91":1,"92":1,"93":1},"2":{"89":3,"90":1,"91":1,"92":1,"93":1,"457":1}}],["code",{"0":{"161":1,"270":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"273":1,"274":1,"275":1,"276":1},"2":{"39":1,"86":1,"89":1,"91":2,"112":1,"152":1,"163":1,"222":2,"224":1,"260":1,"294":1,"335":1,"355":2,"363":3,"364":2,"365":3,"387":1,"394":1,"402":1,"445":1,"457":9,"462":1,"501":1,"506":1,"527":1,"538":4,"539":1}}],["conduct",{"2":{"457":1}}],["conf",{"2":{"457":1}}],["confirmsync",{"2":{"457":1}}],["confirmdraganddrop",{"2":{"457":1}}],["confirmdelete",{"2":{"457":1}}],["confirm",{"0":{"216":1}}],["configs",{"2":{"457":1}}],["config",{"2":{"112":1,"224":1,"228":3,"317":1,"379":1,"382":1,"383":1,"455":2,"457":225,"501":4,"504":1,"515":1,"528":1,"529":1}}],["connection",{"2":{"457":1}}],["connect",{"2":{"361":1}}],["concerns",{"0":{"263":1},"2":{"260":1}}],["console",{"2":{"247":1,"281":1,"296":1,"302":5,"303":7,"360":2,"367":2,"422":1,"423":1,"439":1,"451":1,"460":2}}],["constructor",{"2":{"281":1,"287":1,"292":1}}],["constant",{"2":{"152":2}}],["const",{"2":{"52":4,"83":2,"103":2,"104":1,"114":3,"120":2,"121":2,"123":1,"149":1,"152":2,"160":1,"163":1,"166":1,"191":1,"193":1,"231":1,"244":1,"247":3,"250":2,"255":3,"283":1,"287":1,"289":1,"298":1,"299":1,"315":1,"316":4,"324":1,"325":1,"327":1,"328":1,"330":2,"332":1,"333":2,"334":1,"335":1,"338":1,"339":1,"349":1,"355":1,"360":1,"363":1,"380":1,"382":1,"424":1,"428":2,"429":2,"432":1,"433":2,"434":1,"435":1,"436":1,"437":1,"439":5,"447":2,"448":1,"449":3,"450":1,"453":3,"454":5,"460":1,"463":1,"509":1,"511":2,"512":2,"513":1,"538":2}}],["conventions",{"0":{"161":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1}}],["convention",{"2":{"152":1}}],["convert",{"2":{"91":1}}],["contributors",{"2":{"457":1}}],["contributing",{"2":{"457":1}}],["controller",{"2":{"457":1,"462":2,"463":3}}],["control",{"0":{"385":1},"2":{"115":1,"117":4,"385":3,"397":1,"493":1}}],["continuous",{"2":{"395":3,"442":2}}],["continue",{"2":{"112":1}}],["container",{"2":{"231":6,"469":1,"509":2}}],["content=",{"2":{"552":11}}],["contentlayer",{"2":{"457":10}}],["contents",{"2":{"451":1}}],["content>",{"2":{"249":1}}],["content",{"2":{"53":1,"230":1,"249":2,"512":1}}],["co",{"2":{"52":1,"53":3,"56":3}}],["commitlint",{"2":{"457":4}}],["commit",{"2":{"390":1,"391":3,"393":1,"442":1}}],["common",{"2":{"364":1}}],["commands",{"2":{"457":1}}],["commandinvoker",{"2":{"294":1}}],["command",{"0":{"293":1,"294":1},"1":{"294":1},"2":{"222":1,"260":1,"274":1,"294":4,"425":1,"426":1,"428":4,"429":2,"430":1}}],["commerce",{"2":{"12":2,"16":1,"62":1,"63":1,"76":1,"79":1}}],["compile",{"2":{"457":1}}],["compileroptions",{"2":{"455":1}}],["compare",{"2":{"457":6}}],["completed",{"2":{"256":2}}],["completion",{"2":{"222":1,"457":1}}],["computer",{"2":{"180":1}}],["computed",{"2":{"152":1,"231":7,"255":4,"330":1,"333":3,"449":2,"453":3}}],["component>",{"2":{"160":1,"251":1}}],["components",{"0":{"191":1,"193":1,"432":1,"437":1},"2":{"105":1,"152":1,"160":1,"224":1,"228":5,"230":3,"249":1,"352":2,"355":2,"375":1,"380":1,"381":1,"445":1,"455":1,"457":1,"513":1}}],["component",{"0":{"251":1,"355":1},"2":{"97":3,"121":4,"160":2,"243":3,"251":3,"255":1,"324":3,"335":1,"339":1,"349":3,"353":3,"355":1,"380":1,"381":1,"447":4,"457":7,"463":3}}],["compose",{"2":{"457":1}}],["composer",{"2":{"457":2}}],["composables",{"0":{"250":1},"1":{"251":1},"2":{"103":2,"114":1,"152":1,"250":1,"445":1,"448":1,"450":1,"463":1,"509":1,"513":1,"538":2}}],["composable",{"2":{"34":1,"447":1,"462":2,"463":9,"504":1,"509":1,"519":1,"536":1}}],["composition",{"0":{"152":1,"264":1},"2":{"23":1,"102":1,"119":2,"121":1,"123":1,"125":2,"130":1,"152":10,"250":2,"260":1,"329":1,"331":1,"332":1,"333":2,"335":1,"358":2,"460":3,"463":2,"472":1,"482":1,"504":1}}],["com",{"2":{"22":3,"80":1,"111":1,"116":1,"117":9,"125":2,"134":1,"135":2,"136":2,"141":3,"149":1,"170":1,"199":1,"217":2,"222":1,"226":3,"227":1,"228":1,"235":1,"255":1,"256":1,"292":1,"307":1,"308":1,"322":1,"326":1,"343":1,"361":1,"371":1,"404":1,"405":1,"420":1,"444":5,"451":10,"457":2,"503":1,"511":1,"528":1,"529":1}}],["dprint",{"2":{"457":4}}],["dlint",{"2":{"457":4}}],["dynamic",{"2":{"452":1}}],["dt",{"2":{"451":1}}],["db",{"2":{"433":5}}],["dbservice",{"0":{"433":1},"2":{"432":1,"434":3,"436":1}}],["dbnotes",{"0":{"432":1}}],["dbmanager",{"2":{"282":1,"283":3,"284":3,"285":2,"286":4,"287":10,"289":6}}],["ds",{"2":{"391":1}}],["dx",{"2":{"373":1,"381":1,"471":1,"496":1}}],["dash",{"2":{"512":1}}],["dangerfile",{"2":{"457":2}}],["dart",{"2":{"457":6}}],["dark",{"2":{"457":1,"543":1,"557":1}}],["day",{"2":{"456":2,"460":2}}],["dapp",{"2":{"367":2}}],["dapps",{"2":{"367":1,"368":1}}],["datalayer",{"2":{"529":3}}],["data>",{"2":{"249":1}}],["data=json",{"2":{"336":1}}],["data=localstorage",{"2":{"336":1}}],["data=",{"2":{"249":1}}],["data`",{"2":{"83":1}}],["database",{"2":{"52":1}}],["data",{"0":{"122":1},"2":{"17":1,"18":2,"19":1,"47":3,"48":1,"52":2,"56":1,"83":5,"119":1,"122":6,"123":5,"149":2,"152":6,"247":6,"249":3,"292":3,"294":4,"331":1,"336":4,"360":1,"362":2,"364":1,"365":1,"422":2,"423":1,"428":6,"429":7,"430":1,"432":1,"435":6,"437":9,"439":4,"451":2,"455":1,"460":1}}],["date=`date",{"2":{"451":1}}],["date",{"2":{"0":1,"231":1,"451":7,"457":1,"529":1}}],["döner",{"2":{"198":1}}],["dns",{"0":{"134":2},"1":{"136":2},"2":{"134":6,"145":1,"146":2}}],["doublecount",{"2":{"332":1,"333":2}}],["don",{"0":{"268":1},"2":{"260":1}}],["done",{"2":{"231":5,"232":1}}],["dosignin",{"2":{"360":1}}],["dos",{"2":{"230":1}}],["dosubscribe",{"2":{"165":1}}],["download",{"2":{"227":1}}],["downloads",{"2":{"226":1}}],["docs",{"2":{"344":1,"362":1,"444":1,"451":1}}],["documentscroll",{"2":{"250":2}}],["document",{"2":{"155":1,"193":1,"250":2,"267":1,"431":1,"472":1}}],["dockerignore",{"2":{"457":1}}],["dockerfile",{"2":{"457":2}}],["docker",{"0":{"443":1},"2":{"40":1,"457":2}}],["do",{"0":{"136":1,"229":1,"232":1,"256":1,"257":1,"347":1},"1":{"230":1,"231":1,"232":1},"2":{"221":1,"223":1,"228":1,"229":2,"231":2,"232":1,"233":1,"238":1,"251":1,"255":1,"256":3,"257":1,"259":1,"342":2,"347":1,"352":2}}],["domain",{"2":{"552":1}}],["dom",{"2":{"128":1,"155":1,"156":2,"158":1,"193":2,"267":1,"378":2,"421":1}}],["doe",{"2":{"123":2,"245":1}}],["dropdown",{"2":{"471":1}}],["draw",{"2":{"290":3}}],["drawers",{"0":{"517":1},"1":{"518":1,"519":1}}],["drawer",{"2":{"112":1,"501":1,"508":1,"513":1,"542":1}}],["drilling",{"2":{"247":1,"447":2}}],["drive",{"2":{"115":3}}],["dry",{"0":{"268":1},"2":{"243":1,"250":1,"260":1}}],["diffeditor",{"2":{"457":1}}],["diffdecorationsgutterwidth",{"2":{"457":1}}],["di",{"2":{"325":1}}],["dialyzer",{"2":{"457":1}}],["dialogstyle",{"2":{"457":1}}],["dialog",{"2":{"255":1}}],["diagram",{"0":{"5":1}}],["dirs",{"2":{"451":1}}],["dir=`echo",{"2":{"451":2}}],["dir=your",{"2":{"451":1}}],["dir=dev",{"2":{"451":1}}],["dir=",{"2":{"451":2}}],["dir",{"2":{"451":24,"554":1}}],["dirname",{"2":{"228":1,"455":1}}],["direction",{"2":{"203":2,"509":2}}],["directives",{"2":{"159":1}}],["directive",{"2":{"121":1}}],["directory",{"0":{"355":1},"2":{"112":1,"353":3,"354":1}}],["discord",{"2":{"344":1}}],["disabled=",{"2":{"335":1}}],["dispatch",{"2":{"451":2}}],["dispatcher",{"0":{"426":1},"2":{"292":4,"424":1,"425":1,"426":1,"427":1}}],["displaylanguage",{"2":{"457":1}}],["display",{"2":{"155":1,"191":1,"203":2,"230":1,"231":1,"311":1,"313":1,"317":1,"509":1,"554":1}}],["distributedfooter",{"0":{"525":1}}],["dist",{"2":{"136":1,"143":1,"391":2,"451":2,"452":1,"457":1}}],["divider",{"2":{"557":1}}],["div>",{"2":{"105":1,"149":1,"152":2,"155":1,"191":2,"193":2,"230":1,"231":10,"249":5,"255":2,"299":1,"324":2,"328":2,"330":2,"352":2,"355":3,"432":3,"437":4,"447":6,"448":1,"509":4,"538":2}}],["div",{"2":{"105":2,"149":3,"155":2,"192":1,"193":4,"230":3,"231":12,"249":4,"255":2,"299":1,"352":2,"355":1,"393":5,"432":1,"448":2,"453":1,"509":4}}],["d",{"2":{"53":1,"139":1,"361":1,"375":1,"379":2,"384":1,"392":1,"451":1,"457":16}}],["details",{"2":{"469":1}}],["deno",{"2":{"457":2}}],["deep",{"2":{"453":1}}],["dexie",{"2":{"431":2,"433":5}}],["dexiejs",{"0":{"431":1},"1":{"432":1,"433":1,"434":1,"435":1,"436":1,"437":1},"2":{"431":2}}],["dexiedb",{"2":{"300":1}}],["deposit",{"2":{"536":1}}],["deprecated",{"2":{"463":1}}],["deploy",{"2":{"451":16,"527":2,"542":1}}],["deployment",{"0":{"527":1},"2":{"395":1,"527":2}}],["dependencies",{"2":{"288":3,"451":2,"539":1}}],["dependency2",{"2":{"289":1}}],["dependency1",{"2":{"289":1}}],["dependencyservice",{"2":{"288":2,"289":6}}],["dependency",{"0":{"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"2":{"260":1,"273":1,"287":1,"288":2,"289":2}}],["debounce",{"2":{"465":1}}],["debuganyway",{"2":{"457":1}}],["debug",{"2":{"391":4,"457":1}}],["debian",{"2":{"388":1}}],["decoder",{"2":{"361":1}}],["decorator=",{"2":{"338":1}}],["decorator",{"0":{"297":1,"298":1,"299":1},"1":{"298":1,"299":1},"2":{"260":1,"275":1,"299":1,"303":1,"337":1,"338":2,"340":1,"425":1}}],["decrement",{"2":{"332":1,"333":2,"335":1}}],["degrees",{"2":{"296":6}}],["delegate",{"0":{"425":1},"2":{"419":1,"424":1,"425":3,"427":1,"441":1}}],["deletenote",{"2":{"432":3,"433":2}}],["delete",{"2":{"52":1,"53":1,"103":1,"240":1,"359":1,"428":1,"433":1,"434":1,"449":1,"460":1}}],["delivery",{"2":{"395":1,"442":1}}],["delay",{"2":{"244":2}}],["de",{"2":{"189":1}}],["definition",{"2":{"376":1}}],["define",{"2":{"382":1}}],["defined",{"2":{"376":2}}],["defineasynccomponent",{"2":{"244":7}}],["defineconfig",{"2":{"228":1,"317":2,"379":1,"382":2,"455":1,"528":1}}],["defineemits",{"2":{"124":1,"245":3,"246":2}}],["defineprops",{"2":{"124":1,"191":1,"245":4,"246":2,"255":1,"298":1,"299":1,"352":1,"453":1}}],["definestore",{"2":{"332":3,"333":2}}],["defines",{"2":{"91":1}}],["defaultformatter",{"2":{"457":4}}],["defaults",{"2":{"364":1,"435":1}}],["default",{"0":{"141":1},"2":{"114":1,"122":1,"152":2,"228":1,"245":3,"249":1,"255":4,"280":1,"281":1,"283":1,"284":1,"285":1,"288":1,"317":1,"327":1,"330":1,"349":1,"355":2,"379":1,"382":2,"428":1,"430":1,"433":1,"435":1,"451":2,"453":6,"455":1,"457":2,"512":1,"528":1}}],["devdependencies",{"2":{"455":1,"457":1}}],["devoptions",{"2":{"317":1}}],["developit",{"2":{"326":1}}],["developer",{"2":{"316":1,"336":1,"362":1,"373":1,"424":1,"496":1}}],["development",{"2":{"67":1,"554":1}}],["dev",{"2":{"80":1,"112":1,"117":1,"223":1,"224":1,"226":1,"228":2,"231":1,"317":1,"393":5,"444":2,"451":10,"455":1,"473":1,"502":1,"503":1,"554":1}}],["devtoolsformatters",{"2":{"460":3}}],["devtools",{"2":{"22":1,"116":1,"460":2,"463":4,"539":1}}],["designer",{"2":{"457":2}}],["designing",{"2":{"180":1}}],["design",{"0":{"399":1},"2":{"170":1,"198":1,"225":2,"226":1,"235":1,"255":1,"256":1,"307":1,"322":1,"343":1,"371":1,"400":1,"404":1,"420":1,"454":1,"472":2,"476":1,"497":1}}],["describe",{"2":{"376":3,"380":2,"381":2,"382":1}}],["description",{"2":{"18":1,"19":1,"136":3,"313":1,"451":1,"552":3,"554":1}}],["desc",{"2":{"47":2,"56":2,"83":1}}],["desktop",{"2":{"23":1,"95":1,"178":1,"203":2,"318":1,"509":3,"518":1,"546":2,"548":1}}],["python",{"2":{"472":1,"473":1}}],["pyproject",{"2":{"457":2}}],["pyrightconfig",{"2":{"457":2}}],["psalm",{"2":{"457":1}}],["pm2",{"2":{"457":4}}],["pm",{"2":{"457":1}}],["px`",{"2":{"453":4}}],["pdm",{"2":{"457":2}}],["pdf",{"2":{"452":1,"457":1}}],["pdgaraguso",{"2":{"405":1}}],["pwd",{"2":{"451":1}}],["pwas",{"2":{"368":1}}],["pwa",{"0":{"308":1,"309":1,"317":1,"318":1,"473":1,"553":1},"1":{"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"554":1,"555":1},"2":{"55":1,"78":1,"112":1,"131":2,"144":1,"147":1,"306":5,"308":15,"310":1,"313":2,"315":8,"316":5,"317":5,"318":3,"319":3,"320":4,"400":1,"412":1,"473":12,"496":1,"501":2,"506":2,"508":1,"542":1}}],["ppa",{"2":{"388":3}}],["pnp",{"2":{"457":2}}],["pnpm",{"2":{"51":1,"112":3,"391":1,"451":12,"455":2,"457":6,"501":3,"502":2,"503":2,"506":1}}],["png`",{"2":{"452":1}}],["png",{"2":{"317":8,"452":3,"454":3,"513":1}}],["p>",{"2":{"315":2,"432":2}}],["p",{"2":{"315":2,"352":4,"393":2,"451":1}}],["pending",{"2":{"231":10,"232":1}}],["persistentsessionreviveprocess",{"2":{"457":1}}],["person=",{"2":{"124":1}}],["person",{"2":{"123":5,"124":1,"162":1,"164":1}}],["pereditorgroup",{"2":{"457":1}}],["performance",{"2":{"308":1}}],["permissions",{"2":{"451":1}}],["permission",{"2":{"115":1}}],["pipelines",{"2":{"457":2}}],["picture",{"2":{"154":3}}],["pinia",{"0":{"331":1,"335":1},"1":{"332":1,"333":1,"334":1,"335":1},"2":{"23":1,"104":1,"119":1,"127":2,"321":1,"330":1,"331":6,"332":3,"333":2,"334":2,"335":12,"339":1,"401":1,"402":1,"413":1,"463":14,"482":1}}],["pug",{"2":{"460":1}}],["pugtools",{"2":{"457":1}}],["puppeteer",{"2":{"457":10}}],["put",{"2":{"316":1,"359":2,"434":1}}],["pubspec",{"2":{"457":3}}],["pubxml",{"2":{"457":2}}],["pub",{"2":{"291":1,"295":1,"352":2}}],["publishing",{"2":{"112":1,"174":1,"501":1}}],["public",{"2":{"52":1,"58":2,"109":1,"116":1,"126":1,"224":1,"225":1,"226":1,"227":1,"452":4}}],["push",{"0":{"356":1},"2":{"231":1,"292":1,"308":3,"356":4,"357":1,"386":1,"394":2,"395":1,"442":1,"451":3,"462":1,"529":1}}],["purple",{"2":{"151":1,"299":1}}],["pure",{"2":{"151":1}}],["pullapprove",{"2":{"457":2}}],["pull",{"2":{"143":1,"386":1,"394":1}}],["plugin",{"2":{"255":4,"317":3,"455":2,"457":1,"473":2,"515":1}}],["plugins",{"2":{"228":3,"253":2,"255":5,"256":1,"317":1,"350":1,"379":1,"455":1}}],["plus",{"2":{"231":1}}],["playground",{"2":{"457":1}}],["playwright",{"2":{"457":10}}],["player",{"2":{"217":1}}],["placeholder=",{"2":{"231":1,"432":2}}],["placeholder",{"2":{"116":1}}],["please",{"2":{"112":1,"457":1}}],["pba",{"2":{"115":1}}],["phantom",{"2":{"367":1}}],["photoshop",{"2":{"344":1}}],["photo",{"2":{"115":1}}],["phpcs",{"2":{"457":2}}],["phpunit",{"2":{"457":1}}],["php",{"2":{"62":1,"116":1,"457":2,"472":1,"473":2}}],["pouchdb",{"2":{"431":1}}],["port",{"2":{"389":1,"439":4}}],["portrait",{"2":{"313":1}}],["polygon",{"2":{"367":1}}],["policy",{"2":{"115":1}}],["policies",{"2":{"59":1}}],["pointer",{"2":{"231":1}}],["position",{"2":{"105":1}}],["postmessage",{"2":{"422":2,"423":1,"424":1,"428":1,"429":1}}],["postman",{"2":{"55":2,"117":1,"457":1}}],["posts",{"2":{"125":1}}],["postcssrc",{"2":{"457":10}}],["postcss",{"2":{"86":2,"457":10}}],["postwoman",{"2":{"55":1}}],["postgresql",{"2":{"116":1}}],["postgrest",{"2":{"53":2}}],["postgres",{"2":{"40":2,"48":1,"53":1}}],["post",{"2":{"0":3,"53":1,"359":2,"360":1,"364":1,"365":2,"434":3,"435":2,"436":1,"437":2,"439":3}}],["pablo",{"2":{"361":1,"398":1}}],["payload=",{"2":{"429":1,"435":2}}],["payload",{"2":{"361":4,"428":7,"429":3,"435":4}}],["pascal",{"2":{"457":1}}],["pascalcase",{"2":{"164":1,"230":2}}],["password",{"2":{"360":3}}],["passingpropsupward>",{"2":{"249":1}}],["passingpropsupward",{"2":{"249":2}}],["padding",{"2":{"230":1,"231":7,"352":1,"439":1}}],["patterns",{"0":{"399":1,"417":1},"2":{"170":1,"235":1,"255":1,"256":1,"307":1,"322":1,"343":1,"371":1,"400":1,"404":1,"420":1,"457":1,"472":2,"476":1,"497":1}}],["paths",{"2":{"455":1}}],["path",{"2":{"97":3,"228":4,"349":3,"353":3,"355":1,"356":1,"447":4,"453":1,"455":3}}],["packtpub",{"2":{"199":1}}],["packtpublishing",{"2":{"170":1,"235":1,"255":1,"256":1,"307":1,"322":1,"343":1,"371":1,"404":1,"420":1}}],["packt",{"2":{"173":2,"174":1,"175":1,"199":1,"200":2,"405":1}}],["packages",{"2":{"457":1}}],["package",{"0":{"5":1},"2":{"95":1,"222":1,"224":2,"292":1,"375":2,"383":1,"384":1,"438":1,"455":1,"457":7,"504":1,"539":1}}],["parameters",{"2":{"356":1}}],["params",{"2":{"114":2,"352":4,"355":1,"356":1,"358":2,"435":1,"512":1}}],["parentbasic",{"0":{"324":1}}],["parent",{"2":{"246":1,"421":1}}],["parse",{"2":{"104":1,"336":1,"432":1,"433":1}}],["pagespeed",{"2":{"473":2}}],["pages",{"0":{"526":1},"1":{"527":1,"528":1},"2":{"112":3,"442":1,"444":3,"451":11,"472":1,"501":1,"527":6,"542":2}}],["page",{"2":{"96":2,"117":1,"196":2,"473":1}}],["panel",{"0":{"31":1}}],["pr",{"2":{"495":1}}],["practices",{"0":{"399":1},"2":{"170":1,"235":1,"255":1,"256":1,"307":1,"322":1,"343":1,"371":1,"404":1,"420":1,"472":2,"476":1,"497":1}}],["primevue",{"2":{"456":1}}],["print",{"2":{"460":1}}],["printwidth",{"2":{"457":1}}],["printf",{"2":{"451":1}}],["printpage",{"2":{"159":3}}],["principle",{"0":{"265":1},"2":{"269":1}}],["privacy",{"0":{"211":1}}],["private",{"2":{"137":1,"445":1,"451":5,"463":1}}],["price",{"2":{"18":1,"83":1,"473":1}}],["procfile",{"2":{"457":2}}],["processmessage",{"2":{"428":4}}],["process",{"2":{"421":1}}],["processqueue",{"2":{"165":1}}],["proceed",{"2":{"112":1}}],["proj",{"2":{"457":2}}],["projectname",{"2":{"501":1}}],["projects",{"2":{"282":2,"283":3,"284":4,"285":3,"286":4,"287":9,"352":1}}],["projectservice",{"2":{"166":1}}],["projectservice=new",{"2":{"166":1}}],["project",{"2":{"112":2,"349":4,"352":1,"451":5,"457":1,"501":5,"502":1,"506":2}}],["prod",{"2":{"451":5}}],["producs",{"2":{"103":1}}],["production",{"2":{"455":1}}],["productid",{"2":{"97":1,"103":6,"450":1}}],["productview",{"2":{"96":2,"97":1}}],["productcategoryview",{"2":{"96":2,"97":2}}],["productcard",{"2":{"83":1,"108":1}}],["products",{"0":{"46":1,"83":1},"2":{"41":2,"43":1,"47":1,"48":1,"52":3,"53":3,"56":2,"83":5,"91":1,"95":1,"96":1,"103":1,"109":1,"114":3,"450":1}}],["product",{"0":{"47":1},"2":{"16":1,"17":1,"52":1,"56":1,"59":1,"83":4,"91":2,"97":3,"135":1,"450":2}}],["proxies",{"0":{"337":1},"1":{"338":1,"339":1}}],["proxy",{"0":{"295":1,"296":1},"1":{"296":1},"2":{"117":1,"123":1,"125":1,"260":1,"275":1,"295":1,"296":3,"297":2,"337":1,"338":3,"425":1,"460":2,"462":1}}],["provision",{"2":{"247":5}}],["provider",{"2":{"361":1}}],["provide",{"0":{"247":1},"2":{"246":1,"247":8,"255":1,"288":3,"289":4,"325":2,"445":1,"447":3,"463":2}}],["promised",{"2":{"305":1}}],["promises",{"2":{"260":1,"276":1,"302":1}}],["promise",{"0":{"303":1},"2":{"241":1,"244":1,"255":1,"303":9,"378":2,"428":3,"429":2,"430":2,"433":3,"435":2,"511":1}}],["prompt",{"0":{"315":1},"2":{"222":1,"314":1,"315":6}}],["progressive",{"2":{"308":1,"318":1,"400":1,"473":1}}],["progress",{"0":{"190":1},"1":{"191":1},"2":{"190":1,"256":2}}],["profile",{"2":{"154":3,"247":1}}],["protocol",{"2":{"134":1,"143":2,"144":1}}],["prop",{"2":{"124":2,"246":1,"255":1,"324":1,"338":12,"352":2,"447":2}}],["props",{"0":{"124":1},"2":{"119":1,"124":3,"152":1,"245":1,"246":2,"247":2,"249":1,"255":1,"323":2,"338":6,"349":2,"352":1,"353":2,"355":1,"373":2,"374":1,"380":3,"450":1,"453":11}}],["property=",{"2":{"552":7}}],["properties",{"2":{"358":1}}],["proper",{"2":{"91":1}}],["problem",{"0":{"92":1},"2":{"92":1,"473":1}}],["prerenderer",{"2":{"473":1}}],["prettier",{"2":{"457":14}}],["pretty",{"2":{"349":1}}],["pre>",{"2":{"330":2}}],["preventdefault",{"2":{"315":1}}],["preview",{"2":{"224":1,"375":2,"457":1}}],["pre",{"2":{"302":14,"303":7}}],["press",{"2":{"205":2}}],["prestashop",{"2":{"41":1}}],["preferredtagnamecase",{"2":{"457":1}}],["prefer",{"2":{"53":1,"317":1}}],["ящики",{"2":{"266":1}}],["ячеек",{"2":{"263":1}}],["ярким",{"2":{"336":1,"359":1}}],["яркий",{"2":{"266":1}}],["ярких",{"2":{"184":1}}],["ярлыков",{"2":{"200":1}}],["ярлыка",{"2":{"186":1,"313":1}}],["ядра",{"2":{"125":1,"386":2}}],["языком",{"2":{"264":1,"421":1}}],["языков",{"0":{"469":1},"2":{"148":1,"225":1,"279":1,"281":1,"460":1,"464":1,"536":1}}],["языке",{"2":{"116":2,"152":1,"171":1,"178":1,"185":1,"226":1,"260":1,"403":1,"472":1}}],["языках",{"2":{"265":2,"446":1,"462":1,"464":1}}],["языками",{"2":{"151":1,"267":1}}],["языка",{"2":{"68":1,"117":1,"171":1,"225":1,"264":1,"272":1,"376":1,"460":1,"472":1,"536":1}}],["язык",{"0":{"399":1},"2":{"68":2,"118":1,"147":2,"166":1,"169":1,"264":1,"312":1,"417":1,"463":1,"472":2}}],["явная",{"2":{"268":1}}],["явным",{"2":{"114":1}}],["явные",{"2":{"53":1}}],["явного",{"2":{"286":1}}],["явное",{"2":{"257":1}}],["явном",{"2":{"151":1}}],["явно",{"2":{"105":1,"152":1,"160":1,"210":1,"224":1,"504":1}}],["явен",{"2":{"105":1}}],["являющееся",{"2":{"187":2}}],["являются",{"2":{"14":1,"116":1,"121":1,"124":1,"161":1,"166":1,"174":1,"178":2,"180":1,"192":1,"204":1,"209":1,"222":1,"225":1,"243":1,"262":1,"267":1,"270":1,"278":1,"280":1,"296":1,"302":1,"308":1,"316":1,"323":1,"332":2,"336":2,"344":2,"358":1,"359":1,"360":3,"364":1,"367":3,"370":1,"376":1,"408":1,"421":1,"447":1,"460":1,"499":1}}],["является",{"0":{"122":1},"2":{"41":1,"55":1,"116":1,"119":1,"122":1,"123":1,"125":1,"134":1,"137":1,"143":1,"144":2,"148":1,"149":1,"151":3,"152":4,"154":1,"168":1,"172":1,"178":1,"179":1,"186":1,"189":1,"192":2,"193":1,"196":1,"200":1,"203":1,"204":3,"208":1,"216":2,"219":1,"221":1,"223":1,"224":3,"227":2,"228":2,"232":1,"234":2,"235":1,"238":1,"240":1,"241":1,"244":1,"245":1,"246":3,"247":3,"256":3,"260":1,"264":1,"265":1,"266":1,"268":1,"269":1,"276":1,"280":1,"284":1,"291":1,"292":1,"295":2,"296":2,"300":3,"301":2,"302":1,"303":1,"306":1,"310":1,"313":1,"315":1,"316":2,"318":1,"323":2,"329":2,"330":2,"331":1,"335":2,"336":4,"338":4,"344":1,"347":1,"349":1,"352":1,"354":1,"355":1,"359":2,"360":1,"361":3,"365":4,"367":3,"370":1,"373":2,"374":1,"376":3,"378":1,"379":1,"385":2,"386":2,"387":1,"390":2,"391":2,"421":3,"426":1,"428":1,"430":1,"432":1,"434":2,"435":1,"447":1,"462":2,"463":2,"464":1,"473":1,"512":1}}],["являться",{"2":{"6":1,"435":1}}],["я",{"2":{"4":1,"62":2,"119":1,"149":1,"152":2,"160":1,"206":1,"222":4,"239":1,"249":1,"255":1,"265":1,"267":1,"292":2,"295":1,"296":1,"302":1,"303":2,"313":1,"325":1,"335":1,"338":1,"352":1,"405":1,"435":1,"463":2,"464":2,"472":2}}],["едят",{"2":{"539":1}}],["единицы",{"2":{"372":1}}],["единиц",{"2":{"300":1}}],["единицей",{"2":{"238":1}}],["единую",{"2":{"281":1,"293":1,"425":1}}],["единый",{"2":{"268":1,"330":1,"331":1,"471":1}}],["единая",{"2":{"260":1,"263":1,"291":1,"308":1}}],["единственному",{"2":{"376":1}}],["единственной",{"2":{"207":1}}],["единственное",{"2":{"62":1,"303":1,"376":1}}],["единственная",{"2":{"192":1,"504":1}}],["единственным",{"2":{"284":1,"439":1}}],["единственные",{"2":{"176":1,"335":1,"336":1}}],["единственный",{"2":{"152":2,"335":1,"352":1}}],["единой",{"0":{"265":1},"2":{"265":1,"329":1,"425":1,"427":1}}],["единое",{"2":{"150":1,"266":1,"372":1}}],["единовременно",{"2":{"144":1}}],["ежедневно",{"2":{"340":1}}],["ею",{"2":{"323":2}}],["е",{"2":{"133":1,"205":1}}],["еvent",{"2":{"118":1}}],["ему",{"2":{"115":1,"174":1,"186":1,"239":1,"240":1,"292":1,"303":1,"352":1,"365":1,"430":1,"442":1,"463":1,"473":1}}],["ей",{"2":{"62":1,"271":1,"471":1}}],["ее",{"2":{"23":1,"69":1,"140":1,"148":1,"149":1,"151":2,"152":2,"171":1,"181":1,"185":2,"193":1,"215":1,"222":2,"225":2,"229":1,"231":1,"232":1,"240":1,"244":1,"246":1,"250":3,"251":2,"257":1,"263":1,"267":2,"269":1,"284":1,"286":1,"287":2,"292":1,"301":1,"315":1,"323":1,"324":1,"326":1,"330":1,"332":1,"336":3,"344":1,"353":1,"363":1,"367":1,"377":1,"380":1,"381":1,"383":1,"385":1,"393":1,"421":2,"422":1,"429":1,"431":1,"433":2,"440":1,"464":1}}],["её",{"0":{"224":1},"2":{"23":1,"41":1,"53":1,"89":1,"97":1,"98":2,"108":1,"115":2,"154":1,"445":1,"452":1,"460":1,"462":2,"465":2}}],["еще",{"0":{"249":1},"2":{"10":1,"27":1,"41":1,"134":1,"143":1,"148":1,"150":1,"159":1,"160":1,"167":1,"169":1,"171":1,"174":1,"176":1,"189":1,"213":1,"222":1,"223":2,"224":1,"227":2,"228":1,"239":1,"243":1,"246":1,"247":1,"249":1,"255":1,"256":3,"257":1,"258":1,"263":2,"269":1,"270":1,"289":1,"299":1,"314":1,"344":2,"364":1,"366":3,"372":1,"375":2,"376":2,"378":1,"382":1,"383":1,"384":1,"391":1,"393":1,"394":1,"421":1,"424":2,"425":1,"429":1,"439":1,"440":1,"457":4,"460":1,"462":1,"472":1,"473":3,"536":1}}],["ещё",{"2":{"4":1,"344":1}}],["естественный",{"2":{"345":1}}],["естественным",{"2":{"176":1,"246":1}}],["естественные",{"0":{"176":1}}],["естественных",{"2":{"175":1,"376":1}}],["естественной",{"2":{"175":1}}],["естественном",{"2":{"171":1}}],["естественно",{"2":{"48":1,"112":1,"130":1,"265":1,"451":1,"463":1}}],["есть",{"0":{"498":1},"2":{"9":1,"10":1,"12":1,"13":1,"16":3,"17":2,"22":2,"43":1,"47":1,"48":1,"59":1,"76":1,"85":2,"86":2,"89":1,"90":1,"97":1,"102":3,"105":1,"112":1,"115":3,"116":4,"119":1,"122":1,"123":1,"125":1,"134":2,"136":1,"142":1,"144":1,"147":1,"148":4,"151":2,"152":3,"160":1,"168":1,"180":1,"187":1,"189":1,"190":3,"193":1,"195":1,"204":1,"206":2,"209":1,"223":2,"227":1,"231":4,"232":3,"238":1,"243":1,"244":1,"246":1,"248":1,"249":1,"251":1,"255":1,"256":1,"258":1,"259":1,"264":2,"267":1,"269":1,"292":1,"293":1,"295":2,"297":3,"299":1,"302":1,"303":4,"308":2,"314":1,"315":2,"316":3,"317":1,"323":3,"325":2,"327":1,"328":1,"330":3,"331":1,"333":1,"335":1,"336":1,"344":1,"346":1,"349":1,"350":1,"352":2,"353":1,"355":3,"361":3,"365":1,"367":1,"375":3,"376":1,"379":2,"381":1,"382":1,"383":1,"385":1,"391":1,"394":1,"421":4,"423":1,"427":1,"445":2,"451":3,"454":1,"456":2,"457":1,"458":1,"462":3,"463":4,"464":1,"465":1,"471":1,"472":6,"473":3,"507":1,"539":2,"540":1}}],["если",{"2":{"3":1,"9":1,"12":2,"23":1,"26":1,"34":1,"36":1,"40":1,"41":1,"59":2,"68":1,"91":1,"93":2,"105":2,"109":1,"115":5,"116":2,"117":5,"121":1,"125":4,"131":1,"134":1,"135":4,"136":2,"137":1,"139":1,"141":2,"143":1,"144":4,"145":1,"147":1,"148":1,"150":1,"151":4,"152":2,"154":2,"156":2,"157":1,"160":1,"166":1,"168":2,"169":1,"172":1,"174":3,"176":2,"178":1,"179":1,"180":1,"181":1,"187":1,"190":1,"192":1,"195":1,"200":1,"206":1,"208":2,"213":1,"217":1,"218":1,"222":1,"223":8,"224":2,"225":3,"226":1,"227":2,"231":2,"232":1,"238":1,"239":1,"243":2,"244":2,"246":1,"247":1,"249":6,"250":1,"255":1,"263":2,"265":1,"267":3,"268":2,"270":2,"277":1,"280":2,"281":1,"284":1,"286":2,"287":2,"288":1,"292":2,"293":1,"294":1,"295":1,"296":1,"297":1,"301":1,"308":3,"310":1,"315":2,"316":3,"317":1,"318":1,"319":1,"322":1,"325":2,"328":5,"330":3,"331":1,"332":1,"334":1,"335":1,"336":2,"338":2,"339":2,"342":1,"344":1,"346":1,"349":1,"352":3,"354":1,"355":1,"358":2,"360":1,"361":1,"366":3,"367":1,"375":1,"376":3,"378":2,"379":1,"382":1,"383":2,"385":1,"387":1,"388":1,"389":3,"390":4,"394":1,"402":1,"421":8,"422":2,"424":1,"426":1,"430":1,"432":1,"433":1,"434":1,"444":1,"445":1,"447":1,"451":1,"452":2,"454":1,"455":3,"457":1,"460":1,"463":5,"465":2,"466":1,"468":1,"471":1,"472":4,"473":2,"504":1,"527":1,"528":2,"539":1,"548":1}}],["его",{"0":{"278":1},"2":{"3":1,"4":1,"16":1,"22":2,"23":1,"25":1,"41":1,"48":1,"59":1,"64":1,"65":1,"68":1,"69":1,"85":1,"89":2,"104":1,"105":2,"108":1,"112":1,"115":10,"116":2,"117":1,"121":3,"123":2,"125":1,"134":1,"135":1,"137":1,"140":1,"141":1,"144":2,"148":2,"149":2,"151":1,"152":5,"155":2,"159":1,"160":1,"161":1,"169":1,"171":3,"174":2,"179":1,"184":2,"187":1,"188":1,"190":4,"192":1,"193":1,"195":1,"197":1,"199":1,"200":1,"203":1,"205":1,"207":2,"208":1,"209":1,"213":1,"216":1,"218":2,"221":1,"222":2,"223":2,"224":6,"226":1,"227":1,"229":2,"230":2,"231":3,"232":3,"233":1,"243":2,"244":2,"245":1,"246":1,"247":1,"255":4,"256":2,"258":1,"259":1,"265":1,"267":1,"268":4,"270":1,"281":1,"285":1,"288":1,"289":2,"292":2,"293":1,"295":4,"296":1,"297":4,"298":1,"300":3,"302":2,"303":1,"306":1,"308":2,"312":1,"314":1,"315":2,"316":6,"317":1,"319":1,"320":1,"323":2,"325":1,"326":1,"329":2,"331":4,"332":3,"333":1,"335":2,"336":2,"337":3,"338":5,"339":2,"341":1,"345":1,"346":1,"347":1,"349":1,"351":1,"352":3,"353":1,"355":1,"359":1,"360":2,"361":4,"362":1,"365":2,"366":1,"367":6,"370":1,"372":1,"373":2,"374":1,"375":1,"379":1,"381":2,"384":1,"385":1,"386":2,"390":3,"393":3,"394":1,"395":1,"416":1,"422":1,"424":1,"425":2,"426":1,"428":1,"429":2,"430":1,"431":2,"432":1,"433":1,"435":2,"439":1,"440":1,"445":1,"447":1,"451":1,"455":1,"457":2,"462":1,"463":1,"464":3,"470":1,"471":1,"472":1,"473":7,"496":2,"508":2,"539":1,"554":1}}],["ie6",{"2":{"471":1}}],["iex",{"2":{"457":1}}],["ie11",{"2":{"454":1}}],["ie",{"2":{"454":1}}],["igzir14e",{"2":{"361":1}}],["ignoredlocales",{"2":{"457":1}}],["ignoretrimwhitespace",{"2":{"457":1}}],["ignorerecommendations",{"2":{"457":1}}],["ignore",{"2":{"112":1,"457":2,"501":1}}],["iat",{"2":{"361":2}}],["i++",{"2":{"292":1,"302":2,"303":1}}],["i>",{"2":{"227":1,"231":3}}],["ico",{"2":{"224":1,"317":1}}],["iconify",{"2":{"454":1,"457":2}}],["icons",{"0":{"454":1},"2":{"311":1,"317":1,"453":2,"454":1,"554":1}}],["iconwithbadge",{"2":{"105":3}}],["iconbadge",{"2":{"105":3}}],["iconbuddy",{"2":{"98":1}}],["iconbutton",{"0":{"85":1}}],["icones",{"2":{"98":1}}],["icon",{"2":{"19":1,"105":2,"226":1,"317":3,"453":1}}],["icann",{"2":{"134":2}}],["ipc",{"2":{"303":1,"422":1}}],["ipv6",{"2":{"134":4}}],["ipv4",{"2":{"134":3}}],["ip",{"2":{"115":1,"134":7}}],["iphone",{"2":{"115":1,"184":1}}],["ipo",{"2":{"63":1}}],["i",{"2":{"112":1,"157":4,"227":2,"231":3,"292":6,"302":4,"303":2,"457":1,"502":1,"503":1}}],["isdraweropen",{"2":{"513":3}}],["isn",{"2":{"463":2}}],["isauthenticated",{"2":{"463":1}}],["ist",{"2":{"457":1}}],["issuenumberlabel",{"2":{"457":1}}],["issued",{"2":{"361":1}}],["is=",{"2":{"160":1}}],["is",{"0":{"251":1},"2":{"112":1,"151":1,"160":1,"244":1,"251":2,"457":1,"460":2,"463":2}}],["isinfavourites",{"2":{"103":3}}],["if=",{"2":{"255":1,"453":1}}],["ifmodule>",{"2":{"139":2}}],["ifmodule",{"2":{"139":2}}],["if",{"0":{"156":2},"2":{"103":1,"156":1,"160":1,"231":1,"244":1,"251":1,"281":1,"287":1,"292":3,"302":2,"303":2,"315":1,"316":1,"332":1,"333":1,"336":1,"338":3,"363":1,"365":2,"376":1,"428":1,"429":1,"432":1,"435":2,"451":3}}],["imageresources",{"2":{"454":3}}],["imageraw",{"2":{"452":1}}],["imagenameinvariable",{"2":{"452":1}}],["imageurl",{"2":{"452":1}}],["image",{"2":{"317":3,"452":4,"552":4}}],["images",{"2":{"18":1,"317":4,"451":1,"452":3,"454":2,"513":1,"552":1,"555":1}}],["imgurl",{"2":{"452":2}}],["img",{"2":{"154":1,"452":6,"453":1}}],["importscript",{"2":{"423":2,"424":1}}],["important",{"2":{"299":1}}],["import",{"2":{"103":2,"114":7,"121":3,"123":1,"152":2,"160":3,"193":1,"230":1,"243":2,"244":7,"251":2,"255":5,"267":1,"281":1,"286":1,"287":3,"289":3,"299":1,"317":2,"324":2,"328":2,"330":1,"333":2,"334":2,"335":1,"339":1,"349":2,"350":4,"352":1,"353":3,"355":3,"360":1,"376":1,"380":2,"381":2,"382":3,"423":1,"424":1,"432":2,"437":2,"448":1,"449":1,"452":3,"453":3,"454":6,"455":3,"457":2,"509":1,"511":1,"512":6,"513":3,"538":1}}],["ios",{"2":{"308":1}}],["io",{"2":{"80":1,"112":1,"228":1,"361":1,"527":1}}],["i18next",{"0":{"536":1,"539":1},"2":{"460":1,"536":1,"539":3,"540":1}}],["i18n",{"0":{"535":1},"1":{"536":1,"537":1,"538":1,"539":1,"540":1},"2":{"78":1,"96":1,"112":1,"446":1,"457":3,"460":3,"504":1,"506":1,"508":1,"536":2,"538":1,"539":1,"544":2}}],["inplace",{"2":{"457":1}}],["inputs",{"2":{"451":5}}],["inputevents",{"2":{"381":4}}],["inputevents=wrapper",{"2":{"381":1}}],["input",{"2":{"98":1,"158":2,"163":1,"183":2,"231":6,"244":1,"365":2,"380":2,"381":6,"432":1,"437":3,"457":1,"462":1}}],["invisiblecharacters",{"2":{"457":1}}],["invalid",{"2":{"363":1}}],["invoker",{"2":{"293":1,"294":2}}],["inrange",{"2":{"332":1,"333":2}}],["inc",{"2":{"554":1}}],["includesource",{"2":{"382":1}}],["includeassets",{"2":{"317":1}}],["increment=",{"2":{"324":3}}],["increment",{"2":{"324":1,"325":4,"332":1,"333":2,"335":3}}],["incrementcounter",{"2":{"324":7,"325":2}}],["inheritance",{"0":{"264":1},"2":{"260":1}}],["injectregister",{"2":{"317":1}}],["injections",{"2":{"515":1}}],["injection",{"0":{"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"2":{"260":1,"273":1,"289":2,"515":2}}],["inject",{"0":{"247":1},"2":{"246":1,"247":7,"255":4,"288":2,"289":2,"325":2,"445":1,"447":3,"463":2}}],["instanceof",{"2":{"338":1}}],["instance",{"2":{"281":5}}],["installpwa",{"2":{"315":3}}],["installed",{"2":{"315":5}}],["install",{"0":{"315":1},"2":{"223":1,"252":1,"255":2,"314":1,"315":10,"316":1,"317":1,"326":1,"331":1,"346":1,"359":1,"374":1,"375":1,"379":2,"384":1,"388":2,"389":2,"431":1,"434":1,"438":1,"451":10}}],["insertfinalnewline",{"2":{"457":1}}],["insert",{"2":{"52":1}}],["infinitum",{"2":{"193":1}}],["infinitescroller",{"0":{"193":1}}],["infinite",{"2":{"191":1,"192":1}}],["info",{"2":{"117":3}}],["inlinesuggest",{"2":{"457":1}}],["inline",{"2":{"191":1}}],["ind",{"2":{"457":1}}],["indent",{"2":{"457":1}}],["indexedb",{"2":{"315":1}}],["indexeddb",{"0":{"336":1,"431":1},"1":{"432":1,"433":1,"434":1,"435":1,"436":1,"437":1},"2":{"282":2,"300":2,"336":5,"419":2,"421":1,"425":1,"431":2,"440":1}}],["indexof",{"2":{"292":1}}],["index",{"0":{"136":1,"349":1,"429":1,"434":1,"436":1,"439":1,"515":1},"2":{"120":1,"126":1,"135":1,"136":1,"137":1,"139":2,"141":4,"150":1,"224":3,"225":2,"226":1,"227":1,"255":5,"310":1,"314":1,"348":1,"393":5,"428":2,"438":1,"451":2,"473":2,"512":1,"515":1,"529":1,"552":1,"556":1}}],["individual",{"2":{"247":1}}],["indicating",{"2":{"91":1}}],["initi18n",{"2":{"538":2}}],["initialset",{"2":{"104":2}}],["init",{"2":{"114":1,"390":1,"438":1,"451":2,"512":1}}],["in",{"0":{"382":1},"2":{"112":1,"157":1,"159":1,"160":2,"193":1,"231":2,"251":1,"256":2,"332":1,"333":1,"335":3,"352":1,"355":1,"375":1,"393":2,"432":1,"454":2,"457":1,"463":1,"501":1}}],["intl",{"2":{"456":1,"460":1}}],["integrated",{"2":{"457":5}}],["integration",{"2":{"395":1,"442":1}}],["intel",{"2":{"402":1}}],["intellisense",{"2":{"222":1}}],["inteface",{"2":{"171":1}}],["interval",{"2":{"365":2,"457":1}}],["intersectionobserver",{"2":{"193":3}}],["intersection",{"2":{"192":1,"460":1}}],["interaction",{"2":{"180":1,"363":1}}],["interacting",{"2":{"52":1}}],["interfaces",{"2":{"358":1,"493":1}}],["interface",{"2":{"180":1,"496":1}}],["internet",{"2":{"134":2,"310":1}}],["interceptors",{"2":{"114":1,"511":1,"512":1}}],["into",{"2":{"91":1,"114":1}}],["idx",{"2":{"457":1}}],["idb",{"2":{"431":1}}],["id=g",{"2":{"529":1}}],["id=await",{"2":{"433":1}}],["id=setinterval",{"2":{"365":1}}],["id=",{"2":{"149":3}}],["id=eq",{"2":{"56":2,"83":2}}],["ids",{"2":{"91":2}}],["idea",{"2":{"391":1}}],["identity",{"2":{"363":1,"364":2}}],["ide",{"0":{"457":1},"2":{"89":1,"221":1,"222":6,"224":2,"233":1,"267":1,"335":1,"394":1,"457":1,"496":1}}],["id",{"2":{"3":2,"18":1,"19":1,"52":1,"53":3,"56":4,"83":3,"97":1,"149":1,"157":1,"162":1,"231":4,"349":2,"352":5,"361":1,"362":1,"365":1,"428":9,"429":5,"432":5,"433":6,"450":1,"451":2,"529":1}}],["items",{"2":{"256":1}}],["item",{"2":{"231":5,"256":1,"336":7}}],["it",{"0":{"267":1,"269":1},"2":{"2":1,"68":1,"91":1,"112":2,"260":2,"267":1,"292":1,"463":2,"501":2,"506":1,"554":1}}],["лёгкое",{"2":{"504":1}}],["лэндинг",{"2":{"347":2,"352":1}}],["лэйаута",{"2":{"508":1,"548":1}}],["лэйаутами",{"2":{"447":1}}],["лэйауте",{"2":{"447":1}}],["лэйаутов",{"2":{"447":1}}],["лэйаут",{"2":{"26":1,"28":1,"230":1,"447":1,"471":1}}],["лайфхак",{"2":{"463":1}}],["ландшафтная",{"2":{"312":1}}],["ландшафте",{"2":{"147":1}}],["лаконичен",{"2":{"244":1,"376":1}}],["лазить",{"2":{"115":1}}],["лепту",{"0":{"495":1}}],["лечь",{"2":{"473":1}}],["лень",{"2":{"473":1}}],["ленивой",{"2":{"317":1}}],["ленивую",{"2":{"244":1}}],["ленточная",{"2":{"176":1}}],["лет",{"2":{"189":1,"227":1,"460":1}}],["лету",{"2":{"171":1,"344":1}}],["левой",{"2":{"174":1,"204":1}}],["левом",{"2":{"172":1,"178":1,"204":1}}],["легкий",{"2":{"472":1}}],["легким",{"2":{"373":1}}],["легкая",{"2":{"148":1,"431":1}}],["легкого",{"2":{"216":1}}],["легкой",{"2":{"152":1,"462":1}}],["легко",{"2":{"35":1,"63":1,"114":1,"148":1,"180":2,"184":1,"192":1,"195":1,"210":1,"225":1,"227":1,"268":1,"269":1,"302":1,"303":1,"352":1,"361":1,"375":1,"376":2,"379":1,"381":1,"434":1,"435":1,"447":1,"472":1,"504":1,"511":1}}],["легче",{"2":{"125":1,"318":1,"472":1}}],["лежащего",{"2":{"442":1}}],["лежащую",{"2":{"344":1}}],["лежат",{"2":{"376":1}}],["лежать",{"2":{"109":1}}],["лежит",{"2":{"116":1,"172":1,"176":1}}],["лучшем",{"2":{"373":1,"421":1}}],["лучшее",{"2":{"171":1,"308":1,"457":1}}],["лучшего",{"2":{"149":1,"322":1}}],["лучшей",{"2":{"59":1,"265":1,"267":1,"346":1,"507":1}}],["лучше",{"2":{"23":1,"35":1,"59":1,"85":1,"125":1,"126":1,"152":1,"160":1,"203":1,"223":1,"232":1,"233":1,"238":1,"244":1,"263":1,"265":1,"267":2,"269":1,"286":1,"287":1,"304":1,"316":1,"321":1,"328":1,"344":1,"351":1,"359":1,"361":1,"369":1,"374":1,"402":1,"447":1,"454":1,"457":1,"462":1,"468":1,"472":2,"473":1,"539":1}}],["лучшими",{"2":{"472":1}}],["лучшим",{"2":{"359":1,"447":1}}],["лучших",{"2":{"77":1,"221":1,"227":1,"265":1,"270":1,"287":1,"447":1,"472":1,"496":1,"507":2,"508":1}}],["лучший",{"0":{"150":1},"2":{"17":1,"325":1}}],["лучшие",{"0":{"398":1,"447":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"448":1,"449":1,"450":1},"2":{"9":1,"76":1,"115":1,"147":1,"232":1,"271":1,"381":1,"472":1,"508":1}}],["литерал",{"2":{"280":1,"288":1}}],["литературах",{"2":{"276":1}}],["листов",{"2":{"227":1}}],["лицензией",{"2":{"499":1}}],["лицензии",{"2":{"226":1}}],["лица",{"2":{"366":1}}],["лицом",{"2":{"134":1}}],["линтинга",{"2":{"504":1}}],["линтингом",{"2":{"461":1}}],["линтер",{"2":{"166":1,"457":1}}],["линус",{"2":{"386":1}}],["линусом",{"2":{"386":1}}],["линии",{"2":{"198":2}}],["лишен",{"2":{"366":1}}],["лишающие",{"2":{"219":1}}],["лишь",{"2":{"115":1,"147":1,"150":1,"180":1,"204":1,"227":1,"247":1,"255":1,"308":1,"372":1,"380":1,"421":1}}],["лишние",{"2":{"115":1,"393":1}}],["лимиты",{"2":{"40":1}}],["личное",{"2":{"352":1}}],["личность",{"2":{"210":1,"367":1}}],["личного",{"2":{"36":1,"445":1}}],["личным",{"2":{"59":1}}],["личный",{"2":{"29":1,"33":1,"79":1,"115":1}}],["ли",{"2":{"10":1,"26":1,"115":3,"116":1,"134":1,"135":1,"137":1,"146":1,"186":1,"220":1,"234":3,"238":2,"249":1,"259":1,"281":1,"301":1,"305":3,"314":1,"316":1,"325":1,"328":1,"338":2,"370":1,"383":1,"397":3,"447":1,"461":1,"463":1,"472":4,"473":1}}],["либо",{"2":{"3":1,"31":1,"40":1,"47":3,"50":1,"53":1,"59":1,"89":1,"116":1,"174":2,"185":2,"186":1,"188":2,"190":2,"204":2,"212":2,"214":2,"218":1,"222":1,"224":4,"228":1,"244":1,"251":4,"256":1,"293":1,"302":1,"315":4,"330":1,"356":2,"366":1,"367":2,"375":2,"383":1,"421":1,"425":2,"428":2,"435":2,"452":3,"455":1,"465":1,"471":2,"472":1,"473":1,"504":1,"507":1,"537":1}}],["ложное",{"2":{"376":1}}],["ложится",{"2":{"39":1}}],["ломают",{"2":{"373":1}}],["ловушки",{"2":{"338":1}}],["ловушку",{"2":{"210":1}}],["лотком",{"2":{"188":1}}],["локали",{"2":{"460":1}}],["локализации",{"2":{"460":3,"536":3}}],["локалей",{"2":{"460":1,"504":1,"536":1,"538":1}}],["локальную",{"2":{"386":1}}],["локальных",{"2":{"457":1,"463":1}}],["локальные",{"0":{"243":1,"336":1},"2":{"386":2}}],["локальными",{"2":{"308":2}}],["локальным",{"2":{"224":1,"308":1,"394":1,"425":1,"464":1}}],["локальный",{"2":{"223":1,"390":2,"394":3,"463":1}}],["локальное",{"2":{"249":1,"344":1}}],["локального",{"2":{"141":1,"144":1,"243":1,"336":1,"344":1}}],["локальной",{"2":{"135":1,"184":1,"188":1,"300":1,"308":3,"336":1,"394":1,"430":1,"440":1}}],["локальному",{"2":{"339":1,"431":1}}],["локальном",{"2":{"135":1,"140":1,"143":1}}],["локально",{"2":{"111":1,"147":1,"224":2,"243":1,"336":1,"394":2,"473":1}}],["локация",{"2":{"4":1}}],["логарифмической",{"2":{"179":1}}],["лого",{"2":{"98":1}}],["логотипа",{"2":{"95":1,"204":1}}],["логотип",{"2":{"29":1,"204":2}}],["логирования",{"2":{"297":1}}],["логично",{"2":{"463":1}}],["логичный",{"2":{"345":1,"460":1}}],["логичней",{"2":{"105":1}}],["логическому",{"2":{"473":1}}],["логическом",{"2":{"425":1}}],["логической",{"2":{"267":1}}],["логические",{"2":{"373":1,"445":1}}],["логически",{"2":{"367":1,"467":1}}],["логический",{"2":{"270":1}}],["логических",{"2":{"68":1}}],["логикe",{"2":{"250":1}}],["логикой",{"2":{"160":1,"256":2,"265":1,"267":1,"293":1,"294":1,"365":1}}],["логике",{"2":{"89":1,"231":1,"268":1,"303":1,"315":1}}],["логику",{"2":{"40":1,"116":2,"152":1,"231":2,"244":1,"255":1,"256":2,"268":2,"270":1,"294":1,"295":1,"296":1,"297":1,"302":1,"316":1,"331":1,"376":2,"381":1,"462":3,"463":2,"471":2}}],["логика",{"2":{"34":1,"116":1,"232":1,"249":1,"367":1,"462":1,"463":4}}],["логики",{"2":{"6":1,"83":1,"250":4,"255":1,"256":3,"268":1,"360":3,"373":1,"376":1,"463":3,"511":1}}],["логине",{"2":{"115":1}}],["логинится",{"2":{"115":1}}],["логина",{"2":{"98":1,"115":1,"461":1,"545":1}}],["логин",{"2":{"33":1,"115":4}}],["люксовый",{"2":{"473":1}}],["людей",{"2":{"218":1}}],["люди",{"2":{"2":1,"174":1,"394":1}}],["любезно",{"2":{"375":1}}],["любую",{"2":{"225":1,"244":1,"263":1,"330":1,"361":1}}],["любимую",{"2":{"114":1}}],["любая",{"2":{"102":1,"312":1,"381":1,"450":1,"463":1,"471":1}}],["любые",{"2":{"362":1,"363":1,"425":1,"433":1}}],["любым",{"2":{"134":1,"192":1,"330":1,"336":2,"338":1,"421":1,"424":1,"451":1}}],["любыми",{"2":{"63":1}}],["любых",{"2":{"2":1,"206":1,"287":1}}],["любого",{"2":{"23":1,"117":1,"133":1,"241":1,"245":1,"255":2,"296":1,"346":1,"354":1,"366":1,"367":1,"390":1,"427":1,"439":2,"495":1}}],["любом",{"2":{"12":1,"115":1,"178":1,"186":1,"225":1,"227":1,"297":2,"303":1,"306":1,"310":1,"325":1,"352":1,"463":1,"468":1,"473":1}}],["любому",{"2":{"2":1,"123":1,"134":1,"189":1,"325":1,"336":1}}],["любой",{"2":{"2":1,"117":1,"124":1,"137":1,"148":1,"150":1,"190":2,"229":1,"247":2,"252":1,"285":1,"326":1,"329":1,"344":1,"354":1,"359":1,"367":1,"394":1,"422":1,"426":1,"446":1,"452":1,"463":1,"471":1}}],["любое",{"2":{"2":1,"115":1,"204":1,"223":1,"329":1,"335":1,"377":1}}],["vwa",{"2":{"548":1,"557":11}}],["vetur",{"2":{"457":2}}],["vercel",{"2":{"444":1,"457":2,"545":1}}],["vertical",{"2":{"191":1}}],["versionrc",{"2":{"457":2}}],["versions",{"2":{"457":3}}],["version",{"2":{"112":1,"390":1,"402":1,"433":1,"451":5,"457":3,"555":1}}],["vbproj",{"2":{"457":1}}],["vb",{"2":{"457":6}}],["v4значительно",{"2":{"451":1}}],["v4",{"2":{"451":4}}],["v2",{"2":{"451":3}}],["volar",{"2":{"222":1,"457":4}}],["vlc",{"2":{"217":1}}],["validate",{"2":{"457":1}}],["validateotp",{"2":{"365":1}}],["values",{"2":{"376":1}}],["value>0",{"2":{"365":1}}],["value>=0",{"2":{"333":2}}],["value=reply",{"2":{"437":1}}],["value=result",{"2":{"365":1}}],["value=data",{"2":{"432":1}}],["value=note",{"2":{"432":1}}],["value=",{"2":{"432":2,"437":3}}],["value=true",{"2":{"365":1}}],["value=value",{"2":{"328":1}}],["value=window",{"2":{"250":1}}],["value++",{"2":{"324":1,"333":1}}],["valueof",{"2":{"231":1}}],["value",{"2":{"91":2,"103":5,"114":2,"123":3,"152":2,"193":5,"231":9,"244":1,"245":2,"247":1,"296":4,"302":8,"303":6,"315":6,"328":1,"333":2,"338":8,"356":2,"360":2,"361":1,"365":3,"376":2,"381":1,"432":5,"437":2,"450":1,"457":1,"460":1,"462":2,"463":1,"511":1,"538":1}}],["vars",{"2":{"557":1}}],["var",{"2":{"451":4}}],["varb",{"2":{"246":1}}],["vara",{"2":{"246":1}}],["variable",{"2":{"152":1,"246":1}}],["variablename",{"2":{"152":1}}],["vps",{"2":{"137":4,"140":2,"143":1,"146":1}}],["v3",{"2":{"125":1,"129":1,"451":4}}],["v",{"0":{"124":1,"154":1,"155":1,"156":3,"157":1,"158":1,"159":1,"245":1},"2":{"119":1,"124":5,"153":1,"154":1,"155":2,"156":4,"157":1,"158":1,"159":2,"160":3,"184":1,"193":2,"231":11,"246":9,"249":8,"251":3,"255":1,"315":2,"352":1,"355":1,"432":3,"437":3,"453":3}}],["v0",{"2":{"87":1,"95":1,"100":1,"106":1}}],["vscode",{"2":{"224":1,"391":2,"451":1,"457":9}}],["vs",{"2":{"86":1,"89":1,"445":1,"457":7,"462":1,"539":1}}],["v16",{"2":{"402":1}}],["v1",{"0":{"475":1,"478":1,"480":1,"483":1,"486":1},"1":{"476":1,"477":1,"479":1,"481":1,"482":1,"484":1,"485":1,"487":1},"2":{"53":3,"56":3}}],["visible",{"2":{"457":1}}],["visuals",{"2":{"457":1}}],["visualizer",{"2":{"455":4}}],["visual",{"2":{"222":1,"224":1,"387":1,"394":1,"402":1}}],["vivaldi",{"2":{"222":1}}],["virtual",{"2":{"137":1,"460":1}}],["video",{"2":{"64":1,"87":1,"106":1}}],["vitepress",{"2":{"451":1,"470":1,"472":1,"507":1}}],["vitepwa",{"2":{"317":3}}],["vitest",{"0":{"375":1,"384":1},"1":{"376":1},"2":{"370":1,"373":1,"374":1,"375":12,"376":6,"378":1,"379":3,"380":1,"381":3,"382":6,"383":5,"384":4,"402":1,"457":10,"461":1}}],["vitejs",{"2":{"228":3,"317":1}}],["vite",{"0":{"228":1,"317":1,"528":1},"2":{"23":1,"112":1,"114":1,"117":1,"119":1,"126":1,"136":1,"150":1,"151":1,"152":1,"221":2,"222":1,"223":8,"224":6,"227":1,"228":10,"231":2,"234":1,"244":1,"306":1,"316":2,"317":9,"319":1,"375":5,"379":2,"382":1,"383":1,"384":1,"401":1,"402":1,"421":1,"423":1,"424":2,"428":1,"452":1,"453":1,"455":13,"457":3,"473":3,"497":1,"504":1,"512":1,"515":2,"528":1}}],["view>",{"2":{"352":2}}],["viewport",{"2":{"255":1}}],["viewitem",{"2":{"160":3}}],["view",{"2":{"11":1,"96":4,"352":1,"353":2,"355":1,"447":4,"462":1,"463":2}}],["views",{"0":{"96":1,"355":1},"2":{"3":1,"96":1,"346":1,"349":2,"353":3,"445":1}}],["vuefaq",{"2":{"498":1}}],["vuetify",{"2":{"471":1}}],["vuejs",{"2":{"125":3,"129":1,"159":1,"160":2,"227":1,"249":1,"251":1,"335":1,"358":1,"463":1,"497":4}}],["vuex",{"2":{"119":1,"127":1,"335":4,"463":6,"482":1}}],["vuesence",{"2":{"80":2,"111":1,"112":2,"503":1}}],["vuestorefront",{"2":{"62":1}}],["vueuse",{"2":{"23":1,"104":1,"250":1}}],["vue",{"0":{"112":1,"119":1,"147":1,"149":1,"153":1,"191":1,"193":1,"230":1,"231":1,"298":1,"299":1,"324":1,"325":1,"328":1,"335":1,"339":1,"345":1,"352":1,"355":1,"379":1,"398":1,"399":1,"407":1,"418":2,"432":1,"437":1,"448":1,"463":1,"472":1,"489":1,"501":1,"505":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"148":1,"149":1,"150":2,"151":1,"152":1,"153":1,"154":2,"155":2,"156":2,"157":2,"158":2,"159":2,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"380":1,"381":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"502":1,"506":1,"507":1},"2":{"3":2,"10":2,"11":1,"23":2,"41":1,"55":1,"76":2,"102":1,"103":3,"112":2,"119":6,"120":11,"121":13,"122":2,"123":2,"124":4,"125":9,"126":3,"127":1,"128":4,"130":7,"133":1,"135":2,"136":2,"137":5,"139":1,"142":1,"145":3,"146":1,"147":4,"148":9,"149":11,"150":7,"151":8,"152":16,"153":3,"155":1,"157":1,"158":1,"159":3,"160":6,"161":1,"167":1,"168":2,"170":2,"176":1,"190":1,"191":1,"193":6,"197":1,"205":3,"220":1,"221":2,"222":3,"223":4,"224":9,"225":2,"227":3,"228":5,"229":1,"230":5,"231":4,"234":3,"235":2,"237":1,"238":2,"239":6,"240":2,"241":1,"242":1,"243":7,"244":11,"246":6,"247":6,"249":9,"250":4,"251":5,"252":2,"255":16,"256":4,"260":1,"264":1,"265":1,"266":1,"267":4,"271":2,"272":1,"289":2,"294":1,"295":3,"296":1,"297":1,"298":1,"299":3,"300":1,"304":1,"307":1,"308":1,"315":3,"317":3,"321":1,"322":1,"323":2,"324":3,"325":1,"328":3,"329":2,"330":6,"331":2,"333":2,"334":2,"335":5,"338":3,"339":1,"340":1,"342":4,"343":1,"344":1,"345":4,"346":2,"347":1,"349":4,"350":2,"351":1,"352":12,"353":3,"354":1,"355":7,"360":2,"361":2,"363":1,"364":1,"367":1,"368":1,"370":2,"371":1,"372":2,"373":3,"374":7,"375":2,"378":2,"379":6,"380":4,"381":2,"397":1,"400":3,"401":3,"402":4,"404":1,"407":1,"408":1,"411":1,"413":1,"415":2,"416":1,"418":1,"420":1,"421":1,"423":1,"425":1,"427":2,"430":1,"432":4,"437":2,"438":1,"441":1,"445":2,"446":1,"447":2,"448":1,"449":1,"451":1,"452":1,"453":2,"455":4,"457":15,"459":1,"460":7,"461":1,"462":16,"463":12,"471":3,"472":22,"473":1,"476":2,"477":1,"479":1,"489":1,"495":1,"497":2,"498":1,"499":2,"501":7,"502":1,"503":2,"504":3,"506":3,"507":4,"508":2,"509":2,"513":2,"527":2,"528":1,"538":1,"539":2,"547":1,"556":1}}],["эстетики",{"2":{"496":1}}],["эскиза",{"2":{"258":1}}],["эван",{"2":{"462":1}}],["эволюция",{"2":{"471":1}}],["эволюцией",{"2":{"367":1}}],["эволюции",{"2":{"306":1}}],["эра",{"2":{"344":1}}],["эмитент",{"2":{"361":1}}],["эмиттера",{"2":{"327":1}}],["эмиты",{"2":{"124":1}}],["эмпирическое",{"2":{"278":1}}],["эмулятор",{"2":{"222":1}}],["эфемерны",{"2":{"188":1,"257":1}}],["эффектом",{"2":{"349":1}}],["эффектов",{"2":{"98":1,"250":1,"268":1}}],["эффектам",{"2":{"323":1}}],["эффективен",{"2":{"172":1,"328":1,"381":1}}],["эффективней",{"2":{"460":1,"462":2,"473":1}}],["эффективна",{"2":{"428":1}}],["эффективная",{"2":{"344":1,"386":1}}],["эффективные",{"2":{"279":1,"325":1}}],["эффективным",{"2":{"269":1}}],["эффективный",{"2":{"193":1,"421":1}}],["эффективны",{"2":{"171":1,"353":1}}],["эффективной",{"2":{"421":1}}],["эффективности",{"2":{"319":1,"419":1,"460":1}}],["эффективное",{"2":{"258":1,"335":1,"344":1,"504":1}}],["эффективного",{"2":{"157":1,"504":1}}],["эффективно",{"2":{"47":1,"137":1,"260":1,"306":1,"464":1,"507":1,"508":1}}],["эффекты",{"2":{"26":1,"169":1,"189":1}}],["элегантен",{"2":{"376":1}}],["элегантно",{"2":{"270":1}}],["электронных",{"2":{"365":1}}],["электронные",{"2":{"344":1}}],["электронная",{"2":{"365":1}}],["электронной",{"2":{"134":1,"187":1,"365":2,"366":1,"367":1}}],["элементе",{"2":{"185":2,"186":1,"227":1,"231":3}}],["элементом",{"2":{"158":1,"192":1,"193":1,"198":1,"204":1,"255":1,"339":1}}],["элементов",{"0":{"238":1,"240":1},"2":{"69":2,"115":1,"137":1,"147":1,"156":2,"157":2,"160":5,"173":1,"174":1,"175":1,"180":2,"182":1,"185":2,"190":1,"191":1,"192":2,"193":2,"200":1,"231":3,"232":1,"237":1,"238":1,"239":1,"246":1,"256":4,"263":1,"268":1,"292":1,"311":1,"318":1,"325":1,"344":1,"428":1,"432":1,"460":4,"461":1,"506":1}}],["элементу",{"2":{"158":1,"193":1,"221":1,"243":1,"249":1}}],["элементарное",{"2":{"472":1}}],["элементарно",{"2":{"452":1}}],["элементах",{"2":{"251":1}}],["элементам",{"2":{"175":1}}],["элементами",{"0":{"173":1},"2":{"69":1,"123":1,"156":1,"159":1,"189":1,"192":1,"229":1,"231":1,"274":1,"321":1,"432":1}}],["элемента",{"2":{"128":2,"151":1,"153":2,"157":2,"185":1,"186":1,"192":2,"193":1,"198":2,"230":1,"231":5,"239":3,"240":2,"256":4,"258":1,"263":1,"315":1,"336":1,"381":2,"462":1,"473":1}}],["элементы",{"0":{"183":1},"1":{"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1},"2":{"29":1,"69":1,"133":1,"147":1,"151":1,"160":1,"171":1,"173":1,"175":1,"176":1,"182":1,"183":2,"192":5,"193":1,"209":1,"231":1,"232":1,"237":1,"239":1,"240":1,"246":1,"249":1,"257":1,"263":1,"308":1,"311":1,"315":1,"331":1,"373":1,"381":2,"417":1,"421":1,"433":1,"442":1,"462":1,"469":1,"473":1}}],["элемент",{"2":{"9":1,"149":3,"155":2,"156":4,"160":1,"183":1,"186":1,"190":4,"192":1,"193":1,"201":1,"229":1,"230":1,"231":7,"240":1,"249":1,"254":1,"298":1,"315":2,"331":1,"338":1,"339":1,"351":1,"354":1,"370":1,"381":1,"496":1}}],["эндрю",{"2":{"268":1}}],["эндпойнтов",{"2":{"116":1}}],["эндпойнтам",{"2":{"116":1}}],["эндпойнта",{"2":{"56":1}}],["эндпойнты",{"2":{"50":1}}],["эндпойнту",{"2":{"41":1,"116":2}}],["энергосбережения",{"2":{"115":1}}],["экстремального",{"2":{"472":1}}],["экстраполированного",{"2":{"299":1}}],["экспериментов",{"2":{"473":1}}],["экспериментировал",{"2":{"462":1}}],["экспериментируя",{"2":{"340":1}}],["экспериментируем",{"0":{"337":1},"1":{"338":1,"339":1}}],["экспериментального",{"2":{"337":1}}],["экспериментальной",{"2":{"160":1}}],["эксперименты",{"2":{"321":1}}],["экспозиции",{"2":{"308":1}}],["экспортом",{"2":{"330":1}}],["экспортируем",{"2":{"281":1,"428":1}}],["экспортируете",{"2":{"463":1}}],["экспортирует",{"2":{"151":1,"228":1,"250":1,"282":1}}],["экспортирующий",{"2":{"252":1,"280":1}}],["экспортировать",{"2":{"250":1,"338":1}}],["экспорта",{"2":{"228":1}}],["экспорт",{"2":{"152":1,"383":1}}],["эксплуатационным",{"2":{"69":1}}],["эквивалент",{"2":{"221":1,"230":1,"356":1}}],["эквивалентны",{"2":{"376":1}}],["эквивалентный",{"2":{"134":1}}],["эквивалентно",{"2":{"377":1}}],["эквивалентное",{"2":{"355":1}}],["эквивалентности",{"2":{"303":1}}],["эквивалентная",{"2":{"381":1}}],["эквивалентна",{"2":{"155":1}}],["экземпляром",{"2":{"287":1}}],["экземпляров",{"2":{"245":1,"463":1}}],["экземпляре",{"2":{"255":1}}],["экземпляры",{"0":{"166":1},"2":{"160":1,"166":1,"352":1}}],["экземпляр",{"2":{"149":1,"255":1,"277":1,"281":2,"428":1}}],["экземпляру",{"2":{"121":1,"152":1,"193":1,"252":1}}],["экосистемой",{"2":{"508":1}}],["экосистеме",{"2":{"317":1,"457":1,"460":1}}],["экосистему",{"2":{"119":1}}],["экосистемы",{"2":{"76":1,"221":1,"345":1}}],["экономии",{"2":{"227":1}}],["экономичным",{"2":{"116":1}}],["экономит",{"2":{"93":1}}],["экранов",{"2":{"203":2}}],["экран",{"2":{"172":1,"204":1,"205":1,"256":1,"265":1,"473":1,"542":1,"554":1}}],["экранах",{"2":{"519":1}}],["экрана",{"2":{"9":1,"23":1,"108":1,"172":1,"173":1,"174":1,"178":4,"188":1,"195":4,"203":3,"205":1,"223":1,"230":1,"329":1,"355":1,"391":1,"516":1,"518":1,"556":1}}],["экране",{"2":{"3":1,"160":1,"180":1,"315":1,"421":5,"436":1,"437":1}}],["эту",{"2":{"118":1,"134":1,"135":1,"143":1,"152":1,"169":1,"176":1,"190":1,"193":1,"195":1,"201":1,"205":1,"208":1,"224":1,"225":1,"227":1,"230":1,"238":1,"240":1,"247":1,"249":2,"250":2,"256":2,"268":2,"291":1,"297":1,"302":1,"324":1,"326":1,"330":1,"344":1,"346":1,"361":1,"367":1,"372":3,"383":2,"393":1,"421":1,"427":1,"437":1,"438":1,"452":1,"461":1,"463":1,"472":1}}],["эталонный",{"2":{"419":1}}],["эта",{"0":{"401":1,"406":1},"1":{"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"86":1,"122":1,"132":1,"137":1,"148":1,"152":1,"155":1,"158":1,"159":1,"170":1,"175":1,"193":1,"203":1,"211":1,"215":1,"219":1,"221":1,"222":1,"223":2,"224":2,"225":1,"227":1,"238":1,"244":1,"247":1,"251":1,"255":1,"256":2,"260":1,"265":1,"266":1,"267":1,"294":1,"295":1,"296":1,"301":1,"304":1,"310":1,"328":1,"330":1,"344":1,"345":1,"366":1,"371":1,"375":2,"376":1,"395":1,"400":1,"401":1,"402":1,"410":1,"413":1,"414":1,"417":1,"420":1,"422":1,"428":1,"430":1,"433":1,"457":1}}],["этап",{"0":{"238":1},"2":{"238":1}}],["этапов",{"2":{"64":1}}],["этапах",{"2":{"372":1}}],["этапами",{"2":{"237":1}}],["этапам",{"2":{"14":1,"79":1}}],["этапа",{"2":{"11":1,"17":1,"79":1}}],["этапы",{"0":{"79":1},"2":{"10":1,"145":1,"372":1,"390":2}}],["этапе",{"2":{"6":1,"7":1,"11":2,"12":1,"17":1,"22":1,"39":1,"56":1,"72":1,"190":1,"193":1,"239":1,"241":1,"251":1,"260":1,"352":1,"365":1,"375":1,"464":1}}],["этическая",{"2":{"218":1}}],["этичный",{"2":{"206":1}}],["этим",{"2":{"119":1,"141":1,"144":1,"148":1,"151":1,"171":1,"173":1,"182":1,"189":1,"227":1,"228":1,"238":1,"240":1,"246":1,"247":1,"255":2,"256":2,"268":1,"298":1,"342":1,"344":1,"347":1,"360":1,"372":1,"385":1,"421":1,"424":1,"436":1,"507":1}}],["этими",{"2":{"69":1,"171":1,"255":1,"295":1,"379":1,"394":1}}],["этих",{"2":{"69":2,"117":1,"119":1,"122":1,"147":1,"148":4,"158":1,"173":1,"178":1,"180":1,"194":1,"200":1,"206":1,"207":1,"225":1,"228":1,"231":1,"260":2,"261":1,"263":1,"270":1,"291":1,"292":1,"300":1,"302":1,"306":1,"308":2,"316":1,"336":4,"346":1,"352":1,"359":1,"361":3,"367":3,"370":1,"375":1,"379":1,"381":2,"382":1,"388":1,"390":1,"391":1,"394":1,"421":1,"439":1,"461":1,"472":1,"473":2}}],["эти",{"2":{"3":1,"69":1,"126":1,"134":3,"135":2,"141":1,"150":2,"151":1,"152":2,"156":1,"157":1,"166":1,"167":1,"168":1,"171":1,"172":1,"175":1,"176":1,"178":2,"180":2,"183":2,"184":1,"185":1,"188":2,"189":2,"194":1,"195":1,"211":1,"222":1,"225":2,"227":3,"237":2,"239":2,"241":2,"244":1,"251":1,"291":1,"299":1,"302":1,"304":2,"308":1,"323":1,"326":1,"330":1,"336":2,"340":1,"341":1,"344":1,"347":1,"351":1,"355":2,"358":1,"359":1,"360":1,"361":2,"367":2,"368":1,"370":2,"373":1,"375":1,"376":1,"378":1,"382":1,"391":1,"394":1,"395":1,"396":1,"421":2,"424":1,"426":2,"428":1,"430":1,"431":1,"433":1,"434":1,"439":1,"463":2}}],["этой",{"0":{"402":1},"2":{"22":1,"48":1,"115":1,"124":1,"131":2,"133":1,"142":1,"144":1,"145":2,"147":4,"148":1,"152":3,"159":2,"160":1,"161":2,"167":1,"168":1,"169":2,"173":1,"181":1,"184":1,"193":1,"195":1,"205":2,"207":1,"218":2,"219":1,"220":1,"222":4,"223":1,"224":2,"227":2,"233":1,"235":4,"236":2,"239":2,"240":1,"244":1,"246":1,"247":3,"249":3,"250":2,"255":1,"256":3,"258":1,"259":1,"260":1,"263":3,"265":1,"266":1,"271":1,"272":1,"288":1,"290":1,"292":3,"296":3,"297":2,"302":1,"304":1,"306":2,"307":1,"319":2,"320":1,"321":3,"322":3,"333":1,"336":1,"337":1,"339":1,"340":1,"341":1,"342":2,"343":1,"344":1,"346":1,"352":1,"355":1,"358":1,"361":1,"367":2,"368":1,"369":1,"370":4,"371":1,"372":2,"374":1,"375":2,"380":1,"384":1,"385":2,"386":1,"390":1,"391":1,"393":1,"394":1,"396":1,"402":3,"404":1,"405":3,"407":1,"408":1,"409":1,"412":1,"415":1,"416":1,"419":4,"421":1,"422":1,"425":1,"435":1,"440":1,"451":1,"456":1,"460":1,"463":1,"471":1,"504":1}}],["этого",{"2":{"12":1,"27":1,"41":1,"59":1,"62":1,"95":1,"102":1,"121":1,"124":1,"134":3,"140":1,"150":1,"151":3,"152":1,"153":1,"156":1,"178":2,"179":2,"186":2,"187":1,"190":1,"192":3,"195":2,"203":2,"204":2,"205":1,"222":1,"229":1,"230":1,"231":3,"239":1,"240":1,"241":1,"243":2,"249":3,"250":1,"251":2,"255":1,"256":2,"263":1,"265":2,"267":2,"268":1,"270":1,"279":2,"280":1,"288":1,"291":1,"292":1,"293":1,"294":1,"295":1,"297":2,"298":1,"300":1,"301":1,"308":1,"315":2,"316":1,"318":1,"323":1,"324":1,"325":2,"329":1,"330":2,"333":1,"335":1,"336":3,"337":1,"347":1,"349":1,"352":2,"355":1,"359":2,"361":2,"364":2,"365":1,"366":2,"367":1,"373":1,"374":1,"375":1,"376":1,"380":1,"381":1,"382":1,"383":1,"385":1,"389":1,"390":1,"391":1,"395":1,"421":1,"424":1,"426":2,"430":1,"435":1,"438":1,"439":1,"444":1,"455":1,"460":1,"462":1,"463":1,"464":1,"472":2,"473":1}}],["этом",{"2":{"12":1,"39":1,"41":1,"62":1,"69":1,"134":2,"136":1,"137":1,"143":1,"148":2,"149":2,"150":1,"152":2,"158":1,"160":1,"178":1,"179":1,"185":1,"187":1,"189":1,"190":1,"191":1,"192":1,"193":1,"196":1,"217":1,"218":1,"224":1,"227":2,"229":1,"231":1,"239":1,"242":1,"246":1,"251":1,"252":1,"255":1,"266":1,"267":1,"270":1,"285":2,"291":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":2,"301":1,"303":2,"306":1,"307":1,"310":1,"315":1,"317":1,"322":1,"323":1,"324":1,"328":1,"331":1,"332":2,"333":1,"338":1,"339":1,"352":3,"353":1,"355":1,"359":1,"360":2,"361":1,"364":1,"372":2,"374":1,"375":1,"378":1,"382":1,"388":1,"390":1,"393":2,"418":1,"428":1,"434":1,"437":1,"439":1,"444":1,"447":1,"452":1,"455":1,"461":2,"462":3,"463":2,"472":2,"507":1}}],["этому",{"2":{"2":1,"16":1,"180":1,"204":1,"221":1,"237":1,"244":2,"266":1,"267":1,"276":1,"282":1,"318":1,"331":1,"347":1,"349":1,"358":1,"376":1,"433":2,"439":1,"472":1}}],["этот",{"2":{"9":1,"13":1,"86":1,"103":1,"112":2,"115":1,"119":1,"123":1,"134":3,"137":2,"144":1,"148":2,"149":3,"150":1,"152":3,"155":1,"173":1,"174":1,"175":1,"176":1,"178":1,"179":1,"180":1,"185":1,"186":2,"187":2,"188":1,"189":1,"190":1,"193":2,"198":2,"199":1,"200":3,"203":3,"204":2,"208":2,"209":2,"210":1,"213":1,"216":1,"222":1,"223":2,"224":4,"228":1,"229":1,"230":1,"231":1,"238":2,"239":2,"240":2,"241":1,"243":1,"244":2,"247":1,"249":1,"250":1,"251":1,"255":1,"256":1,"263":2,"264":2,"265":2,"266":2,"267":1,"268":1,"269":2,"270":2,"276":1,"277":1,"278":1,"280":2,"281":3,"282":1,"283":1,"286":1,"287":1,"289":2,"290":1,"291":1,"293":2,"294":1,"295":2,"297":1,"300":3,"303":3,"306":1,"310":1,"317":1,"325":1,"326":1,"328":3,"329":1,"330":4,"332":2,"333":1,"334":2,"336":1,"338":2,"339":2,"349":1,"351":1,"352":1,"354":1,"355":3,"358":1,"360":1,"361":4,"365":1,"366":4,"372":1,"374":1,"375":1,"380":1,"381":2,"382":1,"383":3,"390":1,"391":1,"395":1,"423":1,"424":1,"425":3,"426":1,"428":1,"429":2,"430":1,"435":2,"437":2,"445":1,"451":1,"457":1,"464":1,"472":2,"528":1}}],["это",{"0":{"227":1,"269":1},"2":{"2":1,"3":1,"11":1,"12":2,"13":1,"23":1,"26":1,"29":1,"33":1,"34":1,"39":1,"40":1,"47":1,"48":1,"55":1,"56":1,"59":2,"68":1,"82":1,"86":2,"89":1,"97":1,"102":1,"103":1,"104":1,"105":1,"115":3,"116":3,"117":3,"122":1,"124":2,"125":1,"127":1,"130":2,"131":1,"134":6,"135":2,"136":1,"137":1,"138":1,"141":1,"143":1,"145":2,"147":1,"148":9,"149":4,"150":1,"151":7,"152":16,"156":1,"157":1,"158":1,"159":1,"160":4,"166":2,"169":1,"171":1,"172":1,"173":2,"174":2,"176":3,"181":3,"184":1,"185":1,"189":1,"190":4,"192":3,"193":1,"194":1,"195":1,"196":1,"197":1,"199":1,"200":4,"201":1,"205":1,"207":2,"209":1,"213":1,"217":1,"219":1,"222":4,"223":6,"224":9,"225":5,"227":2,"228":4,"230":2,"231":7,"232":2,"234":2,"235":1,"238":2,"239":1,"241":1,"242":1,"243":1,"244":2,"245":2,"246":2,"249":2,"250":3,"252":1,"253":1,"254":1,"255":4,"256":7,"257":1,"258":1,"260":4,"261":2,"263":1,"264":2,"265":3,"266":2,"267":2,"268":3,"271":3,"277":1,"280":1,"281":1,"282":1,"284":3,"285":1,"286":3,"287":5,"288":1,"289":4,"291":2,"292":2,"293":1,"294":1,"295":5,"296":6,"297":6,"298":1,"300":2,"301":6,"302":4,"303":7,"304":2,"306":1,"308":4,"309":3,"310":2,"312":1,"313":1,"315":5,"316":2,"317":1,"318":1,"323":6,"325":2,"326":2,"327":1,"328":5,"329":2,"330":5,"331":3,"332":5,"333":2,"335":3,"336":8,"338":4,"339":2,"344":4,"345":2,"349":5,"352":4,"353":2,"355":3,"356":1,"358":1,"360":2,"361":4,"363":2,"364":1,"365":2,"366":1,"367":3,"368":1,"372":4,"373":1,"374":1,"375":2,"376":4,"377":2,"378":2,"381":1,"383":1,"384":1,"385":2,"386":3,"390":4,"391":5,"393":6,"394":6,"395":2,"397":1,"400":2,"411":1,"421":15,"422":3,"423":2,"424":1,"425":1,"429":2,"431":3,"432":2,"433":2,"434":1,"435":2,"437":1,"439":5,"440":1,"441":1,"442":1,"444":1,"445":1,"447":1,"452":2,"455":1,"460":1,"461":1,"462":10,"463":8,"464":5,"465":2,"466":1,"467":1,"468":1,"470":1,"471":1,"472":4,"473":4,"507":1,"555":1}}],["ухудшает",{"2":{"471":1}}],["уязвимость",{"2":{"465":1}}],["уязвимости",{"2":{"463":1}}],["ушли",{"2":{"386":1}}],["ушло",{"2":{"180":1}}],["укрепить",{"2":{"556":1}}],["украдут",{"2":{"366":1}}],["укоряет",{"2":{"471":1}}],["укоренилась",{"2":{"344":1}}],["укажет",{"2":{"381":1}}],["укажу",{"2":{"222":1}}],["указателя",{"2":{"178":1}}],["указателями",{"2":{"152":1}}],["указателей",{"2":{"152":1}}],["указать",{"2":{"135":2,"336":1,"376":1,"382":1,"394":1,"462":1}}],["указано",{"2":{"249":2,"318":1}}],["указанные",{"2":{"391":1}}],["указанных",{"2":{"245":1}}],["указанный",{"2":{"245":1,"363":1,"439":1}}],["указанными",{"2":{"315":1,"358":1,"362":1}}],["указанным",{"2":{"226":1}}],["указанную",{"2":{"117":1,"362":1}}],["указаны",{"2":{"223":1}}],["указаниям",{"2":{"255":1}}],["указания",{"2":{"231":1,"378":1,"543":1}}],["указанием",{"2":{"365":1,"372":1,"376":1,"501":1}}],["указание",{"2":{"143":1}}],["указании",{"2":{"136":1}}],["указана",{"2":{"117":1}}],["указывали",{"2":{"205":1}}],["указывают",{"2":{"310":1}}],["указываются",{"2":{"144":1}}],["указывающие",{"2":{"393":1}}],["указывающих",{"2":{"376":1}}],["указывающий",{"2":{"190":1}}],["указывающей",{"2":{"193":1}}],["указывающее",{"2":{"187":1,"231":1}}],["указывающая",{"2":{"134":1,"187":1}}],["указываем",{"2":{"140":1,"141":1,"228":1}}],["указывает",{"2":{"134":1,"136":1,"143":1,"149":1,"152":2,"174":1,"186":1,"190":1,"198":3,"346":1,"349":3,"352":1,"390":1,"391":1}}],["указывать",{"2":{"134":2,"349":1}}],["узлов",{"2":{"367":1}}],["узлами",{"2":{"367":1}}],["узких",{"2":{"203":1}}],["узнаваемость",{"2":{"171":1,"181":1,"556":1}}],["узнает",{"2":{"193":1,"314":1}}],["узнаете",{"2":{"152":1,"401":1,"409":1}}],["узнаем",{"2":{"169":1,"235":1,"244":1,"282":1,"306":1,"342":1,"419":1}}],["узнали",{"2":{"145":1,"174":1,"220":1,"233":1,"258":2,"337":1,"341":1,"396":1}}],["узнать",{"2":{"135":1,"149":1,"347":1,"367":1,"424":2}}],["угрозой",{"2":{"336":1}}],["уголкам",{"2":{"207":1}}],["угодно",{"2":{"134":1}}],["угла",{"2":{"178":1}}],["углов",{"2":{"178":1}}],["углубление",{"2":{"383":1}}],["углубляться",{"2":{"263":1}}],["углубляясь",{"2":{"196":1}}],["углубиться",{"2":{"224":1}}],["углу",{"2":{"172":2,"174":1,"178":2,"204":1,"318":2}}],["унаследован",{"2":{"152":1}}],["универсальный",{"2":{"452":2}}],["универсальней",{"2":{"85":1}}],["уникален",{"2":{"367":1,"463":1}}],["уникального",{"2":{"367":1,"376":1,"428":1,"450":1}}],["уникальному",{"2":{"367":1}}],["уникальная",{"2":{"361":1}}],["уникальным",{"2":{"332":1,"336":1,"428":1}}],["уникальный",{"2":{"134":1,"157":1,"231":1,"349":1,"352":1,"361":1}}],["унификации",{"2":{"118":1}}],["утвердить",{"2":{"381":1}}],["утверждаем",{"2":{"376":1}}],["утверждает",{"2":{"211":1,"282":1}}],["утверждениях",{"2":{"381":1}}],["утверждения",{"0":{"377":1,"378":1},"2":{"376":3,"377":1}}],["утверждений",{"2":{"376":4,"380":1}}],["утверждение",{"2":{"282":1,"376":1,"377":2,"378":1,"381":2}}],["утерянных",{"2":{"367":1}}],["утеряны",{"2":{"361":1}}],["утечек",{"2":{"267":1}}],["утечку",{"2":{"151":1}}],["уточняет",{"2":{"310":1}}],["утилит",{"0":{"466":1}}],["утилитами",{"2":{"466":1}}],["утилита",{"2":{"318":3}}],["утилитарных",{"2":{"225":1}}],["утилиту",{"2":{"104":1}}],["утилиты",{"2":{"95":1,"374":1,"429":1,"445":2,"463":1,"513":1}}],["уж",{"2":{"149":1,"166":1,"201":1,"255":1,"268":1,"434":1}}],["уже",{"2":{"3":1,"16":1,"27":1,"36":1,"38":1,"39":1,"47":1,"86":3,"112":1,"116":1,"118":1,"134":1,"143":2,"151":1,"152":2,"166":1,"172":1,"175":1,"190":1,"193":1,"197":1,"205":1,"223":1,"224":1,"225":1,"227":1,"230":1,"231":1,"237":1,"240":1,"247":1,"256":2,"287":1,"288":1,"292":1,"297":2,"300":2,"308":1,"309":1,"317":2,"321":2,"329":1,"330":1,"352":1,"353":1,"358":1,"367":2,"372":1,"375":1,"383":1,"391":1,"394":1,"400":1,"419":1,"451":1,"460":1,"461":1,"462":1,"464":1,"472":1,"473":3,"501":1,"536":1}}],["уважает",{"2":{"375":1}}],["уверенным",{"2":{"472":1}}],["уверенный",{"2":{"374":1}}],["уверенную",{"2":{"180":1}}],["уверены",{"2":{"303":1,"439":1}}],["увеличили",{"2":{"421":1}}],["увеличивая",{"2":{"321":1}}],["увеличивает",{"2":{"244":1,"452":1,"465":1}}],["увеличивается",{"2":{"223":1,"433":1,"452":1}}],["увеличиваем",{"2":{"193":1}}],["увеличивать",{"2":{"193":1}}],["увеличения",{"2":{"147":1}}],["увеличение",{"0":{"309":1},"1":{"310":1,"311":1,"312":1,"313":1,"314":1,"315":1},"2":{"125":1,"344":3}}],["уведомить",{"2":{"190":1,"315":1,"325":1}}],["уведомлять",{"2":{"244":1}}],["уведомляется",{"2":{"291":1}}],["уведомляет",{"2":{"240":1}}],["уведомляющие",{"0":{"187":1}}],["уведомлений",{"0":{"240":1}}],["уведомление",{"2":{"188":3,"315":1}}],["уведомления",{"0":{"188":1},"2":{"188":2,"308":3}}],["уведомлении",{"2":{"187":1}}],["увесистыми",{"2":{"169":1}}],["увидели",{"2":{"440":1,"473":1}}],["увидеть",{"2":{"134":2,"170":1,"189":1,"197":1,"205":1,"222":1,"223":1,"224":1,"231":2,"236":1,"271":1,"296":1,"307":1,"322":1,"324":1,"330":1,"333":1,"339":1,"341":1,"343":1,"352":1,"371":1,"420":2,"427":1,"429":1,"430":1}}],["увидит",{"2":{"421":1}}],["увидите",{"2":{"148":1,"223":3,"263":1,"266":1,"321":1,"339":1,"355":1}}],["увидим",{"2":{"150":1,"152":1,"159":2,"226":1,"231":1,"239":1,"251":1,"264":1,"290":1,"294":1,"316":1,"328":1,"332":1,"344":1,"347":1,"349":1,"360":1,"366":1,"391":1,"420":1,"432":1}}],["упаковывает",{"2":{"439":1}}],["упакованных",{"2":{"364":1}}],["упакованные",{"2":{"292":1}}],["упакован",{"2":{"150":1}}],["упакует",{"2":{"150":1}}],["упала",{"2":{"125":1}}],["упорядоченной",{"2":{"375":1}}],["упорядочиваете",{"2":{"267":1}}],["упоминалось",{"2":{"231":1,"247":1,"329":1}}],["упоминали",{"2":{"143":1,"224":1,"297":1,"300":1,"317":1,"435":1}}],["упомянутую",{"2":{"427":1}}],["упомянуть",{"2":{"180":1,"256":1,"270":1}}],["упомянутый",{"2":{"151":1}}],["упомянутых",{"2":{"129":1,"188":1,"395":1,"402":1}}],["упомянутого",{"2":{"144":1,"286":1}}],["уполномоченной",{"2":{"134":1}}],["упражнением",{"2":{"365":1}}],["упражнение",{"2":{"287":1}}],["упражнения",{"2":{"229":2,"232":1,"353":1,"374":1,"434":1}}],["управлению",{"2":{"148":1,"249":1,"269":1,"321":1,"328":1,"352":1}}],["управлении",{"2":{"119":1,"137":1}}],["управлением",{"2":{"222":1}}],["управление",{"0":{"321":1,"386":1,"392":1,"413":1},"1":{"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1},"2":{"79":1,"119":1,"127":2,"148":1,"152":1,"171":1,"239":3,"246":1,"249":1,"251":1,"258":1,"265":1,"282":1,"289":1,"306":1,"315":1,"316":1,"331":2,"341":1,"352":1,"370":1,"385":1,"394":1}}],["управления",{"2":{"53":1,"127":1,"136":1,"137":3,"194":1,"224":1,"230":1,"244":1,"246":1,"252":1,"256":1,"284":1,"292":1,"311":2,"315":1,"322":1,"329":1,"330":1,"331":1,"335":2,"340":1,"392":2,"397":1,"401":1,"413":2,"430":1,"463":3}}],["управляло",{"2":{"257":1}}],["управляемое",{"2":{"473":1}}],["управляемым",{"2":{"555":1}}],["управляемые",{"2":{"263":2}}],["управляемый",{"2":{"137":1}}],["управляет",{"2":{"137":1,"224":1,"240":1,"250":1,"255":1,"256":1,"265":1,"315":1,"386":1}}],["управляется",{"2":{"2":1,"134":1,"519":1}}],["управляются",{"2":{"557":1}}],["управляют",{"2":{"134":1,"194":1}}],["управляющему",{"2":{"2":1}}],["управляться",{"2":{"390":1}}],["управлять",{"2":{"2":1,"149":1,"151":1,"179":1,"203":1,"232":1,"305":1,"308":1,"323":1,"345":2,"349":1,"396":1,"441":1,"462":2}}],["упростит",{"2":{"466":1}}],["упростить",{"2":{"134":1,"249":1,"278":1,"300":1,"367":1}}],["упрощенную",{"2":{"473":1}}],["упрощенно",{"2":{"462":1}}],["упрощенного",{"2":{"366":1}}],["упрощенное",{"2":{"150":1,"300":1,"361":1}}],["упрощенным",{"2":{"315":1}}],["упрощенный",{"2":{"300":1,"303":1,"326":1,"366":1}}],["упрощения",{"2":{"269":1,"271":1,"300":2,"315":1}}],["упрощение",{"0":{"2":1}}],["упрощать",{"2":{"300":1}}],["упрощающий",{"2":{"300":1}}],["упрощают",{"2":{"47":1}}],["упрощает",{"2":{"79":1,"118":1,"368":1,"451":1}}],["умирает",{"2":{"463":1}}],["умными",{"2":{"367":1}}],["умных",{"2":{"344":1}}],["умны",{"2":{"280":1}}],["умные",{"2":{"270":1}}],["умён",{"2":{"231":1}}],["ума",{"2":{"229":1}}],["ум",{"2":{"192":1}}],["умолчанию",{"0":{"543":1},"2":{"123":1,"124":3,"125":1,"136":1,"141":1,"144":1,"193":1,"223":1,"245":2,"246":1,"249":6,"255":1,"287":1,"311":1,"335":1,"352":1,"355":3,"364":1,"391":1,"435":1,"439":1,"538":1}}],["умеет",{"2":{"473":1}}],["умеешь",{"2":{"93":2}}],["умел",{"2":{"472":1}}],["умело",{"2":{"147":1}}],["уместен",{"2":{"328":1}}],["уместно",{"2":{"304":1}}],["умеют",{"2":{"300":1}}],["умеющий",{"2":{"55":1}}],["умение",{"2":{"472":1}}],["умении",{"2":{"471":1}}],["умения",{"2":{"260":1}}],["уменьшить",{"2":{"345":1,"349":1}}],["уменьшение",{"2":{"125":1,"130":1}}],["уме",{"2":{"22":1,"134":1,"168":1}}],["уровень",{"2":{"115":2,"144":2,"227":1,"353":1,"366":1,"464":1,"470":1,"497":1}}],["уровни",{"2":{"300":1}}],["уровней",{"2":{"196":1,"200":1}}],["уровне",{"2":{"136":1,"203":1,"246":1,"247":1,"252":1,"255":1,"295":1,"308":1,"423":1,"446":2,"460":1,"461":1,"472":2}}],["уровнем",{"2":{"114":1}}],["уровнями",{"2":{"353":1,"533":1}}],["уровнях",{"2":{"260":1,"295":1,"425":1}}],["уровня",{"0":{"309":1},"1":{"310":1,"311":1,"312":1,"313":1,"314":1,"315":1},"2":{"65":1,"115":1,"120":1,"125":1,"134":3,"146":1,"261":1,"346":1,"347":1,"368":1,"373":1,"374":1,"462":1,"472":1}}],["удивительная",{"2":{"440":1}}],["удивительных",{"2":{"300":1}}],["удивительные",{"2":{"135":1}}],["уделяя",{"2":{"402":1}}],["уделять",{"2":{"319":1}}],["уделите",{"2":{"376":1}}],["уделить",{"2":{"241":1,"308":1}}],["уделили",{"2":{"340":2,"368":1}}],["удерживать",{"2":{"180":1}}],["удержание",{"2":{"172":1}}],["удачные",{"2":{"303":1}}],["удастся",{"2":{"244":1,"393":1}}],["удается",{"2":{"141":1}}],["удалась",{"2":{"363":1}}],["удалить",{"2":{"209":1,"225":1,"227":1,"230":1,"393":1}}],["удалось",{"2":{"190":1,"376":1}}],["удаляет",{"2":{"336":2}}],["удаляем",{"2":{"250":1,"352":1,"428":1}}],["удаляют",{"2":{"156":1,"434":1}}],["удаляя",{"2":{"134":1,"155":1}}],["удалять",{"2":{"125":1,"392":1,"431":1}}],["удалением",{"2":{"180":1,"267":1}}],["удаление",{"2":{"180":1,"239":2,"358":1,"392":1,"460":1}}],["удалении",{"2":{"160":1,"216":1}}],["удаления",{"2":{"115":1,"125":1,"185":1,"232":1,"267":1,"431":2}}],["удаленном",{"2":{"395":1,"451":1}}],["удаленно",{"2":{"394":1}}],["удаленного",{"2":{"143":1,"386":1,"394":1}}],["удаленные",{"2":{"394":1}}],["удаленных",{"2":{"386":1}}],["удаленный",{"2":{"143":1,"144":1,"386":1,"393":1,"394":3,"434":1,"451":4}}],["удаленными",{"0":{"394":1},"2":{"431":1}}],["удаленным",{"2":{"137":1,"268":1,"394":5,"425":1,"434":1}}],["удалена",{"0":{"125":1},"2":{"125":1}}],["удовлетворения",{"2":{"370":1}}],["удовлетворение",{"2":{"172":1}}],["удовлетворить",{"2":{"237":1,"241":1}}],["удовлетворительный",{"2":{"219":1}}],["удовлетворяющее",{"2":{"69":1,"315":1}}],["удостоверяющим",{"2":{"210":1}}],["удостоверяется",{"2":{"115":2}}],["удостовериться",{"2":{"115":1}}],["удобен",{"2":{"118":1,"172":1,"299":1,"303":1,"383":1,"512":1}}],["удобство",{"2":{"177":1,"181":1,"394":1,"496":2}}],["удобством",{"2":{"17":1}}],["удобства",{"2":{"115":1,"134":1,"160":1,"198":1,"219":1,"222":1,"227":1,"231":2,"288":1,"375":1,"384":1,"431":1,"496":1}}],["удобную",{"0":{"456":1},"2":{"192":1,"457":1,"471":1}}],["удобнее",{"2":{"118":1,"316":1}}],["удобней",{"2":{"23":1,"463":1,"471":1}}],["удобна",{"2":{"76":1,"457":1}}],["удобная",{"2":{"53":1,"86":1,"227":1,"381":1,"445":1}}],["удобны",{"2":{"256":1,"444":1}}],["удобным",{"2":{"166":1,"284":1}}],["удобные",{"2":{"62":1,"434":1}}],["удобных",{"2":{"55":1,"159":1,"300":1,"351":1,"355":1}}],["удобный",{"2":{"17":1,"22":1,"367":1,"451":1,"457":1,"460":1,"470":1,"472":1}}],["удобное",{"2":{"424":1,"445":1}}],["удобного",{"2":{"359":1}}],["удобной",{"2":{"222":1,"359":1,"414":1}}],["удобно",{"2":{"44":1,"69":1,"89":1,"103":1,"114":2,"123":1,"138":1,"152":1,"157":1,"173":1,"223":1,"286":2,"289":1,"301":1,"434":1,"447":1,"457":1,"463":2,"471":1,"503":1,"507":1}}],["убить",{"2":{"472":1}}],["убирать",{"2":{"267":1}}],["убирается",{"2":{"102":1,"556":1}}],["убираем",{"2":{"86":2,"96":2}}],["убывающей",{"2":{"383":1}}],["убедимся",{"2":{"421":1}}],["убедились",{"2":{"367":1}}],["убедитесь",{"2":{"225":1,"300":1,"318":1,"391":1}}],["убедиться",{"2":{"168":1,"231":1,"278":1,"303":1,"349":1,"364":1,"377":1,"432":1}}],["убрать",{"2":{"86":1,"112":1}}],["улицам",{"2":{"472":1}}],["улице",{"2":{"26":1}}],["уложенные",{"2":{"203":1}}],["улучшайте",{"2":{"472":1}}],["улучшая",{"2":{"467":1}}],["улучшать",{"2":{"65":1}}],["улучшила",{"2":{"372":1}}],["улучшили",{"2":{"368":1}}],["улучшить",{"2":{"232":1,"233":1,"328":1,"349":1,"372":1,"440":1,"473":1,"555":1}}],["улучшит",{"2":{"156":1}}],["улучшена",{"2":{"335":2}}],["улучшению",{"2":{"376":1}}],["улучшение",{"2":{"257":1,"460":1}}],["улучшения",{"2":{"74":1,"148":1,"431":1,"542":1}}],["учит",{"2":{"472":2}}],["учителем",{"2":{"472":1}}],["учите",{"2":{"270":2}}],["учиться",{"2":{"464":1}}],["учить",{"2":{"270":1}}],["учитывают",{"2":{"473":1}}],["учитывая",{"2":{"237":1,"238":1,"241":1,"249":1,"256":1,"309":1,"332":1,"365":2}}],["учитывать",{"2":{"172":1,"224":1,"308":1,"316":1,"360":1,"455":1}}],["учреждения",{"2":{"205":1}}],["участию",{"2":{"499":1}}],["участие",{"0":{"499":1}}],["участника",{"2":{"361":2}}],["участниками",{"2":{"361":2}}],["участки",{"2":{"135":1,"231":1,"238":1,"267":1}}],["учатся",{"2":{"174":1}}],["ученика",{"2":{"472":1}}],["учебники",{"2":{"472":1}}],["учебник",{"2":{"472":3}}],["учебного",{"2":{"353":1,"374":1,"434":1}}],["учетной",{"2":{"367":1}}],["учетным",{"2":{"366":1}}],["учетными",{"2":{"361":1}}],["учетные",{"2":{"360":2,"361":1,"367":1}}],["учетных",{"2":{"360":3,"361":1,"365":1}}],["учетом",{"2":{"43":1,"119":1,"221":1,"240":1,"241":1,"373":1}}],["учесть",{"2":{"133":1,"422":1}}],["учтем",{"2":{"40":1}}],["усовершенствование",{"2":{"308":1}}],["усовершенствовать",{"2":{"257":1}}],["усваивать",{"2":{"270":1}}],["усвоить",{"2":{"181":1}}],["усмотрению",{"2":{"224":1,"393":1,"421":1}}],["ускоряет",{"2":{"471":1}}],["ускорение",{"2":{"308":1}}],["ускорению",{"2":{"152":1}}],["ускорить",{"2":{"179":1,"260":1,"464":1,"471":1}}],["усилий",{"2":{"308":1,"313":1,"317":1,"372":1,"440":1}}],["усиливает",{"2":{"171":1}}],["усилия",{"2":{"148":1,"383":1,"421":1,"434":1}}],["услышать",{"2":{"171":1}}],["услуг",{"2":{"210":2,"211":1,"359":1,"464":1}}],["услугу",{"2":{"144":1}}],["услуги",{"2":{"134":1,"212":1,"214":1,"216":2,"218":1,"395":1}}],["услугам",{"2":{"263":1}}],["услуга",{"2":{"133":1,"171":1}}],["усложнению",{"2":{"265":1}}],["усложнение",{"2":{"210":1}}],["усложняться",{"2":{"473":1}}],["усложнять",{"2":{"105":1}}],["условию",{"2":{"375":1,"376":1}}],["условие",{"2":{"303":1}}],["условием",{"2":{"210":1,"219":1,"335":1}}],["условии",{"2":{"249":1,"281":1,"297":1,"360":1,"361":1,"376":1}}],["условий",{"2":{"188":1,"256":1,"303":1,"308":2,"452":1}}],["условиям",{"2":{"271":1}}],["условиями",{"2":{"131":1}}],["условия",{"2":{"171":1,"241":1,"299":1}}],["условиях",{"2":{"148":1,"211":1,"372":1}}],["условные",{"2":{"156":1,"255":1}}],["условна",{"2":{"14":1}}],["устраняет",{"2":{"397":1}}],["устраняя",{"2":{"271":1}}],["устранения",{"2":{"393":1}}],["устранению",{"2":{"372":1}}],["устранить",{"2":{"393":1}}],["устройстве",{"2":{"310":1}}],["устройств",{"2":{"195":1,"306":1,"518":1}}],["устройством",{"2":{"266":1}}],["устройство",{"2":{"172":1,"366":2}}],["устройствами",{"2":{"308":1}}],["устройствам",{"2":{"308":2}}],["устройствах",{"2":{"308":3,"311":1,"312":1,"315":1,"344":1,"421":1}}],["устройства",{"2":{"108":1,"171":1,"306":1,"308":2,"366":1,"472":1}}],["устроена",{"2":{"109":1}}],["устойчивым",{"2":{"232":1}}],["устоявшихся",{"2":{"169":1,"507":1}}],["уступают",{"2":{"183":1}}],["устареть",{"2":{"471":1}}],["устареет",{"2":{"465":1}}],["устаревающих",{"2":{"507":1}}],["устаревает",{"2":{"463":1}}],["устаревший",{"2":{"455":1}}],["устаревшими",{"2":{"344":1}}],["устаревшие",{"2":{"130":1,"457":1}}],["устаревшем",{"2":{"125":1,"308":1}}],["устарели",{"2":{"472":1}}],["устарел",{"2":{"456":1,"460":1,"463":1}}],["устанавливающихся",{"2":{"509":1}}],["устанавливаются",{"2":{"223":1,"316":1,"509":1}}],["устанавливать",{"2":{"254":1,"292":1,"319":1,"396":1,"554":1}}],["устанавливаться",{"2":{"147":1,"308":1,"344":1}}],["устанавливается",{"2":{"455":1,"548":1}}],["устанавливает",{"2":{"203":1,"315":1,"430":1,"512":1}}],["устанавливаемые",{"0":{"308":1}}],["устанавливаем",{"2":{"23":1,"316":1,"317":1,"364":2}}],["установят",{"2":{"388":1}}],["установливаем",{"2":{"352":1}}],["установленную",{"2":{"451":1}}],["установленный",{"2":{"315":1}}],["установленным",{"2":{"222":1}}],["установлена",{"2":{"434":1,"473":1}}],["установлены",{"2":{"387":1,"501":1}}],["установлено",{"2":{"310":1,"314":1,"315":7,"503":1}}],["установлен",{"2":{"193":1,"223":1,"326":1,"389":2,"390":1}}],["установим",{"2":{"374":1,"375":1}}],["установив",{"2":{"222":1,"309":1}}],["установили",{"2":{"224":1,"383":1,"389":1}}],["установил",{"2":{"173":1,"316":1}}],["установит",{"2":{"223":1,"346":1}}],["установите",{"2":{"144":1,"315":1,"346":1,"375":1,"472":1}}],["установить",{"2":{"116":1,"144":3,"222":3,"223":1,"228":1,"308":2,"315":1,"316":1,"346":1,"359":1,"374":1,"378":1,"379":3,"381":1,"383":2,"384":1,"444":1}}],["установкой",{"2":{"145":1,"152":1,"314":1}}],["установке",{"0":{"315":1},"2":{"144":1,"222":1,"223":1,"231":1,"315":6,"316":2,"473":2}}],["установку",{"2":{"133":1,"144":1,"223":1,"224":1,"315":8,"388":1,"390":1}}],["установки",{"2":{"117":1,"123":1,"144":2,"179":1,"223":1,"226":1,"230":1,"255":1,"308":2,"315":10,"317":1,"331":1,"338":1,"346":1,"374":1,"379":1,"381":1,"386":1,"387":4,"388":1,"389":1,"390":1,"402":1,"434":1,"438":1,"451":1,"457":1,"460":1,"536":1}}],["установка",{"0":{"51":1,"221":1,"346":1,"375":1,"379":1,"387":1,"388":1,"389":1,"427":1,"500":1,"501":1,"503":1},"1":{"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"376":1,"380":1,"381":1,"428":1,"429":1,"430":1,"501":1,"502":2,"503":1},"2":{"120":1,"126":1,"140":1,"150":1,"151":1,"152":1,"223":1,"235":1,"236":1,"253":1,"292":1,"308":1,"322":1,"346":1,"370":2,"379":1,"388":1,"501":2}}],["успевает",{"2":{"457":1}}],["успешными",{"2":{"308":1}}],["успешным",{"2":{"301":1}}],["успешный",{"2":{"171":1,"363":1}}],["успешности",{"2":{"445":1}}],["успешностью",{"2":{"22":1}}],["успешной",{"2":{"362":1,"363":1}}],["успешном",{"2":{"303":1}}],["успешного",{"2":{"303":1,"378":1}}],["успешно",{"2":{"226":1,"318":1,"363":1}}],["успехов",{"2":{"405":1}}],["успехом",{"2":{"360":1}}],["успех",{"2":{"69":1,"188":1,"301":1,"370":1}}],["успеха",{"2":{"41":1,"303":3,"360":1,"365":1,"373":1}}],["у",{"0":{"498":1},"2":{"3":1,"12":1,"13":1,"16":3,"17":2,"22":1,"28":1,"29":1,"36":1,"41":1,"43":1,"47":3,"48":1,"59":1,"89":1,"95":1,"97":1,"102":2,"112":1,"115":3,"116":4,"118":1,"123":1,"134":2,"137":1,"144":2,"151":2,"152":1,"166":1,"168":1,"169":1,"171":1,"174":1,"178":1,"180":3,"188":1,"193":1,"206":1,"208":1,"215":1,"223":1,"231":4,"239":1,"243":1,"244":1,"246":1,"249":1,"251":1,"253":1,"257":1,"264":1,"267":1,"291":1,"299":1,"301":1,"302":1,"303":2,"315":1,"316":1,"323":1,"325":2,"328":1,"333":1,"335":1,"336":2,"352":1,"353":1,"355":3,"361":2,"365":1,"367":3,"375":2,"378":1,"379":1,"386":2,"389":2,"390":1,"391":1,"394":1,"423":1,"427":1,"428":2,"447":1,"451":1,"460":1,"463":5,"464":1,"471":1,"472":1,"473":2,"507":1,"528":2,"539":1}}],["флексбокса",{"2":{"468":1}}],["флагманом",{"2":{"462":1}}],["флаг",{"2":{"315":1,"336":2}}],["флажок",{"2":{"184":1,"208":1}}],["флажка",{"2":{"184":1,"208":1,"231":2}}],["форсирует",{"2":{"451":1}}],["форумах",{"2":{"196":1}}],["форм",{"2":{"545":1}}],["формочки",{"2":{"473":1}}],["формой",{"2":{"422":1}}],["формы",{"2":{"179":1,"336":1,"463":1}}],["формируя",{"2":{"150":1}}],["формируется",{"2":{"205":1}}],["формирует",{"2":{"116":1,"223":1,"473":1}}],["формирование",{"2":{"114":1}}],["формуле",{"2":{"361":1}}],["формулы",{"2":{"203":1}}],["формулу",{"2":{"133":1,"148":1,"301":2}}],["формулировки",{"2":{"216":1}}],["формулировок",{"2":{"216":1}}],["формулировать",{"2":{"4":1}}],["формулируется",{"2":{"2":1}}],["форму",{"2":{"115":1,"208":1,"360":1,"365":1,"495":1}}],["форме",{"2":{"76":1,"185":1}}],["формальная",{"2":{"239":1}}],["формальный",{"2":{"152":1}}],["формах",{"2":{"183":1}}],["форма",{"2":{"48":1,"192":1}}],["форматирует",{"2":{"457":1}}],["форматируете",{"2":{"267":1}}],["форматировании",{"2":{"473":1}}],["форматирование",{"2":{"457":1}}],["форматирования",{"2":{"434":1,"504":1}}],["форматированию",{"2":{"183":1}}],["форматов",{"2":{"245":1}}],["форматом",{"2":{"184":1,"383":1}}],["формата",{"2":{"118":1,"473":1}}],["формате",{"2":{"116":1,"152":1,"222":1,"239":1,"250":1,"336":1,"360":1,"382":1,"439":1,"454":2,"473":1}}],["формат",{"2":{"17":1,"152":1,"174":1,"303":1,"361":1,"434":1,"454":1,"501":1}}],["фоне",{"2":{"462":1}}],["фон",{"2":{"454":1}}],["фонт",{"2":{"316":1}}],["фоновые",{"2":{"434":1}}],["фоновыми",{"2":{"421":1}}],["фоновый",{"2":{"316":1}}],["фоновом",{"2":{"190":1}}],["фона",{"2":{"230":1,"312":1,"315":1}}],["фонд",{"2":{"144":1}}],["фондом",{"2":{"144":1}}],["фокус",{"2":{"197":1}}],["фокусироваться",{"2":{"184":1,"197":1}}],["фокусировки",{"2":{"173":1}}],["фокусной",{"2":{"173":1}}],["ферме",{"2":{"137":1}}],["фибоначчи",{"0":{"302":1},"2":{"301":1,"303":1,"374":3,"377":1}}],["фигура",{"2":{"328":1}}],["фигуру",{"2":{"290":1}}],["фигурных",{"2":{"231":1}}],["фигурные",{"2":{"149":1}}],["финальном",{"2":{"464":1}}],["финальную",{"2":{"243":1}}],["финансы",{"2":{"367":1}}],["финляндия",{"2":{"200":1}}],["философию",{"2":{"203":1}}],["фильтрасобытия",{"2":{"239":1}}],["фильтрасостояние",{"2":{"239":1}}],["фильтрации",{"2":{"200":1,"231":1,"239":1,"256":1,"296":1}}],["фильтрация",{"2":{"16":1,"22":1}}],["фильтрами",{"2":{"30":1,"35":1}}],["фильтры",{"2":{"4":1,"33":1}}],["фиксит",{"2":{"464":1}}],["фиксируют",{"2":{"395":1}}],["фиксируются",{"2":{"381":1}}],["фиксируем",{"2":{"231":1}}],["фиксированного",{"2":{"192":1}}],["фиксация",{"2":{"391":1}}],["фиксации",{"2":{"166":1,"390":2,"391":2}}],["фишек",{"2":{"185":1}}],["фитта",{"0":{"178":1}}],["физических",{"2":{"137":1}}],["фидбеки",{"2":{"64":1}}],["фулстек",{"2":{"118":1,"457":1}}],["фулстеков",{"2":{"118":1}}],["футеров",{"2":{"520":1}}],["футером",{"2":{"445":1,"546":1}}],["футер",{"2":{"32":1}}],["фунциональность",{"2":{"86":1}}],["функций",{"2":{"148":2,"152":1,"175":1,"184":1,"246":1,"247":1,"250":1,"255":1,"267":2,"271":1,"277":1,"285":1,"289":1,"291":1,"297":1,"298":1,"300":1,"303":1,"305":1,"332":1,"374":1,"378":1,"379":1,"381":1,"425":1,"447":1,"463":3}}],["функциях",{"2":{"303":1,"323":1,"381":1,"462":1}}],["функциям",{"2":{"249":1,"263":1}}],["функциями",{"2":{"224":1,"247":1,"323":1,"329":1,"463":1}}],["функция",{"2":{"124":1,"144":1,"152":1,"159":1,"173":1,"179":1,"227":1,"231":3,"239":1,"244":2,"250":4,"255":1,"256":2,"265":1,"267":1,"288":2,"290":1,"296":1,"297":1,"301":3,"302":1,"328":3,"330":3,"332":1,"338":3,"361":1,"365":1,"376":4,"377":2,"380":1,"421":1,"425":1,"433":1,"450":1,"460":1,"463":1,"464":1,"465":1}}],["функцию",{"2":{"122":1,"125":1,"135":1,"149":1,"159":1,"173":1,"193":2,"195":1,"231":1,"241":1,"244":3,"245":1,"247":2,"250":5,"252":1,"255":1,"256":1,"265":2,"267":3,"281":1,"286":1,"287":2,"290":1,"291":1,"292":3,"293":1,"296":1,"302":3,"303":3,"324":3,"325":2,"330":1,"333":2,"335":1,"338":2,"352":2,"359":1,"372":1,"376":3,"377":1,"378":1,"380":2,"381":1,"390":1,"421":1,"428":1,"429":2,"439":1,"447":1,"453":1,"463":1,"465":1,"511":1}}],["функцией",{"0":{"122":1},"2":{"91":1,"122":1,"152":1,"159":1,"179":1,"192":1,"223":1,"231":1,"245":1,"263":1,"297":1,"302":1,"338":1,"370":1,"376":1,"536":1}}],["функции",{"0":{"165":1,"250":1},"1":{"251":1},"2":{"40":1,"41":1,"89":2,"91":2,"103":2,"104":1,"116":2,"125":1,"140":1,"148":1,"149":1,"152":6,"163":1,"166":1,"171":1,"172":1,"177":1,"178":1,"184":1,"193":1,"225":1,"244":2,"250":4,"251":1,"255":1,"256":1,"263":1,"265":2,"267":2,"272":1,"282":1,"284":1,"286":1,"288":1,"289":1,"292":1,"296":2,"301":5,"302":3,"303":8,"315":1,"323":1,"330":1,"332":1,"333":3,"338":1,"364":1,"365":2,"373":3,"375":1,"376":6,"377":1,"378":3,"382":1,"421":2,"423":1,"425":1,"426":1,"430":1,"431":1,"432":2,"433":1,"445":1,"462":1,"463":6,"504":1,"509":1,"519":1}}],["функционируют",{"2":{"21":1}}],["функционалом",{"2":{"25":1,"425":1,"501":1,"507":1}}],["функциональную",{"2":{"263":1}}],["функциональным",{"2":{"264":1,"297":1}}],["функциональный",{"2":{"228":1}}],["функциональные",{"0":{"78":1},"2":{"263":1,"269":1,"359":1,"508":1}}],["функциональных",{"2":{"3":1,"176":1,"508":1}}],["функциональной",{"2":{"463":1}}],["функциональном",{"2":{"265":1}}],["функциональному",{"2":{"256":1}}],["функциональности",{"2":{"148":3,"166":1,"225":1,"235":1,"238":1,"239":1,"241":1,"252":1,"256":1,"264":1,"295":1,"297":3,"344":1,"396":1,"504":2}}],["функциональностью",{"2":{"152":1,"183":1,"252":1,"265":2,"297":1}}],["функциональность",{"2":{"11":1,"77":1,"148":1,"152":1,"153":1,"230":1,"233":1,"243":1,"247":1,"258":1,"264":2,"268":1,"291":3,"297":2,"298":1,"308":1,"317":1,"325":1,"326":1,"335":1,"431":1,"503":1,"519":1}}],["функционально",{"2":{"22":1}}],["функционал",{"2":{"9":1,"13":1,"26":1,"48":1,"55":1,"325":1,"464":1,"470":1,"504":1,"508":1,"536":1,"540":1}}],["функционала",{"2":{"9":1,"32":1,"79":1,"105":1,"460":2,"471":1,"503":1,"504":1,"506":1,"508":1,"536":1,"537":1,"545":1}}],["фундаментальное",{"2":{"384":1,"462":1}}],["фундаментальной",{"2":{"148":1}}],["фундаментальными",{"2":{"342":1}}],["фундаментальный",{"2":{"302":1}}],["фундаментальную",{"2":{"260":1}}],["фундаментальная",{"2":{"249":1}}],["фундамента",{"2":{"26":1}}],["фракционирование",{"2":{"368":1}}],["фрагментов",{"2":{"515":1}}],["фрагментом",{"2":{"192":1,"261":1}}],["фрагменте",{"2":{"271":1,"354":1}}],["фрагменты",{"2":{"249":1,"508":1,"515":1}}],["фрагмент",{"2":{"176":1,"188":1,"192":1,"250":1,"256":1,"267":1,"353":1,"429":1}}],["фрагментам",{"2":{"419":1}}],["фрагментах",{"2":{"256":1}}],["фрагмента",{"2":{"149":1,"302":1,"355":1,"376":1}}],["фреймворку",{"2":{"156":1,"308":1}}],["фреймворке",{"2":{"148":1,"460":1,"462":1}}],["фреймворков",{"2":{"147":1,"148":2,"167":1,"221":1,"225":1,"228":1,"336":1,"400":1,"462":1,"504":1,"507":1}}],["фреймворком",{"2":{"124":1,"145":1,"147":1,"151":1,"153":1,"166":1,"168":2,"225":1,"231":1,"460":1,"536":1}}],["фреймворки",{"2":{"147":1,"148":2,"150":1,"160":1,"224":2,"225":2,"234":1,"308":1,"462":2}}],["фреймворк",{"0":{"147":1,"148":1,"226":1,"407":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"230":1,"231":1,"232":1},"2":{"119":2,"147":1,"148":6,"149":1,"150":1,"159":2,"160":1,"223":1,"224":1,"225":2,"226":1,"242":1,"251":1,"260":1,"266":1,"316":1,"345":1,"367":1,"375":1,"400":1,"407":1,"413":1,"419":1,"431":1,"438":1,"463":1,"507":1}}],["фреймворках",{"0":{"462":1},"2":{"331":1,"336":1,"349":1,"482":1}}],["фреймворками",{"0":{"225":1},"1":{"226":1},"2":{"224":1,"372":1}}],["фреймворка",{"2":{"23":1,"117":1,"119":1,"147":1,"148":3,"149":1,"221":1,"225":1,"231":2,"242":1,"258":2,"267":1,"291":1,"321":1,"346":1,"373":1,"400":2,"401":1,"407":1,"460":2,"507":1}}],["фронте",{"2":{"115":3,"118":2,"461":2,"462":1,"464":2,"472":1}}],["фронтендом",{"2":{"117":1}}],["фронтенды",{"2":{"62":1}}],["фронтенда",{"2":{"10":1,"11":1,"22":1,"41":2,"59":1,"82":1,"463":3,"472":1,"508":2}}],["фронтенд",{"0":{"462":1},"2":{"4":1,"6":1,"23":1,"41":1,"47":1,"116":1,"366":1,"367":1,"419":1,"444":1,"457":1,"461":1,"462":1,"464":1,"473":1,"477":1,"479":1,"482":2,"507":1}}],["фронтендеру",{"2":{"442":1}}],["фронтендера",{"0":{"116":1}}],["фронтенде",{"0":{"81":1},"1":{"82":1,"83":1},"2":{"3":1,"6":1,"13":1,"44":1,"102":1,"365":1,"461":1,"462":2,"463":2,"464":1,"472":1}}],["фронту",{"2":{"115":1,"116":1}}],["фронт",{"2":{"115":3,"116":2,"457":1}}],["фронта",{"2":{"115":1,"116":1,"462":1}}],["фронтэнде",{"2":{"462":1}}],["фронтэндер",{"2":{"116":1}}],["фронтэнд",{"0":{"464":1},"1":{"465":1,"466":1,"467":1,"468":1,"469":1,"470":1},"2":{"115":1,"116":1,"118":1,"497":1}}],["фабричной",{"2":{"330":1}}],["фабрики",{"2":{"290":2}}],["фабрика",{"0":{"290":1}}],["фаренгейта",{"2":{"295":1,"296":2}}],["фасадов",{"2":{"300":1}}],["фасадный",{"2":{"300":1}}],["фасада",{"2":{"299":1,"300":1}}],["фасад",{"0":{"300":1},"2":{"260":1,"296":1,"300":1}}],["фантазийный",{"2":{"237":1}}],["фактического",{"2":{"372":1,"451":1,"473":1}}],["фактические",{"2":{"323":1}}],["фактически",{"2":{"247":1,"431":1}}],["факт",{"2":{"186":1,"463":1}}],["факто",{"2":{"118":1,"346":1,"512":1}}],["фактора",{"2":{"368":1}}],["фактор",{"2":{"297":1,"366":1,"462":1}}],["фактором",{"2":{"256":1,"295":1,"360":1,"426":1}}],["факторов",{"2":{"41":1,"301":1,"370":1,"373":2}}],["факторизация",{"2":{"13":1}}],["файлом",{"2":{"139":1,"224":1,"314":1}}],["файловой",{"2":{"308":1}}],["файловый",{"2":{"137":1}}],["файлов",{"0":{"126":1,"143":1,"165":1},"2":{"11":2,"38":1,"76":1,"109":1,"119":1,"132":1,"135":2,"141":1,"145":2,"150":1,"217":1,"223":1,"225":1,"229":1,"244":2,"256":1,"317":1,"355":1,"375":2,"382":1,"390":3,"444":1,"451":1,"453":1,"455":1}}],["файлу",{"2":{"135":1,"228":1,"267":1,"422":1}}],["файл",{"0":{"310":1},"1":{"311":1,"312":1,"313":1},"2":{"112":1,"135":1,"136":1,"137":1,"139":1,"140":2,"141":2,"150":3,"151":3,"174":2,"180":1,"217":2,"224":12,"225":2,"226":3,"227":2,"228":5,"230":1,"244":2,"255":2,"256":2,"282":1,"284":1,"306":1,"308":1,"310":4,"314":3,"316":2,"317":2,"330":1,"333":1,"334":1,"344":1,"348":1,"349":4,"352":1,"374":1,"375":5,"379":5,"380":1,"382":1,"383":2,"384":1,"390":4,"391":2,"393":6,"397":1,"428":1,"432":1,"433":1,"438":1,"451":4,"453":1,"457":1,"473":2,"515":1}}],["файле",{"2":{"86":1,"112":1,"151":1,"226":1,"243":2,"256":1,"310":1,"316":1,"331":1,"352":2,"355":1,"382":1,"383":1,"393":1,"422":1,"428":1,"434":1,"554":1,"557":2}}],["файлам",{"2":{"135":1,"224":1}}],["файлами",{"2":{"11":1,"38":1,"140":1,"255":1,"390":1}}],["файлах",{"2":{"109":1,"375":2,"376":1,"381":2,"382":3,"457":1}}],["файла",{"2":{"17":1,"117":1,"120":1,"136":1,"138":1,"140":1,"224":1,"226":1,"227":1,"244":1,"255":2,"283":1,"308":1,"310":2,"313":2,"376":2,"382":1,"390":1,"422":1,"423":1,"435":2,"438":1,"451":3,"473":1,"501":2}}],["файлы",{"0":{"38":1,"404":1},"2":{"6":1,"11":1,"17":1,"126":1,"136":2,"137":1,"142":1,"143":2,"144":1,"150":1,"222":1,"223":2,"224":4,"227":2,"236":1,"255":1,"308":1,"316":1,"317":1,"344":1,"346":1,"375":1,"385":2,"386":1,"390":5,"391":3,"392":1,"393":1,"404":1,"434":1,"451":1,"452":1,"455":1,"473":1,"513":1,"538":1}}],["зря",{"2":{"471":1}}],["зрения",{"2":{"11":1,"22":1,"103":1,"123":1,"171":1,"301":1,"352":1,"425":2,"440":1,"463":3,"496":1}}],["звеном",{"2":{"435":1}}],["звездочка",{"2":{"391":1}}],["звучало",{"2":{"374":1}}],["звучит",{"2":{"150":1}}],["звуков",{"2":{"171":1}}],["зерна",{"2":{"472":1}}],["зеркально",{"2":{"436":2,"437":1}}],["зеркальное",{"2":{"135":1}}],["зеленого",{"2":{"376":1}}],["зону",{"2":{"263":1}}],["зона",{"2":{"148":1}}],["злоупотреблять",{"2":{"421":1,"447":1}}],["злоупотребление",{"2":{"189":1}}],["злой",{"2":{"169":1}}],["змеином",{"2":{"163":1}}],["знал",{"2":{"472":1}}],["знатоков",{"2":{"457":1}}],["знать",{"2":{"119":1,"130":1,"135":1,"148":1,"150":1,"152":1,"219":1,"223":1,"251":1,"285":1,"295":1,"306":1,"315":1,"342":1,"358":1,"455":1,"472":2}}],["знающих",{"2":{"472":1}}],["знают",{"2":{"323":1,"471":1}}],["знаю",{"2":{"303":1}}],["знанию",{"2":{"472":1}}],["знаний",{"2":{"340":1,"472":1}}],["знание",{"2":{"260":1,"401":1}}],["знаниями",{"2":{"342":1}}],["знания",{"2":{"147":1,"219":1,"235":1,"251":1,"259":1,"260":1,"342":1,"369":1,"401":1,"419":1,"472":2}}],["знаменитая",{"2":{"176":1}}],["знаем",{"2":{"152":1,"251":1,"301":1,"358":1,"381":1,"383":1,"421":1}}],["знает",{"2":{"150":1,"152":2,"295":1,"434":1}}],["знаете",{"2":{"116":1,"366":1}}],["знаки",{"2":{"391":1}}],["знаку",{"2":{"349":1}}],["знаке",{"2":{"229":1}}],["знаками",{"2":{"367":1}}],["знака",{"2":{"163":1,"299":1}}],["знак",{"2":{"149":1,"349":1,"391":1,"433":1}}],["знакомимся",{"2":{"415":1}}],["знакомит",{"2":{"410":1,"413":1}}],["знакомиться",{"2":{"374":1}}],["знакомясь",{"2":{"342":1}}],["знакома",{"2":{"222":1,"256":1}}],["знакомы",{"2":{"175":1,"266":1,"402":1}}],["знакомым",{"2":{"151":1}}],["знакомой",{"2":{"267":1}}],["знакомо",{"2":{"172":1}}],["знакомого",{"2":{"76":1}}],["знаком",{"2":{"162":1,"249":1,"358":1}}],["знакомстве",{"2":{"304":1}}],["знакомство",{"2":{"131":1}}],["знакомства",{"2":{"131":2,"145":1,"276":1}}],["значимых",{"2":{"227":1}}],["значимое",{"2":{"224":1}}],["значителен",{"2":{"434":1}}],["значительную",{"2":{"148":1,"344":1}}],["значительный",{"2":{"148":1,"430":1,"473":1}}],["значительные",{"2":{"147":1,"297":1,"421":1}}],["значительными",{"2":{"289":1}}],["значительным",{"2":{"125":1}}],["значительных",{"2":{"62":1}}],["значительной",{"2":{"147":1,"172":1,"176":1,"301":1,"344":1,"385":1}}],["значительно",{"2":{"134":1,"148":1,"149":1,"303":1,"308":1,"368":1,"419":1,"440":1,"445":1,"457":1,"471":1,"473":1,"507":1}}],["значительного",{"2":{"125":1,"258":1}}],["значительное",{"2":{"69":1,"372":1,"460":1}}],["значит",{"2":{"12":1,"85":1,"365":1}}],["значков",{"2":{"205":1,"227":2}}],["значком",{"2":{"185":1,"187":1,"195":1}}],["значке",{"2":{"187":1,"313":1}}],["значками",{"2":{"227":2}}],["значка",{"2":{"187":2,"311":1}}],["значки",{"0":{"187":1},"2":{"176":1,"225":1,"227":5,"308":1,"364":1}}],["значок",{"2":{"172":1,"174":1,"187":1,"195":1,"198":2,"227":2}}],["значению",{"2":{"152":2,"231":1,"245":1,"335":1,"376":2,"381":2}}],["значений",{"2":{"152":1,"245":1,"329":1,"331":1,"335":1,"336":1,"381":1,"421":1,"432":1}}],["значением",{"2":{"154":1,"231":1,"245":1,"246":1,"250":1,"287":1,"296":1,"323":1,"324":1,"376":1,"380":1,"381":1,"462":1}}],["значение",{"2":{"124":1,"134":2,"148":4,"149":1,"152":6,"154":2,"155":2,"157":1,"158":2,"160":1,"193":1,"213":1,"231":2,"245":3,"246":3,"250":1,"251":1,"255":1,"281":1,"296":5,"298":1,"301":1,"302":1,"303":2,"312":1,"323":1,"328":1,"330":2,"338":2,"339":1,"352":2,"361":1,"376":1,"377":1,"380":1,"381":4,"431":1,"432":1,"437":2,"451":1,"529":1,"555":1}}],["значения",{"2":{"123":1,"124":1,"136":1,"137":1,"148":1,"149":1,"152":1,"154":1,"156":1,"158":1,"160":1,"163":1,"193":1,"231":3,"244":1,"245":2,"247":1,"301":1,"303":4,"310":1,"315":1,"331":1,"335":1,"336":2,"337":1,"339":1,"358":1,"360":1,"373":1,"378":1,"381":1,"433":1,"462":1,"501":1,"552":1}}],["значениями",{"2":{"245":1,"255":1,"338":1,"362":1}}],["значениям",{"2":{"123":1}}],["значении",{"2":{"116":1,"232":1}}],["зная",{"2":{"59":1,"229":1,"308":1}}],["здравом",{"2":{"269":1}}],["здравым",{"2":{"16":1}}],["здесь",{"0":{"64":1,"399":1},"2":{"3":1,"5":1,"12":1,"61":1,"64":1,"118":1,"119":2,"125":1,"129":1,"132":1,"134":2,"135":1,"137":2,"139":1,"140":1,"142":1,"144":2,"147":1,"150":1,"151":2,"152":2,"159":1,"160":2,"173":2,"175":1,"178":1,"180":1,"183":1,"201":1,"205":1,"210":1,"221":1,"222":1,"223":3,"224":5,"225":1,"228":1,"236":1,"249":3,"255":1,"256":1,"265":1,"267":4,"280":1,"287":1,"288":2,"289":1,"292":2,"294":4,"296":3,"297":1,"301":1,"308":2,"314":1,"315":1,"323":1,"325":1,"330":1,"331":1,"335":1,"336":2,"346":1,"352":1,"355":1,"358":2,"361":1,"365":1,"366":1,"367":1,"373":1,"378":1,"381":1,"382":2,"393":1,"396":1,"422":2,"427":1,"428":2,"431":1,"463":2}}],["зазываниях",{"2":{"465":1}}],["зажимает",{"2":{"462":1}}],["заинтересованные",{"2":{"402":1}}],["заимствован",{"2":{"264":1}}],["зафиксирован",{"2":{"393":1}}],["зафиксированное",{"2":{"33":1}}],["зашифрованных",{"2":{"361":1}}],["зашифрованном",{"2":{"360":1}}],["займет",{"2":{"302":1}}],["застывший",{"2":{"421":1}}],["застыть",{"2":{"421":1}}],["заставки",{"2":{"556":1}}],["заставка",{"2":{"315":1,"542":1,"556":2}}],["заставим",{"2":{"295":1}}],["заставив",{"2":{"216":1}}],["заставить",{"2":{"207":1,"208":1,"213":1,"217":1,"323":1,"337":1}}],["заставили",{"2":{"22":1,"335":1}}],["заставляя",{"2":{"193":1}}],["заставляет",{"2":{"179":1,"421":1}}],["заставлять",{"2":{"115":1}}],["заслуживает",{"2":{"287":1}}],["заумной",{"2":{"270":1}}],["заодно",{"2":{"233":1}}],["заложим",{"2":{"304":1}}],["заложили",{"2":{"221":1}}],["залог",{"2":{"181":1}}],["залогинился",{"2":{"115":1,"463":1}}],["заняв",{"2":{"224":1}}],["занят",{"2":{"421":1}}],["занятость",{"2":{"190":1}}],["занято",{"2":{"190":1}}],["занять",{"2":{"190":1,"461":1}}],["занята",{"2":{"190":2}}],["заново",{"2":{"174":1}}],["занимающие",{"2":{"460":1,"536":1}}],["занимающиеся",{"2":{"372":1}}],["занимаются",{"2":{"461":1}}],["занимают",{"2":{"125":1,"195":1,"235":1,"455":1}}],["занимать",{"2":{"336":2}}],["заниматься",{"2":{"65":1}}],["занимается",{"2":{"171":1,"227":1}}],["занимает",{"2":{"126":1,"147":1,"295":1,"421":2}}],["заботу",{"2":{"462":1}}],["заботитесь",{"2":{"454":1}}],["заботы",{"2":{"396":1}}],["забот",{"2":{"291":1}}],["заботятся",{"2":{"137":1,"401":1}}],["забыл",{"2":{"468":1}}],["забыть",{"2":{"268":1,"287":1,"460":1}}],["забывает",{"2":{"200":1}}],["забывать",{"2":{"144":1}}],["заблокировать",{"2":{"255":1}}],["забудьте",{"2":{"226":1}}],["забрасывается",{"2":{"218":1}}],["защищенную",{"2":{"365":1}}],["защищенному",{"2":{"309":1,"365":1}}],["защищенное",{"2":{"308":1}}],["защищать",{"2":{"144":1}}],["защитить",{"2":{"416":1}}],["защит",{"2":{"349":1,"360":1}}],["защите",{"2":{"145":1}}],["защита",{"0":{"144":1},"2":{"131":1,"360":1}}],["защиты",{"2":{"117":1,"131":1,"361":1}}],["зачем",{"0":{"385":1},"2":{"125":1,"295":1,"320":1,"352":1,"463":1}}],["зачастую",{"2":{"44":1,"211":1,"218":1,"219":1,"240":1,"373":1,"461":1}}],["замаскированная",{"0":{"217":1}}],["замаскирована",{"2":{"212":1}}],["замаскировать",{"2":{"184":1}}],["заманить",{"2":{"210":1}}],["заморозить",{"2":{"302":1}}],["заморожено",{"2":{"301":1}}],["заморочки",{"2":{"115":1}}],["заморачиваться",{"2":{"116":1}}],["замедление",{"2":{"344":1}}],["заметка",{"2":{"472":1}}],["заметку",{"2":{"432":1}}],["заметки",{"2":{"239":1,"431":1,"432":1,"473":1}}],["заметок",{"2":{"431":1,"432":2}}],["заметите",{"2":{"432":1}}],["заметить",{"2":{"152":1,"297":1,"303":1,"346":1,"355":2,"376":1,"390":1,"434":1}}],["заметим",{"2":{"310":1}}],["заметили",{"2":{"287":1,"376":1}}],["заметьте",{"2":{"216":1,"238":1,"288":1,"302":1,"339":1,"393":1}}],["заметным",{"2":{"191":1}}],["заметное",{"2":{"126":1}}],["замечаем",{"2":{"296":1}}],["замечаниями",{"2":{"249":1}}],["замечание",{"2":{"4":1,"65":1,"96":1,"336":1,"433":1}}],["замечательную",{"2":{"359":1}}],["замечательно",{"0":{"227":1}}],["замечательным",{"2":{"149":1}}],["замену",{"2":{"460":2,"462":1,"466":1}}],["замены",{"2":{"264":1,"460":1}}],["заменяет",{"2":{"357":1}}],["заменяем",{"2":{"85":1,"86":1}}],["заменяются",{"2":{"162":1}}],["заменяющий",{"2":{"119":1}}],["заменяя",{"2":{"134":1}}],["замена",{"2":{"119":2,"303":1,"460":1}}],["заменой",{"2":{"95":1}}],["заменится",{"2":{"160":1}}],["замените",{"2":{"159":1}}],["заменить",{"2":{"114":1,"123":1,"464":1,"471":2,"529":1}}],["заменим",{"2":{"95":2}}],["заменив",{"2":{"82":1,"302":1,"335":1}}],["заменено",{"2":{"149":1}}],["заменен",{"2":{"123":2,"249":1}}],["замене",{"2":{"41":1,"83":1}}],["загуглите",{"2":{"465":1}}],["заглянуть",{"2":{"334":1,"457":1}}],["заглавными",{"2":{"163":1,"166":1}}],["загрязнять",{"2":{"352":1}}],["загромождает",{"2":{"152":1}}],["загружен",{"2":{"192":1,"227":1,"349":1}}],["загружено",{"2":{"132":1}}],["загружают",{"2":{"352":1}}],["загружаются",{"2":{"192":1}}],["загружаясь",{"2":{"452":1}}],["загружая",{"2":{"352":1}}],["загружает",{"2":{"217":1,"223":1,"244":1}}],["загружаем",{"2":{"87":1,"95":1,"100":1,"106":1,"112":1}}],["загружать",{"2":{"137":1,"150":1,"160":1,"227":1}}],["загружаться",{"2":{"125":1,"224":1,"244":1}}],["загрузился",{"2":{"314":2}}],["загрузит",{"2":{"150":2,"346":1}}],["загрузить",{"2":{"83":1,"136":1,"143":1,"217":1,"244":2,"344":1,"379":1,"383":1,"404":1}}],["загрузчик",{"2":{"244":1}}],["загрузку",{"2":{"224":1,"244":1,"287":1,"318":1,"349":1,"363":1}}],["загрузке",{"2":{"193":1,"204":1,"205":2,"289":1,"352":1,"374":1,"451":1,"457":1,"473":1}}],["загрузка",{"2":{"121":1,"244":2,"344":1,"345":1,"352":1,"387":1,"447":1,"451":1}}],["загрузки",{"0":{"120":1},"2":{"119":1,"120":1,"192":2,"217":3,"224":1,"225":1,"244":2,"317":1,"344":2,"349":1,"374":1,"421":2,"451":2,"452":1,"460":1,"536":1,"556":1}}],["заголовки",{"2":{"364":2,"435":1}}],["заголовках",{"2":{"364":1}}],["заголовка",{"2":{"255":1,"312":1,"361":1}}],["заголовком",{"2":{"199":1,"208":1,"297":1,"315":1,"527":1}}],["заголовков",{"2":{"117":1}}],["заголовок",{"2":{"231":3,"255":1,"256":1,"328":1,"355":1,"364":1}}],["загорается",{"2":{"102":1}}],["захваченного",{"2":{"381":1}}],["захват",{"2":{"381":1}}],["захватывая",{"2":{"197":1}}],["захвата",{"2":{"178":1,"231":1}}],["захостите",{"2":{"472":1}}],["захостить",{"2":{"116":1,"444":1}}],["захотеть",{"2":{"148":1}}],["захотим",{"2":{"48":1,"105":1}}],["захардкодим",{"2":{"99":1}}],["заранее",{"2":{"473":1}}],["заработать",{"2":{"62":1,"63":1}}],["зародились",{"2":{"147":1}}],["заряде",{"2":{"115":1}}],["зарегистрируйте",{"2":{"472":1}}],["зарегистрирует",{"2":{"204":1}}],["зарегистрировали",{"2":{"362":1,"363":1}}],["зарегистрировать",{"2":{"255":1,"288":1,"292":1,"317":1}}],["зарегистрироваться",{"2":{"58":1,"361":1,"472":1}}],["зарегистрировано",{"2":{"361":1}}],["зарегистрированной",{"2":{"366":1}}],["зарегистрированное",{"2":{"288":1}}],["зарегистрированным",{"2":{"255":1}}],["зарегистрированных",{"2":{"59":1,"358":1}}],["зарегистрирован",{"2":{"134":1,"316":1,"365":1}}],["зарекомендовавшие",{"2":{"147":1}}],["зарекомендовавшую",{"2":{"39":1}}],["зарезервированный",{"2":{"198":1}}],["зарезервированных",{"2":{"134":1}}],["зарезервированное",{"2":{"134":1,"152":1,"423":1}}],["запятыми",{"2":{"433":1}}],["запятой",{"2":{"134":1}}],["запланированных",{"2":{"428":1}}],["запланированы",{"2":{"293":1}}],["запишем",{"2":{"239":1}}],["записывается",{"2":{"367":1}}],["записываются",{"2":{"164":1}}],["записью",{"2":{"433":1}}],["запись",{"2":{"134":2,"433":1}}],["записать",{"2":{"134":1,"336":1}}],["записанный",{"2":{"115":1}}],["записи",{"0":{"134":1},"1":{"136":1},"2":{"59":1,"115":1,"134":4,"146":1,"152":1,"338":1,"367":1,"428":1}}],["записей",{"2":{"48":1,"134":2,"145":1,"198":1,"375":1}}],["заполнено",{"2":{"463":1}}],["заполнен",{"2":{"355":1}}],["заполнения",{"2":{"179":1,"255":1}}],["заполнителя",{"2":{"432":1}}],["заполнить",{"2":{"288":1}}],["заполним",{"2":{"231":1}}],["заполняется",{"2":{"353":1}}],["заполнять",{"2":{"313":1}}],["заполнял",{"2":{"249":1}}],["заполняющего",{"2":{"208":1}}],["запоминается",{"2":{"557":1}}],["запоминаемость",{"2":{"181":1}}],["запоминанием",{"2":{"361":1}}],["запоминать",{"2":{"221":1}}],["запомнить",{"2":{"186":1,"295":1}}],["запомните",{"2":{"151":1}}],["запущен",{"2":{"421":1,"461":1}}],["запутывающее",{"2":{"463":1}}],["запутывает",{"2":{"179":1}}],["запутанным",{"2":{"381":1}}],["запутать",{"2":{"332":1}}],["запустили",{"2":{"381":1}}],["запустив",{"2":{"355":2}}],["запустим",{"2":{"150":1,"316":1}}],["запустится",{"2":{"384":1}}],["запустит",{"2":{"223":1,"224":1}}],["запустите",{"2":{"144":1,"231":1,"372":1,"387":1}}],["запустить",{"2":{"59":1,"116":2,"143":1,"223":3,"226":1,"315":1,"328":1,"376":2,"378":1,"384":2,"388":1,"390":1,"394":1,"430":1,"439":1,"457":1}}],["запуском",{"2":{"395":1}}],["запуске",{"2":{"243":1,"244":1,"308":1,"312":1,"339":1,"346":1,"379":1,"473":2}}],["запуск",{"0":{"502":1},"2":{"224":1,"315":1,"331":1,"370":1,"372":1,"376":1,"487":1}}],["запуску",{"2":{"144":1}}],["запускалось",{"2":{"473":1}}],["запускают",{"2":{"395":1}}],["запускаются",{"2":{"152":1,"457":1}}],["запускаться",{"2":{"421":1}}],["запускать",{"2":{"193":1,"224":3,"355":2,"367":1,"376":1,"379":1,"387":1,"421":1,"554":1}}],["запускается",{"2":{"366":1,"421":1,"455":1}}],["запускает",{"2":{"150":1,"315":2,"352":1,"358":1,"395":1}}],["запускаем",{"2":{"112":1,"255":1,"324":1,"325":1}}],["запуска",{"0":{"120":1},"2":{"119":1,"120":1,"123":2,"315":1,"323":1,"328":1,"365":2,"374":1,"375":2,"384":1,"402":1,"434":1}}],["запасного",{"2":{"160":1}}],["запрограммировать",{"2":{"395":1}}],["запрограммированной",{"2":{"316":1}}],["запрошенное",{"2":{"296":1}}],["запрошен",{"2":{"117":1}}],["запросом",{"2":{"473":1}}],["запросов",{"2":{"11":1,"40":1,"53":1,"59":1,"114":1,"117":1,"118":2,"137":1,"138":1,"358":1,"359":1,"439":3,"512":1}}],["запросу",{"2":{"201":1,"359":1,"386":1}}],["запросить",{"2":{"188":1,"367":1}}],["запросами",{"2":{"276":1}}],["запросам",{"2":{"117":1}}],["запроса",{"2":{"114":1,"117":4,"315":1,"352":2,"354":1,"358":1,"359":1,"361":1,"362":2,"363":2,"366":1,"369":1,"425":1,"428":1,"432":1,"435":1,"436":1,"437":2,"439":3,"473":1}}],["запросы",{"2":{"47":1,"53":2,"55":1,"56":1,"59":2,"82":1,"118":1,"135":1,"137":1,"138":1,"280":1,"439":2,"457":2,"473":2}}],["запросе",{"2":{"47":1,"115":2,"439":1}}],["запрос",{"2":{"41":1,"56":1,"59":1,"83":1,"117":3,"135":1,"137":1,"139":1,"223":1,"315":3,"316":1,"360":1,"366":1,"383":1,"430":1,"434":2,"435":1,"437":1,"439":1}}],["запрашивают",{"2":{"336":1}}],["запрашивающий",{"2":{"115":1,"367":1}}],["запрашиваем",{"2":{"367":1}}],["запрашиваемая",{"2":{"364":1}}],["запрашиваемого",{"2":{"117":1,"338":1}}],["запрашиваемому",{"2":{"115":1}}],["запрашивает",{"2":{"117":1,"218":1}}],["запрашивать",{"2":{"116":1}}],["запрещены",{"2":{"115":1}}],["завернуть",{"2":{"302":1}}],["завершится",{"2":{"393":1}}],["завершиться",{"2":{"372":1}}],["завершить",{"2":{"255":3}}],["завершаться",{"2":{"421":1}}],["завершая",{"2":{"393":1}}],["завершают",{"2":{"336":1}}],["завершает",{"2":{"260":1,"376":1}}],["завершена",{"2":{"421":1}}],["завершенного",{"2":{"316":1}}],["завершенные",{"2":{"231":2}}],["завершенных",{"2":{"231":1}}],["завершение",{"2":{"329":1}}],["завершении",{"2":{"301":1}}],["завершению",{"2":{"255":1}}],["завершения",{"2":{"229":1,"301":1,"379":1,"387":1,"421":1,"422":1,"438":1}}],["зависеть",{"2":{"301":1,"363":1}}],["зависанию",{"2":{"301":1}}],["завис",{"2":{"190":1}}],["зависящих",{"2":{"301":1}}],["зависящие",{"2":{"231":1,"462":1}}],["зависящей",{"2":{"179":1}}],["зависят",{"2":{"172":1,"260":1,"308":1}}],["зависимой",{"2":{"282":1,"289":1}}],["зависимое",{"2":{"148":1}}],["зависимость",{"2":{"254":1,"255":2,"284":1,"286":1,"287":3,"288":3,"289":1,"317":1,"383":1,"384":1,"463":1,"465":1,"471":2,"504":1}}],["зависимостями",{"2":{"224":1,"284":1,"305":1}}],["зависимостей",{"0":{"282":1,"465":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"2":{"86":1,"148":1,"163":1,"223":1,"224":2,"241":1,"246":1,"247":1,"248":1,"252":1,"258":1,"260":1,"282":1,"283":1,"284":1,"286":2,"287":3,"288":2,"290":1,"296":1,"325":1,"374":1,"375":1,"460":1,"462":2,"504":1,"537":1}}],["зависимости",{"0":{"247":1},"2":{"23":2,"53":1,"115":1,"119":1,"134":1,"143":1,"148":2,"151":1,"152":1,"156":1,"188":1,"203":1,"223":3,"224":1,"225":1,"231":1,"243":1,"244":1,"249":1,"251":1,"262":1,"272":2,"276":1,"282":1,"283":1,"284":1,"286":2,"287":4,"289":2,"292":1,"294":1,"304":1,"315":1,"336":1,"346":1,"360":1,"370":1,"375":1,"379":1,"383":2,"388":1,"391":1,"421":2,"431":2,"434":1,"438":1,"452":1,"472":1,"473":1,"507":1}}],["зависит",{"2":{"108":1,"117":1,"121":1,"148":1,"149":1,"178":1,"260":1,"286":1,"360":2,"361":1,"366":1,"370":1,"385":1,"395":1,"507":1}}],["завязанные",{"2":{"39":1}}],["закэшировать",{"2":{"473":1}}],["закладывающих",{"2":{"306":1}}],["заключаться",{"2":{"337":1}}],["заключает",{"2":{"271":1}}],["заключается",{"2":{"148":4,"152":1,"160":1,"186":1,"187":2,"188":1,"193":1,"200":1,"203":1,"209":1,"210":1,"211":1,"213":1,"227":1,"229":1,"238":1,"251":1,"256":1,"267":1,"268":1,"270":1,"284":1,"289":2,"293":1,"297":1,"303":1,"306":1,"336":2,"352":2,"365":1,"366":1,"377":1,"378":1,"380":1,"381":1,"382":1,"439":1}}],["заключенного",{"2":{"150":1}}],["заключена",{"2":{"34":1}}],["закрепления",{"2":{"320":1}}],["закрепить",{"2":{"168":1,"304":1,"369":1}}],["закрываем",{"2":{"257":1}}],["закрывать",{"2":{"255":1}}],["закрытый",{"2":{"451":1}}],["закрытых",{"2":{"367":1}}],["закрытым",{"2":{"360":1}}],["закрытие",{"2":{"255":1}}],["закрытия",{"2":{"172":1,"178":1}}],["закрыть",{"2":{"215":2}}],["закодированное",{"2":{"429":1}}],["закодированные",{"2":{"289":1,"361":1}}],["закомитьте",{"2":{"393":1}}],["закоммичен",{"2":{"393":1}}],["закоммитьте",{"2":{"393":1}}],["закоммитили",{"2":{"391":1}}],["закомментируем",{"2":{"112":1}}],["законченный",{"2":{"472":1}}],["закончить",{"2":{"437":1}}],["закончите",{"2":{"400":1}}],["закончила",{"2":{"330":1}}],["закончилась",{"2":{"131":1}}],["закончили",{"2":{"255":1,"319":1}}],["законодательством",{"2":{"360":1}}],["закономерности",{"2":{"219":1}}],["законом",{"2":{"180":1}}],["законе",{"2":{"178":1,"179":1}}],["закона",{"2":{"178":2,"179":2}}],["законы",{"0":{"177":1},"2":{"177":1,"180":1}}],["закон",{"0":{"178":1,"179":1},"2":{"148":1,"178":1,"179":1,"383":1}}],["заканчивается",{"2":{"336":1}}],["заканчивая",{"2":{"76":2,"145":1,"151":1,"205":1,"238":1,"261":1,"263":1,"368":1}}],["заказа",{"2":{"209":2}}],["заказами",{"2":{"59":1}}],["заказчик",{"2":{"464":1,"468":1}}],["заказчика",{"2":{"68":1}}],["заказчиком",{"2":{"9":1,"12":1}}],["заказ",{"2":{"12":1}}],["заказов",{"2":{"12":1,"36":1,"79":1}}],["заказываете",{"2":{"26":1}}],["заказы",{"2":{"4":1,"59":1,"105":1}}],["закупаете",{"2":{"26":1}}],["зато",{"2":{"301":1}}],["затушевывает",{"2":{"243":1}}],["затронуты",{"2":{"433":1}}],["затронуть",{"2":{"355":1}}],["затронуло",{"2":{"127":1}}],["затруднение",{"2":{"344":1}}],["затруднена",{"2":{"330":1}}],["затрудняет",{"2":{"200":1,"323":1,"335":1,"336":1}}],["затраченные",{"2":{"434":1}}],["затрагиваемым",{"2":{"497":1}}],["затрагивает",{"2":{"127":1}}],["затрагивая",{"2":{"391":1,"392":1}}],["затрагивают",{"2":{"119":1}}],["затраты",{"2":{"278":1}}],["затратно",{"2":{"41":1}}],["затратами",{"2":{"40":1,"464":1}}],["затрат",{"2":{"12":1,"308":1,"421":1}}],["затем",{"2":{"6":1,"89":1,"115":1,"116":1,"120":1,"122":1,"123":1,"134":1,"143":1,"150":2,"172":1,"203":2,"211":1,"224":1,"231":1,"240":1,"250":3,"255":2,"258":1,"263":1,"281":2,"283":1,"289":1,"293":2,"299":1,"303":1,"316":4,"330":1,"333":1,"336":1,"338":2,"352":2,"353":1,"359":1,"361":2,"363":1,"364":1,"365":3,"366":1,"367":1,"376":2,"380":1,"381":2,"384":1,"387":1,"393":2,"395":1,"400":1,"419":1,"421":2,"429":2,"432":1,"454":1,"473":3}}],["задумываемся",{"2":{"204":1}}],["задуман",{"2":{"228":1}}],["задумал",{"2":{"181":1,"208":1,"215":1}}],["задуматься",{"2":{"123":1}}],["задает",{"2":{"460":1}}],["задаем",{"2":{"191":1,"435":1}}],["задаст",{"2":{"438":1}}],["зададим",{"2":{"352":1}}],["задаются",{"2":{"224":1}}],["заданными",{"2":{"355":1}}],["заданный",{"2":{"311":1}}],["заданное",{"2":{"376":1}}],["заданного",{"2":{"301":1,"365":1}}],["заданном",{"2":{"150":1}}],["заданному",{"2":{"116":1,"255":1}}],["задания",{"2":{"286":1}}],["заданиями",{"2":{"257":1}}],["заданий",{"2":{"231":1}}],["задание",{"2":{"190":2,"296":1}}],["задавать",{"2":{"435":1}}],["задаваемые",{"2":{"199":1,"497":1}}],["задав",{"2":{"136":1}}],["задать",{"2":{"115":1,"462":2}}],["задачу",{"2":{"231":1,"372":1,"508":1}}],["задачей",{"2":{"352":1,"385":1,"462":1}}],["задаче",{"2":{"229":1,"232":1}}],["задач",{"2":{"14":1,"68":1,"70":1,"103":1,"180":2,"187":1,"190":1,"203":1,"224":1,"229":1,"231":6,"257":1,"263":1,"271":1,"293":1,"294":1,"358":1,"367":1,"425":1,"428":1,"507":3}}],["задачи",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1},"2":{"12":1,"68":1,"79":1,"179":1,"229":2,"231":3,"232":1,"265":1,"271":1,"299":1,"367":1,"370":1,"372":1,"385":1,"421":2,"426":1}}],["задачами",{"2":{"169":1}}],["задача",{"2":{"11":1,"12":1,"172":1,"173":1,"174":1,"197":1,"231":1,"251":1,"300":1,"345":1,"366":1,"373":1,"375":2,"457":1}}],["задержка",{"2":{"430":1}}],["задержкам",{"2":{"244":1}}],["задеплоится",{"2":{"112":1}}],["задействовано",{"2":{"370":1}}],["задействовать",{"0":{"116":1},"2":{"23":1,"473":1}}],["задействуем",{"2":{"17":1}}],["задокументированный",{"2":{"77":1}}],["задокументировать",{"2":{"9":1}}],["за",{"0":{"175":1},"2":{"2":1,"6":1,"41":1,"55":1,"105":1,"112":1,"115":1,"118":1,"123":1,"133":1,"135":1,"147":1,"148":1,"152":1,"156":1,"160":3,"166":1,"171":1,"175":1,"188":1,"192":1,"193":3,"203":3,"209":1,"222":1,"224":1,"225":1,"227":1,"235":1,"237":2,"239":1,"249":1,"258":1,"265":1,"266":1,"267":3,"268":1,"269":1,"270":1,"286":1,"287":1,"291":1,"292":1,"296":1,"300":2,"301":1,"306":1,"316":1,"317":1,"321":1,"325":1,"336":2,"349":1,"352":2,"358":1,"359":1,"360":7,"364":1,"367":2,"373":1,"376":1,"385":1,"391":1,"394":3,"405":2,"409":1,"421":4,"425":1,"432":1,"434":1,"447":2,"457":1,"460":2,"462":6,"463":4,"472":1,"508":1,"536":1,"557":1}}],["тёмной",{"2":{"557":1}}],["тише",{"2":{"457":1}}],["типизировать",{"2":{"447":1}}],["типизированным",{"2":{"265":1}}],["типизируем",{"2":{"23":1}}],["типичными",{"2":{"225":1}}],["типичный",{"2":{"192":1}}],["типичного",{"2":{"192":2}}],["типом",{"2":{"245":1,"310":1}}],["типографика",{"2":{"176":1}}],["типографики",{"2":{"171":1,"173":1,"175":1}}],["типов",{"2":{"123":1,"183":2,"185":1,"249":1,"282":1,"372":1,"421":1,"461":1,"463":1,"555":1}}],["типе",{"2":{"137":1,"306":1}}],["тип",{"2":{"134":1,"137":2,"144":1,"176":1,"245":1,"313":1,"352":1,"355":1,"359":1,"361":3,"390":1,"422":1,"434":2,"437":1,"439":1,"471":1}}],["типу",{"2":{"123":1}}],["типыref",{"2":{"463":1}}],["типы",{"0":{"17":1},"1":{"18":1,"19":1},"2":{"16":1,"26":1,"91":1,"124":1,"134":1,"158":1,"185":1,"198":1,"245":1,"247":1,"323":1,"376":1,"422":1,"463":1,"520":1}}],["типам",{"2":{"171":1}}],["типами",{"2":{"123":1}}],["типах",{"2":{"145":1,"245":1}}],["типа",{"2":{"11":1,"17":2,"55":1,"62":1,"117":1,"144":1,"151":1,"245":1,"247":1,"272":1,"301":1,"344":1,"367":1,"431":1,"434":1,"444":1,"452":1,"455":1,"464":1,"471":3,"472":2,"473":1,"528":1,"555":1}}],["твердые",{"2":{"419":1}}],["творчества",{"2":{"271":1}}],["творческим",{"2":{"241":1}}],["творчески",{"2":{"26":1,"375":1}}],["творческие",{"0":{"26":1}}],["твой",{"2":{"115":1,"116":1,"457":1}}],["твоего",{"2":{"115":1}}],["твоему",{"2":{"115":1,"116":1}}],["твоем",{"2":{"115":1,"457":1}}],["тканей",{"2":{"263":1}}],["тяжеловеса",{"2":{"460":1,"536":1}}],["тяжеловесности",{"2":{"456":1}}],["тяжелые",{"2":{"421":1}}],["тяжелыми",{"2":{"421":1}}],["тяжелым",{"2":{"183":1}}],["тяжесть",{"2":{"143":1}}],["тщательно",{"2":{"181":1,"207":1,"373":1}}],["тщательную",{"2":{"99":1}}],["тысячи",{"2":{"206":1,"300":1}}],["тысяч",{"2":{"134":1,"265":1}}],["ты",{"2":{"89":2,"115":1,"464":1}}],["тупиковой",{"2":{"473":1}}],["ту",{"2":{"231":1,"292":1,"328":1,"375":1}}],["тумблер",{"2":{"184":4}}],["тумблеры",{"0":{"184":1},"2":{"184":1}}],["туда",{"2":{"44":1,"116":1,"151":1,"467":1}}],["туториал",{"2":{"61":1}}],["тут",{"2":{"41":1,"65":1,"85":1,"105":1,"116":1}}],["тэгов",{"2":{"471":1}}],["тэг",{"2":{"23":1,"87":1,"95":1,"100":1,"106":1,"509":1}}],["тэги",{"2":{"16":1,"185":1,"542":1,"552":1}}],["тайлвинде",{"2":{"468":1}}],["таймстемпа",{"2":{"451":1}}],["таймер",{"2":{"430":1}}],["таймера",{"2":{"189":1,"365":1}}],["тайм",{"2":{"174":1,"428":1}}],["тарифы",{"2":{"444":1}}],["тарифных",{"2":{"212":1}}],["тараканов",{"0":{"210":1}}],["таблетками",{"2":{"185":1}}],["таблетки",{"0":{"185":1}}],["таблицу",{"2":{"224":1,"227":1}}],["таблицы",{"2":{"48":1,"59":1,"147":1,"224":1,"227":1,"239":1,"282":1,"344":1}}],["таблиц",{"2":{"47":3,"192":1,"225":1,"433":1}}],["таблицам",{"2":{"50":1,"59":1}}],["таблицами",{"2":{"47":1}}],["таблица",{"2":{"17":1,"123":1,"134":1,"137":1,"226":1,"313":1,"344":1}}],["таблицах",{"2":{"17":2,"47":1,"56":1}}],["таблицей",{"2":{"43":1}}],["таблице",{"2":{"16":1,"48":2,"59":1,"313":1,"344":1}}],["та",{"2":{"174":1,"201":1,"214":1,"364":1}}],["там",{"2":{"29":1,"116":1,"256":1,"325":1,"451":2,"457":1,"461":1,"463":1,"515":1}}],["такая",{"2":{"169":1,"196":1,"211":1,"268":1,"352":1,"360":1,"361":1}}],["таком",{"2":{"244":1}}],["такому",{"2":{"134":1}}],["такого",{"2":{"152":1,"192":1,"207":1,"263":1,"276":1,"287":1,"308":1,"336":1,"344":2,"434":1,"441":1}}],["такова",{"2":{"217":1}}],["таковые",{"2":{"255":1,"358":1}}],["таковыми",{"2":{"471":1}}],["таковым",{"2":{"216":1}}],["таковы",{"2":{"148":1}}],["такового",{"2":{"115":1}}],["такое",{"0":{"271":1,"344":1,"372":1,"385":1},"2":{"115":2,"116":1,"117":1,"118":1,"146":4,"147":1,"148":2,"150":1,"160":1,"168":1,"169":1,"174":1,"204":1,"211":1,"220":2,"240":2,"259":1,"302":1,"305":1,"306":1,"308":1,"320":2,"341":2,"344":2,"367":1,"397":2,"421":2,"425":1,"426":1,"441":1,"442":1,"451":1,"461":1,"462":1,"463":1,"464":1,"471":1,"473":1}}],["такой",{"2":{"17":1,"138":1,"144":1,"152":1,"169":1,"189":1,"196":2,"205":1,"207":1,"209":1,"235":1,"246":1,"250":1,"264":1,"265":1,"286":1,"290":1,"303":1,"308":1,"328":1,"353":1,"361":1,"378":1,"381":1,"382":1,"424":1,"473":1}}],["такую",{"2":{"97":1,"150":1,"326":1,"359":1,"361":1,"385":1}}],["также",{"2":{"63":1,"99":1,"100":1,"105":1,"112":1,"115":3,"116":1,"119":3,"120":1,"127":2,"128":2,"133":1,"134":3,"139":1,"143":1,"144":4,"145":2,"147":2,"148":3,"151":3,"152":1,"153":2,"159":2,"160":2,"166":1,"169":1,"175":2,"176":1,"178":1,"180":1,"181":2,"184":1,"187":1,"199":1,"205":1,"218":1,"219":2,"222":2,"224":5,"226":1,"228":2,"230":1,"231":8,"232":1,"233":3,"235":1,"245":1,"247":2,"249":2,"251":1,"254":1,"255":1,"256":2,"258":1,"261":1,"264":1,"265":2,"267":1,"270":1,"271":1,"276":1,"280":1,"281":1,"286":2,"289":1,"291":2,"293":3,"295":1,"296":2,"297":1,"298":1,"299":2,"300":1,"302":1,"303":2,"306":1,"308":1,"310":1,"313":1,"315":1,"316":2,"317":1,"318":3,"319":1,"323":1,"325":3,"326":1,"328":2,"330":1,"331":2,"333":1,"336":5,"339":2,"340":1,"342":1,"344":1,"347":3,"349":5,"352":2,"353":2,"355":7,"358":1,"360":1,"361":4,"362":1,"364":1,"365":2,"367":5,"368":3,"373":2,"375":1,"376":1,"378":1,"381":2,"382":1,"383":2,"384":1,"385":1,"386":1,"391":3,"393":1,"394":3,"395":1,"396":3,"400":2,"402":1,"412":1,"414":1,"415":2,"419":4,"421":2,"423":1,"425":1,"427":1,"428":2,"429":1,"431":2,"432":1,"433":1,"434":2,"439":3,"440":2,"444":1,"447":1,"455":1,"457":1,"461":1,"462":2,"463":2,"466":1,"471":2,"472":5,"473":1,"495":1,"501":1,"508":1,"548":1}}],["таки",{"2":{"59":1,"472":1,"473":1}}],["такие",{"2":{"43":1,"62":1,"69":1,"82":1,"128":1,"134":2,"148":1,"158":2,"171":1,"172":1,"189":1,"198":1,"209":2,"225":1,"236":1,"244":2,"245":1,"247":1,"249":2,"261":1,"300":1,"359":1,"367":2,"368":1,"376":1,"381":1,"391":1,"394":1,"434":1,"508":1}}],["такими",{"2":{"171":1,"189":1,"227":1,"249":1,"263":1,"267":1,"344":1,"402":1,"512":1}}],["таким",{"2":{"17":1,"36":1,"48":1,"53":1,"115":2,"116":1,"126":1,"149":1,"150":1,"157":1,"171":1,"173":1,"175":1,"198":1,"211":1,"212":1,"226":1,"228":1,"231":1,"243":1,"246":1,"247":1,"250":1,"281":2,"287":1,"295":1,"298":1,"303":1,"316":1,"323":1,"345":1,"349":1,"353":1,"358":1,"361":1,"375":1,"378":1,"379":1,"381":1,"394":1,"422":1,"433":1,"435":1,"471":1}}],["таких",{"2":{"2":1,"4":1,"22":1,"67":1,"143":1,"171":1,"172":1,"177":1,"180":1,"182":1,"183":1,"190":1,"193":2,"205":1,"209":1,"225":2,"251":1,"265":1,"303":2,"308":1,"315":1,"330":1,"336":1,"344":1,"349":1,"352":1,"359":2,"361":2,"370":1,"376":1,"377":1,"385":1,"391":1}}],["так",{"0":{"121":1},"2":{"9":2,"11":1,"14":1,"16":1,"22":1,"26":2,"32":1,"44":1,"62":1,"63":1,"78":1,"95":1,"97":1,"102":1,"103":1,"104":1,"114":1,"115":1,"118":1,"119":1,"126":1,"135":1,"143":1,"147":1,"148":1,"149":2,"152":3,"156":2,"166":1,"169":1,"171":2,"174":1,"178":1,"179":1,"180":1,"185":1,"189":1,"196":1,"201":1,"204":2,"211":1,"216":1,"221":2,"222":2,"223":1,"224":3,"225":1,"226":1,"227":3,"228":2,"230":1,"231":4,"232":1,"234":1,"244":1,"249":4,"250":1,"255":2,"263":1,"265":1,"268":2,"270":1,"271":1,"289":1,"290":1,"292":1,"297":3,"301":1,"303":1,"304":1,"305":2,"306":1,"308":3,"318":1,"319":1,"326":1,"329":1,"330":3,"332":1,"335":1,"336":2,"337":1,"339":1,"344":3,"360":2,"361":2,"363":1,"364":1,"365":2,"367":1,"372":1,"373":1,"375":2,"376":2,"377":1,"378":1,"379":1,"381":2,"383":1,"386":2,"390":1,"391":1,"393":1,"421":2,"423":1,"425":1,"428":1,"431":1,"434":2,"435":1,"437":1,"439":2,"451":3,"455":1,"457":1,"460":1,"461":1,"463":3,"472":4,"473":3,"497":2,"507":1,"509":1,"511":1,"539":2,"545":1}}],["теcты",{"2":{"461":1}}],["телеграм",{"0":{"498":1},"2":{"497":1}}],["теле",{"2":{"439":1}}],["телефонную",{"2":{"366":1}}],["телефона",{"2":{"365":1,"366":1}}],["телефон",{"2":{"365":1}}],["телефоны",{"2":{"308":1}}],["телодвижения",{"2":{"115":1}}],["тело",{"2":{"89":1,"333":1}}],["теоретическая",{"2":{"427":1}}],["теоретические",{"2":{"221":1,"464":1}}],["теоретически",{"2":{"148":1,"222":1,"336":1,"381":1}}],["теории",{"2":{"301":2}}],["тесно",{"2":{"446":1}}],["тесной",{"2":{"313":1,"447":1}}],["тесную",{"2":{"289":1}}],["тестируем",{"2":{"438":1}}],["тестируемый",{"2":{"375":1}}],["тестирующее",{"2":{"372":1}}],["тестироваться",{"2":{"379":1}}],["тестировать",{"0":{"373":1},"2":{"372":1,"373":2,"378":1}}],["тестированию",{"2":{"370":1,"378":1}}],["тестировании",{"2":{"344":1,"377":1,"381":1,"382":1}}],["тестированием",{"2":{"145":1,"461":2}}],["тестирование",{"0":{"72":1,"314":1,"318":1,"370":1,"372":1,"382":1,"415":1,"461":1},"1":{"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"67":1,"72":1,"143":1,"222":1,"224":1,"370":1,"372":4,"373":1,"381":1,"395":1,"397":1,"439":1,"461":2}}],["тестирования",{"0":{"438":1},"1":{"439":1},"2":{"55":1,"71":1,"116":1,"241":1,"318":1,"367":1,"370":1,"372":5,"373":4,"374":2,"375":2,"376":1,"377":1,"378":1,"379":3,"380":1,"384":1,"385":1,"397":2,"400":1,"415":1,"419":2,"436":1,"438":1,"440":1,"442":1,"451":1,"461":2,"503":1,"545":1}}],["тестам",{"2":{"463":1}}],["тестами",{"2":{"383":2}}],["теста",{"2":{"372":1,"375":1,"380":2}}],["тест",{"2":{"318":1,"372":1,"376":3,"378":1,"381":1,"436":1,"472":1}}],["тестовая",{"2":{"376":1}}],["тестовую",{"2":{"376":1}}],["тестовыми",{"2":{"376":1,"384":1}}],["тестовые",{"2":{"375":1,"382":1,"415":1}}],["тестовый",{"2":{"374":2,"375":4,"377":1,"379":1,"382":2,"384":1,"430":1,"436":1,"437":2}}],["тестовых",{"2":{"144":1,"373":1,"375":1,"376":2}}],["тестовое",{"2":{"430":1}}],["тестового",{"2":{"370":1,"372":2,"373":1,"376":1,"384":1}}],["тестовой",{"2":{"370":1,"380":2}}],["тестов",{"2":{"318":1,"370":2,"372":2,"373":1,"374":1,"375":3,"376":10,"380":1,"381":2,"384":1,"396":1,"461":3}}],["тесты",{"2":{"72":1,"318":1,"372":1,"375":1,"376":3,"378":2,"379":1,"381":1,"382":4,"384":1,"395":1,"461":7,"473":1}}],["тень",{"2":{"464":1}}],["тенденции",{"2":{"471":1}}],["тенденцию",{"2":{"265":1,"385":1}}],["тенденция",{"2":{"208":1}}],["теневым",{"2":{"207":1}}],["тегом",{"2":{"352":1,"393":1}}],["тегов",{"2":{"185":1,"249":1,"298":1}}],["теги",{"0":{"185":1},"2":{"249":1}}],["теге",{"2":{"153":1,"225":1}}],["тег",{"2":{"149":1,"151":3,"152":1,"224":1,"225":2,"227":1,"243":1,"297":1,"333":1,"352":1}}],["тегами",{"2":{"249":1}}],["тега",{"2":{"149":2,"224":1,"226":1}}],["течение",{"2":{"134":1,"152":1,"336":2,"365":1,"366":1,"421":1}}],["течением",{"2":{"125":1,"250":1}}],["тексты",{"2":{"365":1}}],["тексте",{"2":{"322":1,"393":1}}],["текстом",{"2":{"195":1,"222":1,"227":1}}],["текстов",{"0":{"415":1},"2":{"222":1,"224":2,"235":1,"384":1,"385":1}}],["текстовые",{"2":{"327":1,"344":1}}],["текстовых",{"2":{"307":1,"365":1}}],["текстовым",{"2":{"190":1}}],["текстовый",{"2":{"151":1,"174":1,"188":1,"222":1,"391":1,"473":1}}],["текстового",{"2":{"198":1,"365":1}}],["текстовом",{"2":{"186":1}}],["текстовое",{"2":{"91":1,"473":1}}],["текстовую",{"2":{"183":1}}],["текстовая",{"2":{"134":1}}],["текстами",{"0":{"386":1}}],["текста",{"2":{"173":1,"183":1,"191":1,"228":1,"231":3,"257":1,"303":1,"376":1,"431":1,"536":1}}],["текст",{"2":{"158":1,"183":1,"185":1,"186":1,"201":1,"208":1,"257":1,"353":1,"361":1,"380":1,"446":1,"473":2}}],["текущим",{"2":{"250":1}}],["текущий",{"2":{"223":1,"232":1,"256":1,"357":1}}],["текущей",{"2":{"367":1,"390":1,"392":3,"393":2,"451":1,"460":1,"501":1}}],["текущего",{"2":{"198":1,"254":1,"255":2,"367":1}}],["текущее",{"2":{"190":1,"196":1,"358":1}}],["текущему",{"2":{"152":1,"255":1,"358":1,"386":1}}],["текущем",{"2":{"56":1,"223":1,"316":1,"355":1,"358":1}}],["текущую",{"2":{"187":1,"223":1}}],["текущая",{"2":{"80":1}}],["тебе",{"2":{"89":1,"464":1}}],["теряете",{"2":{"463":1}}],["термины",{"2":{"397":1}}],["терминологией",{"2":{"148":1}}],["терминов",{"2":{"148":1,"361":1}}],["термина",{"2":{"171":1}}],["терминала",{"2":{"222":1,"223":1,"390":2,"438":1}}],["терминал",{"2":{"143":1,"222":1,"387":1}}],["терминалом",{"2":{"137":1}}],["терминале",{"2":{"136":1,"223":3,"231":1,"317":1,"326":1,"346":1,"389":2,"393":1,"434":1}}],["терминами",{"2":{"131":2,"148":1,"219":1}}],["терминах",{"2":{"68":1}}],["термин",{"2":{"96":1,"133":1,"203":1,"306":1,"308":1}}],["терпимая",{"2":{"86":1}}],["те",{"2":{"85":1,"137":1,"153":1,"227":1,"243":1,"252":1,"254":1,"261":1,"292":1,"297":1,"304":1,"323":1,"344":1,"350":1,"357":1,"383":1,"385":1,"445":2}}],["техноологии",{"2":{"460":1}}],["технологиями",{"2":{"402":1}}],["технологиям",{"2":{"344":1}}],["технология",{"2":{"300":1,"308":1,"344":1,"421":1,"440":1,"442":1}}],["технологии",{"2":{"147":1,"250":1,"260":1,"306":1,"308":2,"344":2,"367":1,"401":1,"455":1,"472":2}}],["технологий",{"2":{"147":1,"300":2,"306":2,"308":4,"319":1,"344":3,"359":1,"367":3,"395":1,"507":1}}],["технического",{"2":{"470":1,"472":1}}],["техническим",{"2":{"69":1}}],["технический",{"0":{"23":1}}],["технически",{"2":{"12":1,"36":1}}],["технические",{"0":{"132":1,"170":1,"222":1,"236":1,"307":1,"322":1,"343":1,"371":1,"420":1},"2":{"9":1}}],["техник",{"2":{"508":1}}],["техника",{"2":{"193":2}}],["технику",{"2":{"193":1}}],["техники",{"2":{"170":1,"260":1,"432":1}}],["тех",{"2":{"64":1,"142":1,"148":1,"160":1,"183":1,"197":1,"210":1,"224":1,"238":1,"241":2,"243":1,"264":1,"270":1,"284":1,"301":1,"303":1,"311":1,"329":1,"344":1,"352":2,"365":1,"367":1,"379":1,"386":1,"421":1,"473":1}}],["теперь",{"0":{"122":1},"2":{"41":1,"82":1,"83":1,"86":1,"91":1,"95":1,"102":1,"112":2,"119":1,"120":2,"122":1,"124":1,"125":1,"126":2,"127":1,"128":1,"136":2,"143":2,"148":1,"152":3,"160":1,"193":1,"222":1,"224":2,"225":1,"226":2,"227":1,"230":1,"231":3,"238":1,"244":1,"246":2,"249":2,"251":1,"255":1,"256":1,"283":1,"284":1,"295":1,"297":2,"300":3,"302":2,"303":3,"308":1,"315":2,"321":1,"324":1,"334":1,"338":1,"339":1,"342":1,"344":3,"349":1,"350":1,"352":2,"355":1,"358":1,"364":1,"372":1,"374":1,"379":2,"380":1,"382":1,"391":1,"393":2,"421":1,"427":2,"428":1,"430":1,"436":1,"439":1}}],["темой",{"2":{"249":1,"315":1}}],["темам",{"2":{"497":1}}],["тема",{"2":{"225":1,"314":1,"335":1,"543":1,"557":1}}],["темная",{"2":{"206":1,"210":1,"211":1,"543":1}}],["темный",{"2":{"209":1,"308":1}}],["темные",{"0":{"207":1},"1":{"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1},"2":{"207":1,"220":1}}],["темными",{"2":{"216":1}}],["темным",{"2":{"181":1}}],["темных",{"2":{"169":1,"206":1,"218":1,"219":1}}],["темном",{"2":{"218":1}}],["темно",{"2":{"173":1}}],["теми",{"2":{"147":1,"171":1,"289":1,"439":1}}],["тему",{"2":{"118":1,"135":1,"143":1,"180":1,"249":1,"344":1,"372":1,"461":1}}],["теме",{"2":{"115":1,"117":1,"143":1,"271":1,"385":1,"394":1,"463":1}}],["темы",{"0":{"557":1},"2":{"78":1,"145":1,"147":1,"321":1,"367":1,"419":2,"446":2,"464":1,"506":1,"508":1,"545":1,"557":2}}],["тем",{"2":{"2":1,"6":1,"39":1,"118":2,"136":1,"137":1,"148":2,"150":1,"151":1,"152":2,"158":1,"178":1,"190":1,"204":1,"223":1,"224":1,"227":1,"230":1,"269":1,"291":1,"296":1,"300":1,"301":1,"302":1,"303":1,"316":1,"336":1,"355":2,"361":1,"367":1,"369":1,"372":1,"381":1,"393":2,"425":1,"432":1,"433":1,"439":1,"463":1,"507":1,"543":1,"557":3}}],["трагедия",{"2":{"471":1}}],["трафика",{"2":{"308":1}}],["традиционными",{"2":{"344":1}}],["традиционным",{"2":{"303":1}}],["традиционно",{"2":{"151":1,"186":1,"281":1,"303":1,"360":1}}],["традиционном",{"2":{"148":1,"308":1}}],["традиции",{"2":{"227":1}}],["тратить",{"2":{"179":1,"270":1}}],["траекторию",{"2":{"130":1}}],["транзакционной",{"2":{"336":1}}],["транзакционность",{"2":{"17":1}}],["транспорт",{"2":{"511":1}}],["транспортного",{"2":{"511":1}}],["транспортной",{"2":{"83":1}}],["транспортные",{"2":{"118":1,"472":1}}],["транспортным",{"2":{"114":1}}],["транспиляции",{"2":{"455":1}}],["трансформация",{"2":{"203":1}}],["трансформацию",{"2":{"147":1}}],["труднее",{"2":{"269":1}}],["трудночитаемый",{"2":{"270":1}}],["трудно",{"2":{"152":1,"172":1,"222":1,"265":1,"383":1}}],["трудности",{"2":{"228":1}}],["трудностями",{"2":{"148":1}}],["трудностей",{"2":{"118":1}}],["трудозатратней",{"2":{"473":1}}],["трудозатратам",{"2":{"473":1}}],["трудов",{"2":{"223":1}}],["трудоемко",{"2":{"12":1}}],["труда",{"2":{"59":1}}],["трем",{"2":{"320":1}}],["тремя",{"2":{"189":1,"303":1,"429":1}}],["трехуровневая",{"2":{"353":1}}],["трехуровневых",{"2":{"6":1}}],["трех",{"2":{"195":1,"200":1,"369":1,"428":2}}],["трехмесячные",{"2":{"169":1}}],["третьего",{"2":{"366":1}}],["третьей",{"2":{"239":1,"361":1}}],["третье",{"2":{"232":1}}],["третьему",{"2":{"105":1}}],["третий",{"2":{"67":1,"244":1}}],["требовать",{"2":{"286":1}}],["требоваться",{"2":{"192":1}}],["требование",{"2":{"309":1}}],["требованием",{"2":{"144":1}}],["требованиях",{"2":{"372":2}}],["требованиями",{"2":{"137":1,"231":1,"372":1,"440":1}}],["требованиям",{"2":{"69":1,"237":1,"241":1,"308":1,"318":1,"320":1,"372":1,"402":1}}],["требования",{"0":{"77":1,"78":1,"132":1,"170":1,"222":1,"236":1,"307":1,"322":1,"343":1,"371":1,"420":1},"2":{"68":1,"137":1,"234":1,"236":1,"309":1,"370":1,"373":1,"402":1,"471":1,"473":1}}],["требований",{"2":{"67":1,"69":1,"115":1,"370":1,"371":1,"402":1,"420":1,"431":1}}],["требуемого",{"2":{"434":1,"504":1}}],["требуемой",{"2":{"225":1,"434":1}}],["требуеться",{"2":{"455":1}}],["требует",{"2":{"118":1,"130":1,"131":2,"138":1,"224":1,"260":1,"308":1,"310":1,"313":1,"316":1,"344":1,"349":1,"366":1,"372":1,"390":1,"440":1,"455":1}}],["требуется",{"2":{"116":1,"120":1,"122":1,"137":1,"179":1,"241":1,"248":1,"434":2,"446":1}}],["требующее",{"2":{"187":1}}],["требующий",{"2":{"102":1,"349":1}}],["требующих",{"2":{"17":1,"188":1,"190":1}}],["требуются",{"2":{"460":1,"536":1}}],["требуют",{"2":{"160":1,"210":1,"421":1,"444":1}}],["тривиален",{"2":{"364":1}}],["тривиальными",{"2":{"365":1}}],["тривиальность",{"2":{"365":1,"376":1}}],["тривиально",{"2":{"352":1}}],["тривиального",{"2":{"152":1,"323":1}}],["тривиальную",{"2":{"189":1}}],["тривиальна",{"2":{"140":1,"185":1,"190":1,"315":1,"355":1,"366":1,"426":1,"437":1}}],["триггерного",{"2":{"315":1}}],["триггерную",{"2":{"201":1}}],["три",{"2":{"7":1,"11":1,"56":1,"103":2,"151":1,"198":4,"224":1,"225":1,"265":1,"295":1,"296":1,"299":1,"303":1,"323":1,"338":1,"361":2,"367":1,"374":1,"376":1,"428":1,"437":1,"451":2,"555":1}}],["т",{"0":{"240":1},"2":{"4":1,"38":1,"68":2,"109":1,"116":1,"119":1,"120":1,"124":1,"133":1,"148":1,"149":1,"151":1,"152":2,"158":1,"160":1,"171":5,"175":2,"180":2,"184":1,"186":1,"187":1,"188":2,"192":2,"205":1,"222":1,"224":3,"227":1,"249":1,"250":1,"257":2,"263":1,"288":1,"291":1,"295":1,"298":1,"303":1,"308":3,"310":1,"311":1,"312":1,"323":1,"344":3,"349":1,"358":1,"359":1,"360":1,"364":1,"365":1,"366":2,"370":1,"372":3,"373":1,"376":3,"378":1,"379":1,"391":1,"392":1,"395":1,"421":1,"422":1,"434":1,"461":1,"464":1,"469":1,"473":1,"496":1,"506":2,"507":1,"508":4}}],["торопитесь",{"2":{"465":1}}],["тормозит",{"2":{"464":1}}],["тормозящим",{"2":{"421":1}}],["торвальдс",{"2":{"386":1}}],["торвальдсом",{"2":{"386":1}}],["торговые",{"2":{"148":1,"189":1}}],["толку",{"2":{"213":1,"302":1,"375":1}}],["только",{"2":{"4":1,"16":1,"22":1,"23":2,"34":1,"39":1,"41":3,"53":1,"58":1,"59":1,"71":1,"74":1,"85":1,"86":1,"91":1,"92":1,"95":1,"97":1,"102":1,"103":1,"105":1,"108":1,"115":2,"116":1,"117":2,"119":1,"123":2,"127":1,"134":3,"144":1,"148":1,"149":1,"150":1,"151":1,"152":2,"154":2,"156":1,"161":1,"171":1,"174":1,"175":2,"178":1,"183":1,"184":1,"188":1,"191":1,"197":1,"199":3,"203":2,"217":1,"223":4,"225":1,"227":4,"228":3,"230":2,"231":4,"232":4,"234":1,"239":2,"243":1,"244":1,"245":1,"247":1,"255":1,"256":2,"257":2,"260":1,"265":1,"266":2,"268":2,"270":1,"277":1,"278":1,"294":1,"303":2,"308":1,"315":4,"316":2,"319":1,"323":2,"330":1,"331":2,"336":5,"338":1,"344":1,"349":1,"352":4,"354":1,"355":4,"361":3,"365":1,"367":1,"376":1,"381":1,"383":1,"384":1,"393":1,"420":1,"421":1,"425":2,"433":1,"434":1,"435":1,"442":1,"446":1,"454":1,"457":3,"460":2,"462":1,"463":4,"468":1,"471":2,"472":1,"501":1,"504":2}}],["тостах",{"2":{"188":1}}],["тостер",{"2":{"504":1}}],["тосте",{"2":{"188":1}}],["тостовое",{"2":{"188":2}}],["тостовые",{"0":{"188":1}}],["тонкая",{"2":{"508":1}}],["тонкую",{"2":{"457":1}}],["тонкостей",{"2":{"169":1}}],["тонкий",{"2":{"152":2,"228":1,"317":1}}],["той",{"2":{"134":1,"135":1,"156":1,"175":1,"215":1,"231":1,"263":1,"269":1,"270":1,"297":1,"315":1,"336":2,"345":1,"373":1,"385":1,"394":1,"421":1,"451":1,"463":1,"507":1}}],["тобой",{"2":{"116":1}}],["токены",{"2":{"364":1,"446":1}}],["токенов",{"2":{"361":1,"364":1}}],["токеном",{"2":{"115":1}}],["токенами",{"2":{"361":2}}],["токена",{"2":{"115":2,"361":5}}],["токенах",{"2":{"115":2,"545":1}}],["токену",{"2":{"115":1}}],["токен",{"2":{"115":7,"361":3,"364":1,"496":2}}],["тот",{"2":{"41":1,"123":1,"124":1,"125":1,"148":2,"152":1,"186":1,"213":1,"268":1,"280":1,"290":1,"295":3,"296":1,"297":2,"298":1,"299":1,"300":1,"302":1,"303":1,"308":1,"333":3,"336":1,"338":1,"361":1,"362":1,"367":2,"379":1,"424":1,"462":1,"472":1}}],["тоже",{"2":{"16":1,"43":1,"48":1,"112":1,"195":1,"462":1,"473":1}}],["точек",{"2":{"336":1,"361":1,"438":1}}],["точечной",{"2":{"189":1}}],["точка",{"2":{"203":1,"223":1,"224":1,"253":1,"310":1,"435":1,"439":1,"473":1}}],["точками",{"2":{"134":1,"203":1,"434":1}}],["точке",{"2":{"137":1,"269":1,"434":1}}],["точкой",{"2":{"134":2,"187":1,"224":1,"238":1,"306":1,"361":2,"427":2}}],["точку",{"2":{"119":1,"149":1,"173":2,"223":2,"237":1,"281":1,"293":1,"360":1,"362":1,"363":1,"366":2,"425":1}}],["точки",{"0":{"187":1},"2":{"11":1,"22":1,"103":1,"123":1,"151":1,"171":1,"173":1,"198":2,"224":1,"301":1,"335":1,"394":1,"425":3,"439":1,"440":1,"463":3,"496":1}}],["точное",{"2":{"192":1}}],["точностью",{"2":{"172":1}}],["точно",{"2":{"89":1,"105":1,"117":1,"166":1,"297":1,"330":1,"370":1,"376":1}}],["точней",{"2":{"4":1,"473":1}}],["томасу",{"2":{"268":1}}],["тому",{"2":{"203":1,"208":1,"267":1,"270":1,"344":1,"367":1,"368":1,"394":1,"423":1}}],["том",{"2":{"7":1,"13":1,"22":1,"25":2,"68":2,"102":1,"125":1,"136":1,"144":1,"145":1,"147":1,"148":4,"149":1,"150":1,"152":1,"156":1,"169":1,"171":1,"178":2,"186":1,"187":1,"190":1,"199":1,"200":1,"203":1,"209":1,"210":1,"211":1,"219":1,"224":2,"227":1,"231":1,"232":1,"238":1,"241":1,"246":1,"251":1,"256":1,"266":1,"268":1,"270":2,"271":1,"284":1,"289":1,"294":1,"296":2,"300":1,"303":1,"306":1,"308":1,"315":2,"321":1,"336":3,"352":1,"365":1,"366":1,"367":1,"373":1,"375":1,"377":1,"378":1,"381":1,"382":1,"383":2,"393":1,"419":1,"421":1,"425":1,"427":1,"432":2,"435":1,"439":1,"463":1,"473":1,"508":1}}],["тогдашний",{"2":{"126":1}}],["тогда",{"2":{"3":1,"44":1,"104":1,"114":1,"139":1,"159":1,"290":1,"297":1,"303":1,"326":1,"361":1,"421":1}}],["того",{"2":{"2":1,"7":1,"22":1,"43":1,"69":1,"102":1,"112":1,"115":1,"118":1,"123":1,"130":1,"134":1,"135":1,"136":1,"148":2,"149":1,"152":7,"159":1,"168":1,"171":1,"172":1,"179":1,"182":1,"186":1,"191":1,"192":1,"198":1,"216":1,"223":2,"225":1,"227":1,"228":1,"231":2,"238":1,"241":2,"247":1,"249":2,"255":1,"256":1,"258":2,"260":2,"263":1,"264":1,"266":1,"269":1,"281":1,"285":1,"286":1,"288":1,"292":3,"293":1,"294":1,"296":1,"297":1,"302":1,"303":1,"308":5,"313":1,"314":1,"315":5,"316":1,"323":1,"325":1,"330":1,"333":1,"338":1,"339":1,"341":1,"345":1,"346":1,"349":1,"352":2,"358":1,"366":1,"367":1,"370":1,"372":1,"373":1,"374":1,"379":1,"382":1,"386":1,"387":1,"390":2,"391":1,"396":1,"400":1,"416":1,"419":1,"421":3,"424":1,"425":1,"428":1,"433":1,"439":1,"445":1,"451":3,"455":2,"462":1,"463":1,"465":1,"473":3,"527":1,"534":1}}],["то",{"2":{"3":2,"9":1,"12":2,"17":1,"23":3,"26":2,"30":1,"33":1,"35":3,"40":2,"41":2,"48":1,"59":3,"61":1,"62":1,"76":1,"93":1,"95":1,"97":2,"102":1,"109":1,"115":4,"116":3,"122":2,"123":1,"125":1,"127":1,"134":2,"135":3,"136":2,"137":1,"141":1,"144":2,"148":7,"150":1,"151":2,"152":3,"154":2,"155":1,"160":1,"168":2,"169":2,"172":2,"174":3,"175":1,"176":1,"178":2,"180":1,"181":4,"187":1,"189":2,"190":1,"192":1,"195":1,"198":1,"205":2,"208":1,"210":1,"211":1,"216":1,"218":1,"220":1,"222":1,"223":5,"224":1,"225":1,"226":1,"227":3,"228":1,"230":1,"231":2,"232":1,"237":1,"238":1,"239":2,"243":1,"246":1,"247":1,"249":2,"255":1,"256":1,"263":1,"265":1,"267":4,"268":3,"270":4,"271":1,"280":1,"281":1,"282":1,"284":3,"286":1,"287":2,"294":1,"295":5,"296":3,"297":3,"301":1,"303":1,"308":3,"316":3,"317":1,"318":1,"323":4,"326":1,"327":1,"328":6,"330":3,"331":1,"332":1,"334":1,"335":1,"337":1,"338":2,"339":1,"342":1,"344":2,"346":1,"349":2,"352":2,"355":1,"358":2,"360":1,"361":5,"366":1,"367":1,"372":1,"373":1,"375":4,"376":1,"377":1,"379":2,"382":2,"385":1,"390":2,"402":1,"421":10,"422":3,"426":2,"429":1,"430":2,"434":2,"444":1,"445":1,"447":2,"451":1,"455":1,"457":1,"460":2,"461":4,"462":1,"463":5,"464":2,"466":2,"472":4,"473":6,"507":1,"528":2,"536":1}}],["товару",{"2":{"205":1}}],["товаров",{"0":{"38":1,"107":1},"1":{"108":1,"109":1},"2":{"4":1,"22":1,"30":1,"31":1,"41":1,"47":1,"56":1,"79":2,"82":1,"83":1,"95":1,"102":1,"108":2,"189":1,"445":1}}],["товаре",{"2":{"4":1,"31":1,"56":1,"82":1,"83":1}}],["товары",{"2":{"4":1,"7":1,"16":1,"102":1,"209":2}}],["товар",{"0":{"16":1},"2":{"3":2,"16":2,"102":1,"205":1,"209":2}}],["товарам",{"2":{"47":1,"79":1,"95":1}}],["товарами",{"2":{"3":1,"43":1}}],["товара",{"0":{"102":1},"2":{"3":3,"4":2,"7":1,"16":2,"17":1,"22":1,"30":1,"47":2,"48":1,"83":1,"102":1,"108":1,"109":1,"115":1,"214":1,"445":1,"473":1}}],["мгновений",{"2":{"434":1}}],["мгновенную",{"2":{"391":1}}],["мб",{"2":{"336":2}}],["мучается",{"2":{"468":1}}],["мутировать",{"2":{"265":1}}],["мутный",{"2":{"10":1}}],["мусора",{"2":{"267":1}}],["мусор",{"2":{"160":1}}],["многим",{"2":{"270":1}}],["многих",{"2":{"166":1,"169":1,"179":1,"188":1,"201":1,"209":1,"226":1,"228":1,"265":1,"358":1,"370":1,"421":1,"507":1}}],["многие",{"2":{"125":1,"207":1,"267":1,"346":1,"444":1,"457":1,"464":1,"472":1}}],["многолетним",{"2":{"473":1}}],["многолетние",{"2":{"169":1}}],["многопоточной",{"2":{"462":1}}],["многопоточности",{"2":{"414":1}}],["многопоточность",{"0":{"414":1,"419":1},"1":{"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":1,"429":1,"430":1,"431":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1},"2":{"268":1,"271":1,"294":1,"300":1,"306":1,"336":2,"359":1,"419":1,"420":1,"440":1}}],["многопоточным",{"2":{"400":1}}],["многоплатформенностью",{"2":{"308":1}}],["многостраничные",{"2":{"344":1}}],["многостраничное",{"2":{"308":1}}],["многословны",{"2":{"335":1}}],["многословным",{"2":{"303":1,"316":1,"390":1}}],["многословно",{"2":{"295":1,"303":1,"325":1}}],["многословность",{"2":{"152":1}}],["многословной",{"2":{"152":1}}],["многословен",{"2":{"152":1,"303":1}}],["многочисленные",{"2":{"278":1}}],["многочисленных",{"2":{"229":1}}],["многого",{"2":{"268":1}}],["многоцелевые",{"2":{"265":1}}],["многом",{"2":{"149":1,"260":1}}],["многократно",{"2":{"148":1,"150":1,"235":1,"241":1,"427":1}}],["много",{"2":{"63":1,"67":1,"93":1,"115":1,"116":1,"117":1,"125":1,"134":1,"227":1,"228":1,"255":1,"263":1,"265":1,"295":1,"330":1,"333":1,"421":3,"424":1,"434":1,"452":1,"456":1,"457":1,"460":1,"462":1,"507":1,"536":1}}],["многое",{"2":{"26":1,"140":1,"148":1,"239":1,"242":1,"257":1,"367":1,"394":1}}],["множественного",{"2":{"460":1}}],["множественном",{"2":{"355":1}}],["множественность",{"2":{"329":1}}],["множестве",{"2":{"349":1}}],["множество",{"2":{"134":1,"142":1,"143":1,"183":1,"189":1,"196":1,"226":1,"237":1,"238":1,"239":1,"252":1,"256":1,"264":1,"272":1,"279":1,"284":1,"353":1,"361":2,"367":2,"369":1,"372":1,"373":1,"376":1,"385":1,"425":1,"431":1,"434":1,"457":2,"462":1,"473":1}}],["множеством",{"2":{"85":1,"137":1,"223":1,"227":1,"319":1,"360":1,"386":1}}],["множества",{"2":{"16":1,"203":1,"263":1}}],["мнению",{"2":{"441":1}}],["мнение",{"2":{"223":1,"497":1}}],["мнения",{"2":{"189":1}}],["мне",{"2":{"22":1,"108":1}}],["мягкое",{"2":{"336":1}}],["мягкие",{"2":{"19":1}}],["мягкая",{"2":{"18":1}}],["м",{"2":{"16":1}}],["мидл",{"2":{"464":1}}],["микрософт",{"2":{"473":1}}],["микросервисов",{"2":{"464":1}}],["микросервиса",{"2":{"462":1}}],["микро",{"2":{"457":1}}],["миксинов",{"2":{"152":1,"250":1}}],["миксины",{"0":{"250":1},"1":{"251":1},"2":{"152":2,"250":1,"460":4}}],["миллисекундах",{"2":{"244":1}}],["миллисекунд",{"2":{"244":1}}],["миллисекунды",{"2":{"223":1,"421":1}}],["миллионами",{"2":{"134":1}}],["миллионов",{"2":{"48":1,"63":1}}],["мир",{"2":{"471":1}}],["мира",{"2":{"394":1}}],["миру",{"2":{"385":1,"473":1}}],["миров",{"2":{"308":1}}],["миром",{"2":{"3":1,"34":1}}],["мире",{"2":{"125":1,"150":1,"297":1,"386":1,"402":1}}],["миграции",{"2":{"119":2,"125":1,"152":1,"335":1,"418":1}}],["миграция",{"0":{"119":1,"418":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1},"2":{"152":1}}],["минут",{"2":{"472":1,"508":1}}],["минуточку",{"2":{"421":1}}],["минуты",{"2":{"244":1}}],["минуя",{"2":{"148":1}}],["минусы",{"2":{"471":2}}],["минусов",{"2":{"463":1}}],["минус",{"2":{"105":1,"463":1}}],["минисервере",{"2":{"457":1}}],["мини",{"2":{"431":1,"457":2}}],["миниатюр",{"2":{"189":1}}],["миниатюре",{"2":{"116":1}}],["минималистичным",{"2":{"507":1}}],["минимален",{"2":{"193":1}}],["минимальную",{"2":{"231":1,"504":1}}],["минимальным",{"2":{"328":1}}],["минимальны",{"2":{"224":1}}],["минимальный",{"2":{"192":1,"310":1}}],["минимальной",{"2":{"47":1,"288":1}}],["минимальна",{"2":{"22":1}}],["минимуму",{"2":{"179":1}}],["минимум",{"2":{"12":1,"265":1,"295":1,"308":1,"311":1,"313":1,"349":1,"365":1,"402":2,"425":1,"434":1,"457":1,"463":1,"470":1,"472":2}}],["мае",{"2":{"472":1}}],["маяк",{"2":{"318":1}}],["манифест",{"2":{"320":1,"473":3}}],["манифестом",{"2":{"317":1}}],["манифесте",{"2":{"315":1}}],["манифеста",{"0":{"310":1,"314":1},"1":{"311":1,"312":1,"313":1},"2":{"306":1,"308":2,"310":2,"313":2,"314":2,"316":1,"317":2,"542":1,"554":1}}],["манипулирование",{"2":{"219":1}}],["манипулирования",{"2":{"147":1,"156":1,"213":1}}],["манипулироваться",{"2":{"323":1}}],["манипулировать",{"2":{"207":1,"323":2,"381":1}}],["манипулятивный",{"2":{"216":1}}],["манипулятивных",{"2":{"206":1}}],["манипулятивная",{"2":{"216":1}}],["манипуляций",{"2":{"193":1}}],["манипуляции",{"2":{"115":1,"323":1}}],["манере",{"2":{"166":1}}],["магические",{"2":{"460":1}}],["магия",{"2":{"158":1}}],["магию",{"2":{"151":1,"227":1,"376":1}}],["магазине",{"2":{"473":1}}],["магазины",{"2":{"22":1,"27":1,"79":1,"109":1,"308":2}}],["магазином",{"2":{"22":1}}],["магазинов",{"2":{"21":1,"28":1,"79":1,"109":1,"308":1}}],["магазинах",{"2":{"97":1,"310":1}}],["магазинами",{"2":{"105":1}}],["магазинам",{"2":{"22":1}}],["магазина",{"2":{"14":1,"22":1,"39":2,"78":1,"189":1,"205":1,"308":1,"445":1}}],["магазин",{"0":{"12":1},"2":{"9":1,"12":1,"22":2,"43":1,"61":1,"63":1,"115":1,"506":1,"507":1,"508":1}}],["машине",{"2":{"223":1,"294":1,"472":1}}],["машин",{"2":{"147":1}}],["машиной",{"2":{"137":1}}],["машина",{"2":{"137":1,"180":1}}],["машины",{"2":{"137":1,"256":1,"457":1}}],["максимальная",{"2":{"548":1}}],["максимальную",{"0":{"402":1},"2":{"231":1,"402":1}}],["максимального",{"2":{"370":1}}],["максимально",{"2":{"219":1,"260":1,"306":1,"471":1,"473":1,"512":1}}],["максимум",{"2":{"205":1,"227":1}}],["максимизации",{"2":{"178":1}}],["макрос",{"2":{"124":1}}],["макросами",{"2":{"124":1}}],["макете",{"2":{"542":2}}],["макетов",{"0":{"238":1},"2":{"353":1}}],["макетом",{"2":{"230":1,"238":1}}],["макетами",{"2":{"447":1}}],["макета",{"2":{"231":1,"249":1,"351":1,"506":1}}],["макеты",{"2":{"176":1,"315":1,"355":1,"508":1}}],["макет",{"0":{"27":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1},"2":{"27":1,"174":1,"203":1,"237":1,"238":2,"542":1,"546":1}}],["материал",{"2":{"109":1}}],["материалах",{"2":{"498":1}}],["материала",{"2":{"65":1,"289":1,"495":1}}],["массовых",{"2":{"431":1}}],["массовый",{"2":{"391":1}}],["массовой",{"2":{"218":1,"394":1}}],["массу",{"2":{"227":1}}],["массиву",{"2":{"292":1,"381":1,"429":1}}],["массива",{"2":{"231":2,"245":1,"353":1,"381":1,"460":3,"462":1,"472":1}}],["массивам",{"2":{"123":2}}],["массиве",{"2":{"157":1,"231":1,"245":1,"381":1}}],["массивы",{"2":{"124":1,"158":1,"245":1,"247":1,"323":1,"422":1,"536":1}}],["массивов",{"2":{"123":1}}],["массив",{"2":{"41":1,"231":5,"245":3,"246":1,"256":1,"292":2,"293":1,"311":1,"313":3,"349":1,"354":1,"367":1,"381":3,"429":2,"433":1,"435":1,"460":3,"462":1}}],["масштабируемых",{"2":{"462":1}}],["масштабируемой",{"2":{"440":1}}],["масштабирования",{"2":{"148":1,"419":1}}],["масштаб",{"2":{"421":1}}],["масштабе",{"2":{"294":1,"425":1}}],["масштабах",{"2":{"156":1}}],["мастере",{"2":{"375":1}}],["мастер",{"2":{"144":1,"438":1}}],["мастером",{"2":{"62":1}}],["маске",{"2":{"453":1}}],["маскируемый",{"2":{"317":1}}],["маскирует",{"2":{"212":1,"215":1}}],["маскируются",{"2":{"217":1}}],["маскировка",{"2":{"217":1}}],["маскироваться",{"2":{"217":1}}],["маску",{"2":{"134":1}}],["маска",{"2":{"117":2}}],["малая",{"2":{"372":1}}],["маленьком",{"2":{"355":1}}],["маленькой",{"2":{"209":1}}],["маленького",{"2":{"187":1,"452":1}}],["маленьких",{"2":{"150":1,"263":1}}],["маленький",{"2":{"115":1,"187":2}}],["маленькая",{"2":{"22":1,"187":1}}],["маломощных",{"2":{"421":1}}],["малого",{"2":{"148":2}}],["мало",{"2":{"38":1,"232":1,"316":1,"352":1,"354":1}}],["маркерами",{"2":{"393":1}}],["маркером",{"2":{"364":1}}],["маркетинговые",{"2":{"172":1}}],["маркетинг",{"2":{"171":1}}],["маркетплейсом",{"2":{"22":1,"76":1}}],["маркетплейсов",{"2":{"21":1}}],["маркетплейс",{"0":{"13":1,"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1},"2":{"9":1,"22":2,"61":1,"79":1}}],["маркетплейса",{"2":{"4":1,"12":1,"22":2,"43":1,"61":1,"78":1,"79":1}}],["маршруте",{"2":{"349":2,"355":3}}],["маршруту",{"2":{"346":1,"349":1,"354":2,"365":1,"369":1}}],["маршрутов",{"0":{"348":1,"354":1},"1":{"349":1,"350":1},"2":{"244":1,"347":1,"351":1,"353":2,"354":1,"355":2,"358":2,"360":1,"361":1}}],["маршрут",{"2":{"136":1,"347":1,"349":5,"352":1,"354":1,"365":1,"366":2}}],["маршрутизации",{"2":{"136":1,"294":1,"342":1}}],["маршрутизацию",{"2":{"11":1}}],["маршрутизатору",{"2":{"355":1}}],["маршрутизатором",{"2":{"127":1,"354":1,"355":1}}],["маршрутизатора",{"0":{"351":1},"2":{"127":1,"342":1,"345":4,"346":1,"352":1,"368":1,"369":1}}],["маршрутизатор",{"2":{"127":1,"344":1,"346":3,"349":1,"350":1,"352":1,"353":1,"354":1,"355":1,"363":1,"411":1}}],["маршрутизаторе",{"2":{"119":1,"127":2,"137":1}}],["маршруты",{"0":{"353":1},"1":{"354":1,"355":1},"2":{"97":1,"316":1,"345":2,"346":3,"348":1,"349":3,"353":2,"354":2,"358":1,"547":1}}],["маршрутам",{"2":{"351":1,"352":1,"355":1,"360":1}}],["маршрутами",{"2":{"136":1,"346":1,"349":1,"358":1}}],["маршрута",{"2":{"7":1,"349":1,"351":1,"352":3,"355":4,"358":3}}],["мыслить",{"2":{"464":1}}],["мыслит",{"2":{"260":1}}],["мышку",{"2":{"457":1}}],["мышление",{"2":{"372":1}}],["мышления",{"2":{"148":1}}],["мышью",{"2":{"178":1,"192":1}}],["мышь",{"2":{"174":1,"178":1,"421":1}}],["мыши",{"2":{"159":1,"186":1,"200":1,"201":1,"250":1,"256":2,"313":1}}],["мы",{"2":{"6":1,"9":1,"12":3,"13":1,"17":2,"18":1,"22":4,"23":2,"36":2,"40":1,"41":4,"48":1,"53":2,"59":1,"86":2,"91":1,"95":1,"97":1,"103":1,"105":1,"120":2,"121":3,"122":1,"124":2,"131":2,"133":2,"134":5,"135":4,"136":3,"137":7,"139":1,"140":2,"141":8,"143":3,"144":1,"145":5,"146":1,"147":3,"148":2,"149":10,"150":4,"151":13,"152":14,"153":1,"154":1,"158":3,"159":8,"160":3,"161":1,"166":1,"167":3,"169":2,"172":2,"174":1,"175":2,"176":2,"179":1,"181":1,"191":1,"192":1,"193":10,"197":1,"203":1,"204":1,"205":2,"219":3,"221":5,"222":4,"223":7,"224":10,"225":4,"226":2,"227":12,"228":8,"229":4,"230":11,"231":22,"232":10,"233":4,"235":7,"237":4,"238":4,"239":4,"241":6,"242":2,"243":3,"244":6,"245":1,"246":7,"247":8,"248":1,"249":11,"250":10,"251":5,"252":3,"254":1,"255":19,"256":18,"257":4,"258":8,"259":3,"260":1,"263":4,"264":1,"266":1,"267":4,"268":2,"271":3,"272":1,"281":5,"282":1,"283":1,"286":1,"287":7,"288":6,"289":2,"290":1,"292":8,"294":3,"295":2,"296":15,"297":5,"298":4,"299":5,"300":6,"301":2,"302":6,"303":11,"304":5,"306":3,"308":1,"309":1,"310":4,"314":3,"315":8,"316":13,"317":6,"319":3,"321":7,"322":1,"323":4,"324":3,"325":8,"326":4,"327":1,"328":7,"329":3,"330":7,"331":3,"332":4,"333":8,"334":1,"335":5,"336":8,"337":6,"338":10,"339":5,"340":4,"341":1,"342":5,"344":9,"345":1,"346":4,"347":9,"349":15,"351":2,"352":20,"353":5,"354":3,"355":11,"358":4,"359":4,"360":7,"361":4,"362":5,"363":3,"364":8,"365":6,"366":2,"367":8,"368":4,"369":1,"370":2,"372":2,"373":3,"374":3,"375":7,"376":10,"377":1,"378":5,"379":1,"380":10,"381":21,"382":3,"383":5,"384":1,"385":2,"387":1,"390":1,"391":5,"393":3,"394":2,"396":2,"409":1,"415":1,"419":8,"420":1,"421":4,"422":1,"423":3,"424":6,"425":5,"426":4,"427":6,"428":7,"429":7,"430":2,"431":2,"432":6,"433":8,"434":3,"435":6,"436":1,"437":7,"438":1,"439":13,"440":4,"451":2,"464":5}}],["молчаливая",{"2":{"501":1}}],["морган",{"2":{"472":1}}],["морскими",{"2":{"269":1}}],["мотивации",{"2":{"472":1}}],["мощь",{"2":{"463":1,"464":1}}],["мощную",{"2":{"336":1}}],["мощного",{"0":{"331":1},"1":{"332":1,"333":1,"334":1,"335":1},"2":{"321":1}}],["мощной",{"2":{"222":1}}],["мощности",{"2":{"147":1,"248":1,"306":1,"344":1,"419":1,"430":1}}],["мощность",{"2":{"137":1,"367":1}}],["мощная",{"2":{"148":1,"431":1}}],["мощный",{"2":{"248":1}}],["мощные",{"2":{"246":1,"308":1}}],["мощным",{"2":{"200":1,"302":1}}],["мощными",{"2":{"143":1,"447":1}}],["мощных",{"2":{"147":1}}],["мой",{"2":{"271":1}}],["моем",{"2":{"455":1}}],["моему",{"2":{"265":1,"272":1,"421":1}}],["мое",{"2":{"223":1}}],["моей",{"2":{"22":1}}],["мошенническими",{"2":{"209":1}}],["могла",{"2":{"432":1}}],["могло",{"2":{"422":1}}],["могли",{"2":{"232":1,"235":1,"255":1,"257":1,"287":2,"296":1,"325":1,"337":2,"338":1,"344":1,"346":1,"347":1,"359":1,"366":1,"381":1,"439":1}}],["могущие",{"2":{"497":1}}],["могу",{"2":{"358":1}}],["могут",{"2":{"17":1,"47":1,"117":2,"128":1,"134":1,"147":1,"148":2,"152":1,"156":1,"160":1,"176":1,"185":1,"188":1,"189":3,"190":1,"194":1,"207":1,"222":1,"224":1,"225":1,"228":1,"238":2,"239":1,"241":1,"245":2,"247":1,"258":1,"259":1,"261":2,"289":1,"293":1,"297":1,"304":1,"306":1,"308":4,"310":1,"319":1,"326":2,"332":1,"336":2,"337":1,"344":1,"349":1,"354":1,"358":1,"361":2,"366":1,"367":1,"368":1,"370":1,"372":1,"373":1,"400":1,"402":1,"421":3,"423":1,"426":1,"441":2,"445":1,"447":1,"452":1,"457":1,"462":2,"465":1,"472":2,"508":1}}],["мог",{"2":{"151":1,"180":1,"331":1,"344":1,"353":1,"367":1,"473":1,"507":1}}],["мои",{"2":{"118":1}}],["монитора",{"2":{"457":1}}],["монитор",{"2":{"457":1}}],["мониторинг",{"2":{"211":1}}],["мониторингом",{"2":{"115":1}}],["монолитных",{"2":{"265":1}}],["монополистом",{"2":{"55":1}}],["монтируется",{"2":{"267":1}}],["монтируем",{"2":{"120":1,"243":1}}],["монтирования",{"2":{"121":1,"267":1,"352":1,"381":1}}],["монетизация",{"2":{"64":1}}],["мобильную",{"2":{"315":1}}],["мобильный",{"2":{"366":1}}],["мобильных",{"2":{"195":3,"198":1,"203":1,"226":1,"306":1,"308":1,"311":1,"312":1,"315":2,"344":1,"361":1,"518":1}}],["мобильные",{"2":{"171":1,"308":1,"365":1,"367":1}}],["мобильного",{"2":{"203":1}}],["мобильном",{"2":{"85":1,"95":1,"108":1,"203":1,"310":1}}],["мобильное",{"0":{"84":1},"1":{"85":1,"86":1,"87":1},"2":{"473":1}}],["мобильной",{"2":{"29":1,"30":1,"33":2,"35":1}}],["мобильная",{"0":{"33":1},"2":{"315":1}}],["модернизируем",{"2":{"308":1}}],["моделям",{"2":{"319":1,"468":1}}],["модели",{"2":{"148":1,"184":1,"203":1,"232":1,"246":1,"330":1,"352":1,"421":1}}],["моделей",{"2":{"124":1,"166":1,"246":1,"335":1}}],["моделью",{"2":{"124":2}}],["модель",{"0":{"15":1,"42":1},"1":{"16":1,"17":1,"18":1,"19":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1},"2":{"39":2,"148":2,"352":1,"427":2,"431":1,"462":1,"463":2,"471":1}}],["модал",{"2":{"255":2,"256":1}}],["модала",{"2":{"255":4}}],["модалы",{"2":{"240":1}}],["модалов",{"0":{"252":1},"1":{"253":1,"254":1,"255":1},"2":{"239":1}}],["модальное",{"2":{"254":1,"504":1}}],["модального",{"2":{"254":4,"255":3}}],["модальной",{"2":{"241":1}}],["модальном",{"2":{"198":1}}],["модальных",{"2":{"197":1,"239":1,"240":1,"241":1,"247":1,"258":1}}],["модальный",{"2":{"197":1,"240":1,"241":2,"254":2,"255":6}}],["модальные",{"0":{"197":1},"2":{"197":1,"238":1,"241":1,"252":1,"256":1,"347":1}}],["модифицировали",{"2":{"352":1}}],["модифицировать",{"2":{"69":1,"140":1,"328":1,"351":1}}],["модифицирует",{"2":{"240":1,"298":1}}],["модифицируем",{"2":{"223":1,"226":1,"231":1,"345":1}}],["модификаций",{"2":{"302":1,"347":1}}],["модификация",{"2":{"221":1,"352":1}}],["модификации",{"0":{"224":1},"2":{"135":1,"155":1,"330":1,"346":1}}],["модификатор",{"2":{"151":1,"246":1}}],["модули",{"2":{"256":1,"265":1,"280":2,"300":1,"445":1,"463":2,"464":1,"467":1}}],["модулях",{"2":{"335":1}}],["модуля",{"2":{"96":1,"330":1,"463":1,"512":1,"542":1,"545":1}}],["модуле",{"2":{"95":1,"97":1,"225":1,"338":1,"348":1,"445":1,"462":1,"463":1}}],["модулей",{"2":{"5":1,"89":1,"266":1}}],["модульная",{"2":{"445":1}}],["модульными",{"2":{"148":1}}],["модульности",{"2":{"127":1}}],["модульной",{"2":{"95":1}}],["модуль",{"0":{"510":1},"1":{"511":1,"512":1},"2":{"4":2,"41":1,"114":2,"138":1,"151":1,"250":1,"252":1,"268":2,"280":2,"289":1,"331":1,"335":1,"445":6,"464":1,"506":2,"508":2,"542":1}}],["моменты",{"2":{"472":1,"497":1}}],["моментов",{"2":{"461":1}}],["моментом",{"2":{"137":1,"256":1,"323":1,"507":1}}],["моментами",{"2":{"360":1}}],["момента",{"2":{"231":1,"364":1,"421":1}}],["момент",{"2":{"9":1,"16":1,"36":1,"43":1,"53":1,"123":1,"134":1,"160":1,"193":1,"224":1,"228":1,"251":1,"255":1,"256":1,"262":1,"286":1,"287":1,"308":1,"315":1,"352":1,"379":1,"390":1,"460":1,"473":1,"517":1,"520":1,"542":1,"549":1}}],["можем",{"2":{"22":1,"23":2,"36":1,"121":1,"124":1,"134":1,"135":1,"136":1,"141":1,"143":1,"145":1,"146":1,"149":1,"151":5,"152":3,"153":1,"158":1,"159":2,"160":1,"179":1,"193":1,"224":3,"225":1,"227":4,"228":3,"230":1,"231":2,"232":2,"237":3,"238":1,"241":2,"243":2,"244":2,"246":2,"247":3,"250":1,"255":2,"256":2,"257":1,"259":2,"263":1,"288":1,"289":1,"296":1,"297":1,"298":1,"302":3,"315":2,"316":3,"317":1,"323":3,"326":1,"329":2,"330":3,"336":2,"338":1,"339":2,"341":1,"345":1,"347":3,"349":5,"351":1,"352":2,"353":1,"354":1,"355":3,"362":1,"363":1,"364":1,"365":1,"367":1,"373":1,"375":2,"376":3,"378":1,"380":1,"381":3,"382":3,"383":1,"384":1,"421":1,"424":4,"425":2,"432":1,"435":1,"439":4}}],["можете",{"2":{"123":2,"125":1,"134":2,"143":1,"148":5,"150":1,"152":2,"161":1,"166":2,"168":2,"176":1,"184":1,"197":1,"203":1,"220":1,"223":1,"224":3,"225":1,"234":1,"271":1,"280":1,"286":1,"295":2,"302":1,"305":2,"308":3,"314":1,"336":1,"347":1,"352":1,"359":1,"376":1,"386":1,"390":1,"391":2,"392":1,"394":1,"395":1,"421":2,"430":1,"432":1,"446":2,"452":1,"495":1}}],["может",{"2":{"2":2,"3":1,"4":1,"14":1,"16":1,"17":1,"18":1,"26":1,"43":1,"44":1,"67":1,"68":1,"69":1,"96":1,"98":1,"105":2,"109":1,"115":2,"116":2,"117":1,"118":1,"119":1,"123":2,"124":2,"125":1,"134":2,"137":1,"140":1,"147":1,"148":4,"150":1,"151":3,"152":3,"155":1,"160":2,"169":1,"171":1,"179":1,"180":1,"184":1,"185":2,"186":2,"187":1,"188":1,"189":1,"190":4,"192":4,"199":1,"200":3,"201":2,"208":1,"212":2,"216":2,"217":2,"218":1,"220":1,"223":3,"224":1,"228":1,"229":1,"232":1,"235":1,"238":2,"239":1,"241":3,"244":3,"247":1,"249":3,"251":2,"252":2,"256":2,"263":1,"264":1,"265":1,"267":2,"268":1,"269":1,"276":1,"277":1,"281":2,"288":1,"291":1,"294":2,"295":4,"297":3,"302":1,"303":2,"306":1,"307":1,"308":3,"310":2,"314":1,"315":7,"316":1,"321":1,"323":1,"325":1,"326":2,"329":1,"330":1,"332":1,"333":1,"336":7,"338":1,"353":1,"360":1,"361":2,"366":1,"367":3,"370":1,"372":4,"375":3,"381":2,"383":2,"388":1,"393":2,"394":1,"395":1,"402":1,"421":9,"422":3,"425":1,"426":2,"429":1,"431":1,"437":2,"447":4,"451":1,"452":1,"455":1,"457":1,"460":1,"461":1,"462":3,"463":6,"465":1,"471":3,"472":1,"473":6,"501":1,"507":2,"511":1,"534":1,"548":1,"556":1}}],["можно",{"2":{"3":1,"4":1,"9":1,"10":1,"12":1,"16":2,"22":1,"25":1,"26":1,"27":1,"29":2,"35":1,"36":1,"40":4,"43":1,"44":1,"50":1,"53":1,"59":1,"63":2,"64":1,"67":1,"82":1,"85":1,"86":1,"89":1,"91":1,"98":1,"102":1,"104":2,"105":1,"108":1,"109":1,"114":1,"115":4,"116":2,"118":1,"124":1,"127":1,"129":1,"132":1,"134":4,"140":1,"142":1,"143":1,"144":2,"148":2,"149":1,"150":3,"159":1,"160":3,"166":1,"170":1,"171":1,"174":1,"175":1,"178":1,"179":1,"180":1,"183":1,"184":1,"189":1,"190":1,"198":1,"200":2,"201":1,"203":1,"207":1,"217":1,"222":5,"225":4,"226":2,"227":3,"228":3,"232":1,"233":1,"235":1,"236":1,"244":1,"246":3,"248":1,"249":3,"251":1,"254":1,"255":1,"256":2,"257":1,"263":2,"265":3,"268":1,"271":2,"284":1,"288":1,"292":1,"294":1,"295":1,"297":3,"300":1,"302":2,"303":2,"305":1,"308":1,"315":1,"316":2,"317":1,"319":1,"320":1,"325":1,"331":1,"333":1,"334":1,"335":1,"336":3,"339":1,"341":1,"343":1,"344":1,"352":3,"353":1,"355":3,"358":4,"359":1,"361":4,"363":1,"365":1,"366":2,"367":1,"368":1,"369":2,"370":2,"371":1,"372":3,"373":1,"374":1,"375":1,"376":3,"379":2,"380":1,"381":1,"383":1,"384":1,"388":2,"389":1,"390":3,"394":1,"395":2,"404":1,"405":1,"419":2,"421":2,"422":1,"423":1,"424":1,"425":2,"426":1,"427":1,"430":1,"431":2,"432":1,"434":2,"441":1,"444":3,"445":1,"447":2,"452":1,"457":2,"460":2,"462":3,"463":3,"464":2,"471":1,"472":5,"473":3,"501":1,"504":1,"509":1,"517":1,"520":1,"536":1,"549":1,"555":1}}],["механической",{"2":{"472":1}}],["механизмы",{"2":{"463":1}}],["механизм",{"2":{"329":1}}],["медленней",{"2":{"463":1}}],["медиазапросов",{"2":{"203":1}}],["медиазапросами",{"2":{"203":1}}],["межпроцессное",{"2":{"434":1}}],["межпроцессного",{"2":{"422":1}}],["межпроцессные",{"2":{"303":1}}],["межстрочные",{"2":{"270":1}}],["между",{"0":{"104":1,"173":1},"2":{"3":1,"17":1,"22":1,"34":1,"43":2,"68":2,"69":1,"104":1,"117":1,"119":1,"123":1,"144":1,"147":3,"148":3,"151":1,"152":2,"168":1,"169":1,"171":1,"178":1,"189":1,"192":1,"198":1,"224":1,"231":2,"237":1,"238":1,"243":1,"246":1,"247":1,"249":1,"250":2,"252":1,"256":1,"268":1,"271":1,"274":1,"275":1,"289":1,"291":1,"294":1,"295":1,"296":1,"297":1,"300":1,"305":2,"308":1,"320":1,"321":1,"322":1,"323":1,"331":1,"332":1,"335":1,"340":1,"341":2,"345":1,"349":1,"352":1,"360":1,"361":3,"366":1,"368":1,"384":1,"386":1,"417":1,"421":2,"425":2,"426":2,"434":1,"447":2,"457":1,"463":2,"472":2,"473":1}}],["мелких",{"2":{"269":1,"463":1}}],["мелкие",{"2":{"179":1,"263":1}}],["мельчайшей",{"2":{"263":1}}],["мечом",{"2":{"216":1}}],["мегабайт",{"2":{"537":1}}],["мега",{"2":{"200":4}}],["мегаменю",{"0":{"200":1},"2":{"29":1,"200":2,"201":1}}],["мета",{"2":{"542":1,"552":1}}],["метасервисы",{"2":{"364":1}}],["метрике",{"2":{"473":1}}],["метрики",{"2":{"473":1}}],["метка",{"2":{"361":1}}],["метку",{"2":{"323":1}}],["метки",{"0":{"187":1},"2":{"393":1}}],["методом",{"2":{"366":1,"473":1}}],["методологии",{"2":{"344":1,"345":1}}],["методов",{"2":{"14":1,"287":1,"289":1,"326":1,"332":1,"335":1,"354":1,"355":1,"358":2,"361":1,"366":1,"376":3,"429":1,"460":1}}],["методу",{"2":{"303":1}}],["методе",{"2":{"152":1,"281":1,"349":1,"439":1}}],["метод",{"0":{"280":1,"281":1},"2":{"115":1,"123":1,"149":3,"152":1,"203":3,"243":2,"247":1,"252":1,"255":2,"256":1,"265":1,"281":3,"287":2,"290":2,"292":3,"294":1,"303":3,"315":2,"349":1,"356":1,"358":1,"361":2,"366":3,"381":2,"423":1,"428":3,"433":1,"434":1,"436":1,"439":1,"501":1}}],["методы",{"0":{"165":1},"2":{"79":1,"117":1,"121":1,"123":1,"147":1,"149":1,"150":1,"247":1,"252":1,"255":1,"266":1,"267":1,"281":1,"292":1,"295":1,"303":1,"328":1,"331":1,"333":2,"335":1,"336":1,"340":1,"341":1,"342":1,"349":1,"358":1,"359":2,"381":2,"428":2,"434":2,"435":1,"439":2,"440":1,"463":1}}],["методах",{"2":{"336":1}}],["методами",{"2":{"303":1,"366":1,"463":1,"472":1}}],["методам",{"2":{"152":1,"359":1,"380":1,"435":1}}],["метода",{"2":{"3":1,"255":1,"279":1,"292":1,"297":1,"338":1,"340":1,"349":1,"366":1,"423":1,"433":1,"434":2,"435":2,"437":1,"439":2,"473":1}}],["месяцев",{"2":{"144":1}}],["месяца",{"2":{"144":1}}],["местным",{"2":{"360":1}}],["места",{"2":{"311":1,"328":1,"336":2,"391":1,"402":1,"460":1}}],["местах",{"2":{"179":1,"338":1}}],["мест",{"2":{"105":1,"473":1}}],["месте",{"2":{"91":1,"105":1,"151":1,"228":1,"268":1,"289":1,"315":1,"325":1,"352":1,"395":1,"434":1,"462":1}}],["местом",{"2":{"200":1,"205":1,"347":1}}],["местоположение",{"2":{"192":1}}],["место",{"2":{"86":1,"126":1,"147":1,"160":1,"200":1,"224":1,"235":1,"336":2,"351":1,"462":1}}],["мешает",{"2":{"112":1}}],["мер",{"2":{"372":1,"439":1}}],["меры",{"2":{"115":1,"180":1,"363":1}}],["меру",{"2":{"23":1}}],["мере",{"2":{"12":2,"133":1,"147":2,"150":1,"152":2,"159":1,"167":1,"192":1,"198":1,"221":2,"232":1,"238":1,"244":1,"266":1,"284":1,"288":1,"296":1,"301":1,"304":1,"308":1,"313":1,"344":1,"361":1,"370":1,"402":1,"421":1,"427":1}}],["ментор",{"2":{"472":2}}],["менталитета",{"2":{"130":1}}],["меньшим",{"2":{"344":1,"367":1}}],["меньших",{"2":{"308":1}}],["меньший",{"2":{"152":1,"462":1}}],["меньшего",{"2":{"244":1}}],["меньше",{"2":{"189":1,"270":1,"421":1,"462":1,"540":1}}],["менеджера",{"2":{"388":1,"451":1}}],["менеджер",{"2":{"115":3,"223":1,"337":1,"375":1}}],["менее",{"2":{"2":1,"174":1,"230":1,"296":1,"300":1,"301":1,"303":1,"335":1,"336":1,"355":1,"369":1,"372":1,"439":1,"473":1,"507":1}}],["меня",{"2":{"463":1}}],["меняющими",{"2":{"156":1}}],["меняются",{"2":{"157":1,"221":1,"460":1}}],["меняют",{"2":{"148":1}}],["меняете",{"2":{"463":1}}],["меняет",{"2":{"152":1}}],["меняется",{"2":{"114":1,"352":1,"355":1,"435":1}}],["меняем",{"2":{"139":1,"464":1}}],["меняя",{"2":{"17":1,"86":1,"508":1}}],["меняться",{"2":{"349":1,"370":1,"460":1}}],["менять",{"2":{"17":1,"41":1,"105":1,"366":1,"452":1,"545":1}}],["меню",{"0":{"84":1,"195":1,"198":1,"199":1,"201":1},"1":{"85":1,"86":1,"87":1},"2":{"3":2,"4":1,"29":1,"30":1,"33":1,"85":1,"95":1,"98":2,"172":1,"173":1,"174":2,"175":1,"180":1,"186":5,"192":1,"195":4,"196":1,"198":7,"199":3,"200":8,"201":3,"203":2,"205":2,"223":1,"238":1,"249":2,"313":2,"314":1,"315":3,"318":2,"346":1,"352":1,"445":1,"447":2,"527":1,"542":1}}],["ах",{"2":{"460":1}}],["аудио",{"2":{"452":1}}],["аута",{"2":{"428":1}}],["аутентифицирует",{"2":{"366":1}}],["аутентифицирующему",{"2":{"361":1}}],["аутентификаторы",{"2":{"365":1}}],["аутентификацию",{"2":{"116":1,"361":2,"362":1}}],["аутентификацией",{"2":{"115":1}}],["аутентификация",{"0":{"115":1,"360":1,"361":1,"365":2,"366":1,"367":1},"2":{"79":1,"115":5,"359":1,"360":1,"363":2,"365":2,"366":1}}],["аутентификации",{"0":{"359":1},"1":{"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1},"2":{"59":1,"115":1,"342":2,"349":1,"358":1,"359":1,"360":4,"361":5,"362":4,"363":2,"364":1,"366":5,"367":1,"368":2,"369":2,"435":2,"446":3,"463":1,"496":2,"545":1}}],["аутентификаций",{"2":{"40":1}}],["апгрейд",{"2":{"473":1}}],["апдейта",{"2":{"451":1}}],["апплеты",{"2":{"147":1}}],["аппаратное",{"2":{"308":1,"402":1}}],["аппаратного",{"2":{"301":1}}],["аппаратному",{"2":{"137":1,"402":1}}],["аппаратных",{"2":{"440":1}}],["аппаратные",{"2":{"171":1}}],["аппаратным",{"2":{"171":1}}],["аппарате",{"2":{"68":1}}],["ами",{"2":{"428":1}}],["аварийно",{"2":{"336":1}}],["авиабилетов",{"2":{"213":1}}],["авиабилеты",{"2":{"209":1}}],["автошколе",{"2":{"472":1}}],["автономным",{"2":{"400":1}}],["автономной",{"2":{"316":1}}],["автономности",{"2":{"315":1}}],["автономное",{"2":{"306":1,"308":1}}],["автономного",{"2":{"149":1,"308":2,"315":1}}],["автозаполнения",{"2":{"335":1}}],["автор",{"2":{"398":1}}],["авторство",{"2":{"268":1}}],["авторизации",{"2":{"361":2}}],["авторизационный",{"2":{"115":1}}],["авторизация",{"0":{"115":1},"2":{"79":1,"115":4}}],["автоматы",{"2":{"256":1}}],["автомат",{"2":{"256":2}}],["автоматического",{"2":{"144":1,"148":1,"317":1,"440":1,"451":1}}],["автоматические",{"2":{"395":1}}],["автоматически",{"2":{"50":1,"112":2,"134":1,"147":1,"152":1,"209":1,"223":1,"224":1,"227":1,"231":1,"244":2,"295":1,"296":1,"297":1,"315":2,"335":1,"339":1,"345":1,"349":1,"352":2,"355":1,"358":2,"367":1,"376":1,"379":1,"433":2,"451":1,"462":1,"527":1}}],["автоматизацией",{"2":{"472":1}}],["автоматизацию",{"2":{"224":1}}],["автоматизации",{"2":{"71":1,"306":1,"442":1,"451":2}}],["автоматизированный",{"2":{"395":1}}],["автоматизированными",{"2":{"383":1}}],["автоматизированных",{"2":{"372":1,"396":1}}],["автоматизированное",{"2":{"372":1,"397":1}}],["автоматизировано",{"2":{"372":1}}],["автоматизировать",{"2":{"143":1}}],["автоматизирует",{"2":{"144":1}}],["автообновление",{"2":{"144":1}}],["автокомплита",{"2":{"89":1}}],["автокомплит",{"0":{"89":1},"2":{"89":1}}],["ассоциируют",{"2":{"394":1}}],["ассоциируются",{"2":{"171":1}}],["асинхронная",{"2":{"302":1,"421":1}}],["асинхронную",{"2":{"268":1,"301":1,"302":1,"378":1,"421":1,"511":1}}],["асинхронно",{"2":{"336":1}}],["асинхронное",{"2":{"305":1}}],["асинхронном",{"2":{"303":1}}],["асинхронного",{"2":{"244":1,"293":1,"359":1,"370":1,"421":1}}],["асинхронной",{"2":{"188":1,"301":1,"302":1,"433":1}}],["асинхронным",{"2":{"303":1,"330":1}}],["асинхронными",{"2":{"276":1,"303":1,"421":1,"434":1}}],["асинхронных",{"2":{"300":1,"301":2,"302":1,"359":1,"447":1}}],["асинхронный",{"0":{"244":1,"378":1},"2":{"378":1,"421":1}}],["асинхронные",{"0":{"276":1},"2":{"160":1,"301":2,"344":1,"373":1,"421":1}}],["аспекте",{"2":{"461":1,"462":1}}],["аспекты",{"2":{"171":1,"407":1}}],["аспект",{"2":{"65":1,"172":1}}],["аспиранты",{"2":{"65":1}}],["азы",{"2":{"148":1}}],["абзаца",{"2":{"176":1,"186":1,"208":1}}],["абзацев",{"2":{"176":1}}],["абы",{"2":{"118":1}}],["абсолютно",{"2":{"472":2}}],["абсолютном",{"2":{"116":1}}],["абсолютный",{"2":{"141":1}}],["абстрагированный",{"2":{"271":1}}],["абстрагирование",{"2":{"114":1,"268":1}}],["абстрагировать",{"2":{"268":1}}],["абстракции",{"2":{"260":1,"282":1}}],["абстракция",{"0":{"3":1,"113":1},"1":{"114":1},"2":{"263":1,"511":1}}],["абстрактный",{"2":{"542":1}}],["абстрактны",{"2":{"167":1}}],["абстрактное",{"2":{"166":1}}],["анонсы",{"2":{"498":1}}],["аномалией",{"2":{"385":1}}],["антипаттерн",{"2":{"323":1}}],["антипаттерны",{"2":{"271":1}}],["антипаттерном",{"2":{"271":1,"447":1}}],["анимационный",{"2":{"447":1}}],["анимация",{"2":{"250":1}}],["анимации",{"2":{"160":3,"171":1,"345":1}}],["анимацию",{"2":{"147":1,"473":1}}],["английского",{"2":{"472":1}}],["английском",{"2":{"403":1,"472":2}}],["англ",{"2":{"117":1,"367":1}}],["аналогу",{"2":{"473":1}}],["аналогом",{"2":{"463":1}}],["аналогов",{"2":{"462":1}}],["аналогами",{"2":{"332":1}}],["аналог",{"2":{"124":1,"375":1,"447":1,"463":1}}],["аналогию",{"2":{"472":1}}],["аналогией",{"2":{"464":1}}],["аналогичен",{"2":{"249":1,"270":1,"519":1,"548":1}}],["аналогичную",{"2":{"381":1}}],["аналогичные",{"2":{"463":1}}],["аналогичным",{"2":{"231":1,"373":1}}],["аналогичных",{"2":{"98":1,"308":1}}],["аналогичный",{"2":{"89":1,"174":1,"249":1,"331":1,"367":1,"472":1}}],["аналогичного",{"2":{"507":1}}],["аналогичном",{"2":{"22":1}}],["аналогично",{"2":{"2":1,"18":1,"311":1,"423":1}}],["аналогии",{"2":{"249":1}}],["аналоги",{"0":{"22":1},"2":{"5":1,"463":1}}],["аналитика",{"2":{"68":1}}],["анализировать",{"2":{"318":1}}],["анализа",{"2":{"14":1,"369":1,"421":1}}],["анализ",{"0":{"8":1,"20":1,"68":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"21":1,"22":1},"2":{"12":1,"67":1,"173":1,"203":1}}],["академическое",{"2":{"287":1}}],["академических",{"2":{"147":1}}],["аккуратней",{"2":{"461":1}}],["аккуратно",{"2":{"375":1}}],["аккордеона",{"2":{"199":1,"200":1}}],["аккордеонное",{"2":{"199":1,"201":2}}],["аккордеонные",{"0":{"199":1}}],["аккаунт",{"2":{"115":1}}],["аккаунтом",{"2":{"115":1}}],["аккаунта",{"2":{"98":1,"445":1}}],["акт",{"2":{"390":1}}],["активных",{"2":{"432":1}}],["активными",{"2":{"421":1}}],["активного",{"2":{"255":1}}],["активности",{"2":{"211":1}}],["активно",{"2":{"144":1,"239":1,"462":1}}],["активен",{"2":{"352":1}}],["активы",{"2":{"225":1,"316":1}}],["активизируется",{"2":{"365":1}}],["активизируются",{"2":{"201":1}}],["активировать",{"2":{"315":1,"390":1}}],["активированным",{"2":{"316":1}}],["активирован",{"2":{"184":1,"336":1}}],["активирует",{"2":{"186":1}}],["активации",{"2":{"184":2,"186":1,"316":1,"423":1}}],["актуальность",{"2":{"344":1,"497":1}}],["актуальных",{"2":{"344":1,"427":1}}],["актуальные",{"2":{"335":1}}],["актуальны",{"2":{"180":1,"368":1}}],["актуален",{"2":{"152":1}}],["акции",{"2":{"4":1}}],["атомарного",{"2":{"225":1,"263":1}}],["аттрибутах",{"2":{"471":1}}],["аттрибута",{"2":{"244":1}}],["аттрибут",{"2":{"149":1}}],["аттрибуту",{"2":{"13":1}}],["атрибутом",{"2":{"251":1}}],["атрибутов",{"2":{"177":1,"185":1,"212":1,"251":1,"255":1,"310":3,"358":1,"372":1}}],["атрибутами",{"2":{"244":1,"356":1}}],["атрибутам",{"2":{"231":1,"370":1}}],["атрибута",{"2":{"154":1,"155":1,"157":1,"231":2,"249":1,"287":1,"311":1,"338":1,"352":1,"354":1,"355":2}}],["атрибуту",{"2":{"152":1,"183":1,"287":2}}],["атрибут",{"2":{"122":2,"124":1,"148":2,"151":3,"152":1,"154":1,"157":2,"245":1,"298":1,"299":1,"310":1,"311":1,"312":1,"313":1,"352":4,"354":2,"355":1}}],["атрибуте",{"2":{"122":1,"428":1}}],["атрибуты",{"2":{"69":1,"123":2,"152":1,"153":1,"244":2,"245":2,"261":1,"310":2,"358":1}}],["ат",{"2":{"115":2}}],["алиаса",{"2":{"455":1}}],["алиасы",{"2":{"455":1}}],["алиас",{"2":{"455":2}}],["алгоритму",{"2":{"361":1}}],["алгоритмы",{"2":{"269":1}}],["алгоритм",{"2":{"267":1,"361":2}}],["алгоритмов",{"2":{"68":1}}],["альтернативной",{"2":{"287":1}}],["альтернативный",{"2":{"152":1,"243":1,"249":1,"423":1}}],["альтернативные",{"2":{"68":1,"213":1}}],["альтернативы",{"2":{"227":1,"382":1,"389":1}}],["альтернативой",{"2":{"192":1,"200":1,"244":2,"265":1}}],["альтернативах",{"2":{"184":1}}],["альтернатива",{"2":{"89":1,"116":1,"144":1,"295":1,"323":1,"381":1,"383":1}}],["альтернатив",{"2":{"55":1,"203":1,"321":1,"323":1,"421":1}}],["аргумент",{"2":{"245":1,"249":1,"332":1}}],["аргументов",{"2":{"245":1,"323":1,"381":2}}],["аргументы",{"2":{"228":1,"338":1}}],["аргументами",{"2":{"376":1,"381":1}}],["аргумента",{"2":{"123":1,"149":1,"243":1,"244":1,"245":1,"288":1,"296":1,"308":1,"332":2,"338":1,"376":2,"380":1,"439":1}}],["арендовать",{"2":{"145":1}}],["арендуем",{"2":{"137":1}}],["артефакты",{"2":{"68":1}}],["архитектуру",{"2":{"440":1}}],["архитектур",{"2":{"400":1,"440":1}}],["архитектурой",{"2":{"148":1,"222":1}}],["архитектуре",{"2":{"95":1,"419":1,"429":1}}],["архитектурные",{"0":{"445":1},"1":{"446":1,"447":1,"448":1,"449":1,"450":1}}],["архитектурный",{"2":{"263":1}}],["архитектурными",{"2":{"148":1,"425":1}}],["архитектурных",{"2":{"69":1,"221":1,"425":1}}],["архитектурная",{"2":{"148":1}}],["архитектурной",{"2":{"460":1}}],["архитектурное",{"2":{"69":1}}],["архитектурно",{"2":{"6":1,"463":1}}],["архитектуры",{"2":{"40":1,"76":1,"137":1,"169":1,"261":1,"263":1,"272":1,"359":1,"402":1,"408":1,"414":1,"421":1,"440":1,"508":1}}],["архитектура",{"0":{"1":1,"6":1,"69":1,"464":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1},"2":{"67":1,"69":2,"238":1,"335":1,"427":1,"445":2,"464":2,"496":1}}],["адресом",{"2":{"223":1}}],["адресов",{"2":{"134":2}}],["адресе",{"2":{"134":1,"136":1,"353":2}}],["адресное",{"2":{"134":1}}],["адресата",{"2":{"134":1}}],["адресату",{"2":{"134":1}}],["адресах",{"2":{"134":1,"136":1}}],["адреса",{"2":{"134":5,"144":1,"205":1,"224":1,"345":1}}],["адрес",{"2":{"134":8,"136":1,"154":1,"223":1,"231":1,"311":1,"313":1,"344":1,"352":1,"362":1,"367":2,"384":1,"439":1}}],["адресу",{"2":{"112":1,"117":1,"129":1,"134":1,"170":1,"178":1,"222":1,"235":1,"249":1,"251":1,"255":1,"307":1,"335":1,"343":1,"358":2,"367":1,"371":1,"404":1,"439":2,"527":1}}],["администратора",{"2":{"390":1}}],["административного",{"2":{"134":1}}],["административная",{"2":{"79":1}}],["администрирования",{"2":{"138":1}}],["админ",{"2":{"115":1,"445":1}}],["админке",{"2":{"13":1,"115":1}}],["админка",{"2":{"12":1,"53":1}}],["адаптация",{"2":{"316":1}}],["адаптации",{"2":{"271":1,"308":1}}],["адаптацию",{"2":{"265":1}}],["адаптировать",{"2":{"269":1,"350":1}}],["адаптированная",{"2":{"222":1}}],["адаптируется",{"2":{"203":2}}],["адаптивны",{"2":{"530":1}}],["адаптивный",{"2":{"306":1}}],["адаптивного",{"2":{"507":1}}],["адаптивноcти",{"2":{"468":1}}],["адаптивность",{"0":{"35":1,"509":1},"2":{"464":1,"471":1,"509":2}}],["адаптивностью",{"2":{"25":1}}],["адаптивности",{"2":{"23":1,"98":1}}],["адаптивная",{"2":{"36":1}}],["адаптер",{"0":{"82":1},"1":{"83":1},"2":{"41":2,"512":2,"542":1}}],["адаптеры",{"0":{"41":1},"2":{"41":1}}],["а",{"2":{"4":1,"11":1,"12":2,"16":1,"23":1,"25":1,"39":1,"65":1,"96":2,"102":1,"104":1,"105":1,"115":2,"116":1,"117":2,"119":2,"120":1,"122":1,"123":2,"124":1,"128":1,"134":3,"143":2,"144":2,"148":4,"149":1,"150":1,"151":1,"152":4,"159":1,"160":1,"162":1,"169":1,"171":1,"172":2,"173":2,"174":1,"175":2,"180":1,"181":1,"192":2,"196":1,"198":1,"199":1,"203":2,"205":1,"209":1,"211":1,"213":1,"217":1,"221":1,"223":2,"224":6,"225":2,"228":6,"231":5,"232":1,"233":2,"234":1,"235":1,"245":1,"246":2,"247":2,"249":1,"250":1,"254":2,"255":2,"256":1,"257":1,"263":2,"264":1,"267":3,"270":1,"271":2,"276":1,"281":3,"282":2,"286":1,"291":1,"293":1,"294":1,"295":3,"297":1,"298":1,"299":1,"300":1,"302":1,"306":1,"308":3,"310":1,"313":2,"315":3,"316":4,"317":1,"318":3,"321":1,"323":3,"325":1,"327":1,"331":1,"332":1,"333":4,"335":2,"336":3,"338":2,"339":1,"347":1,"349":3,"352":4,"353":1,"354":1,"355":3,"358":1,"360":2,"361":3,"362":1,"365":5,"366":1,"367":3,"368":1,"373":1,"376":3,"377":1,"378":3,"380":2,"381":2,"382":2,"385":3,"387":1,"391":1,"393":3,"394":2,"395":1,"396":2,"400":2,"412":1,"415":2,"419":3,"421":2,"423":2,"425":2,"427":1,"428":1,"429":1,"431":2,"434":1,"439":2,"440":2,"441":1,"447":2,"460":2,"462":1,"463":5,"464":1,"466":1,"472":4,"473":5,"504":1,"508":1,"518":1,"534":1}}],["ощущениям",{"2":{"473":1}}],["ощущение",{"2":{"175":1}}],["ощутим",{"2":{"440":1}}],["ощутить",{"2":{"421":1}}],["оцените",{"2":{"447":1}}],["оценить",{"2":{"319":1,"430":1}}],["оценки",{"2":{"318":2,"372":1,"412":1}}],["охватить",{"2":{"308":2,"373":1}}],["охватывают",{"2":{"249":1,"368":1}}],["охватывает",{"2":{"144":1,"171":1,"185":1,"497":1}}],["оживают",{"2":{"308":1}}],["ожидая",{"2":{"301":1,"365":1}}],["ожидание",{"2":{"430":1}}],["ожиданий",{"2":{"385":1}}],["ожидания",{"2":{"244":1,"303":1,"365":1}}],["ожидании",{"2":{"232":1}}],["ожидалось",{"2":{"231":1,"298":1,"302":1,"377":1,"381":1,"430":1}}],["ожидающие",{"2":{"229":1,"231":1}}],["ожидать",{"2":{"198":1,"330":1,"333":1,"335":1}}],["ожидаемую",{"2":{"381":1}}],["ожидаемому",{"2":{"284":1,"376":1}}],["ожидаемых",{"2":{"372":1}}],["ожидаемый",{"2":{"287":1}}],["ожидаемым",{"2":{"246":1}}],["ожидаемые",{"2":{"152":1}}],["ожидает",{"2":{"155":1,"159":1,"302":1,"355":1,"365":1,"429":1}}],["ожидается",{"2":{"125":1,"372":1,"377":1}}],["оговорками",{"2":{"152":1}}],["огромен",{"2":{"225":1}}],["огромный",{"2":{"393":1,"454":1}}],["огромные",{"2":{"148":1}}],["огромного",{"2":{"268":1}}],["огромном",{"2":{"134":1}}],["огромная",{"2":{"148":1}}],["ограничивают",{"2":{"308":1}}],["ограничивает",{"2":{"48":1,"151":1,"231":1}}],["ограничить",{"2":{"227":1}}],["ограничимся",{"2":{"367":1}}],["ограничим",{"2":{"172":1}}],["ограничен",{"2":{"336":1}}],["ограничено",{"2":{"303":1}}],["ограниченным",{"2":{"360":1}}],["ограниченный",{"2":{"296":1}}],["ограниченного",{"2":{"134":1,"190":1,"192":1}}],["ограниченное",{"2":{"134":1,"173":1}}],["ограничены",{"2":{"225":1}}],["ограничений",{"2":{"152":1,"336":2,"373":1,"463":1,"473":1}}],["ограничением",{"2":{"193":1,"246":1}}],["ограничение",{"2":{"146":1,"336":2,"344":1}}],["ограничения",{"2":{"128":1,"148":1,"248":1,"300":1,"325":1,"328":1,"336":3,"441":2,"471":1}}],["оффлайн",{"2":{"473":2}}],["оффлайном",{"2":{"308":1}}],["оформить",{"2":{"445":1}}],["оформлении",{"2":{"209":1}}],["оформлением",{"2":{"328":1}}],["оформление",{"2":{"79":1}}],["оформления",{"2":{"25":1,"209":1,"432":1}}],["официальная",{"2":{"310":1,"463":1,"497":1}}],["официальную",{"2":{"221":1,"335":1}}],["официальные",{"2":{"373":1,"387":1,"396":1,"457":1}}],["официальными",{"2":{"415":1}}],["официальным",{"2":{"150":1,"228":1,"335":1}}],["официальных",{"2":{"134":1,"228":1,"372":1}}],["официальный",{"2":{"119":1,"125":1,"200":1,"222":5,"251":1,"345":1,"388":1,"413":1}}],["официально",{"2":{"331":1,"463":1}}],["официального",{"2":{"222":1,"387":1}}],["официальному",{"2":{"330":1}}],["официальном",{"2":{"200":1,"226":1,"335":1,"371":1}}],["официальное",{"2":{"127":1}}],["официальной",{"2":{"119":1,"128":1,"129":1,"137":1,"138":1,"142":1,"159":1,"160":1,"222":1,"249":1,"251":1,"349":1,"358":2,"376":1,"379":1,"380":1,"388":1,"389":1,"435":1,"447":1}}],["очищен",{"2":{"432":1}}],["очищаются",{"2":{"160":1}}],["очищаться",{"2":{"115":1}}],["очистит",{"2":{"555":1}}],["очистить",{"2":{"226":1,"232":1,"292":1}}],["очистки",{"2":{"384":1}}],["очистке",{"2":{"291":1}}],["очереди",{"2":{"207":1,"232":1,"294":1}}],["очередь",{"2":{"25":1,"149":1,"256":1,"263":2,"293":2,"294":1,"303":2,"344":1,"354":1,"421":1,"425":1,"445":1,"463":2}}],["очевидны",{"2":{"240":1}}],["очевидным",{"2":{"149":1,"151":1,"172":1,"349":1,"432":1}}],["очевидной",{"2":{"251":1,"359":1,"373":1}}],["очевидно",{"2":{"16":1,"22":1,"150":1,"173":1,"349":1}}],["очень",{"2":{"3":1,"12":1,"14":1,"39":1,"40":1,"41":1,"44":1,"55":1,"56":1,"62":1,"92":1,"115":3,"116":2,"130":1,"137":4,"138":1,"142":1,"148":1,"149":1,"150":2,"152":1,"157":1,"171":1,"176":1,"181":1,"184":1,"189":1,"190":1,"198":1,"200":1,"204":1,"210":1,"211":1,"222":3,"223":3,"224":1,"232":1,"241":1,"244":1,"246":1,"247":1,"248":1,"249":1,"252":1,"256":1,"265":3,"267":1,"269":1,"277":1,"282":1,"284":1,"287":1,"289":2,"291":1,"293":1,"297":2,"299":2,"300":1,"301":2,"302":1,"326":1,"330":2,"336":1,"344":1,"347":1,"352":1,"365":1,"367":1,"374":1,"375":1,"381":2,"383":2,"385":2,"391":1,"392":1,"396":1,"422":1,"423":1,"431":3,"432":1,"434":1,"435":1,"440":1,"444":1,"447":1,"455":1,"457":4,"459":1,"460":3,"461":1,"462":1,"463":1,"470":1,"471":1,"472":4,"473":3,"512":1,"536":2}}],["ооп",{"2":{"103":1,"264":4,"265":1,"462":1,"463":1,"464":3}}],["ом",{"2":{"92":1,"224":1,"390":1,"393":1,"396":1,"397":1,"462":1,"473":1}}],["ошибетесь",{"2":{"151":1}}],["ошибемся",{"2":{"40":1}}],["ошибку",{"2":{"286":1,"287":1,"303":1,"376":2,"377":1,"422":2,"432":1}}],["ошибке",{"2":{"180":1,"301":1,"377":1,"393":1}}],["ошибкам",{"2":{"332":1,"370":2}}],["ошибками",{"2":{"92":1}}],["ошибка",{"0":{"377":1},"2":{"152":1,"188":1,"303":1,"367":1,"381":1,"422":1,"433":1,"464":1}}],["ошибки",{"2":{"92":2,"117":1,"302":1,"359":1,"363":1,"364":1,"372":1,"376":1,"377":2,"422":2,"433":1,"457":1}}],["ошибок",{"2":{"74":1,"180":3,"287":2,"292":1,"295":1,"364":1,"365":1,"372":2,"376":1,"482":1}}],["оригинал",{"2":{"391":1}}],["оригинальный",{"2":{"295":1}}],["оригинального",{"2":{"184":1}}],["ориентацию",{"2":{"312":1}}],["ориентации",{"2":{"203":1}}],["ориентация",{"2":{"148":1}}],["ориентированных",{"2":{"464":1}}],["ориентированными",{"2":{"151":1}}],["ориентированное",{"2":{"425":1,"462":1}}],["ориентированного",{"2":{"3":1,"264":1,"462":1}}],["ориентироваться",{"2":{"22":1,"195":1}}],["ориентируемся",{"2":{"12":1,"13":1}}],["оранжевого",{"2":{"173":1}}],["органами",{"2":{"263":1}}],["органом",{"2":{"144":1}}],["организм",{"2":{"263":1}}],["организовываться",{"2":{"256":1}}],["организовывать",{"2":{"152":1}}],["организован",{"2":{"375":1}}],["организованными",{"2":{"368":1}}],["организованности",{"2":{"175":1}}],["организованы",{"2":{"126":1,"200":1}}],["организовать",{"2":{"118":1,"150":1,"152":1,"233":1,"342":1,"351":1,"368":1,"395":1,"427":1,"447":1}}],["организациям",{"2":{"218":1}}],["организациях",{"2":{"200":1,"346":1}}],["организация",{"2":{"152":1}}],["организаций",{"2":{"134":2}}],["организацией",{"2":{"134":1,"202":1}}],["организацию",{"2":{"126":1,"223":1,"375":1}}],["организации",{"0":{"126":1,"202":1},"1":{"203":1,"204":1,"205":1,"206":1},"2":{"64":1,"119":1,"134":1,"149":1,"267":1,"328":1,"366":1,"367":1,"370":1,"375":1,"444":1,"462":1}}],["ов",{"2":{"48":1,"64":1}}],["одинаковую",{"2":{"335":1}}],["одинаковым",{"2":{"296":1}}],["одинаковыми",{"2":{"232":1,"455":1}}],["одинаковы",{"2":{"232":1,"397":1,"439":1}}],["одинаковых",{"2":{"231":1}}],["одинаковый",{"2":{"175":1,"336":1}}],["одинакового",{"2":{"192":1}}],["одинаковое",{"2":{"174":1}}],["одинаково",{"2":{"122":1,"231":1,"326":1}}],["один",{"2":{"36":1,"41":1,"43":1,"58":1,"103":1,"104":1,"115":2,"123":1,"134":1,"150":1,"151":1,"154":1,"160":1,"174":1,"184":1,"189":1,"196":1,"213":1,"217":1,"222":1,"223":1,"230":1,"231":2,"239":1,"243":1,"244":3,"249":1,"251":1,"255":2,"256":2,"257":1,"265":1,"268":1,"269":1,"277":2,"278":1,"280":1,"290":1,"291":2,"297":1,"298":1,"299":1,"315":3,"326":1,"333":1,"335":1,"344":1,"349":1,"353":1,"355":2,"360":1,"364":1,"366":2,"367":1,"374":1,"376":2,"378":1,"379":1,"384":1,"425":1,"436":1,"439":1,"447":3,"455":1,"461":1,"463":4,"473":1}}],["одаренный",{"2":{"26":1}}],["одних",{"2":{"329":1}}],["одни",{"2":{"261":1,"344":1,"353":1,"385":1,"386":1,"445":2}}],["одним",{"2":{"14":1,"41":1,"130":1,"151":1,"152":1,"200":1,"218":1,"227":3,"232":1,"241":1,"246":1,"249":1,"256":2,"300":1,"359":1,"361":1,"373":1,"421":1,"434":2,"441":1}}],["одними",{"2":{"3":1,"227":1}}],["одну",{"2":{"82":1,"171":1,"203":1,"215":1,"227":1,"265":1,"292":1,"297":1,"328":1,"336":1,"338":1,"349":1,"366":1,"375":1,"437":1,"439":1,"462":1}}],["одна",{"2":{"108":1,"109":1,"174":2,"192":1,"199":1,"217":1,"256":1,"314":1,"355":1,"383":1,"421":1}}],["однажды",{"2":{"62":1}}],["однако",{"2":{"12":1,"13":1,"23":1,"55":1,"62":2,"130":1,"132":1,"142":1,"144":1,"148":2,"151":1,"152":5,"166":1,"167":1,"170":1,"172":1,"189":1,"192":1,"196":1,"198":1,"200":2,"204":1,"206":1,"221":1,"222":1,"223":1,"225":1,"227":1,"232":1,"241":1,"243":1,"244":2,"245":2,"251":1,"255":1,"265":1,"267":1,"269":1,"279":1,"296":1,"297":2,"302":2,"303":1,"308":2,"310":1,"315":1,"316":2,"323":1,"328":1,"330":1,"332":2,"335":1,"344":1,"346":1,"349":1,"352":1,"354":1,"355":1,"360":1,"361":3,"370":1,"372":1,"373":2,"376":1,"378":1,"381":2,"388":1,"390":1,"420":1,"421":2,"431":1,"432":1,"456":1,"460":1,"463":2,"471":1,"472":2,"473":2,"503":1,"504":1,"536":1}}],["однозначных",{"2":{"421":1}}],["однозначно",{"2":{"336":1,"457":1,"462":1}}],["однокомпонентного",{"2":{"431":1}}],["однокомпонентное",{"2":{"234":1,"431":1}}],["однократный",{"2":{"376":1}}],["одноразового",{"2":{"365":1}}],["одноразовому",{"0":{"365":1}}],["одноименный",{"2":{"352":1}}],["однопоточным",{"2":{"421":1}}],["однопоточными",{"2":{"301":1}}],["однопоточных",{"2":{"276":1}}],["однофайловыми",{"2":{"375":1}}],["однофайловый",{"2":{"151":1}}],["однофайловых",{"0":{"151":1},"2":{"149":1,"266":1,"379":1,"397":1}}],["однофайловые",{"2":{"147":1,"168":1,"224":1,"378":1}}],["одновременно",{"2":{"137":1,"180":1,"199":1,"223":1,"232":1,"252":1,"295":1,"376":1,"382":1,"445":1,"447":1}}],["одновременного",{"2":{"124":1,"328":1}}],["одновременных",{"2":{"137":1}}],["одностраничных",{"2":{"411":1,"419":1}}],["одностраничными",{"2":{"342":1}}],["одностраничные",{"0":{"342":1,"411":1},"1":{"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1},"2":{"127":1,"135":2,"197":1,"244":1,"251":1,"344":1,"435":1}}],["одностраничное",{"2":{"258":1,"306":1}}],["одностраничного",{"2":{"131":1}}],["одного",{"2":{"128":1,"138":1,"198":1,"234":1,"235":1,"256":1,"277":1,"301":1,"331":1,"336":1,"367":1,"370":1,"375":1,"386":1,"391":1,"429":1,"463":2}}],["одномоментное",{"2":{"335":1}}],["одному",{"2":{"134":1,"287":1,"375":1}}],["одном",{"2":{"103":1,"105":1,"134":1,"151":1,"178":1,"185":1,"189":1,"197":1,"203":1,"228":1,"229":1,"232":1,"268":1,"271":1,"289":1,"301":1,"332":1,"336":1,"374":1,"382":1,"421":1,"462":1}}],["одно",{"2":{"48":1,"148":1,"152":1,"190":1,"245":1,"249":1,"256":1,"264":1,"268":1,"269":1,"292":1,"295":1,"297":1,"303":2,"328":1,"329":1,"352":1,"360":1,"373":1,"375":1,"376":1,"381":1,"394":1,"451":1,"462":1}}],["одной",{"2":{"16":1,"34":1,"55":1,"148":3,"175":1,"191":1,"203":1,"231":1,"248":1,"257":1,"265":1,"286":1,"291":1,"300":1,"301":1,"308":1,"315":1,"321":1,"336":1,"344":1,"367":1,"381":1,"385":1,"394":1,"421":1,"452":1,"463":1,"507":1}}],["означают",{"2":{"344":1,"397":1}}],["означает",{"2":{"11":2,"144":1,"148":2,"152":1,"172":1,"173":1,"200":1,"225":1,"228":1,"239":1,"245":1,"246":1,"250":1,"260":1,"269":2,"291":1,"295":1,"297":1,"328":1,"331":1,"349":1,"359":1,"364":1,"376":1,"386":1,"421":2,"501":1,"504":1}}],["ознакомьтесь",{"2":{"339":1,"367":1,"427":1,"472":1}}],["ознакомления",{"2":{"335":1,"503":1}}],["ознакомительный",{"2":{"396":1}}],["ознакомиться",{"2":{"53":1,"115":1,"132":1,"134":1,"173":1,"247":1,"250":1,"322":1,"338":1,"358":1,"507":1,"508":1}}],["ознакомились",{"2":{"150":1}}],["озон",{"2":{"4":1}}],["осущестляется",{"2":{"452":1}}],["осуществляет",{"2":{"356":1}}],["осуществляется",{"2":{"137":1,"144":2,"278":1,"332":1,"336":1}}],["осуществляются",{"2":{"277":1}}],["осуществляться",{"2":{"246":1,"290":1,"360":1,"361":1,"367":1}}],["осуществлять",{"2":{"246":1,"422":1}}],["осуществления",{"2":{"114":1,"359":1}}],["освоения",{"2":{"396":1}}],["освоении",{"2":{"308":1}}],["освобождаем",{"2":{"267":1}}],["освобождать",{"2":{"267":1}}],["освобождения",{"2":{"267":1}}],["освободить",{"2":{"267":1}}],["осваивать",{"2":{"221":1}}],["осведомлен",{"2":{"211":1}}],["освежить",{"2":{"135":1}}],["оскорбления",{"2":{"216":1}}],["острова",{"2":{"238":1}}],["осторожность",{"2":{"421":1}}],["осторожно",{"2":{"204":1}}],["останемся",{"2":{"429":1}}],["останова",{"2":{"203":2}}],["остановится",{"2":{"192":1}}],["остановиться",{"2":{"125":1}}],["остановимся",{"2":{"12":1,"231":1,"239":1,"282":1,"349":1,"372":1,"427":1}}],["остаться",{"2":{"392":1,"463":1}}],["осталось",{"2":{"227":1,"334":1}}],["остальная",{"2":{"437":1}}],["остальной",{"2":{"255":1}}],["остальное",{"2":{"55":1,"151":1,"333":1,"457":1}}],["остальным",{"2":{"227":1}}],["остальными",{"2":{"197":1}}],["остальных",{"2":{"122":1,"174":1,"260":1,"304":2,"397":1,"435":1}}],["остальные",{"2":{"17":1,"100":1,"122":1,"198":1,"217":1,"352":1}}],["остается",{"2":{"96":1,"114":1,"119":1,"223":1,"352":1}}],["оставьте",{"2":{"447":1}}],["оставались",{"2":{"421":1}}],["оставаться",{"2":{"269":1,"287":1}}],["оставшихся",{"2":{"267":1}}],["оставшейся",{"2":{"223":1}}],["оставить",{"2":{"208":1}}],["оставим",{"2":{"7":1,"99":1}}],["оставляем",{"2":{"97":1}}],["оставлять",{"2":{"64":1,"190":1}}],["остаются",{"2":{"17":1,"370":1,"512":1}}],["ос",{"2":{"184":1,"188":3,"190":1,"222":1,"224":1,"312":1,"457":1}}],["особый",{"2":{"378":1}}],["особых",{"2":{"246":1,"313":1,"317":1,"402":1,"440":1}}],["особенного",{"2":{"430":1}}],["особенностей",{"2":{"297":1,"301":1,"421":1}}],["особенностью",{"2":{"296":1}}],["особенность",{"2":{"130":1,"462":1}}],["особенно",{"2":{"118":1,"137":1,"180":1,"222":1,"265":1,"270":1,"290":1,"293":1,"301":1,"303":1,"419":1,"434":1,"461":1,"508":1}}],["особому",{"2":{"308":1}}],["особого",{"2":{"287":1,"310":1}}],["особое",{"2":{"134":1,"308":1}}],["особо",{"2":{"64":1}}],["основополагающих",{"2":{"300":1}}],["основополагающим",{"2":{"144":1}}],["основу",{"2":{"260":1,"306":1,"396":1}}],["основательным",{"2":{"463":1}}],["основателя",{"2":{"211":1}}],["основа",{"2":{"168":1,"394":1}}],["основано",{"2":{"394":1}}],["основанное",{"2":{"374":1}}],["основанного",{"2":{"284":1,"372":1}}],["основанные",{"2":{"460":1}}],["основанным",{"2":{"232":1}}],["основанный",{"2":{"222":1,"226":1}}],["основанных",{"2":{"137":1}}],["основана",{"2":{"269":1}}],["основан",{"2":{"174":1,"316":1,"361":1,"384":1}}],["основаны",{"2":{"148":1,"169":1,"315":1,"396":1}}],["основании",{"2":{"89":1,"294":1,"428":1}}],["основ",{"2":{"167":1,"291":1,"374":1,"400":1,"472":1}}],["основе",{"2":{"147":1,"148":1,"160":1,"172":1,"212":1,"223":1,"229":1,"244":1,"318":1,"336":1,"344":1,"355":1,"359":1,"365":1,"376":1,"392":1,"395":1,"412":1,"431":3,"463":1}}],["основываясь",{"2":{"255":1,"290":1}}],["основы",{"2":{"145":1,"221":1,"292":1,"304":1,"409":1}}],["основную",{"2":{"326":1,"352":1}}],["основная",{"2":{"34":1,"65":1,"131":1,"134":1,"160":1,"171":1,"173":1,"181":1,"187":1,"190":1,"200":1,"203":1,"210":1,"231":1,"268":1,"277":1,"293":1,"306":1,"365":1,"366":1}}],["основное",{"0":{"323":1},"1":{"324":1,"325":1},"2":{"250":1,"284":1,"300":1,"319":1,"336":1,"463":1}}],["основной",{"2":{"35":1,"119":1,"173":1,"196":1,"203":2,"209":1,"224":1,"227":1,"230":2,"244":1,"301":2,"312":1,"315":2,"336":1,"349":1,"361":1,"367":1,"391":1,"421":1,"457":1,"463":1,"470":1}}],["основного",{"2":{"29":2,"114":1,"230":1,"291":1,"337":1}}],["основном",{"2":{"10":1,"83":1,"132":1,"160":1,"170":1,"175":1,"186":1,"189":1,"190":1,"195":1,"199":1,"219":1,"221":1,"287":1,"288":1,"297":1,"312":1,"328":1,"344":1,"349":1,"360":1,"361":1,"423":1,"437":1,"507":1}}],["основным",{"2":{"149":1,"196":1,"238":1,"320":1}}],["основными",{"2":{"39":1,"169":1,"235":1}}],["основные",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1},"2":{"23":1,"59":1,"69":1,"96":1,"115":1,"145":1,"176":1,"240":1,"245":1,"422":1,"431":1,"442":1,"461":1,"464":1,"497":1}}],["основных",{"2":{"17":1,"64":1,"69":1,"119":1,"195":1,"256":1,"387":1,"461":1}}],["о",{"0":{"135":1,"462":1},"1":{"136":1},"2":{"4":1,"10":1,"11":3,"31":1,"56":1,"58":1,"68":1,"82":1,"83":1,"89":1,"119":1,"127":1,"128":1,"130":1,"134":2,"137":1,"145":4,"147":1,"148":1,"149":2,"150":1,"151":1,"152":1,"169":2,"171":1,"180":1,"186":1,"188":3,"190":3,"200":1,"203":1,"204":1,"205":1,"219":2,"223":1,"224":1,"225":1,"231":1,"232":1,"235":2,"241":1,"245":1,"251":2,"256":2,"258":1,"266":1,"270":2,"296":1,"297":1,"298":1,"308":4,"309":1,"315":2,"317":2,"336":3,"352":1,"355":1,"358":2,"364":1,"373":2,"375":1,"376":1,"378":1,"383":6,"385":1,"391":1,"393":1,"394":2,"396":1,"401":1,"408":1,"419":1,"421":1,"424":1,"426":1,"427":2,"432":1,"435":2,"439":1,"447":1,"454":1,"460":2,"462":2,"473":2,"482":1,"498":1,"554":1}}],["окажется",{"2":{"366":1}}],["оказывается",{"2":{"214":1}}],["оказывают",{"2":{"206":1}}],["оказание",{"2":{"74":1}}],["оказать",{"2":{"69":1}}],["оказаться",{"2":{"4":1,"223":1,"316":1}}],["оказалось",{"2":{"62":1}}],["окне",{"2":{"188":1,"198":1,"215":1,"308":1,"381":1}}],["окном",{"2":{"445":1}}],["окно",{"2":{"186":1,"197":1,"215":1,"223":1,"254":1,"349":1,"367":1,"378":1,"380":1,"390":1,"438":1,"504":1}}],["окна",{"2":{"172":1,"174":1,"178":2,"179":1,"188":1,"238":1,"250":2,"254":1,"267":2,"312":1,"315":1,"336":1,"390":1,"554":1}}],["окружности",{"2":{"191":1}}],["окружению",{"2":{"451":1}}],["окружений",{"2":{"451":1}}],["окружения",{"2":{"444":1,"451":1,"507":1}}],["окружении",{"2":{"188":1,"421":1}}],["окружение",{"2":{"160":1,"379":1}}],["окружающей",{"2":{"250":1}}],["окружающим",{"2":{"3":1,"34":1}}],["окружает",{"2":{"151":2}}],["окошко",{"2":{"302":1}}],["окончательный",{"2":{"371":1}}],["окончательные",{"2":{"136":1}}],["окончательном",{"2":{"230":1}}],["окончания",{"2":{"376":1}}],["окончании",{"2":{"226":1,"256":1}}],["окончанием",{"2":{"180":1}}],["около",{"2":{"86":1}}],["опен",{"2":{"472":1}}],["оперировать",{"2":{"296":1,"428":1}}],["оперирующие",{"2":{"39":1}}],["оперируют",{"2":{"3":1}}],["оперативной",{"2":{"457":1}}],["оператора",{"2":{"338":1}}],["оператор",{"2":{"256":1,"423":1}}],["операциям",{"2":{"434":1}}],["операциями",{"2":{"267":1,"303":1}}],["операциях",{"2":{"336":1}}],["операция",{"2":{"244":1,"296":2,"302":1,"364":1,"366":1,"433":2}}],["операцией",{"2":{"244":1}}],["операции",{"2":{"188":1,"239":1,"240":1,"241":1,"244":1,"282":2,"297":2,"301":3,"302":1,"303":1,"336":1,"360":1,"363":1,"373":1,"392":1,"421":1,"428":1,"431":2,"432":2,"433":2,"434":5}}],["операцию",{"2":{"180":1,"216":1,"265":1,"301":1,"303":2}}],["операций",{"2":{"156":1,"295":2,"301":2,"302":1,"303":2,"338":2,"352":1,"367":2,"387":1,"394":1,"431":1,"434":1,"460":1}}],["операционные",{"2":{"308":1}}],["операционных",{"2":{"308":1,"315":1,"440":1}}],["операционными",{"2":{"306":1,"308":1}}],["операционной",{"2":{"144":1,"308":3,"310":1,"313":1,"336":1,"387":1,"402":1}}],["операционная",{"2":{"137":1,"308":1}}],["операционную",{"2":{"137":1}}],["опираться",{"2":{"381":1}}],["опираясь",{"2":{"297":1}}],["описательные",{"0":{"313":1},"2":{"313":1}}],["описательным",{"2":{"247":1,"306":1,"310":1}}],["описательная",{"2":{"239":1}}],["описать",{"2":{"151":1}}],["описан",{"2":{"451":1}}],["описанная",{"2":{"427":1}}],["описанных",{"2":{"205":1,"222":1,"266":1}}],["описанным",{"2":{"79":1}}],["описаны",{"2":{"120":1,"126":1,"147":1}}],["описаний",{"2":{"231":1}}],["описании",{"2":{"205":1}}],["описания",{"2":{"68":1,"121":1,"152":1,"198":1,"231":1,"310":1,"376":1,"381":1}}],["описанию",{"2":{"48":1}}],["описание",{"0":{"506":1},"2":{"47":1,"64":1,"68":3,"91":1,"95":1,"108":1,"109":1,"134":1,"151":1,"160":1,"214":1,"229":1,"231":2,"276":1,"313":1,"358":1,"376":2,"422":1,"473":1}}],["описанием",{"2":{"11":1,"182":1,"313":1}}],["описываются",{"2":{"497":1}}],["описывающий",{"2":{"432":1}}],["описывающие",{"2":{"152":1}}],["описывайте",{"2":{"470":1}}],["описываться",{"2":{"61":1}}],["описывает",{"2":{"56":1,"69":2}}],["оповестить",{"2":{"462":1}}],["оповещение",{"2":{"337":1}}],["оповещения",{"2":{"291":1,"328":2}}],["оповещает",{"2":{"291":1}}],["опору",{"2":{"180":1}}],["опытным",{"2":{"508":1}}],["опытный",{"2":{"472":1}}],["опытных",{"2":{"118":1,"174":1,"418":1,"497":2}}],["опытному",{"2":{"472":1,"507":1}}],["опыту",{"2":{"181":1,"265":1,"272":1,"421":1}}],["опытом",{"2":{"171":1}}],["опыт",{"2":{"145":1,"151":1,"171":1,"190":1,"206":1,"219":1,"302":1,"472":3,"473":1,"496":2,"555":1}}],["опыта",{"2":{"118":1,"149":1,"169":1,"206":1,"219":1,"322":1,"375":1,"417":1,"425":1}}],["опущены",{"2":{"315":1,"351":1,"364":1}}],["опущено",{"2":{"255":1}}],["опубликовывать",{"2":{"291":1}}],["опубликовала",{"2":{"335":1}}],["опубликовал",{"2":{"180":1}}],["опубликовать",{"2":{"95":1,"131":1,"292":1,"326":1,"416":1}}],["опускаю",{"2":{"255":1}}],["опустили",{"2":{"365":1}}],["опустил",{"2":{"239":1}}],["опустим",{"2":{"235":1}}],["опустить",{"2":{"9":1,"336":1}}],["опционально",{"2":{"313":1,"495":1}}],["опциональными",{"2":{"310":1}}],["опция",{"2":{"223":2,"224":1,"265":1,"390":1}}],["опциями",{"2":{"112":1,"120":1,"144":1,"179":2,"255":1,"317":1,"435":1,"501":1}}],["опцию",{"2":{"92":1,"208":1,"215":1,"346":1,"375":1,"383":1}}],["опций",{"2":{"85":1,"144":1,"179":1,"200":3,"201":2,"213":1,"224":1,"227":1,"381":1,"542":1}}],["опции",{"0":{"137":1,"228":1,"541":1,"542":1},"1":{"138":1,"139":1,"140":1,"141":1,"142":1,"542":1,"543":1,"544":1,"545":1},"2":{"16":1,"144":1,"151":1,"152":1,"198":1,"228":1,"249":1,"435":1,"460":1,"501":1}}],["оптимизируют",{"2":{"373":1}}],["оптимизируя",{"2":{"69":1}}],["оптимизирован",{"2":{"244":1}}],["оптимизировать",{"2":{"150":1,"224":1,"372":1}}],["оптимизаций",{"2":{"150":1,"421":1}}],["оптимизация",{"2":{"79":1,"473":1}}],["оптимизации",{"2":{"48":1,"193":1,"421":1}}],["опять",{"2":{"53":1,"137":1,"292":1,"323":1,"325":1,"332":1,"381":1,"394":1}}],["оправдывает",{"2":{"434":1}}],["оправдали",{"2":{"385":1}}],["оправдан",{"2":{"130":1}}],["опробованы",{"2":{"62":1}}],["опрятностью",{"2":{"17":1}}],["определённых",{"2":{"464":1}}],["определил",{"2":{"349":1,"352":1}}],["определились",{"2":{"247":1,"255":1}}],["определили",{"2":{"166":1,"233":1,"238":1}}],["определите",{"2":{"255":1}}],["определиться",{"2":{"148":1}}],["определить",{"2":{"16":1,"68":1,"124":1,"175":1,"191":1,"231":1,"247":1,"255":2,"260":1,"316":1,"348":1,"352":1,"355":1,"367":1,"370":1,"400":1,"433":1}}],["определим",{"2":{"230":2,"237":1}}],["определяя",{"2":{"331":1}}],["определяю",{"2":{"152":1}}],["определяют",{"2":{"149":2,"152":2,"245":1}}],["определяются",{"2":{"68":1}}],["определяющая",{"2":{"312":1}}],["определяющих",{"2":{"313":1}}],["определяющим",{"2":{"256":1,"426":1}}],["определяющий",{"2":{"224":1,"434":1}}],["определяющие",{"2":{"148":1,"151":2}}],["определяющую",{"2":{"134":1}}],["определять",{"2":{"124":1,"152":1,"225":1,"247":1,"336":1,"352":1}}],["определяемой",{"2":{"244":1}}],["определяемого",{"2":{"156":1}}],["определяемое",{"2":{"69":1}}],["определяем",{"2":{"149":2,"191":1,"231":1,"255":1,"315":1,"331":1,"349":1,"352":1,"355":1,"429":2,"433":1}}],["определяете",{"2":{"151":1,"463":1}}],["определяется",{"2":{"115":1,"152":1,"316":1,"428":1}}],["определяет",{"2":{"69":1,"115":1,"147":1,"148":1,"149":1,"151":1,"178":1,"224":1,"277":1,"280":1,"291":2,"312":1,"315":1}}],["определены",{"2":{"177":1,"244":1,"245":1,"349":1,"557":1}}],["определено",{"2":{"160":1,"376":1}}],["определен",{"2":{"152":1,"355":1,"377":1,"426":1}}],["определений",{"2":{"245":1}}],["определении",{"2":{"193":1,"244":1,"245":1,"355":2,"367":1}}],["определение",{"0":{"238":1,"239":1,"240":1,"348":1,"354":1},"1":{"349":1,"350":1},"2":{"135":1,"171":1,"246":1,"249":1,"295":1,"332":1,"352":1,"355":2,"463":1,"507":1}}],["определением",{"2":{"122":1,"171":1,"243":1,"251":1,"255":1,"351":1}}],["определению",{"2":{"127":1,"148":1,"241":1,"355":2}}],["определения",{"2":{"3":1,"148":1,"192":1,"207":1,"231":1,"242":1,"245":3,"246":1,"249":1,"315":2,"325":1,"332":1,"353":2,"355":1,"369":1,"421":1,"464":1}}],["определенную",{"2":{"224":1,"308":1,"360":1,"366":1,"395":1}}],["определенный",{"2":{"266":1,"287":1,"316":1,"331":1,"363":1,"365":1,"428":1}}],["определенных",{"2":{"177":1,"308":1,"344":1,"361":1,"463":1,"507":1}}],["определенными",{"2":{"136":1,"151":1,"152":2,"172":1,"237":1,"507":1,"508":1}}],["определенным",{"2":{"115":1,"116":1,"297":1,"425":1}}],["определенные",{"2":{"91":1,"148":1,"149":1,"152":1,"203":1,"226":1,"240":1,"249":1,"265":1,"271":1,"355":1,"382":1,"391":1,"394":1}}],["определенном",{"2":{"315":1}}],["определенному",{"2":{"41":1,"116":1,"148":1,"376":1}}],["определенное",{"2":{"315":1,"326":1}}],["определенного",{"2":{"7":1,"228":1,"297":1,"366":1,"460":1}}],["определенной",{"2":{"7":1,"11":1,"56":1,"201":1,"392":1,"504":2}}],["оплаты",{"2":{"4":1,"12":1,"79":1,"214":1}}],["обёртку",{"2":{"504":1}}],["обзора",{"2":{"341":1}}],["обзор",{"2":{"321":1,"335":1,"456":1}}],["обхода",{"2":{"271":1,"439":1}}],["обходимся",{"2":{"23":1}}],["обиход",{"2":{"269":1}}],["обучающие",{"2":{"472":2}}],["обучающего",{"2":{"232":1}}],["обучение",{"2":{"232":1,"471":1,"472":1}}],["обучением",{"2":{"169":1}}],["обучения",{"2":{"63":1,"169":1}}],["обман",{"2":{"473":1}}],["обмануть",{"2":{"207":1,"208":1}}],["обманных",{"2":{"206":1}}],["обменять",{"2":{"363":1}}],["обмена",{"2":{"311":1,"321":1,"329":1,"341":1,"352":1,"360":1,"361":3,"394":1,"422":1,"428":1}}],["обмену",{"2":{"152":1,"325":1}}],["обмен",{"2":{"144":1,"246":1,"360":1,"361":1}}],["обмениваются",{"2":{"321":1}}],["обмениваться",{"2":{"41":1,"250":1,"252":1}}],["обменивается",{"2":{"3":1}}],["обсуждение",{"2":{"463":1}}],["обсуждали",{"2":{"308":1}}],["обсуждать",{"2":{"251":1}}],["обсуждается",{"2":{"172":1}}],["обсервер",{"2":{"260":1}}],["обслуживается",{"2":{"223":1}}],["обслуживании",{"2":{"228":1,"289":1,"414":1}}],["обслуживанием",{"2":{"297":1}}],["обслуживание",{"2":{"144":1,"171":1,"309":1}}],["обслуживания",{"2":{"135":1,"137":1,"141":1,"145":1,"295":1,"316":1,"435":1,"439":1}}],["обслуживать",{"2":{"137":1,"269":1}}],["обслуживаться",{"2":{"135":1,"308":1}}],["обстоятельствах",{"2":{"201":1}}],["обстоятельств",{"2":{"12":1}}],["оба",{"2":{"116":1,"244":1,"290":1,"302":1,"358":1,"395":1,"421":1,"439":1,"455":1,"539":1}}],["обновят",{"2":{"388":2}}],["обновим",{"2":{"339":1}}],["обновить",{"2":{"316":1,"379":1}}],["обновится",{"2":{"223":1,"462":1}}],["обновилось",{"2":{"296":1}}],["обновляют",{"2":{"434":1}}],["обновляться",{"2":{"347":2,"461":1}}],["обновлять",{"2":{"256":1,"366":1}}],["обновляется",{"2":{"256":1,"353":2}}],["обновляет",{"2":{"115":1,"231":1,"250":1,"297":1,"352":1}}],["обновляем",{"2":{"97":1,"257":1}}],["обновлено",{"2":{"246":1}}],["обновлении",{"2":{"295":1,"336":1,"337":1,"462":1}}],["обновлением",{"2":{"229":1}}],["обновление",{"2":{"154":1,"232":1,"296":1,"335":1,"451":1,"462":1}}],["обновления",{"2":{"144":2,"223":1,"267":1,"308":1,"352":1,"431":1}}],["обнаружении",{"2":{"394":1}}],["обнаружения",{"2":{"123":2,"267":1,"344":1,"352":2}}],["обнаруживает",{"2":{"315":1,"395":1}}],["обнаруживаем",{"2":{"223":1}}],["обнаружились",{"2":{"473":1}}],["обнаружили",{"2":{"270":1,"421":1}}],["обнаружить",{"2":{"249":1,"465":1}}],["обнаружите",{"2":{"224":1}}],["обнуляет",{"2":{"115":1}}],["общую",{"2":{"152":1,"171":1,"239":1,"243":1,"306":1}}],["общепризнанная",{"2":{"497":1}}],["общедоступным",{"2":{"367":1}}],["общее",{"2":{"231":1,"323":1,"427":1,"496":1}}],["общения",{"2":{"218":1}}],["общение",{"2":{"118":1,"321":1,"479":1}}],["общего",{"2":{"174":1,"263":1,"297":1,"427":1,"508":2}}],["общей",{"2":{"148":1,"196":1,"202":1,"239":1,"245":1,"263":1,"336":1,"421":1,"460":1}}],["общем",{"2":{"133":1,"148":1,"250":1,"263":1,"344":1}}],["общая",{"2":{"86":1,"214":1,"264":1}}],["общим",{"2":{"329":1}}],["общих",{"2":{"148":2,"180":1,"400":1}}],["общий",{"2":{"69":1,"144":1,"166":1,"169":1,"237":1,"290":1,"329":1,"365":1,"417":1,"425":1}}],["общие",{"0":{"78":1,"182":1,"194":1,"202":1},"1":{"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"203":1,"204":1,"205":1,"206":1},"2":{"69":1,"78":1,"95":1,"185":1,"233":1,"358":1,"359":1,"369":1,"417":2,"446":1}}],["обязательная",{"2":{"504":1}}],["обязательно",{"2":{"244":1,"472":2}}],["обязательной",{"2":{"223":1}}],["обязательные",{"2":{"261":1,"362":1}}],["обязательными",{"2":{"166":1}}],["обязательным",{"2":{"152":1,"335":1}}],["обязательных",{"2":{"23":1}}],["обязанность",{"2":{"218":1}}],["обязанности",{"2":{"171":1}}],["обязаны",{"2":{"65":1}}],["объявим",{"2":{"330":1}}],["объявивший",{"2":{"323":1}}],["объявили",{"2":{"230":1,"231":1}}],["объявить",{"2":{"151":1,"243":1}}],["объявляя",{"2":{"328":1}}],["объявляют",{"2":{"152":2}}],["объявлять",{"2":{"122":1,"152":1,"231":1,"242":1}}],["объявляете",{"2":{"421":1}}],["объявляется",{"2":{"117":1,"152":1,"153":1}}],["объявляем",{"2":{"121":1,"141":2,"149":1,"152":1,"231":1,"256":1,"287":1,"288":1,"292":1,"296":3,"298":1,"324":1,"330":1,"332":1,"333":1,"338":1,"361":1,"437":1}}],["объявлены",{"2":{"463":1}}],["объявления",{"2":{"217":1,"303":1}}],["объявление",{"2":{"117":1,"244":1,"246":2,"303":1}}],["объявлено",{"2":{"159":1}}],["объявленным",{"2":{"152":1}}],["объявленного",{"2":{"117":1}}],["объяснить",{"2":{"344":2,"472":1}}],["объяснимо",{"2":{"394":1}}],["объясним",{"2":{"230":1,"374":1}}],["объяснению",{"2":{"473":1}}],["объяснения",{"2":{"209":1}}],["объяснение",{"2":{"64":1,"91":1,"92":1}}],["объясняющие",{"2":{"270":1}}],["объясняя",{"2":{"133":1}}],["объясняет",{"2":{"68":1,"472":1}}],["объем",{"2":{"231":1,"271":1}}],["объемном",{"2":{"211":1}}],["объему",{"2":{"47":1}}],["объединению",{"2":{"385":1}}],["объединением",{"2":{"385":1}}],["объединение",{"2":{"17":1,"69":1,"365":1,"366":1}}],["объединены",{"2":{"263":1}}],["объединен",{"2":{"224":1}}],["объединяющие",{"2":{"373":1}}],["объединяются",{"2":{"134":1,"171":1}}],["объединяет",{"2":{"366":1,"376":1}}],["объединять",{"2":{"16":1,"386":3}}],["объединить",{"2":{"104":1,"393":1}}],["объективная",{"2":{"497":1}}],["объективных",{"2":{"12":1}}],["объекту",{"2":{"152":1,"186":1,"225":1,"249":1,"286":2,"287":1,"289":1,"293":1,"295":1,"297":1,"336":1,"349":1,"355":1}}],["объектах",{"2":{"287":1,"460":1}}],["объекта",{"2":{"152":2,"155":1,"157":1,"245":2,"247":1,"256":2,"267":1,"277":1,"284":1,"285":1,"286":1,"287":1,"289":1,"293":1,"295":2,"296":4,"297":4,"298":1,"300":2,"330":1,"333":1,"336":1,"338":2,"339":1,"355":1,"378":1,"380":1,"432":2,"437":1,"439":1,"460":2,"462":1,"463":1,"464":1}}],["объектами",{"2":{"274":1,"291":1,"295":1,"329":1,"460":1}}],["объектам",{"2":{"117":2,"123":2,"421":1}}],["объектом",{"2":{"152":1,"280":1,"291":1,"292":1,"295":1,"296":1,"300":1,"330":2,"336":1,"338":1,"349":1,"439":1}}],["объектов",{"2":{"17":1,"123":1,"166":1,"256":1,"264":1,"273":1,"290":1,"295":1,"311":1,"313":2,"336":1,"338":1,"439":1,"460":1}}],["объекты",{"2":{"124":1,"152":2,"158":1,"163":1,"225":1,"231":1,"245":1,"247":1,"323":1,"335":1,"336":1,"358":2,"376":1,"422":1,"439":1,"460":1,"462":1,"463":1}}],["объект",{"0":{"348":1},"1":{"349":1,"350":1},"2":{"103":1,"104":1,"120":1,"122":2,"123":6,"149":3,"151":1,"152":9,"243":1,"244":1,"245":3,"247":2,"249":1,"250":1,"252":1,"255":2,"256":2,"264":1,"277":1,"278":1,"280":2,"282":2,"288":3,"289":1,"290":1,"291":2,"292":1,"294":1,"295":5,"296":6,"297":2,"300":2,"303":3,"311":1,"313":1,"317":1,"323":1,"326":1,"328":1,"329":2,"331":1,"332":5,"333":1,"335":1,"336":3,"338":5,"339":2,"349":3,"352":2,"354":1,"355":3,"356":1,"358":3,"359":1,"361":3,"362":2,"367":4,"376":1,"380":2,"381":1,"422":1,"428":1,"432":2,"433":2,"435":1,"439":1,"460":2}}],["объекте",{"2":{"103":1,"149":1,"286":1,"315":1,"355":1,"422":1,"460":1,"472":1}}],["объектным",{"2":{"464":1}}],["объектный",{"2":{"280":1,"288":1}}],["объектные",{"2":{"17":1}}],["объектной",{"2":{"421":1}}],["объектного",{"2":{"295":1}}],["объектно",{"2":{"3":1,"151":1,"264":1,"462":1,"464":1}}],["об",{"2":{"62":1,"134":1,"148":1,"150":1,"152":2,"158":1,"178":1,"179":1,"180":1,"188":1,"211":1,"224":1,"246":1,"247":1,"250":1,"270":1,"281":1,"282":1,"285":1,"291":1,"300":1,"315":1,"332":1,"337":1,"359":1,"361":1,"390":1,"393":1,"427":1,"439":1,"446":1,"462":2,"472":1}}],["образец",{"2":{"451":1}}],["образу",{"2":{"148":1}}],["образованную",{"2":{"361":1}}],["образовательный",{"2":{"65":1}}],["образом",{"2":{"17":1,"36":1,"48":1,"53":1,"115":2,"116":1,"126":1,"134":2,"135":1,"150":2,"157":2,"173":1,"176":1,"179":1,"192":2,"205":1,"211":1,"212":1,"225":1,"226":3,"228":3,"229":1,"230":1,"231":2,"237":1,"238":2,"241":1,"243":1,"246":2,"247":3,"249":1,"250":1,"254":1,"255":2,"256":1,"267":1,"281":1,"284":1,"287":2,"289":1,"294":1,"295":2,"297":1,"298":1,"300":1,"302":1,"303":2,"315":1,"316":1,"317":1,"323":1,"326":1,"327":1,"345":1,"347":1,"349":1,"353":2,"355":1,"360":1,"367":1,"373":1,"375":2,"378":1,"379":1,"381":1,"383":1,"384":2,"388":1,"393":1,"394":1,"422":2,"433":1,"435":2,"436":1,"471":1,"511":1}}],["обработать",{"2":{"434":1}}],["обработана",{"2":{"160":1,"432":1}}],["обработчика",{"2":{"337":1}}],["обработчиком",{"2":{"296":1}}],["обработчиков",{"2":{"123":1}}],["обработчике",{"2":{"296":1}}],["обработчики",{"2":{"295":1}}],["обработчик",{"2":{"287":1,"338":1,"429":1}}],["обработке",{"2":{"421":1,"464":1}}],["обработка",{"2":{"364":1,"421":2,"439":1,"464":1}}],["обработкой",{"2":{"267":1}}],["обработку",{"2":{"180":1,"308":1,"329":1,"360":1,"421":1}}],["обработки",{"2":{"141":1,"148":1,"228":1,"256":1,"287":1,"292":1,"293":2,"294":1,"300":1,"302":1,"359":1,"360":1,"421":1,"429":1}}],["обрабатываем",{"2":{"422":2}}],["обрабатывает",{"2":{"250":1,"282":2,"360":1}}],["обрабатывается",{"2":{"127":1}}],["обрабатывающий",{"2":{"361":1}}],["обрабатывают",{"2":{"244":1}}],["обрабатываются",{"2":{"68":1,"439":1,"472":1}}],["обрабатывать",{"2":{"224":1,"230":1,"295":1,"302":1,"328":1,"344":1,"364":1,"424":1,"435":1,"452":1,"473":2}}],["обрабатываться",{"2":{"224":1,"294":1}}],["обратимся",{"2":{"330":1}}],["обратился",{"2":{"210":1}}],["обратит",{"2":{"217":1}}],["обратитесь",{"2":{"128":1,"424":1}}],["обратите",{"2":{"122":1,"123":1,"136":1,"139":1,"149":3,"151":1,"152":1,"175":1,"176":1,"200":1,"203":1,"205":1,"224":1,"230":2,"231":3,"246":1,"255":1,"256":3,"281":1,"296":2,"301":1,"303":1,"325":1,"328":1,"332":1,"335":1,"349":2,"355":1,"361":1,"365":1,"376":1,"378":1,"381":3,"391":1,"421":1,"423":1,"432":1,"435":1}}],["обратиться",{"2":{"160":1,"317":1,"420":1}}],["обратить",{"2":{"105":1,"147":1,"148":1,"187":1,"205":1,"208":1,"291":1,"352":1,"421":1}}],["обратных",{"2":{"303":1}}],["обратными",{"2":{"303":1}}],["обратный",{"0":{"301":1},"1":{"302":1},"2":{"301":1}}],["обратные",{"2":{"260":1}}],["обратную",{"2":{"134":1,"180":1,"295":1}}],["обратная",{"2":{"125":1}}],["обратное",{"2":{"296":1}}],["обратном",{"2":{"247":1}}],["обратного",{"2":{"140":1,"301":3,"302":1,"303":3,"423":1,"439":1}}],["обратной",{"2":{"74":1,"152":1,"190":1,"250":1,"344":1,"354":1,"372":1,"419":1}}],["обратно",{"2":{"44":1,"115":1,"185":1,"295":1,"336":1,"363":1,"421":1,"436":1}}],["обращающегося",{"2":{"422":1}}],["обращаются",{"2":{"244":1,"336":1}}],["обращались",{"2":{"421":1}}],["обращаясь",{"2":{"380":1}}],["обращаемся",{"2":{"335":1,"380":1,"428":1,"429":1}}],["обращается",{"2":{"117":1,"224":1,"344":1}}],["обращаешься",{"2":{"116":1}}],["обращаться",{"2":{"50":1,"116":1,"147":1,"224":1,"225":1,"231":1,"308":1,"323":1,"330":1,"336":2,"337":1,"349":1,"381":1,"439":2,"472":1}}],["обращений",{"2":{"281":1,"338":2,"428":1,"511":1}}],["обращения",{"2":{"152":1,"316":1,"439":1,"473":1,"511":1}}],["обращении",{"2":{"116":1,"423":1,"473":2}}],["обращением",{"2":{"513":1}}],["обращение",{"2":{"41":1,"352":1}}],["обложка",{"2":{"171":1}}],["обладают",{"2":{"319":1}}],["обладает",{"2":{"148":1}}],["область",{"2":{"195":1,"201":1,"255":2,"316":2,"351":1,"365":1,"370":1}}],["областью",{"2":{"192":1}}],["области",{"2":{"137":1,"152":2,"169":1,"193":2,"203":1,"262":1,"271":1,"315":1,"375":1,"463":1}}],["облачном",{"2":{"442":1,"444":1}}],["облачное",{"2":{"116":1}}],["облачные",{"2":{"367":1,"444":1}}],["облачных",{"2":{"39":1,"116":1}}],["облегчили",{"2":{"462":1}}],["облегчит",{"2":{"429":1,"466":1}}],["облегчения",{"2":{"419":1,"504":1}}],["облегчен",{"2":{"29":1}}],["облегчающего",{"2":{"385":1}}],["облегчают",{"2":{"373":1}}],["облегчат",{"2":{"224":1,"419":1}}],["облегчать",{"2":{"23":1}}],["облегчает",{"2":{"3":1,"83":1,"176":1,"265":1}}],["обычная",{"2":{"134":1,"208":1,"310":1,"393":1}}],["обычное",{"2":{"308":2,"473":1}}],["обычном",{"2":{"152":1,"225":1,"286":1,"291":1,"303":1,"304":1,"376":1,"377":1}}],["обычной",{"2":{"102":1,"115":1,"373":1,"462":1}}],["обычного",{"2":{"39":1,"58":1,"148":1,"151":1,"173":1,"175":1,"185":1,"198":1,"301":1,"302":2,"303":1,"308":1,"432":1}}],["обычно",{"2":{"28":1,"30":1,"55":1,"85":1,"109":1,"115":1,"118":1,"134":1,"137":3,"140":1,"144":1,"148":1,"150":1,"160":1,"172":1,"185":1,"186":1,"192":3,"194":1,"195":1,"196":1,"198":1,"205":1,"209":1,"215":1,"221":1,"238":2,"239":1,"241":1,"250":1,"256":1,"293":1,"296":1,"312":1,"313":1,"361":1,"366":1,"390":1,"394":1,"421":1,"425":2,"428":1,"447":1,"460":1,"461":1,"462":1,"463":2,"472":1,"473":1,"507":1,"536":1}}],["обычным",{"2":{"222":1,"225":1,"380":1,"473":1}}],["обычными",{"2":{"103":1,"227":1,"329":1,"452":1}}],["обычный",{"2":{"151":2,"183":1,"223":1,"257":1,"280":1,"323":1,"380":1,"391":1,"425":1,"455":1}}],["обычных",{"2":{"22":1,"166":1,"308":1,"342":1,"379":1,"473":1}}],["обычные",{"2":{"17":1,"249":1,"297":1,"335":1,"392":1,"462":1}}],["обещанных",{"2":{"303":1}}],["обещанной",{"2":{"303":2}}],["обещаний",{"2":{"303":2}}],["обещаниe",{"0":{"303":1}}],["обещаниями",{"2":{"303":1}}],["обещания",{"2":{"255":2,"302":1,"303":4,"428":1,"433":1}}],["обещание",{"2":{"244":1,"254":2,"255":1,"303":2,"428":1,"437":1}}],["оберток",{"2":{"473":1}}],["обертывания",{"2":{"303":1}}],["обертку",{"2":{"380":1,"381":1,"511":1}}],["обертка",{"2":{"114":1,"160":1,"462":1}}],["обертки",{"0":{"466":1},"2":{"23":1,"230":1,"231":1,"380":1,"381":2,"431":1,"466":1,"473":1}}],["обернуть",{"2":{"281":1,"302":1,"303":1,"329":1,"377":1,"464":1}}],["обернутых",{"2":{"381":1}}],["обернуты",{"2":{"266":1}}],["обернутый",{"2":{"160":1}}],["обернутую",{"2":{"250":1}}],["обернем",{"2":{"231":1,"326":1,"337":1}}],["обеспечат",{"2":{"241":1,"444":1}}],["обеспечьте",{"2":{"180":1}}],["обеспечим",{"2":{"430":1}}],["обеспечит",{"2":{"372":1}}],["обеспечить",{"2":{"148":1,"181":1,"192":1,"281":1,"292":1,"417":1}}],["обеспечивая",{"2":{"190":1,"308":1}}],["обеспечивает",{"2":{"147":1,"152":1,"222":2,"232":1,"244":1,"293":1,"302":1,"323":1,"344":1,"351":1,"361":1,"383":1}}],["обеспечивается",{"2":{"144":1,"547":1}}],["обеспечивающая",{"2":{"431":1}}],["обеспечивающие",{"2":{"134":2,"370":1,"440":1}}],["обеспечивают",{"2":{"130":1,"243":1,"336":1,"430":1}}],["обеспечении",{"2":{"179":1,"263":1}}],["обеспечению",{"2":{"137":1,"372":1,"402":1,"440":1}}],["обеспечением",{"2":{"171":1,"372":1,"383":1}}],["обеспечение",{"2":{"133":1,"137":2,"169":1,"171":2,"217":1,"370":1,"372":2,"385":1,"400":1,"402":1,"425":1}}],["обеспечения",{"0":{"260":1,"261":1,"271":1,"408":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1},"2":{"67":1,"69":1,"76":1,"118":1,"125":1,"147":1,"148":1,"160":1,"169":1,"171":1,"177":1,"179":1,"217":1,"225":1,"229":1,"234":1,"235":1,"239":1,"243":1,"250":2,"260":1,"261":2,"269":1,"270":1,"271":1,"301":1,"304":1,"326":1,"337":1,"370":4,"372":2,"374":1,"385":2,"395":1,"408":2,"419":1,"426":1,"461":1}}],["обе",{"2":{"120":1,"171":1,"315":1,"336":1,"382":1,"393":1}}],["обеих",{"2":{"9":1,"393":1}}],["обобщение",{"2":{"508":1}}],["обобщить",{"2":{"220":1}}],["оболочку",{"2":{"473":1}}],["оболочки",{"2":{"445":1}}],["обоснование",{"0":{"507":1}}],["обоснования",{"2":{"464":1}}],["обоснованное",{"2":{"212":1}}],["обоих",{"2":{"281":1,"336":2,"338":1,"375":1,"548":1}}],["обоими",{"2":{"239":1}}],["обоюдоострым",{"2":{"216":1}}],["обоюдная",{"2":{"65":1}}],["обо",{"2":{"174":1}}],["обороты",{"2":{"366":1}}],["оборудовании",{"2":{"169":1,"308":1}}],["оборудование",{"2":{"137":1}}],["оборачивайте",{"2":{"471":1}}],["оборачивает",{"2":{"424":1}}],["оборачивать",{"2":{"105":1,"303":1}}],["оборачивая",{"2":{"23":1}}],["обозначение",{"2":{"249":1,"349":1}}],["обозначениях",{"2":{"358":1}}],["обозначения",{"2":{"134":1,"198":1,"255":1,"355":1}}],["обозначить",{"2":{"238":1,"315":1}}],["обозначают",{"2":{"231":1}}],["обозначаются",{"2":{"163":1,"184":1}}],["обозначающий",{"2":{"174":1}}],["обозначается",{"2":{"192":1}}],["обозначает",{"2":{"134":1,"263":1}}],["обойтись",{"2":{"23":1,"222":1,"228":1}}],["обширен",{"2":{"13":1}}],["оно",{"2":{"139":1,"148":1,"152":1,"174":1,"181":1,"186":1,"188":2,"199":1,"200":2,"204":1,"223":1,"229":1,"232":1,"244":1,"247":1,"257":1,"292":1,"303":2,"305":1,"306":1,"308":3,"312":1,"331":1,"332":1,"339":1,"349":1,"355":1,"361":1,"372":3,"374":2,"381":1,"397":1,"423":2,"435":1,"473":1}}],["она",{"2":{"34":1,"36":1,"69":2,"125":1,"143":1,"148":1,"151":1,"154":1,"155":2,"158":1,"159":1,"160":2,"211":1,"217":1,"218":1,"219":1,"227":1,"228":1,"229":1,"250":1,"256":1,"260":1,"263":1,"267":2,"287":1,"288":1,"292":1,"297":1,"308":1,"315":1,"328":1,"330":2,"336":1,"341":1,"367":1,"372":2,"376":3,"385":1,"428":1,"431":1,"432":1,"451":1,"460":2,"462":1,"463":2,"465":1,"536":2}}],["онлайновыми",{"2":{"396":1}}],["онлайном",{"2":{"308":1}}],["онлайн",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1},"2":{"12":1,"14":1,"27":1,"61":1,"115":1,"142":1,"145":1,"186":1,"370":1,"394":1,"445":1,"455":1,"457":1,"473":1,"507":1,"508":1,"545":1}}],["они",{"2":{"3":3,"21":1,"44":1,"109":1,"134":1,"135":1,"137":1,"147":1,"148":2,"156":3,"157":1,"160":3,"161":1,"162":1,"164":1,"165":1,"166":1,"169":2,"170":1,"172":2,"174":1,"178":1,"179":1,"182":1,"183":1,"185":2,"188":1,"189":1,"195":1,"198":1,"200":1,"201":1,"205":1,"221":1,"224":1,"225":1,"247":1,"249":1,"257":1,"258":1,"260":1,"261":1,"263":1,"265":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"286":1,"289":1,"296":1,"300":1,"301":1,"302":1,"303":2,"306":1,"308":4,"310":1,"313":1,"315":2,"316":1,"319":1,"328":1,"335":2,"349":1,"351":1,"354":1,"358":4,"365":2,"367":1,"368":2,"372":1,"373":2,"376":3,"379":1,"381":2,"393":1,"394":2,"396":2,"397":1,"421":4,"428":1,"431":1,"432":2,"434":1,"435":1,"439":1,"446":2,"451":1,"452":3,"455":1,"462":2,"463":1,"467":1,"472":2,"473":1}}],["он",{"0":{"385":1},"2":{"2":1,"30":1,"32":1,"55":1,"68":1,"89":1,"105":1,"115":3,"118":1,"119":1,"120":1,"123":2,"124":1,"126":1,"134":4,"140":2,"146":2,"147":1,"148":2,"151":2,"152":1,"160":2,"171":3,"173":2,"174":2,"178":1,"180":1,"181":1,"184":3,"185":1,"188":1,"190":1,"192":1,"193":2,"197":1,"198":1,"199":1,"200":1,"203":1,"204":1,"208":2,"209":1,"210":1,"213":1,"215":1,"216":2,"222":1,"223":3,"224":4,"225":1,"226":2,"227":1,"228":2,"231":1,"237":1,"239":2,"243":1,"244":2,"251":2,"254":2,"256":3,"264":1,"265":2,"266":1,"268":2,"269":1,"270":1,"271":1,"280":1,"281":1,"284":1,"286":1,"287":1,"289":1,"290":1,"291":4,"293":1,"295":2,"297":1,"298":3,"300":1,"301":2,"306":1,"308":1,"310":1,"314":1,"315":3,"316":3,"317":1,"320":1,"323":2,"330":1,"331":1,"332":1,"336":3,"338":1,"349":1,"351":1,"352":5,"353":1,"355":3,"356":2,"358":1,"360":1,"361":2,"366":1,"372":2,"375":3,"376":2,"379":2,"381":1,"382":1,"383":1,"384":1,"386":3,"387":1,"390":2,"395":1,"397":3,"402":1,"421":5,"422":1,"423":2,"425":1,"426":1,"428":3,"429":1,"431":2,"435":1,"436":1,"451":2,"455":1,"457":2,"460":1,"461":1,"462":1,"463":1,"464":1,"473":3}}],["отчетности",{"2":{"383":1}}],["отчета",{"2":{"383":1}}],["отчет",{"2":{"376":1,"383":3}}],["отходят",{"2":{"370":1}}],["отец",{"2":{"325":1}}],["отовсюду",{"2":{"463":1}}],["отодвигает",{"2":{"284":1}}],["отобрав",{"2":{"373":1}}],["отобразим",{"2":{"255":1}}],["отобразит",{"2":{"223":1,"229":2}}],["отобразится",{"2":{"186":1}}],["отобразить",{"2":{"155":1,"160":1,"188":1,"192":1,"227":1}}],["отображен",{"2":{"352":1}}],["отображено",{"2":{"157":1}}],["отображении",{"2":{"156":1,"160":2,"174":1,"187":1,"188":1,"224":1,"231":1,"421":1}}],["отображения",{"2":{"98":1,"148":1,"149":1,"156":2,"157":1,"174":1,"175":1,"185":1,"186":3,"189":4,"197":1,"199":1,"201":1,"231":4,"244":1,"247":1,"251":1,"255":2,"256":1,"311":1,"328":1,"347":1,"384":1,"432":1,"473":1}}],["отображением",{"2":{"244":1,"311":1}}],["отображение",{"2":{"22":1,"135":1,"198":1,"421":1,"463":1}}],["отображая",{"2":{"345":1}}],["отображать",{"2":{"192":1,"327":1,"346":1,"347":1,"349":1,"352":1,"436":1,"446":1,"452":1}}],["отображаться",{"2":{"188":1,"198":1,"199":1,"223":1,"244":2,"311":1,"315":2,"318":1,"351":1,"354":2,"355":1}}],["отображающего",{"2":{"384":1}}],["отображающий",{"2":{"190":1,"297":1,"463":1}}],["отображающая",{"2":{"186":1,"231":1}}],["отображают",{"2":{"185":1,"201":1,"205":1,"323":1}}],["отображаются",{"2":{"152":1,"195":1,"198":1,"205":1,"227":2,"335":1}}],["отображаемому",{"2":{"380":1}}],["отображаемый",{"2":{"255":1,"421":1}}],["отображаемые",{"2":{"152":1}}],["отображаем",{"2":{"244":1,"255":1,"325":1}}],["отображает",{"2":{"174":1,"189":1,"231":1,"239":2,"331":1,"347":1}}],["отображается",{"2":{"160":1,"186":1,"198":1,"205":1,"215":1,"244":1,"249":1,"265":1,"347":1,"355":1}}],["отбрасывании",{"2":{"267":1}}],["отладка",{"2":{"330":1}}],["отложено",{"2":{"232":1,"421":1}}],["отложенных",{"2":{"231":2}}],["отличную",{"2":{"317":1}}],["отличный",{"2":{"222":1,"317":1,"345":1,"381":1,"472":1}}],["отличным",{"2":{"143":1,"318":1}}],["отличного",{"2":{"425":1}}],["отличной",{"2":{"421":1}}],["отличное",{"2":{"217":1,"289":1,"455":1}}],["отлично",{"2":{"134":1,"303":1,"462":1}}],["отличает",{"2":{"342":1}}],["отличается",{"2":{"22":1,"117":1,"133":1,"146":1,"352":1,"380":1,"397":1,"461":1}}],["отличать",{"2":{"250":1}}],["отличаться",{"2":{"222":1,"224":1,"276":1}}],["отличалась",{"2":{"173":1}}],["отличающим",{"2":{"256":1}}],["отличающий",{"2":{"134":1}}],["отличаются",{"2":{"144":1,"460":1}}],["отличия",{"2":{"462":1}}],["отличительных",{"2":{"297":1}}],["отличительной",{"2":{"296":1}}],["отличить",{"2":{"217":1}}],["отличимы",{"2":{"173":1}}],["отличий",{"2":{"133":1}}],["отличием",{"2":{"232":1,"439":1}}],["отличие",{"2":{"26":1,"39":1,"140":1,"144":1,"156":1,"179":1,"184":1,"221":1,"224":1,"227":1,"231":1,"245":1,"284":1,"329":1,"335":1,"336":2,"372":1,"395":1,"460":1,"462":1,"463":2}}],["отнимают",{"2":{"461":1}}],["отнести",{"2":{"358":1}}],["отнесены",{"2":{"194":1}}],["относящаяся",{"2":{"498":1}}],["относящейся",{"2":{"359":1}}],["относятся",{"2":{"207":2,"344":1}}],["относительно",{"2":{"428":1,"429":1,"473":1}}],["относительные",{"2":{"228":1}}],["относить",{"2":{"310":2}}],["относиться",{"2":{"239":1}}],["относится",{"2":{"2":1,"23":1,"95":1,"152":4,"171":1,"175":1,"203":1,"249":1,"265":1,"267":2,"303":1,"306":1,"421":1}}],["отношений",{"2":{"239":1,"326":1}}],["отношении",{"2":{"156":1}}],["отношению",{"2":{"152":1}}],["отношения",{"2":{"43":1,"243":1,"291":1,"315":1,"323":1}}],["отношение",{"2":{"43":1}}],["оттенок",{"2":{"308":1}}],["отторжение",{"2":{"180":1}}],["оттуда",{"2":{"102":1}}],["отредактирован",{"2":{"554":1}}],["отредактированы",{"2":{"390":1,"393":1}}],["отредактировать",{"2":{"393":1}}],["отредактируйте",{"2":{"393":1}}],["отрендерит",{"2":{"363":1}}],["отреагировать",{"2":{"159":1}}],["отрисовкой",{"2":{"473":1}}],["отрисованные",{"2":{"381":1}}],["отрисовываться",{"2":{"349":1}}],["отрицательных",{"2":{"303":2,"377":1}}],["отрицательные",{"2":{"169":1,"358":1}}],["отрицательного",{"2":{"303":1,"377":1}}],["отражение",{"2":{"339":1}}],["отражалось",{"2":{"353":1}}],["отражается",{"2":{"329":1,"339":1}}],["отражает",{"2":{"173":1,"240":1,"436":1}}],["отражаются",{"2":{"147":1}}],["отражаться",{"2":{"154":1}}],["отражать",{"2":{"126":1,"173":1,"436":1,"437":1}}],["отразятся",{"2":{"245":1}}],["отраслевым",{"2":{"222":1}}],["отраслевыми",{"2":{"172":1}}],["отрасли",{"2":{"182":1,"218":1,"319":1,"346":1}}],["откуда",{"2":{"462":1}}],["отката",{"2":{"451":1}}],["отказа",{"2":{"366":1,"367":1}}],["отказаться",{"2":{"365":1}}],["отказывается",{"2":{"315":1}}],["отказ",{"2":{"144":1,"210":1,"216":1,"254":1,"378":1}}],["отключить",{"2":{"460":1}}],["отключена",{"2":{"390":1}}],["откладывается",{"2":{"421":1}}],["отклонив",{"2":{"429":1}}],["отклонить",{"2":{"241":1,"315":1,"428":1}}],["отклоняется",{"2":{"361":1}}],["отклоняем",{"2":{"303":1}}],["отклоняющий",{"2":{"359":1}}],["отклонения",{"2":{"255":2}}],["отклонение",{"2":{"187":1,"255":1}}],["отклонено",{"2":{"244":1,"303":1}}],["откроем",{"2":{"227":1,"438":1}}],["откройте",{"2":{"223":2,"228":1,"231":1,"318":1,"390":1}}],["откровенного",{"2":{"216":1}}],["открыла",{"2":{"268":1}}],["открыв",{"2":{"228":1}}],["открываемость",{"2":{"335":1}}],["открываем",{"2":{"316":1}}],["открывается",{"2":{"186":1,"197":1,"215":1,"518":1}}],["открывает",{"2":{"149":1,"240":1,"255":1,"256":1,"282":1,"284":1,"376":1,"381":1}}],["открываться",{"2":{"308":1}}],["открывать",{"2":{"254":1,"336":1}}],["открывающих",{"2":{"205":1}}],["открывающем",{"2":{"153":1}}],["открываются",{"2":{"186":1}}],["открыт",{"2":{"518":1}}],["открытия",{"2":{"318":1,"384":1}}],["открытии",{"2":{"254":1}}],["открытие",{"2":{"239":1}}],["открытых",{"2":{"336":1,"367":1}}],["открытый",{"2":{"270":1}}],["открытыми",{"2":{"472":1}}],["открытым",{"2":{"223":1}}],["открытые",{"2":{"116":1}}],["открытого",{"2":{"386":1}}],["открыто",{"2":{"187":1,"311":1}}],["открытом",{"2":{"145":1,"472":1}}],["открыть",{"2":{"143":1,"174":3,"224":1,"241":1,"254":1,"339":1,"366":1,"367":2,"375":1,"390":1,"421":1}}],["отзывами",{"2":{"473":1}}],["отзывчивой",{"2":{"421":1}}],["отзывчивого",{"2":{"203":1,"308":1}}],["отзывчивых",{"2":{"400":1}}],["отзывчивый",{"2":{"203":1}}],["отзывчивые",{"0":{"203":1},"2":{"308":2}}],["отзывчивыми",{"2":{"125":1,"306":1}}],["отзывы",{"2":{"4":1,"47":1,"79":1}}],["отследить",{"2":{"385":1}}],["отслеживать",{"2":{"390":1,"391":2,"396":1}}],["отслеживаться",{"2":{"390":1}}],["отслеживаются",{"2":{"335":1}}],["отслеживании",{"2":{"427":1}}],["отслеживание",{"2":{"370":1,"385":1}}],["отслеживанию",{"2":{"291":1,"296":1}}],["отслеживания",{"2":{"157":1,"222":1,"254":1,"293":1,"336":1,"384":1,"390":1,"460":2}}],["отслеживает",{"2":{"224":1,"460":3}}],["отсутствовавшие",{"2":{"431":1}}],["отсутствует",{"2":{"383":1}}],["отсутствие",{"2":{"370":1}}],["отсутствий",{"2":{"59":1}}],["отсылается",{"2":{"336":1}}],["отсылаю",{"2":{"119":1,"303":1,"352":1,"435":1}}],["отстоит",{"2":{"367":1}}],["отстает",{"2":{"472":1}}],["отстают",{"2":{"308":1}}],["отставать",{"2":{"308":1}}],["отступов",{"2":{"267":1}}],["отступам",{"2":{"176":1}}],["отсюда",{"2":{"227":1,"439":1}}],["отписки",{"2":{"328":1}}],["отпечаток",{"2":{"115":1,"270":1}}],["отправитель",{"2":{"439":1}}],["отправить",{"2":{"143":1,"365":1,"367":1,"422":1,"436":1}}],["отправили",{"2":{"363":1,"364":1}}],["отправленные",{"2":{"360":1}}],["отправленную",{"2":{"344":1,"436":1}}],["отправляя",{"2":{"426":1}}],["отправлять",{"2":{"308":1,"327":1,"366":1,"429":1,"473":1}}],["отправляли",{"2":{"180":1}}],["отправляемого",{"2":{"437":1}}],["отправляем",{"2":{"364":1,"394":1,"430":1,"437":1}}],["отправляемые",{"2":{"152":1}}],["отправляет",{"2":{"115":1,"344":1,"386":1,"423":1,"430":1}}],["отправляется",{"2":{"3":1,"365":1}}],["отправки",{"2":{"366":2,"437":2,"439":1}}],["отправке",{"2":{"291":1}}],["отправка",{"2":{"114":1,"365":1}}],["отправной",{"2":{"238":1,"306":1}}],["отправная",{"2":{"223":1,"224":1,"253":1,"310":1}}],["отправную",{"2":{"119":1,"237":1}}],["отяжелел",{"2":{"55":1}}],["отмечают",{"2":{"372":1}}],["отмечаем",{"2":{"22":1,"97":1}}],["отмеченных",{"2":{"318":1}}],["отмеченным",{"2":{"208":1}}],["отмечена",{"2":{"318":1}}],["отметить",{"2":{"229":1,"231":1,"247":1,"256":2,"276":1,"294":1,"300":1,"308":1,"323":1,"329":1,"344":1,"435":1,"471":1,"472":1}}],["отметим",{"2":{"33":1}}],["отметьте",{"2":{"208":1}}],["отметка",{"2":{"187":1}}],["отменяет",{"2":{"344":1}}],["отменять",{"2":{"180":1}}],["отменены",{"2":{"293":1}}],["отменен",{"2":{"255":1}}],["отменена",{"2":{"229":1,"366":1}}],["отмене",{"2":{"254":1}}],["отмены",{"2":{"210":1}}],["отменит",{"2":{"210":1}}],["отменить",{"2":{"180":1,"216":1,"241":1,"255":1}}],["отдавать",{"2":{"473":1}}],["отдаваемыми",{"2":{"11":1}}],["отдачи",{"2":{"383":1}}],["отделяет",{"2":{"293":1}}],["отделены",{"2":{"200":1}}],["отделить",{"2":{"462":1,"472":1}}],["отделит",{"2":{"151":1}}],["отделку",{"2":{"26":1}}],["отдельная",{"2":{"73":1,"102":1,"117":1,"308":1}}],["отдельного",{"2":{"349":1,"445":1,"462":1,"508":1}}],["отдельности",{"2":{"271":1}}],["отдельном",{"2":{"268":1,"316":1,"331":1,"463":1}}],["отдельно",{"2":{"67":1,"508":1}}],["отдельной",{"2":{"43":1,"90":1,"192":1,"438":1}}],["отдельное",{"2":{"33":1}}],["отдельным",{"2":{"421":1}}],["отдельными",{"2":{"117":1}}],["отдельных",{"2":{"145":1,"229":1,"253":1,"381":1,"382":2,"421":1,"440":1,"555":1}}],["отдельный",{"2":{"9":1,"41":1,"83":1,"85":1,"98":1,"102":1,"105":2,"114":2,"151":1,"268":1,"335":1,"395":1,"445":1,"471":1}}],["отдельные",{"2":{"2":1,"11":1,"79":1}}],["отдельную",{"2":{"3":1,"22":1,"263":1,"311":1,"394":1,"463":1}}],["от",{"0":{"402":1},"2":{"3":1,"22":1,"23":2,"26":1,"39":1,"53":1,"61":1,"64":1,"74":1,"86":1,"108":1,"114":1,"115":1,"117":4,"121":1,"127":1,"130":1,"133":1,"134":4,"140":1,"143":1,"144":2,"146":1,"147":2,"148":3,"149":1,"151":1,"152":3,"156":2,"167":1,"169":1,"172":1,"173":2,"178":1,"179":2,"183":2,"184":1,"186":1,"187":1,"188":2,"193":1,"198":1,"200":2,"201":1,"203":3,"205":2,"208":1,"210":1,"216":2,"217":2,"218":1,"221":1,"222":1,"224":2,"225":3,"227":1,"231":4,"233":1,"238":1,"239":1,"245":2,"246":1,"249":1,"250":1,"251":1,"256":3,"258":1,"260":2,"262":1,"263":1,"268":1,"271":1,"272":2,"276":1,"286":1,"291":1,"293":1,"294":1,"295":3,"297":1,"298":1,"300":1,"301":3,"304":1,"308":3,"315":3,"323":1,"326":1,"328":3,"329":1,"330":1,"335":2,"336":3,"342":1,"360":4,"361":2,"363":1,"364":1,"365":1,"366":5,"367":1,"368":1,"370":1,"372":1,"374":1,"380":1,"383":1,"385":4,"390":1,"394":1,"395":3,"397":1,"402":1,"421":2,"422":2,"423":1,"425":1,"427":1,"431":3,"432":1,"438":1,"440":1,"444":1,"452":1,"460":1,"461":2,"462":3,"463":3,"467":1,"471":1,"472":4,"496":1,"504":1,"507":1,"508":1,"536":1}}],["отводится",{"2":{"173":1}}],["отвечал",{"2":{"439":1}}],["отвечающие",{"2":{"462":1,"463":1}}],["отвечающий",{"2":{"421":1,"439":1}}],["отвечающего",{"2":{"385":1}}],["отвечаем",{"2":{"360":2,"439":1}}],["отвечает",{"2":{"115":1,"171":1,"213":1,"224":1,"237":1,"238":1,"239":2,"240":1,"241":1,"316":1,"325":1,"383":1,"447":1,"557":1}}],["отвечать",{"2":{"6":1,"402":1,"425":1}}],["ответы",{"2":{"428":1}}],["ответственная",{"2":{"463":1}}],["ответственностью",{"2":{"265":2}}],["ответственность",{"2":{"260":1,"263":1,"287":1,"291":1,"360":2}}],["ответственности",{"0":{"263":1,"265":1},"2":{"260":1,"263":4}}],["ответственным",{"2":{"2":1}}],["ответьте",{"2":{"259":1,"320":1}}],["ответов",{"2":{"196":1,"497":2}}],["ответить",{"2":{"148":1,"168":1,"383":1}}],["ответе",{"2":{"117":2}}],["ответах",{"2":{"497":1}}],["ответа",{"2":{"4":2,"301":1,"316":1,"360":1,"364":1,"365":2,"428":1,"437":1,"439":3}}],["ответ",{"2":{"4":1,"117":2,"185":1,"240":1,"316":1,"344":1,"352":1,"360":2,"362":1,"378":1,"381":1,"421":1,"430":1,"439":2,"472":1,"495":1}}],["отвлечься",{"2":{"3":1}}],["н",{"2":{"472":1}}],["нынешними",{"2":{"230":1}}],["ный",{"2":{"62":1}}],["нюансов",{"2":{"117":1,"119":1}}],["нулевой",{"2":{"317":1}}],["нулевые",{"2":{"134":1}}],["нулей",{"2":{"300":1}}],["нуля",{"2":{"148":1,"221":2,"304":1}}],["нули",{"2":{"134":1}}],["ну",{"2":{"83":1,"255":1,"300":1}}],["нуждающихся",{"2":{"334":1}}],["нуждаются",{"2":{"247":1}}],["нужд",{"2":{"330":1,"359":1}}],["нужды",{"2":{"221":1}}],["нужен",{"0":{"385":1},"2":{"17":1,"288":1,"317":1,"320":1,"352":3,"388":1,"451":1,"455":1,"463":2,"472":2,"473":1,"528":1}}],["нужную",{"2":{"289":1,"387":1,"527":1}}],["нужна",{"2":{"12":1,"118":1,"125":1,"148":1,"264":1,"267":1,"445":1,"454":1,"460":1,"465":1}}],["нужное",{"2":{"86":1,"451":1}}],["нужно",{"2":{"12":1,"39":1,"41":2,"59":1,"68":1,"82":1,"83":1,"95":2,"102":1,"112":1,"115":2,"121":1,"123":1,"134":2,"141":1,"148":1,"149":1,"150":1,"152":2,"156":1,"160":1,"169":1,"191":1,"192":1,"221":1,"224":1,"227":2,"230":1,"231":1,"232":1,"239":1,"244":1,"249":1,"250":1,"255":1,"265":1,"287":1,"292":1,"295":1,"303":1,"328":1,"333":1,"352":2,"361":1,"365":1,"372":1,"375":1,"378":1,"390":1,"391":1,"393":1,"432":1,"439":1,"447":1,"451":1,"452":2,"455":2,"460":1,"461":2,"463":2,"464":1,"471":1,"472":1,"473":2}}],["нужного",{"2":{"9":1,"205":1}}],["нужных",{"2":{"460":1,"536":1}}],["нужный",{"2":{"134":1,"217":1,"227":1,"461":1,"540":1}}],["нужные",{"2":{"116":1,"409":1,"552":1}}],["нужны",{"2":{"7":1,"56":1,"103":1,"379":1,"381":1,"446":1,"460":1,"464":1,"473":1,"536":1}}],["нужным",{"2":{"3":1}}],["нём",{"2":{"41":1,"102":1,"468":1}}],["нежелаемые",{"2":{"507":1}}],["нежелательных",{"2":{"226":1}}],["нежелательные",{"2":{"189":1}}],["нежелательная",{"2":{"225":1}}],["неудобно",{"2":{"452":1}}],["неудачей",{"2":{"372":1,"393":1}}],["неудачи",{"2":{"303":2,"372":1}}],["неудачное",{"2":{"463":1}}],["неудачного",{"2":{"303":1}}],["неудачной",{"2":{"244":1,"376":2}}],["неудачный",{"2":{"363":1}}],["неудачные",{"2":{"302":1}}],["неудачным",{"2":{"301":1,"366":1}}],["неудача",{"2":{"301":1}}],["неуклюжим",{"2":{"381":1}}],["нелогично",{"2":{"463":1}}],["нелегкая",{"2":{"373":1}}],["нельзя",{"2":{"86":1,"336":1,"462":1}}],["нецелесообразно",{"2":{"358":1}}],["неэффективным",{"2":{"473":1}}],["неэффективной",{"2":{"328":1}}],["неэтичной",{"2":{"207":1}}],["недействительным",{"2":{"381":1}}],["неделимого",{"2":{"263":1}}],["недопущения",{"2":{"516":1}}],["недопонимание",{"2":{"68":1}}],["недорого",{"2":{"444":1}}],["недочеты",{"2":{"372":1}}],["недоумении",{"2":{"190":1}}],["недостающие",{"2":{"379":1,"383":1}}],["недостаточно",{"2":{"306":1,"307":1,"366":1}}],["недостаток",{"2":{"302":1,"328":1}}],["недостатком",{"2":{"329":1,"421":2}}],["недостатков",{"2":{"243":1,"344":1,"360":1,"366":1}}],["недостатка",{"2":{"222":1,"364":1}}],["недостатки",{"2":{"152":1,"308":2,"330":1,"344":1,"360":1,"375":1}}],["недоступна",{"2":{"125":1}}],["независимы",{"2":{"463":1}}],["независимых",{"2":{"375":2}}],["независимость",{"2":{"445":1}}],["независимо",{"2":{"271":1,"315":1,"326":1,"328":2,"390":1,"445":1}}],["независимое",{"2":{"258":1}}],["незавершенных",{"2":{"231":1}}],["незаслужено",{"2":{"115":1}}],["неиспользуемых",{"2":{"267":1}}],["неиспользуемые",{"2":{"225":1}}],["неисчерпывающими",{"2":{"262":1}}],["неизменяемым",{"2":{"367":1}}],["неизменяемое",{"2":{"152":1}}],["неизменным",{"2":{"287":1}}],["неизбежным",{"2":{"200":1}}],["нечто",{"2":{"221":1,"331":1,"347":1,"355":1,"463":1}}],["ненужную",{"2":{"269":1}}],["ненужной",{"2":{"463":1}}],["ненужного",{"2":{"269":1}}],["ненужному",{"2":{"265":1}}],["ненужное",{"2":{"118":1}}],["ненужным",{"2":{"264":1}}],["ненависть",{"2":{"215":1}}],["ненаправленность",{"0":{"213":1}}],["неочевидные",{"2":{"497":1}}],["неотзывчивым",{"2":{"336":1,"421":1}}],["неотъемлемой",{"2":{"243":1,"300":1}}],["неоднократно",{"2":{"290":1,"300":1,"358":1}}],["неоптимизированных",{"2":{"473":1}}],["неопределено",{"2":{"303":1}}],["неопределенное",{"2":{"381":1}}],["неопределенном",{"2":{"190":1,"303":1}}],["неопределенных",{"2":{"303":1}}],["неопределенна",{"2":{"301":1}}],["неопытный",{"2":{"270":1}}],["необязателен",{"2":{"423":1}}],["необязательными",{"2":{"356":1}}],["необязательным",{"2":{"245":1}}],["необязательные",{"2":{"53":1}}],["необычными",{"2":{"400":1}}],["необычно",{"2":{"249":1}}],["необходимую",{"2":{"432":1,"473":1}}],["необходима",{"2":{"328":1}}],["необходим",{"2":{"144":1,"292":1,"334":1,"397":1,"444":1}}],["необходимы",{"2":{"358":1,"361":1,"368":1,"396":1,"446":1}}],["необходимыми",{"2":{"227":1,"293":1,"504":1}}],["необходимым",{"2":{"219":1,"310":1,"507":1}}],["необходимые",{"2":{"133":1,"222":1,"249":1,"308":1,"313":1,"316":1,"416":1,"439":1,"457":1}}],["необходимых",{"2":{"119":1,"131":1,"333":1,"375":1,"556":1}}],["необходимый",{"2":{"55":1,"133":1,"209":1,"472":1}}],["необходимому",{"2":{"179":1}}],["необходимость",{"2":{"102":1,"173":1,"187":1,"240":1,"271":1,"359":1,"385":1,"390":1,"397":1}}],["необходимости",{"2":{"59":1,"119":1,"144":1,"148":2,"152":1,"227":1,"244":2,"288":1,"297":2,"313":1,"330":1,"344":1,"345":2,"349":1,"352":1,"358":1,"361":3,"383":1,"421":1,"427":1,"446":1,"451":1,"452":1,"504":2}}],["необходимое",{"2":{"85":1,"178":1,"241":1,"376":1}}],["необходимой",{"2":{"12":1,"292":1,"293":1}}],["необходимо",{"0":{"311":1},"2":{"9":1,"12":1,"59":1,"115":1,"125":2,"133":1,"134":2,"135":6,"137":1,"140":1,"144":1,"145":1,"146":1,"147":1,"148":3,"152":3,"160":1,"172":1,"183":1,"205":2,"224":1,"225":1,"227":1,"230":1,"237":1,"238":1,"239":2,"243":1,"244":1,"245":1,"247":1,"249":1,"254":1,"255":2,"256":1,"264":1,"265":1,"267":2,"278":2,"281":1,"292":1,"294":1,"295":6,"298":1,"300":1,"301":2,"303":1,"308":2,"315":1,"316":2,"317":2,"328":1,"331":2,"335":1,"344":1,"346":1,"348":1,"350":1,"352":2,"354":1,"355":1,"358":1,"360":1,"361":2,"362":1,"363":2,"365":1,"366":1,"367":1,"373":4,"374":2,"375":1,"376":2,"377":1,"378":1,"379":1,"382":2,"383":1,"388":1,"390":1,"394":1,"397":1,"422":1,"423":2,"424":1,"425":1,"432":1,"433":2,"434":1,"439":1,"447":1,"507":1,"528":1,"529":1,"552":1}}],["негативный",{"2":{"190":1}}],["негативных",{"2":{"190":1,"268":1}}],["него",{"2":{"9":1,"11":1,"86":1,"89":1,"102":1,"104":1,"117":1,"130":2,"144":1,"160":1,"199":1,"201":1,"204":1,"218":1,"222":1,"225":1,"228":1,"231":1,"270":1,"281":1,"325":1,"338":1,"355":1,"364":1,"365":1,"375":1,"379":1,"381":1,"382":1,"386":1,"454":1,"457":1,"463":2,"515":1}}],["неяркой",{"2":{"184":1}}],["неявно",{"2":{"103":1}}],["нередко",{"2":{"366":1}}],["нереактивных",{"2":{"352":1}}],["нереактивные",{"2":{"152":1}}],["нерационального",{"2":{"267":1}}],["неразличенно",{"2":{"171":1}}],["невероятно",{"2":{"373":1}}],["невелика",{"2":{"352":1}}],["невелик",{"2":{"231":1}}],["невелики",{"2":{"137":1}}],["невозможен",{"2":{"345":1}}],["невозможна",{"2":{"434":1}}],["невозможным",{"2":{"210":1}}],["невозможной",{"2":{"373":1}}],["невозможность",{"2":{"210":1}}],["невозможности",{"2":{"12":1}}],["невозможно",{"2":{"134":1,"142":1,"217":1,"225":1,"256":1,"263":1,"373":1,"463":1,"472":1}}],["невыполненных",{"2":{"229":1}}],["неё",{"2":{"91":1,"95":1,"115":1,"224":1,"367":1,"511":1}}],["нефункциональные",{"0":{"77":1},"2":{"68":1}}],["некую",{"2":{"293":1}}],["некоего",{"2":{"463":1}}],["некое",{"2":{"187":1}}],["некой",{"2":{"115":1}}],["некоторая",{"2":{"367":1}}],["некоторый",{"2":{"232":1}}],["некоторыми",{"2":{"131":2,"228":1,"231":1,"271":1,"317":1,"353":1,"372":1,"431":1}}],["некоторым",{"2":{"131":2,"183":1,"421":1}}],["некоторые",{"2":{"128":1,"130":1,"134":2,"147":1,"148":3,"152":2,"169":1,"172":2,"179":1,"190":1,"194":1,"195":1,"198":1,"210":1,"217":1,"219":1,"221":1,"222":2,"224":3,"225":4,"228":1,"229":1,"233":1,"249":1,"251":1,"261":1,"267":1,"270":1,"291":1,"292":1,"300":1,"308":3,"310":2,"315":1,"320":1,"321":2,"325":1,"336":2,"344":1,"358":1,"359":1,"364":1,"367":1,"369":2,"370":1,"380":2,"384":1,"393":1,"394":1,"428":1,"429":1,"431":1,"460":1,"473":1}}],["некоторых",{"2":{"47":1,"123":1,"160":1,"171":1,"185":1,"209":1,"217":1,"223":1,"224":1,"225":1,"227":1,"235":1,"251":1,"266":1,"276":1,"279":1,"289":1,"308":2,"323":1,"361":1,"367":1,"372":1,"373":1,"382":1,"421":1,"435":1,"447":1}}],["некоторое",{"2":{"152":1,"276":1,"375":1,"376":1}}],["некоторой",{"2":{"126":1,"257":1,"293":1,"294":1,"316":1,"376":1,"381":1,"426":1}}],["некотором",{"2":{"61":1,"366":1,"463":1}}],["некоторую",{"2":{"116":1}}],["некритичными",{"2":{"40":1}}],["некий",{"2":{"9":1,"295":1,"473":1}}],["небольшом",{"2":{"352":1}}],["небольшого",{"2":{"115":1,"116":1,"149":1,"323":1,"337":1}}],["небольшой",{"0":{"100":1},"2":{"105":1,"137":1,"186":1,"231":1,"250":1,"434":1,"438":1,"439":1,"456":1,"473":1}}],["небольшое",{"2":{"38":1,"123":1,"136":1,"149":1,"160":1,"187":1,"197":1}}],["небольших",{"2":{"152":1,"203":1,"244":1,"321":1,"330":1,"383":1,"471":1,"508":1}}],["небольшим",{"2":{"130":1,"148":1,"232":1}}],["небольшими",{"2":{"91":1,"318":1,"339":1}}],["небольшие",{"2":{"79":1,"170":1,"192":1,"269":1}}],["небольшая",{"0":{"257":1},"2":{"86":1}}],["небольшую",{"2":{"2":1,"209":1,"473":1}}],["ней",{"2":{"34":1,"40":1,"116":2,"170":1,"221":1,"250":1,"292":1,"323":1,"336":2,"376":1,"409":1,"413":1,"414":1,"417":1,"437":1,"460":1,"463":1,"465":1,"473":1,"536":1}}],["нетривиальная",{"2":{"457":1}}],["нетривиальные",{"2":{"373":1}}],["нетривиальных",{"2":{"370":1,"385":1}}],["нетерпеливые",{"2":{"189":1}}],["нет",{"2":{"30":1,"32":1,"62":1,"96":1,"115":2,"119":1,"134":1,"144":1,"152":2,"155":1,"168":1,"180":1,"195":1,"200":1,"209":1,"222":1,"223":1,"231":1,"234":1,"257":2,"281":1,"292":1,"297":1,"330":2,"333":1,"350":1,"355":1,"358":1,"375":2,"376":1,"378":2,"402":1,"421":3,"472":2,"473":1}}],["немножко",{"2":{"473":1}}],["немногие",{"2":{"211":1}}],["немного",{"2":{"86":1,"98":1,"149":1,"167":1,"226":1,"232":1,"248":1,"298":1,"303":1,"308":3,"332":1,"347":1,"355":1,"361":1,"433":1,"462":1,"465":1,"471":1}}],["немедленным",{"2":{"430":1}}],["немедленное",{"2":{"426":1}}],["немедленно",{"2":{"256":1,"329":1}}],["немодифицированный",{"2":{"295":1}}],["нему",{"2":{"115":1,"117":1,"139":1,"249":1,"352":1,"358":1,"381":1,"394":1,"457":1,"463":1}}],["немаленький",{"2":{"44":1}}],["нем",{"2":{"29":1,"32":1,"95":1,"115":2,"117":1,"147":1,"148":1,"204":1,"297":1,"300":1,"334":1,"336":1,"376":1,"380":1,"421":1,"433":1,"444":1,"451":2,"472":1,"498":1}}],["непустое",{"2":{"155":1}}],["непрямой",{"2":{"463":1}}],["непрактичным",{"2":{"385":1}}],["неправильно",{"2":{"361":1}}],["неправильном",{"2":{"156":1,"366":1}}],["неприятных",{"2":{"250":1}}],["непрерывно",{"2":{"395":1}}],["непрерывной",{"2":{"143":1}}],["непрерывная",{"0":{"395":1},"2":{"394":1,"395":3,"442":1}}],["непредусмотренные",{"2":{"207":1}}],["непроизвольным",{"2":{"332":1}}],["непроизвольных",{"2":{"190":1}}],["непростой",{"2":{"98":1}}],["непростая",{"2":{"25":1}}],["неплохим",{"2":{"116":1}}],["неплохой",{"2":{"464":1}}],["неплохо",{"2":{"92":1,"105":1,"299":1,"472":1,"539":1}}],["неполным",{"2":{"394":1}}],["неполный",{"0":{"262":1},"1":{"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1},"2":{"119":1,"182":1,"185":1,"260":1,"272":1}}],["непостоянен",{"2":{"232":1}}],["непосредственный",{"2":{"205":1}}],["непосредственное",{"2":{"206":1}}],["непосредственно",{"2":{"40":1,"122":1,"137":1,"143":1,"150":1,"205":1,"223":1,"224":2,"225":2,"231":1,"243":1,"264":1,"267":2,"281":1,"295":1,"298":1,"316":1,"317":1,"355":1,"367":2,"381":2,"423":1,"428":1,"432":1,"433":1,"460":1,"503":1,"507":1}}],["непонятным",{"2":{"224":1}}],["неподкованых",{"2":{"12":1}}],["нее",{"2":{"23":1,"152":1,"195":1,"327":1,"329":1,"391":1,"392":1,"462":1,"463":1}}],["несущественные",{"2":{"482":1}}],["нестандартные",{"2":{"472":1}}],["нестандартных",{"2":{"360":1}}],["нести",{"2":{"360":1}}],["несем",{"2":{"360":1}}],["несмотря",{"2":{"189":2,"271":1,"323":1,"375":1,"376":1,"434":1,"472":1}}],["несомненно",{"2":{"169":1}}],["несовместимости",{"2":{"147":2}}],["несоответствия",{"2":{"393":1}}],["несоответствие",{"2":{"122":2,"393":1}}],["несоответствию",{"2":{"68":1}}],["несложен",{"2":{"144":1}}],["несложных",{"2":{"473":1}}],["несложный",{"2":{"12":1}}],["несложно",{"2":{"22":1,"39":1,"58":1,"115":1,"447":1}}],["несколькими",{"2":{"228":1,"247":1,"257":1,"367":1,"441":1}}],["нескольким",{"2":{"117":1,"246":1,"269":1}}],["нескольких",{"2":{"43":1,"124":1,"133":1,"134":2,"152":1,"223":1,"230":1,"241":1,"243":1,"250":1,"259":1,"260":1,"265":1,"271":1,"306":1,"319":1,"328":1,"336":1,"347":1,"353":1,"366":1,"385":2,"393":1,"425":1,"432":1,"439":1,"445":1,"447":1,"455":1,"461":1,"462":1,"463":1,"504":1}}],["несколько",{"2":{"11":1,"29":1,"38":1,"99":1,"109":2,"132":1,"134":3,"137":1,"148":1,"149":1,"150":3,"152":1,"159":2,"160":1,"180":1,"184":1,"189":2,"203":1,"205":1,"212":1,"217":2,"220":1,"224":1,"227":2,"231":1,"241":2,"243":1,"244":2,"246":2,"249":3,"256":1,"257":1,"262":1,"265":2,"268":1,"271":1,"291":1,"297":1,"300":1,"302":1,"308":1,"315":1,"316":1,"323":1,"326":1,"328":1,"336":2,"342":1,"355":2,"358":1,"359":1,"361":2,"368":1,"375":3,"376":3,"380":1,"381":1,"421":1,"434":1,"438":1,"440":1,"447":3,"451":1,"463":2,"464":1,"473":1}}],["несвязанные",{"2":{"3":1}}],["не",{"0":{"118":1,"268":1},"2":{"3":1,"10":2,"17":1,"22":2,"23":1,"26":1,"32":1,"33":1,"39":3,"40":1,"41":1,"48":1,"53":1,"55":1,"56":1,"59":2,"64":3,"65":1,"71":1,"73":1,"74":1,"76":1,"86":1,"92":1,"93":2,"96":1,"104":1,"105":2,"114":1,"115":4,"116":4,"117":3,"118":2,"119":4,"121":2,"122":1,"123":4,"124":2,"125":1,"129":1,"131":1,"133":1,"134":4,"136":1,"137":4,"139":1,"140":1,"141":2,"142":1,"143":2,"144":2,"147":2,"148":3,"149":2,"150":2,"151":2,"152":9,"154":1,"155":1,"156":1,"157":1,"159":2,"160":4,"161":1,"166":2,"170":1,"171":1,"172":2,"174":3,"176":3,"178":1,"183":2,"184":1,"187":3,"188":1,"189":1,"190":4,"192":5,"193":1,"195":1,"196":3,"197":2,"198":1,"200":5,"201":1,"204":3,"206":1,"208":4,"209":3,"210":1,"212":2,"214":1,"216":2,"217":1,"218":1,"221":3,"222":1,"223":6,"224":5,"225":3,"226":1,"227":5,"228":8,"230":2,"232":3,"234":1,"235":2,"238":1,"240":1,"241":3,"243":1,"244":1,"245":1,"246":2,"247":3,"249":5,"250":2,"251":4,"255":2,"256":3,"260":4,"261":2,"263":1,"264":3,"265":1,"266":3,"267":4,"268":3,"269":2,"270":2,"271":1,"276":1,"277":1,"280":1,"281":2,"284":1,"286":5,"287":4,"288":2,"289":2,"292":5,"294":1,"295":4,"296":1,"297":2,"298":1,"300":3,"301":7,"302":4,"303":5,"308":6,"310":3,"311":1,"313":2,"315":1,"316":7,"318":2,"319":1,"323":3,"325":4,"328":1,"330":1,"331":2,"332":1,"335":2,"336":11,"337":1,"338":1,"344":6,"346":2,"349":4,"352":6,"354":1,"355":3,"357":1,"358":1,"360":2,"361":3,"363":1,"364":2,"365":4,"366":6,"367":4,"369":1,"370":1,"371":1,"372":3,"373":1,"375":2,"376":4,"377":5,"378":2,"379":1,"380":1,"381":3,"382":3,"384":1,"385":3,"388":1,"390":6,"391":4,"392":1,"393":3,"394":1,"397":1,"420":1,"421":11,"425":2,"426":1,"428":1,"430":1,"431":1,"432":3,"433":5,"434":4,"439":2,"440":1,"441":1,"442":1,"446":1,"447":2,"451":1,"452":1,"454":1,"457":7,"459":1,"460":7,"461":1,"462":6,"463":11,"464":3,"465":5,"466":1,"468":2,"471":1,"472":5,"473":10,"497":1,"503":1,"504":3,"507":2,"508":1,"515":1,"528":2,"539":1,"555":1}}],["ни",{"2":{"152":1,"249":1,"276":1,"287":1,"331":1,"336":3,"360":1,"374":1,"375":1,"376":1,"391":1}}],["низкоуровневый",{"2":{"507":1}}],["низком",{"2":{"295":1}}],["низкие",{"2":{"137":1}}],["низвело",{"2":{"102":1}}],["никогда",{"2":{"118":1,"134":1,"192":1,"224":1,"228":1,"243":1,"316":1,"366":1,"472":1}}],["никаким",{"2":{"352":1}}],["никакие",{"2":{"230":1}}],["никаких",{"2":{"118":1,"381":1,"463":1}}],["никакого",{"2":{"209":1}}],["никакой",{"2":{"193":1,"256":1,"257":1,"463":1,"473":1}}],["никак",{"2":{"3":1,"352":1}}],["нижняя",{"2":{"542":1}}],["нижний",{"2":{"175":1,"255":1}}],["нижней",{"2":{"192":1,"193":1,"195":1,"203":1,"205":1,"315":1}}],["нижнем",{"2":{"162":1,"172":1,"174":1,"178":2,"205":1,"230":1}}],["нижнее",{"2":{"85":1}}],["ниже",{"2":{"10":1,"117":1,"125":1,"137":1,"182":1,"185":1,"187":1,"205":2,"247":1,"355":1,"356":1,"367":1,"392":1,"495":1}}],["ниша",{"2":{"63":1}}],["нивелирования",{"2":{"41":1}}],["ничем",{"2":{"32":1}}],["ничего",{"2":{"10":1,"150":1,"152":1,"180":1,"336":1,"430":1,"472":1}}],["нибудь",{"2":{"12":1,"180":1,"363":1}}],["ним",{"2":{"9":1,"17":1,"48":1,"50":1,"55":2,"102":1,"134":1,"192":1,"225":1,"300":1,"304":1,"347":1,"366":1,"381":2,"421":1,"431":1,"439":1,"468":1,"472":1,"473":1,"513":1}}],["ними",{"2":{"2":1,"34":1,"43":1,"104":1,"115":1,"134":1,"148":2,"151":1,"219":1,"224":1,"231":1,"238":1,"297":1,"304":1,"316":1,"319":1,"323":1,"336":1,"338":1,"342":1,"351":1,"358":1,"359":1,"366":1,"386":1,"421":1,"447":1}}],["них",{"2":{"6":1,"39":1,"41":1,"74":1,"79":1,"123":2,"134":2,"147":1,"148":1,"152":2,"153":1,"160":1,"174":1,"182":1,"184":1,"189":1,"195":1,"203":1,"207":1,"217":2,"225":2,"227":1,"231":1,"239":1,"246":1,"247":1,"248":1,"249":2,"251":1,"256":1,"263":1,"264":1,"270":1,"276":1,"281":1,"291":1,"292":1,"293":1,"297":1,"300":1,"303":1,"315":1,"316":1,"321":2,"336":1,"338":1,"344":2,"347":1,"352":3,"358":2,"373":1,"376":2,"379":1,"380":1,"385":3,"386":1,"391":1,"408":1,"421":1,"426":2,"429":1,"455":1,"460":1,"461":1,"464":1,"466":1}}],["ночных",{"2":{"395":1}}],["ноут",{"2":{"457":1}}],["ноу",{"2":{"385":1}}],["ное",{"2":{"383":1}}],["нормальный",{"2":{"283":1}}],["нормально",{"2":{"62":1,"473":1}}],["нормальному",{"2":{"38":1}}],["носят",{"2":{"216":1,"396":1}}],["носит",{"2":{"132":1,"170":1,"219":1}}],["номер",{"2":{"422":1,"473":1}}],["номера",{"2":{"365":1,"366":1}}],["номеров",{"2":{"192":1}}],["номером",{"2":{"192":1}}],["номеру",{"2":{"192":1}}],["нотации",{"2":{"424":1}}],["нотация",{"2":{"381":1}}],["нотацией",{"2":{"358":1}}],["нотаций",{"2":{"239":1}}],["нотацию",{"2":{"153":1,"230":1,"335":1,"349":3}}],["нотированной",{"2":{"124":1}}],["новички",{"2":{"402":1}}],["новичка",{"2":{"118":1}}],["новейшим",{"2":{"244":1}}],["нова",{"2":{"227":1}}],["новая",{"2":{"127":1,"192":1,"215":1,"226":1,"256":1,"257":1,"302":1,"344":1,"473":1}}],["новую",{"2":{"226":1,"253":1,"342":1,"344":1,"383":1,"393":1,"432":1,"433":1,"465":1,"545":1}}],["нововведением",{"2":{"463":1}}],["новой",{"2":{"221":1,"223":1,"251":1,"256":1,"295":1,"355":1,"383":1,"433":1,"451":1,"471":1,"539":1,"555":1}}],["новостных",{"2":{"344":1,"463":1}}],["новостные",{"2":{"189":1}}],["новостей",{"2":{"208":1,"463":1}}],["новое",{"0":{"347":1,"476":1,"481":1,"484":1,"487":1},"2":{"148":1,"303":1,"367":1,"451":1}}],["новому",{"2":{"259":1}}],["новом",{"2":{"127":2,"241":1,"255":1,"347":1}}],["нового",{"0":{"256":1,"257":1},"2":{"119":1,"125":1,"152":1,"221":2,"256":1,"329":1,"346":1,"354":1,"365":1,"366":1,"372":1,"422":1,"462":1,"495":1}}],["новыми",{"2":{"368":1}}],["новым",{"2":{"152":1,"169":1,"303":1,"436":1}}],["новые",{"0":{"128":1},"2":{"128":1,"134":1,"147":3,"192":2,"193":1,"201":1,"238":1,"251":1,"252":1,"256":1,"330":1,"340":1,"344":1,"347":2,"350":1,"351":1,"355":1,"359":1,"369":1,"370":1,"384":1,"393":1,"400":1,"431":1,"434":1,"457":1,"462":1,"472":1}}],["новый",{"2":{"105":1,"119":3,"127":1,"130":1,"151":1,"152":1,"160":2,"184":1,"193":1,"209":2,"223":2,"238":2,"246":1,"281":1,"322":1,"352":2,"356":1,"365":1,"367":1,"390":1,"394":1,"401":1,"455":1,"465":1}}],["новых",{"2":{"2":1,"128":1,"187":1,"221":1,"239":1,"256":2,"306":1,"335":1,"336":1,"344":2,"400":1,"419":1,"429":1,"432":1,"451":1,"498":1,"557":1}}],["но",{"2":{"3":1,"9":1,"17":1,"22":3,"23":1,"26":3,"29":1,"39":1,"41":1,"44":1,"59":1,"71":1,"74":1,"85":1,"86":2,"92":1,"93":1,"97":1,"104":1,"105":2,"115":3,"116":3,"118":1,"119":3,"123":1,"125":1,"130":3,"131":1,"134":2,"137":4,"138":1,"140":1,"147":1,"148":6,"149":1,"150":1,"151":3,"152":9,"155":1,"156":1,"158":1,"159":1,"160":2,"161":1,"166":1,"171":2,"175":1,"176":2,"181":1,"184":1,"185":2,"186":2,"187":2,"189":1,"190":2,"193":2,"195":1,"200":3,"201":1,"203":2,"204":1,"209":1,"212":1,"215":1,"217":1,"218":1,"222":2,"223":2,"224":3,"225":2,"227":3,"228":2,"239":1,"246":1,"247":1,"248":2,"249":2,"250":1,"251":1,"255":1,"256":3,"257":2,"258":1,"260":1,"265":2,"266":1,"268":2,"270":2,"286":1,"287":3,"289":2,"292":1,"295":5,"297":3,"299":1,"300":2,"301":2,"302":3,"303":3,"304":1,"306":1,"308":6,"310":2,"311":3,"314":1,"315":1,"316":1,"317":1,"321":1,"322":1,"323":2,"325":2,"328":3,"331":1,"332":1,"333":1,"335":3,"336":3,"344":1,"345":1,"346":1,"347":1,"349":1,"352":1,"353":1,"355":2,"359":1,"360":2,"361":2,"366":4,"367":2,"372":1,"373":2,"374":1,"375":4,"376":2,"380":3,"381":2,"384":1,"385":1,"386":1,"390":1,"392":1,"393":1,"394":2,"402":1,"419":1,"421":3,"425":2,"428":1,"429":1,"434":1,"442":1,"447":1,"451":1,"452":1,"457":1,"460":2,"461":1,"462":5,"463":4,"464":2,"465":2,"472":4,"473":5,"507":1,"512":1,"519":1,"548":1}}],["нахождение",{"2":{"536":1}}],["находят",{"2":{"463":1}}],["находятся",{"2":{"143":1,"176":1,"205":1,"445":1,"472":1,"538":1}}],["находимся",{"2":{"391":1}}],["находим",{"2":{"98":1,"381":1,"429":1}}],["находит",{"2":{"227":1}}],["находить",{"2":{"171":1,"267":1}}],["находиться",{"2":{"17":1,"43":1,"294":1,"346":2,"425":1}}],["находится",{"2":{"48":1,"144":1,"160":1,"172":1,"184":2,"190":1,"208":1,"227":1,"255":1,"303":1,"316":1,"328":2,"360":1,"390":1,"463":1,"472":1,"515":1,"549":1,"556":1}}],["находились",{"2":{"47":1}}],["накладные",{"2":{"329":1}}],["накладывает",{"2":{"270":1,"271":1}}],["наконец",{"2":{"141":1,"147":2,"149":1,"228":1,"231":2,"250":2,"255":1,"292":1,"296":1,"310":1,"338":1,"349":1,"353":1,"361":1,"382":1,"393":1,"428":2,"429":1,"439":1}}],["научиться",{"2":{"385":1,"400":1}}],["научимся",{"2":{"373":1,"386":1}}],["научились",{"2":{"258":1,"319":1,"381":1}}],["научных",{"2":{"147":1}}],["нажали",{"2":{"381":1}}],["нажав",{"2":{"318":1}}],["нажатию",{"2":{"518":1}}],["нажатии",{"2":{"255":1,"430":1,"546":1,"548":1}}],["нажатием",{"2":{"186":1,"223":1}}],["нажать",{"2":{"174":1,"227":1}}],["нажимая",{"2":{"381":1}}],["нажимать",{"2":{"229":1}}],["нажимает",{"2":{"215":1,"365":1}}],["нажмите",{"2":{"223":3,"318":1,"527":1}}],["нажмет",{"2":{"160":1}}],["наоборот",{"2":{"152":1,"336":1,"369":1}}],["нагружает",{"2":{"473":1}}],["нагрузке",{"2":{"361":1,"427":1}}],["нагрузку",{"2":{"361":1,"429":1}}],["нагрузки",{"2":{"140":1,"361":1,"437":1}}],["наглядные",{"2":{"321":1}}],["наглядно",{"2":{"193":1}}],["наглядность",{"2":{"190":1}}],["наглядности",{"2":{"122":1}}],["наглядной",{"2":{"185":1}}],["наглядного",{"2":{"68":1}}],["нанимаемой",{"2":{"134":1}}],["наивная",{"2":{"292":1}}],["наивной",{"2":{"291":1,"292":1,"293":1,"295":1}}],["наивную",{"2":{"287":1}}],["наименьшими",{"2":{"464":1}}],["наименьшей",{"2":{"238":1}}],["наименования",{"2":{"22":1,"508":1}}],["наилучшим",{"2":{"237":1,"241":1}}],["наибольшую",{"2":{"215":1}}],["наиболее",{"2":{"134":2,"137":1,"147":1,"152":1,"153":1,"168":1,"169":1,"185":1,"203":1,"205":1,"212":1,"219":1,"222":2,"224":1,"227":1,"241":1,"269":1,"271":1,"306":1,"310":1,"335":1,"341":1,"344":2,"355":1,"358":3,"360":1,"364":1,"367":2,"374":1,"385":1,"392":1,"394":1,"400":1,"407":1,"415":1,"427":1,"434":2,"455":1,"464":1,"497":1}}],["налету",{"2":{"473":1,"536":1}}],["налево",{"2":{"134":1}}],["наложенный",{"2":{"315":1}}],["налогов",{"2":{"214":1}}],["наличии",{"2":{"358":1}}],["наличия",{"2":{"267":1,"310":1,"313":1,"358":1,"462":1}}],["наличие",{"2":{"12":1,"144":1,"198":1,"228":1,"231":1,"286":1,"303":1,"366":1,"375":1,"377":1,"461":1}}],["навязывающим",{"2":{"507":1}}],["навык",{"2":{"321":1}}],["навыков",{"2":{"221":1}}],["навыки",{"2":{"145":1,"233":1,"340":1,"342":1,"368":1,"370":1,"396":1}}],["навигационная",{"2":{"542":1}}],["навигационное",{"2":{"542":1}}],["навигационного",{"2":{"349":1}}],["навигационной",{"2":{"196":1}}],["навигационных",{"2":{"349":1,"353":1,"360":1,"517":1}}],["навигационные",{"2":{"238":1,"349":1,"355":1}}],["навигационный",{"2":{"205":1}}],["навигацией",{"2":{"194":1,"311":1,"345":1,"368":1}}],["навигацию",{"2":{"192":1,"345":2,"347":1,"351":1,"352":1,"355":1,"358":1,"360":1,"383":1}}],["навигации",{"0":{"194":1},"1":{"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1},"2":{"134":1,"189":1,"195":1,"196":2,"198":1,"200":1,"203":2,"251":1,"315":1,"345":1,"346":2,"353":1,"354":1,"357":1,"358":1,"368":1}}],["навигация",{"0":{"353":1},"1":{"354":1,"355":1},"2":{"127":1,"136":1,"144":1,"192":1,"345":1,"349":1,"355":1,"548":1}}],["наведение",{"2":{"186":1}}],["наведем",{"2":{"91":1}}],["наверное",{"2":{"287":1,"428":1,"462":1,"473":1}}],["наверняка",{"2":{"48":1}}],["наверх",{"2":{"30":1}}],["натянуть",{"2":{"464":1}}],["нативная",{"2":{"295":1}}],["нативного",{"2":{"308":1,"462":1,"473":1}}],["нативное",{"2":{"188":1,"306":1}}],["нативно",{"2":{"184":1}}],["нативный",{"2":{"554":1}}],["нативным",{"2":{"473":1}}],["нативными",{"2":{"147":1,"315":1}}],["нативные",{"2":{"125":1,"295":1}}],["нативных",{"2":{"123":1,"251":1,"300":2,"473":1}}],["нативную",{"2":{"123":1}}],["натуры",{"2":{"9":1}}],["набросать",{"2":{"255":1}}],["набросок",{"2":{"237":1}}],["набрать",{"2":{"367":1}}],["набранный",{"2":{"231":1}}],["набрав",{"2":{"224":1}}],["набирает",{"2":{"231":1,"366":1}}],["набирать",{"2":{"228":1}}],["набирают",{"2":{"166":1}}],["набираются",{"2":{"163":1}}],["наберите",{"2":{"223":1}}],["наблюдает",{"2":{"291":1}}],["наблюдающий",{"2":{"193":1}}],["наблюдателю",{"2":{"292":1}}],["наблюдателей",{"2":{"291":4}}],["наблюдатели",{"2":{"291":3}}],["наблюдатель",{"0":{"291":1},"1":{"292":1},"2":{"291":2,"292":2}}],["наблюдателям",{"2":{"291":1,"292":1}}],["наблюдателя",{"2":{"192":1,"291":1,"295":1}}],["наблюдать",{"2":{"179":1,"291":1}}],["наблюдении",{"2":{"105":1}}],["набором",{"2":{"381":1}}],["наборов",{"2":{"373":1}}],["набору",{"2":{"289":1}}],["наборе",{"2":{"192":1}}],["наборами",{"2":{"376":1}}],["набора",{"2":{"174":1,"192":1,"221":1,"360":1}}],["наборы",{"2":{"148":1,"150":1}}],["набор",{"2":{"69":1,"147":1,"161":1,"172":1,"192":2,"264":1,"303":1,"310":1,"344":1,"375":2,"379":1,"394":1,"444":1}}],["назовите",{"2":{"369":1}}],["назвать",{"2":{"220":1,"234":1,"431":1}}],["названную",{"2":{"330":1}}],["названный",{"2":{"152":1,"349":1,"422":1}}],["названа",{"2":{"211":1}}],["названий",{"2":{"213":1}}],["названиемстор",{"2":{"463":1}}],["названием",{"2":{"180":1,"230":1,"251":1,"281":1,"292":1,"315":1,"373":1,"527":1}}],["название",{"2":{"44":1,"89":1,"108":1,"109":1,"152":1,"186":1,"190":1,"310":1,"344":1,"435":1,"472":1,"528":1}}],["названиями",{"2":{"347":1}}],["названия",{"2":{"22":1,"97":1,"190":1,"295":1,"308":1,"311":1}}],["назад",{"2":{"169":1,"189":1,"232":1,"256":1,"311":1,"358":2,"460":1}}],["назначению",{"2":{"440":1}}],["назначение",{"2":{"136":1,"250":1,"300":1,"317":1,"358":1}}],["назначения",{"2":{"133":1,"291":1,"434":1}}],["называть",{"2":{"224":1,"463":2}}],["называют",{"2":{"187":1,"271":1,"291":1,"344":2,"359":1}}],["называются",{"2":{"134":2,"135":1,"198":1,"249":1,"291":1,"367":2}}],["называет",{"2":{"445":1}}],["называется",{"2":{"102":1,"124":1,"137":1,"149":1,"158":1,"192":2,"205":1,"211":1,"247":1,"284":1,"344":1,"385":1,"386":2,"391":1,"395":1,"460":1,"463":1,"527":1,"536":1}}],["называемому",{"2":{"367":1}}],["называемой",{"2":{"134":1,"151":1}}],["называемая",{"2":{"295":1}}],["называемую",{"2":{"281":1,"325":1}}],["называемыми",{"2":{"421":1}}],["называемых",{"2":{"344":1}}],["называемые",{"2":{"153":1,"249":1,"303":1,"308":1,"367":1,"463":1}}],["называемый",{"2":{"152":1,"249":1,"291":1,"425":1}}],["начнут",{"2":{"390":1}}],["начните",{"2":{"372":1}}],["начнете",{"2":{"203":1,"400":1}}],["начнется",{"2":{"150":1}}],["начнем",{"2":{"161":1,"221":1,"231":1,"249":1,"255":1,"303":1,"304":1,"325":1,"326":1,"330":1,"337":1,"338":1,"347":1,"349":1,"351":1,"352":1,"353":2,"375":2,"376":2,"379":1,"386":1,"427":1,"428":1,"429":1}}],["начаться",{"2":{"421":1}}],["начать",{"2":{"116":1,"148":1,"169":1,"222":1,"259":1,"379":1,"390":1,"393":1,"409":1}}],["началу",{"2":{"376":1}}],["начали",{"2":{"233":1,"300":1,"391":1}}],["начальная",{"2":{"238":1}}],["начальный",{"2":{"238":1,"487":1}}],["начальных",{"2":{"224":1,"306":1}}],["начальным",{"2":{"193":1,"221":1,"235":1,"330":1}}],["начального",{"2":{"394":1,"472":1}}],["начальной",{"2":{"224":1}}],["начальное",{"2":{"156":1}}],["начальном",{"2":{"11":1,"226":1}}],["начало",{"2":{"221":1,"386":1,"435":1}}],["началось",{"2":{"190":1}}],["началом",{"2":{"179":1,"472":1}}],["начале",{"2":{"83":1,"144":1,"149":1,"205":1,"216":1,"256":1,"283":1,"421":1,"435":1}}],["начала",{"2":{"22":1,"61":1,"161":1,"172":1,"256":1,"316":1,"360":1,"372":1,"375":1,"378":1,"421":1,"473":1,"507":1,"556":1}}],["начинаниях",{"2":{"405":1}}],["начинаете",{"2":{"322":1}}],["начинает",{"2":{"256":1,"439":1}}],["начинается",{"2":{"164":1,"231":2,"263":1,"355":1,"381":1,"400":1}}],["начинаем",{"2":{"231":1,"250":1,"255":2,"297":1,"303":1,"328":1,"332":1,"333":1,"381":1,"432":1}}],["начинаешь",{"2":{"89":1}}],["начинающим",{"2":{"508":1}}],["начинающий",{"2":{"507":1}}],["начинающих",{"2":{"457":1,"497":1}}],["начинающихся",{"2":{"231":1}}],["начинающему",{"2":{"472":1}}],["начинающемся",{"2":{"231":1}}],["начинающуюся",{"2":{"153":1}}],["начинаются",{"2":{"163":2,"354":1}}],["начинаться",{"2":{"163":1}}],["начинать",{"2":{"118":1,"148":1}}],["начиная",{"2":{"76":2,"145":1,"151":1,"205":1,"224":2,"238":1,"261":1,"263":1,"303":1,"328":1,"368":1,"410":1}}],["наряду",{"2":{"319":1,"344":1,"461":1}}],["нарезку",{"2":{"238":1}}],["нарушена",{"2":{"432":1}}],["нарушению",{"2":{"68":1}}],["нарушить",{"2":{"370":1}}],["нарушит",{"2":{"265":1}}],["нарушать",{"2":{"421":1}}],["нарушает",{"2":{"200":2,"243":1,"286":1,"291":1}}],["нарушаются",{"2":{"229":1}}],["нарушают",{"2":{"195":1}}],["наращивать",{"2":{"11":1,"147":1}}],["найдете",{"2":{"227":1}}],["найдем",{"2":{"95":1,"267":1}}],["найдена",{"2":{"288":1}}],["найдены",{"2":{"286":1}}],["найденные",{"2":{"27":1,"144":1}}],["найдено",{"2":{"10":2,"336":1}}],["найти",{"2":{"62":1,"125":1,"127":1,"129":1,"141":1,"142":1,"144":1,"159":1,"160":1,"170":1,"172":1,"174":1,"178":1,"179":1,"180":1,"183":1,"184":1,"222":2,"225":1,"226":1,"227":1,"228":1,"235":1,"236":1,"251":1,"255":1,"263":1,"315":1,"316":1,"334":1,"335":1,"336":1,"343":1,"358":3,"361":1,"365":1,"371":1,"374":1,"376":1,"380":1,"381":1,"382":1,"383":1,"388":1,"389":1,"432":1}}],["наполнения",{"2":{"506":1,"508":1}}],["напомним",{"2":{"301":1,"326":1}}],["напишите",{"2":{"372":1}}],["напишем",{"2":{"159":1,"377":1,"378":1}}],["написали",{"2":{"141":1}}],["написание",{"2":{"372":1,"461":1}}],["написанию",{"2":{"227":1,"380":1}}],["написании",{"2":{"166":1,"472":1,"473":1}}],["написания",{"2":{"116":1,"147":1,"151":3,"160":1,"193":1,"308":1,"380":1,"390":1}}],["написаны",{"2":{"150":1,"376":1}}],["написано",{"2":{"148":1}}],["написан",{"2":{"55":1,"89":1,"372":1}}],["написанным",{"2":{"461":1}}],["написанный",{"2":{"10":1,"116":1,"148":1}}],["написанную",{"2":{"53":1}}],["написать",{"2":{"12":1,"26":1,"41":1,"89":1,"104":1,"116":2,"231":1,"255":1,"268":1,"373":1,"376":1,"423":1,"472":1,"473":1}}],["напротив",{"2":{"358":1}}],["направленные",{"2":{"219":1}}],["направленную",{"2":{"208":1}}],["направление",{"2":{"381":1}}],["направлением",{"0":{"175":1}}],["направлению",{"2":{"203":1}}],["направлении",{"2":{"178":2,"204":1,"247":1}}],["направлений",{"2":{"178":1}}],["направляя",{"2":{"204":1}}],["направляют",{"2":{"171":1}}],["направляться",{"2":{"139":1}}],["направлять",{"2":{"134":1,"135":1,"137":1}}],["направляется",{"2":{"115":1}}],["направляет",{"2":{"115":1,"293":1,"294":1}}],["направить",{"2":{"173":1,"425":1}}],["напрямую",{"2":{"23":1,"53":1,"149":1,"152":1,"218":1,"231":1,"265":1,"281":1,"286":1,"295":1,"316":1,"330":1,"335":1,"336":1,"352":1,"376":1,"421":1,"422":1,"425":1,"455":1,"460":1,"465":1,"466":1,"473":1}}],["например",{"2":{"3":1,"12":1,"16":1,"18":1,"22":1,"41":2,"47":2,"48":1,"59":1,"91":1,"98":1,"103":1,"115":6,"116":6,"117":1,"124":2,"125":1,"126":1,"128":1,"134":4,"135":1,"136":1,"143":1,"148":3,"152":4,"154":1,"155":1,"157":1,"159":1,"160":1,"162":1,"163":4,"164":1,"165":1,"166":1,"172":2,"174":1,"176":1,"178":1,"179":1,"185":2,"186":2,"189":1,"190":2,"192":2,"195":1,"196":2,"200":3,"201":2,"204":1,"205":1,"206":1,"210":1,"213":1,"224":2,"225":1,"227":2,"228":1,"231":1,"232":1,"239":1,"240":1,"245":3,"247":2,"249":4,"250":1,"263":2,"267":1,"268":1,"271":1,"278":3,"282":1,"284":2,"290":1,"292":1,"293":1,"294":1,"295":3,"296":1,"297":1,"300":1,"301":1,"303":1,"308":3,"312":1,"313":1,"314":1,"315":2,"325":1,"326":1,"334":1,"336":2,"349":1,"355":1,"359":1,"361":2,"363":1,"364":2,"365":1,"366":4,"367":1,"372":1,"373":1,"376":2,"377":2,"378":1,"382":1,"387":1,"391":1,"394":2,"395":1,"421":1,"422":1,"423":1,"426":1,"434":2,"435":1,"442":2,"445":3,"446":2,"447":2,"452":1,"457":2,"462":4,"463":5,"465":1,"466":1,"469":1,"473":2,"504":2,"548":1}}],["намекнули",{"2":{"304":1}}],["намекает",{"2":{"256":1}}],["намеренная",{"0":{"377":1}}],["намеренное",{"2":{"216":1}}],["намеренно",{"2":{"212":1,"229":1}}],["намереваясь",{"2":{"215":1}}],["намечены",{"2":{"36":1}}],["намеченные",{"2":{"10":1}}],["нами",{"2":{"134":1,"200":1,"230":1,"303":1,"349":1,"363":1,"395":1}}],["намного",{"2":{"13":1,"23":1,"47":1,"53":1,"344":1,"457":1,"462":2,"463":1,"466":1,"471":2,"472":1,"473":3}}],["нам",{"2":{"7":1,"39":2,"41":1,"55":1,"56":1,"121":1,"133":2,"134":1,"135":5,"137":4,"140":1,"141":1,"147":1,"148":1,"149":1,"150":2,"152":3,"159":1,"160":2,"171":1,"180":1,"191":1,"192":1,"223":1,"224":3,"227":1,"228":1,"229":1,"230":2,"231":5,"239":1,"240":1,"241":3,"243":1,"244":1,"247":2,"248":1,"249":1,"250":1,"255":3,"257":1,"258":1,"264":1,"287":1,"288":2,"290":1,"295":2,"296":1,"297":1,"298":1,"303":3,"308":1,"315":1,"316":1,"317":2,"326":2,"327":1,"328":2,"330":1,"331":5,"333":2,"335":1,"341":1,"345":1,"352":4,"355":3,"358":1,"359":2,"361":2,"362":1,"363":2,"367":1,"373":3,"374":3,"375":3,"376":1,"378":3,"379":4,"380":2,"381":3,"383":3,"384":1,"385":1,"390":1,"391":1,"419":1,"421":1,"422":2,"424":1,"425":1,"428":1,"438":2,"439":1}}],["нашли",{"2":{"400":1}}],["наша",{"2":{"223":1,"232":2,"250":1,"256":1,"302":1,"325":1,"347":1,"381":1}}],["нашу",{"2":{"193":1,"208":1,"227":1,"230":1,"231":1,"250":1,"256":1,"267":1,"316":1,"324":2,"325":1,"391":1,"394":1,"432":1}}],["нашей",{"2":{"223":1,"224":1,"227":1,"231":4,"232":1,"256":1,"292":1,"296":1,"303":3,"317":1,"325":1,"327":1,"328":1,"360":2,"364":1,"385":2,"386":1,"390":1,"394":1,"419":1,"427":2,"430":1,"439":1}}],["наше",{"2":{"120":1,"134":1,"135":2,"137":3,"149":2,"221":1,"224":1,"225":1,"228":1,"232":2,"233":1,"235":1,"255":1,"257":1,"258":1,"301":1,"315":1,"318":1,"319":1,"326":1,"330":1,"342":1,"346":1,"347":1,"349":1,"361":1,"365":1,"366":1,"367":1,"368":1,"424":1,"425":1,"426":1,"431":1,"434":1}}],["нашего",{"0":{"232":1,"253":1,"256":1,"257":1},"2":{"14":1,"27":1,"82":1,"104":1,"120":2,"131":2,"133":2,"134":1,"135":2,"136":1,"137":3,"139":1,"140":1,"145":4,"146":1,"149":1,"150":2,"151":5,"152":1,"193":1,"221":1,"223":3,"224":5,"225":2,"226":2,"227":1,"230":1,"231":4,"243":2,"244":1,"247":1,"251":1,"255":2,"256":4,"258":1,"287":1,"310":3,"315":4,"316":1,"317":1,"321":1,"325":1,"328":1,"329":1,"336":1,"337":1,"338":2,"339":1,"340":1,"346":3,"348":1,"352":3,"355":1,"358":1,"360":3,"361":1,"363":3,"364":2,"365":1,"366":4,"367":1,"370":2,"375":2,"379":1,"380":2,"381":2,"382":1,"383":3,"384":1,"390":1,"391":3,"396":1,"423":1,"424":2,"427":1,"432":1,"438":1,"440":3}}],["нашему",{"2":{"134":1,"137":1,"141":1,"193":1,"224":1,"230":1,"232":1,"233":1,"243":1,"252":1,"289":1,"313":1,"316":1,"331":1,"335":1,"349":2,"350":1,"361":1,"364":1,"367":1,"386":1,"420":1,"425":1}}],["нашем",{"2":{"5":1,"11":1,"47":1,"85":1,"124":1,"134":1,"136":1,"137":1,"152":2,"159":1,"172":1,"193":1,"223":1,"227":1,"231":1,"232":1,"240":1,"241":3,"244":1,"255":8,"256":4,"287":1,"292":1,"300":1,"303":1,"310":1,"315":1,"316":1,"325":1,"326":1,"327":1,"330":1,"331":2,"332":1,"333":1,"337":1,"338":1,"346":2,"347":1,"351":2,"352":1,"359":1,"361":3,"364":1,"367":3,"372":1,"373":2,"375":2,"379":1,"381":1,"383":3,"393":1,"396":1,"421":1,"423":1,"424":1,"425":1,"427":1,"432":1,"433":1}}],["наш",{"0":{"374":1},"2":{"4":1,"9":1,"12":1,"39":1,"41":2,"100":1,"104":1,"112":1,"136":2,"141":1,"142":1,"143":1,"150":1,"151":1,"152":2,"193":1,"222":1,"223":1,"224":2,"225":1,"227":3,"228":1,"229":2,"230":4,"231":4,"232":3,"233":1,"235":1,"238":1,"241":1,"244":1,"249":1,"254":1,"255":4,"256":3,"303":1,"315":3,"316":2,"318":1,"325":2,"326":1,"328":1,"330":1,"331":2,"333":1,"335":1,"337":1,"338":3,"345":1,"347":1,"349":2,"351":2,"352":2,"355":2,"360":1,"361":2,"364":1,"365":1,"366":2,"374":2,"375":5,"377":1,"380":3,"383":2,"391":1,"394":1,"422":2,"423":2,"430":1,"431":2,"434":1,"435":1,"436":2,"437":1,"451":1}}],["наших",{"2":{"145":1,"150":1,"172":1,"176":1,"223":1,"227":3,"230":1,"231":1,"250":1,"256":1,"281":1,"296":1,"300":1,"303":1,"310":1,"335":1,"336":1,"337":1,"338":1,"340":1,"353":1,"355":2,"359":1,"361":2,"367":2,"368":1,"370":1,"373":1,"375":1,"376":1,"378":1,"380":2,"381":2,"382":3,"383":1,"386":1,"391":1,"397":1,"423":1,"424":2,"425":1}}],["нашими",{"2":{"231":1,"333":1,"340":1,"346":1,"347":1,"349":1,"424":1}}],["нашим",{"2":{"50":1,"125":1,"139":1,"149":1,"193":1,"223":1,"224":1,"231":1,"235":1,"255":2,"257":1,"296":1,"329":1,"330":1,"355":2,"360":1,"370":1,"381":1,"425":1,"430":1}}],["наши",{"0":{"0":1},"2":{"7":1,"137":1,"142":1,"143":2,"150":2,"151":1,"152":2,"221":1,"224":1,"225":1,"232":1,"235":1,"253":1,"256":1,"257":1,"264":1,"308":1,"321":1,"326":1,"327":1,"333":1,"346":4,"349":1,"355":1,"360":1,"364":2,"373":1,"375":1,"378":3,"379":1,"381":1,"419":1}}],["надстройку",{"2":{"507":1}}],["надёжней",{"2":{"457":1}}],["наделите",{"2":{"265":1}}],["наделение",{"2":{"192":1}}],["надеюсь",{"2":{"171":1,"295":1,"308":1}}],["надежного",{"2":{"330":1,"473":1}}],["надежное",{"2":{"241":1,"424":1,"451":1}}],["надежность",{"2":{"17":1}}],["надежные",{"2":{"400":1}}],["надежными",{"2":{"306":1}}],["надежных",{"2":{"235":1,"401":1,"462":1}}],["надежный",{"2":{"115":1,"137":1}}],["надежная",{"2":{"144":1}}],["надобности",{"2":{"539":1}}],["надо",{"2":{"39":1,"41":2,"47":1,"86":1,"89":2,"95":1,"105":1,"112":1,"444":1,"447":1,"451":1,"462":3,"463":2,"464":3,"472":2,"539":1}}],["над",{"0":{"264":1,"466":1},"2":{"4":1,"25":1,"91":1,"105":4,"131":1,"152":2,"181":1,"186":1,"188":1,"222":1,"228":1,"244":1,"255":2,"256":1,"258":1,"264":1,"293":1,"317":2,"376":1,"394":2,"409":1,"428":1,"462":1,"473":1,"496":1}}],["насыщенные",{"2":{"344":1}}],["насыщенного",{"2":{"257":1}}],["наследуют",{"2":{"355":1}}],["наследуемая",{"2":{"264":1}}],["наследованием",{"0":{"264":1},"2":{"264":1,"464":2}}],["наследования",{"2":{"260":1,"264":3,"297":1,"460":1}}],["насколько",{"2":{"148":1,"223":1,"266":1}}],["насчет",{"2":{"23":1,"234":1,"257":1}}],["настал",{"2":{"300":1}}],["настало",{"2":{"223":1,"224":1,"255":1,"315":1,"337":1,"374":1}}],["настоятельно",{"2":{"222":1,"266":1}}],["настоящий",{"2":{"315":1}}],["настоящему",{"2":{"300":1,"308":1}}],["настоящее",{"2":{"134":2,"183":1,"196":1,"199":1,"205":1,"365":1,"367":1,"370":1}}],["настоящую",{"2":{"17":1}}],["настольная",{"2":{"315":1}}],["настольном",{"2":{"310":1}}],["настольному",{"2":{"203":1}}],["настольные",{"2":{"308":1}}],["настольных",{"2":{"195":2,"203":1,"306":1,"308":1,"315":1,"344":1}}],["настольными",{"2":{"147":1,"308":2}}],["настолько",{"2":{"137":1,"148":1,"203":1,"204":2,"251":1,"336":1,"473":1}}],["настройте",{"2":{"472":1}}],["настройку",{"2":{"255":1,"457":1,"460":2}}],["настройкой",{"2":{"255":1}}],["настройке",{"2":{"145":1,"394":1}}],["настройках",{"2":{"363":1}}],["настройками",{"2":{"193":1,"308":1}}],["настройка",{"0":{"140":1,"223":1,"253":1,"457":1,"528":1},"1":{"141":1},"2":{"121":1,"131":1,"209":1,"221":1,"308":1,"394":1,"455":2,"457":1,"507":1}}],["настройки",{"2":{"104":1,"349":1,"384":1,"446":2,"455":1,"553":1}}],["настроили",{"2":{"439":1}}],["настроить",{"2":{"11":1,"134":2,"135":1,"143":1,"395":1,"455":2,"457":1}}],["настроен",{"2":{"451":1}}],["настроена",{"2":{"143":2}}],["настроек",{"2":{"184":1,"231":1,"457":2,"460":1}}],["настраивает",{"2":{"144":1}}],["настраивается",{"2":{"117":1,"308":1}}],["настраиваемой",{"2":{"151":1}}],["настраиваемым",{"2":{"255":1}}],["настраиваемыми",{"2":{"144":1}}],["настраиваемые",{"0":{"246":1},"2":{"78":1}}],["настраиваем",{"2":{"112":1,"394":1}}],["настраивать",{"2":{"63":1,"317":1,"401":1}}],["нас",{"0":{"498":1},"2":{"3":1,"12":1,"16":1,"17":1,"29":1,"36":1,"41":1,"43":1,"48":1,"95":1,"97":1,"102":2,"112":1,"115":1,"123":1,"144":1,"151":1,"152":2,"166":1,"180":1,"193":3,"223":1,"224":1,"231":4,"237":1,"244":1,"246":2,"249":1,"257":1,"264":1,"296":1,"301":1,"303":2,"315":1,"316":1,"323":1,"325":1,"328":1,"333":1,"353":1,"355":3,"360":1,"361":3,"375":2,"378":1,"423":1,"427":1,"451":1,"464":1}}],["на",{"0":{"0":1,"4":1,"81":1,"102":1,"111":1,"143":1,"399":1,"418":1,"526":1},"1":{"82":1,"83":1,"527":1,"528":1},"2":{"2":2,"3":6,"4":1,"6":2,"7":1,"10":2,"11":3,"12":3,"13":2,"16":1,"17":1,"22":5,"23":3,"27":1,"33":1,"34":1,"36":2,"39":5,"40":3,"41":4,"43":1,"44":2,"47":3,"48":1,"53":3,"55":1,"56":2,"58":1,"59":1,"63":1,"67":1,"68":2,"69":1,"71":1,"72":1,"79":1,"85":3,"86":2,"89":3,"91":2,"95":2,"96":1,"97":1,"98":2,"99":1,"102":2,"108":1,"109":3,"111":1,"112":1,"114":4,"115":14,"116":8,"117":5,"118":11,"119":3,"121":1,"123":2,"125":6,"126":2,"130":3,"134":13,"135":4,"136":6,"137":5,"139":1,"140":3,"142":1,"143":9,"144":5,"145":2,"146":1,"147":3,"148":10,"149":8,"150":2,"151":3,"152":8,"153":1,"156":1,"157":4,"159":3,"160":6,"163":3,"166":1,"168":1,"169":3,"170":1,"171":4,"172":1,"173":3,"174":2,"175":1,"176":1,"178":4,"179":2,"180":3,"181":2,"184":2,"185":3,"186":1,"187":5,"188":2,"189":4,"190":4,"192":5,"193":8,"195":2,"196":1,"197":1,"198":4,"199":2,"200":3,"203":4,"204":4,"205":5,"206":1,"208":3,"209":2,"212":2,"214":1,"217":9,"219":2,"221":2,"222":6,"223":7,"224":5,"225":3,"226":4,"227":3,"228":6,"229":3,"230":1,"231":9,"232":1,"236":1,"237":1,"238":2,"239":3,"240":5,"241":2,"244":3,"245":2,"246":3,"247":2,"249":3,"250":3,"251":3,"252":1,"255":7,"256":6,"257":1,"258":1,"259":1,"260":3,"261":2,"263":6,"264":2,"265":5,"266":2,"267":2,"268":1,"269":1,"270":2,"271":6,"272":1,"275":1,"276":1,"278":1,"281":2,"282":1,"284":1,"286":2,"287":4,"290":2,"291":5,"292":1,"293":1,"294":3,"295":3,"296":3,"297":5,"299":1,"300":2,"301":1,"302":2,"303":2,"304":3,"306":3,"308":7,"309":1,"310":1,"311":1,"313":3,"314":1,"315":14,"316":3,"318":2,"319":1,"320":1,"321":2,"323":4,"326":3,"328":4,"329":3,"331":1,"332":1,"333":2,"335":2,"336":12,"337":1,"338":2,"339":1,"342":3,"343":1,"344":6,"345":1,"347":6,"349":5,"352":10,"353":1,"354":1,"355":3,"359":1,"360":5,"361":6,"362":2,"363":3,"364":5,"365":8,"366":5,"367":6,"370":3,"372":7,"373":3,"374":2,"375":4,"376":5,"377":1,"378":3,"379":1,"381":6,"382":1,"383":2,"384":2,"386":2,"387":2,"388":1,"390":4,"392":2,"393":2,"394":5,"395":4,"396":1,"397":1,"402":3,"403":2,"405":1,"408":1,"412":1,"415":1,"416":1,"421":17,"422":3,"423":2,"424":2,"425":2,"426":1,"427":1,"428":5,"429":1,"430":3,"431":3,"432":3,"433":2,"434":6,"436":1,"437":1,"438":1,"439":2,"440":1,"441":1,"442":2,"444":4,"445":2,"446":3,"451":12,"452":2,"455":3,"457":5,"460":7,"461":8,"462":11,"463":11,"464":8,"465":1,"466":2,"468":3,"471":5,"472":23,"473":16,"481":1,"482":1,"496":1,"498":1,"504":2,"508":3,"509":1,"511":2,"516":1,"517":1,"518":1,"519":1,"520":1,"527":2,"529":1,"536":1,"540":1,"542":2,"545":3,"546":1,"548":1,"549":1,"554":2,"555":1,"556":1}}],["пдд",{"2":{"472":1}}],["пк",{"2":{"457":2}}],["пытается",{"2":{"316":1,"382":1,"457":1}}],["пытаются",{"2":{"296":1,"464":1}}],["пытаться",{"2":{"264":1,"265":1,"269":1,"464":1}}],["птицы",{"2":{"171":1}}],["псевдонима",{"2":{"228":1}}],["псевдонимов",{"2":{"228":1}}],["псевдонимы",{"2":{"224":1}}],["псевдоним",{"2":{"134":1,"228":1,"230":1}}],["пятого",{"2":{"67":1}}],["пятью",{"2":{"189":1}}],["пять",{"2":{"36":1,"157":1}}],["песочницы",{"2":{"457":1}}],["песочнице",{"2":{"455":1}}],["пешеходного",{"2":{"308":1}}],["пейджера",{"2":{"192":2}}],["пейджером",{"2":{"192":1}}],["пейджер",{"0":{"192":1},"1":{"193":1},"2":{"192":2}}],["печатает",{"2":{"423":1}}],["печати",{"2":{"311":1}}],["печать",{"2":{"180":2}}],["печатными",{"2":{"169":1}}],["печально",{"2":{"131":1}}],["петлю",{"2":{"134":1}}],["пет",{"2":{"63":1,"451":1}}],["периодическая",{"2":{"228":1}}],["периодически",{"2":{"221":1}}],["периода",{"2":{"210":1}}],["первую",{"2":{"256":1,"303":1,"421":1,"425":1}}],["первые",{"2":{"379":1,"421":1}}],["первых",{"2":{"344":1,"419":1,"472":1,"497":1}}],["первым",{"2":{"204":1,"255":1,"257":1,"435":1}}],["первый",{"2":{"102":1,"108":1,"134":1,"152":1,"200":1,"204":1,"214":1,"222":1,"232":1,"267":1,"280":1,"297":1,"303":1,"349":1,"352":2,"354":1,"376":2,"391":1,"439":1}}],["первичный",{"2":{"173":1}}],["первая",{"2":{"123":1,"205":1,"209":1,"315":1,"365":1,"391":2,"421":1}}],["первоначальной",{"2":{"214":1}}],["первоначальном",{"2":{"154":1}}],["первоначальный",{"2":{"205":1,"238":1,"360":1}}],["первое",{"2":{"186":1,"231":1,"309":1,"365":1}}],["первоклассные",{"2":{"147":1}}],["первой",{"2":{"17":1,"193":1,"205":1,"260":1,"349":1,"352":1,"367":1,"376":1,"390":1,"391":1,"421":3,"472":1,"473":1}}],["первого",{"2":{"11":1,"17":1,"149":1,"169":1,"172":1,"182":1,"198":1,"203":1,"245":1,"286":1,"332":1,"335":1,"376":1,"380":1,"381":2,"421":1,"463":1}}],["первом",{"2":{"6":1,"7":1,"11":1,"17":2,"22":1,"47":1,"72":1,"115":2,"231":2,"281":1,"295":1,"304":1,"379":1,"473":1}}],["персонализация",{"0":{"95":1}}],["перспективе",{"2":{"69":1,"271":1}}],["переопределение",{"2":{"557":1}}],["переиспользуемые",{"2":{"508":1}}],["переиспользовать",{"2":{"445":1}}],["переименуем",{"2":{"100":1}}],["переименовывая",{"2":{"467":1}}],["переименовываются",{"2":{"452":1}}],["переименовываем",{"2":{"96":1}}],["переименован",{"2":{"83":1}}],["переутомлению",{"2":{"370":1}}],["переупаковывать",{"2":{"308":1}}],["переадресация",{"2":{"363":1}}],["перезаписывание",{"2":{"501":1}}],["перезаписываем",{"2":{"385":1}}],["перезаписью",{"2":{"349":1}}],["перезагрузка",{"2":{"545":1}}],["перезагрузку",{"2":{"451":1}}],["перезагрузкой",{"2":{"224":1,"344":1}}],["перезагружается",{"2":{"352":1}}],["перечисленные",{"2":{"372":1}}],["перечисленных",{"2":{"366":1}}],["перечислены",{"2":{"355":1}}],["перечислим",{"2":{"344":1}}],["перечень",{"2":{"218":1}}],["перебирать",{"2":{"231":1}}],["перевода",{"2":{"446":1,"536":1}}],["перевод",{"0":{"399":1},"2":{"472":1,"476":1,"536":1}}],["переводчика",{"2":{"222":1}}],["перевыполняет",{"2":{"376":1}}],["перевычеслены",{"2":{"231":1}}],["перевешивают",{"2":{"303":1,"308":1}}],["перевести",{"2":{"68":1,"118":1}}],["перепишите",{"2":{"235":1}}],["переписываете",{"2":{"463":1}}],["переписывание",{"2":{"461":1}}],["переписывать",{"2":{"138":1,"297":1,"385":1}}],["переписать",{"2":{"332":1}}],["переписанный",{"2":{"120":1}}],["переполнение",{"2":{"193":1}}],["перегружена",{"2":{"342":1}}],["перегруженности",{"2":{"189":1}}],["перегруженных",{"2":{"179":1}}],["перегружать",{"2":{"179":1,"200":1}}],["перекомпоновать",{"2":{"433":1}}],["перекрывают",{"2":{"308":1}}],["перекрестного",{"2":{"117":1}}],["переключитесь",{"2":{"392":1}}],["переключателя",{"2":{"543":1}}],["переключатель",{"2":{"296":1}}],["переключать",{"2":{"195":1}}],["переключаться",{"2":{"156":1,"386":1}}],["переключения",{"2":{"185":1,"203":1}}],["переключение",{"2":{"184":1,"239":1,"543":1,"557":3}}],["перерасти",{"2":{"148":1}}],["перехвачен",{"2":{"361":1}}],["перехваченные",{"2":{"297":1}}],["перехвачена",{"2":{"296":1}}],["перехватчиков",{"2":{"511":1}}],["перехватчики",{"2":{"338":1}}],["перехвата",{"2":{"338":2}}],["перехвате",{"2":{"315":1}}],["перехватываем",{"2":{"381":1,"433":1}}],["перехватывает",{"2":{"298":1,"316":1}}],["перехватывается",{"2":{"296":1}}],["перехватывать",{"2":{"295":1}}],["перехватываться",{"2":{"139":1}}],["перехватывая",{"2":{"295":1,"316":1,"381":1}}],["перехватить",{"2":{"246":1,"363":1}}],["перехвату",{"2":{"231":1}}],["переходом",{"2":{"358":1}}],["переходов",{"2":{"160":1}}],["переходят",{"2":{"203":1}}],["переходит",{"2":{"203":1,"264":1}}],["переходить",{"2":{"119":1,"238":1,"256":1}}],["переходим",{"2":{"134":1,"365":1}}],["переход",{"2":{"118":1,"119":1,"130":3,"256":1,"335":1,"356":1,"392":1,"466":1}}],["переходе",{"2":{"86":1,"217":1}}],["перехода",{"2":{"23":1,"160":1,"195":1,"198":1,"345":1,"349":1,"354":1,"356":1,"442":1}}],["пересылает",{"2":{"473":1}}],["пересылаемый",{"2":{"115":1}}],["перестанет",{"2":{"465":1}}],["перестает",{"2":{"291":1,"463":1}}],["пересчитали",{"2":{"462":1}}],["пересчет",{"2":{"231":1}}],["пересчете",{"2":{"134":1}}],["пересмотреть",{"2":{"325":1}}],["пересмотрите",{"2":{"135":1}}],["пересекаться",{"2":{"358":1}}],["пересекаются",{"2":{"207":1}}],["пересечении",{"2":{"192":1}}],["перешло",{"2":{"127":1}}],["перешел",{"2":{"126":1}}],["перемещения",{"2":{"248":1,"311":1,"390":1}}],["перемещая",{"2":{"467":1}}],["перемещать",{"2":{"231":1}}],["перемещаться",{"2":{"192":1}}],["перемещается",{"2":{"203":1,"231":1}}],["перемещает",{"2":{"178":1}}],["переместившись",{"2":{"392":1}}],["переместит",{"2":{"229":1}}],["переместился",{"2":{"126":1,"224":1}}],["переменным",{"2":{"152":2}}],["переменными",{"2":{"152":1}}],["переменные",{"0":{"162":1},"2":{"149":1,"151":1,"152":4,"231":2,"242":1,"247":1,"250":1,"256":1,"267":1,"303":1,"330":1,"437":1,"462":2,"463":1,"557":1}}],["переменных",{"2":{"123":1,"148":1,"152":1,"160":1,"231":1,"315":1,"432":1,"460":1,"557":1}}],["переменная",{"2":{"148":1,"149":1,"152":1,"154":3,"155":2,"193":1,"231":1,"239":1,"246":1,"255":1,"256":2,"303":1,"462":2}}],["переменную",{"2":{"148":1,"152":2,"155":1,"159":1,"195":1,"231":2,"249":1,"250":1,"251":1,"281":1,"323":2,"324":2,"328":1,"330":1,"462":1,"463":2}}],["переменной",{"2":{"102":1,"115":1,"148":2,"149":1,"152":3,"154":2,"158":2,"160":2,"193":2,"231":1,"232":1,"246":2,"255":1,"325":1,"328":1,"349":1,"437":2,"460":2,"462":2,"463":1,"548":1}}],["перелогиниваться",{"2":{"115":1}}],["перелогин",{"2":{"115":1}}],["переделать",{"2":{"342":1}}],["передаю",{"2":{"463":1}}],["передающих",{"2":{"428":1}}],["передают",{"2":{"293":1,"323":1}}],["передаются",{"2":{"245":2,"433":1,"439":1}}],["передаст",{"2":{"365":1}}],["передадим",{"2":{"349":1}}],["переданного",{"2":{"428":1}}],["переданной",{"2":{"376":1}}],["переданное",{"2":{"338":1,"381":1}}],["переданному",{"2":{"302":1}}],["переданную",{"2":{"288":1,"363":1}}],["переданные",{"2":{"422":1,"428":1}}],["переданными",{"2":{"381":1}}],["переданным",{"2":{"156":1,"369":1}}],["переданный",{"2":{"123":1}}],["переданы",{"2":{"255":1}}],["передан",{"2":{"249":1,"349":1,"355":1}}],["передач",{"2":{"472":1}}],["передача",{"2":{"286":1,"287":2,"354":1,"447":1}}],["передаче",{"2":{"224":1}}],["передачи",{"2":{"152":1,"245":1,"247":1,"249":1,"286":1,"323":1,"361":1}}],["передачу",{"2":{"143":1}}],["передаваемых",{"2":{"434":1}}],["передаваемые",{"2":{"299":1,"363":1,"421":1}}],["передаваемой",{"2":{"437":1}}],["передаваемое",{"2":{"428":1}}],["передаваемому",{"2":{"249":1}}],["передавать",{"2":{"228":2,"239":1,"245":1,"247":1,"249":1,"303":1,"325":2,"326":1,"355":1,"366":1,"421":1,"425":1,"446":1,"462":1}}],["передаваться",{"2":{"136":1,"251":1,"323":1,"432":1}}],["передавая",{"2":{"149":1,"228":1,"240":1,"292":1,"295":1,"349":1,"380":1,"429":1,"446":1}}],["передав",{"2":{"135":1,"352":1}}],["передает",{"2":{"249":1,"292":1,"360":1,"374":1}}],["передается",{"2":{"127":1,"218":1,"284":1}}],["передаем",{"2":{"120":1,"136":1,"149":1,"193":1,"302":1,"303":1,"317":1,"324":1,"328":1,"333":1,"349":2,"355":2,"365":1,"380":2,"381":3,"429":1,"433":1,"437":1,"439":2}}],["передаёт",{"2":{"115":1}}],["передать",{"2":{"47":1,"141":1,"151":1,"193":1,"244":2,"246":1,"270":1,"292":1,"323":2,"352":2,"361":1,"381":1,"432":1,"463":2}}],["перед",{"2":{"112":1,"148":2,"152":1,"179":1,"180":1,"193":1,"196":1,"197":1,"211":1,"223":1,"224":1,"244":1,"247":1,"267":2,"285":1,"287":1,"297":1,"303":1,"315":1,"349":1,"352":1,"358":1,"367":1,"393":1,"395":1,"424":1,"425":1,"452":1,"472":1,"507":1}}],["перейдите",{"2":{"527":1}}],["перейдем",{"2":{"86":1,"143":1,"172":1,"174":1,"229":1,"289":1,"325":1,"380":1,"393":1}}],["перейти",{"2":{"38":1,"189":1,"300":1,"339":1,"355":1,"367":1,"427":1,"511":1}}],["переехать",{"2":{"39":1}}],["перенесенного",{"2":{"421":1}}],["перенесена",{"2":{"287":1}}],["перенести",{"2":{"95":1,"142":1}}],["перенаправить",{"2":{"365":1}}],["перенаправит",{"2":{"363":1}}],["перенаправлен",{"2":{"362":1}}],["перенаправления",{"2":{"362":2,"363":1}}],["перенаправлениях",{"2":{"361":1}}],["перенаправление",{"2":{"217":1,"365":1}}],["перенаправляющие",{"2":{"364":1}}],["перенаправляют",{"2":{"217":1}}],["перенаправляем",{"2":{"362":1}}],["перенаправляться",{"2":{"361":1}}],["перенасыщенности",{"2":{"189":1}}],["переноса",{"2":{"235":1}}],["переносить",{"2":{"160":1,"344":1}}],["переносится",{"2":{"30":1,"279":1,"457":1}}],["переносе",{"2":{"147":1}}],["перенос",{"0":{"143":1},"2":{"367":1}}],["перенять",{"2":{"26":1}}],["плевел",{"2":{"472":1}}],["плечах",{"2":{"176":1}}],["плохая",{"2":{"463":2}}],["плохие",{"2":{"271":1,"471":1}}],["плохую",{"2":{"271":1}}],["плохой",{"2":{"171":1,"268":1,"460":1}}],["плохо",{"2":{"65":1,"460":1,"471":1}}],["плавность",{"2":{"421":1}}],["плавающее",{"2":{"213":1}}],["плавающей",{"2":{"205":1}}],["плавающего",{"2":{"188":1}}],["плавающий",{"2":{"186":1}}],["платежей",{"2":{"464":1}}],["плату",{"2":{"394":1}}],["платформах",{"2":{"397":1}}],["платформа",{"2":{"315":3,"394":1}}],["платформы",{"2":{"308":1,"310":1,"313":1,"315":1,"319":1}}],["платных",{"2":{"364":1}}],["платные",{"2":{"39":1,"472":1}}],["платная",{"2":{"222":2}}],["платить",{"2":{"152":1}}],["плагину",{"2":{"317":1}}],["плагине",{"2":{"251":1,"255":1}}],["плагинами",{"2":{"455":1}}],["плагина",{"2":{"235":1,"247":1,"254":1,"255":3,"256":1,"316":1,"319":1,"349":1,"473":1,"515":1}}],["плагином",{"2":{"228":1,"252":1,"255":1}}],["плагинов",{"0":{"121":1},"2":{"119":1,"121":1,"125":1,"147":1,"151":1,"228":2,"252":1,"317":1,"335":1,"429":1,"455":1,"457":1}}],["плагин",{"0":{"252":1,"317":1},"1":{"253":1,"254":1,"255":1},"2":{"125":2,"222":1,"235":1,"241":1,"252":1,"254":1,"255":4,"256":2,"258":1,"259":1,"316":1,"317":6,"345":1,"439":3,"515":1}}],["плагины",{"2":{"104":1,"119":1,"120":1,"121":1,"130":1,"147":1,"224":1,"252":1,"253":1,"306":1,"367":1,"455":1,"463":1}}],["планшетов",{"2":{"518":1}}],["планшеты",{"2":{"308":1}}],["планирования",{"2":{"426":1,"427":1}}],["планирование",{"2":{"426":1}}],["планироваться",{"2":{"426":1}}],["планируется",{"2":{"64":1,"508":1}}],["планов",{"2":{"212":1}}],["планы",{"2":{"116":2}}],["план",{"0":{"66":1},"1":{"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"370":1,"372":2}}],["планах",{"0":{"545":1}}],["планами",{"2":{"444":1}}],["плана",{"2":{"40":1,"67":1,"373":1,"427":1}}],["плане",{"2":{"9":1,"25":1,"232":1,"460":1,"463":1,"471":1}}],["плюсы",{"2":{"463":1,"471":2}}],["плюсом",{"2":{"231":1}}],["плюс",{"2":{"25":1,"53":1,"86":1,"115":1,"152":1,"229":1,"375":1,"433":1,"451":1,"463":1}}],["пищеварительной",{"2":{"263":1}}],["пикселей",{"2":{"203":1}}],["пиктограмму",{"2":{"201":1}}],["пиктограмм",{"2":{"198":1}}],["пиктограммами",{"2":{"195":2}}],["пиктограммой",{"2":{"188":1}}],["пиктограммы",{"2":{"175":1,"176":1,"180":1,"186":1,"187":1}}],["письмо",{"2":{"365":2}}],["письмом",{"2":{"210":1}}],["письмами",{"2":{"218":1}}],["писем",{"2":{"187":1,"365":1}}],["писать",{"2":{"89":1,"152":1,"166":1,"228":1,"375":1,"385":1,"462":1,"463":1,"504":1}}],["писаться",{"2":{"23":1}}],["пишут",{"2":{"270":1}}],["пишутся",{"2":{"162":1,"165":1}}],["пишет",{"2":{"473":1}}],["пишете",{"2":{"267":1,"268":1}}],["пишем",{"2":{"9":1,"151":1}}],["пиши",{"0":{"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"260":1,"268":1}}],["пуша",{"2":{"451":1}}],["пулей",{"2":{"308":1}}],["пули",{"2":{"241":1}}],["пузырьком",{"2":{"187":1}}],["пузырьки",{"0":{"187":1}}],["пузыря",{"2":{"186":1}}],["публичным",{"2":{"367":1}}],["публичный",{"2":{"134":2,"224":1}}],["публикуются",{"2":{"498":1}}],["публикуем",{"2":{"328":1,"428":1}}],["публиковаться",{"2":{"426":1}}],["публикацию",{"2":{"395":1}}],["публикации",{"2":{"131":1,"133":1,"145":1,"146":1,"291":2,"328":1}}],["публикация",{"0":{"133":1},"1":{"134":1},"2":{"131":1,"133":1}}],["пупкина",{"2":{"115":1}}],["пупкин",{"2":{"115":1}}],["путаница",{"2":{"367":1}}],["путаницу",{"2":{"171":1,"189":1}}],["путешествии",{"2":{"223":1}}],["путешествовать",{"2":{"123":1}}],["путем",{"2":{"117":1,"138":1,"140":1,"174":1,"197":1,"228":1,"255":1,"264":1,"297":1,"355":1,"358":1,"360":1,"361":2,"386":1,"429":1}}],["путей",{"2":{"95":1,"228":1}}],["путях",{"2":{"112":1,"455":1}}],["путями",{"2":{"112":1,"135":1,"354":1}}],["путь",{"0":{"150":2},"2":{"108":1,"127":2,"133":1,"135":3,"136":2,"139":1,"140":1,"141":2,"151":1,"167":1,"171":1,"247":1,"311":1,"316":1,"352":1,"355":1,"358":1,"390":1,"422":1}}],["пути",{"2":{"83":1,"135":2,"196":1,"228":2,"230":1,"328":1,"349":1,"352":1,"354":1,"358":4,"368":1}}],["пункте",{"2":{"527":1}}],["пункту",{"2":{"325":1}}],["пунктирными",{"2":{"238":1}}],["пункт",{"2":{"209":2,"267":1}}],["пункты",{"2":{"133":1,"229":1,"256":2,"313":1,"352":1}}],["пунктов",{"2":{"29":1,"119":1,"198":1,"229":1,"352":1}}],["пунктах",{"2":{"318":1,"427":1}}],["пункта",{"2":{"4":1,"286":1}}],["пуст",{"2":{"231":1}}],["пуста",{"2":{"231":1}}],["пустого",{"2":{"507":1,"556":1}}],["пустом",{"2":{"227":1}}],["пустой",{"2":{"7":1,"288":1,"292":1,"328":1}}],["пустым",{"2":{"134":1,"338":1}}],["пусть",{"2":{"16":1,"354":1,"464":1,"468":1}}],["падает",{"2":{"421":1}}],["пабло",{"2":{"405":1}}],["пагинации",{"2":{"192":2}}],["пагинация",{"0":{"192":1},"1":{"193":1},"2":{"192":1}}],["памятью",{"2":{"328":2}}],["память",{"2":{"180":1,"267":1}}],["памяти",{"2":{"127":1,"134":1,"180":1,"267":3,"385":1,"421":1,"457":1}}],["паттерн",{"2":{"231":1,"352":1,"460":1}}],["паттернов",{"2":{"167":1,"260":1,"342":1,"368":1,"370":1,"401":1,"402":1,"417":1}}],["паттерны",{"2":{"147":2,"225":2,"229":1,"232":2,"342":1,"374":1,"414":1,"471":1}}],["паутина",{"2":{"147":1}}],["папок",{"0":{"224":1},"2":{"137":1,"221":1}}],["папкоподобная",{"2":{"196":1}}],["папке",{"2":{"170":1,"224":1,"227":1,"255":1,"346":2,"365":1,"390":3,"452":1}}],["папка",{"2":{"135":1,"136":1,"140":1,"143":1,"224":4}}],["папки",{"2":{"126":1,"223":1,"227":1,"253":1,"452":2}}],["папку",{"2":{"126":1,"136":1,"143":1,"223":1,"224":1,"225":1,"226":1,"227":1,"253":1,"375":2,"452":3}}],["панацея",{"2":{"93":1}}],["панелей",{"2":{"198":1}}],["панели",{"0":{"190":1},"1":{"191":1},"2":{"31":1,"90":1,"187":1,"195":3,"198":1,"200":1,"205":1,"347":1,"352":1,"383":1,"527":1,"547":1}}],["панелью",{"2":{"200":1}}],["панель",{"2":{"28":1,"79":1,"137":2,"138":1,"176":1,"190":1,"203":3,"205":1,"347":1,"355":1,"384":1,"445":1}}],["палитры",{"2":{"545":1}}],["палитру",{"2":{"173":1}}],["пал",{"2":{"39":1}}],["пару",{"2":{"361":1,"457":1,"460":1,"468":1,"508":1,"536":1}}],["паролей",{"2":{"361":2,"366":1}}],["паролями",{"2":{"360":1,"361":1}}],["пароля",{"2":{"360":2,"366":1,"368":1}}],["паролю",{"0":{"360":1,"365":1},"2":{"360":1}}],["пароль",{"2":{"115":1,"361":1,"366":1,"463":1}}],["парольной",{"2":{"40":1}}],["параграфов",{"2":{"536":1}}],["параграфы",{"2":{"472":1}}],["параграфа",{"2":{"315":1}}],["параллельно",{"2":{"372":1}}],["парами",{"2":{"352":1}}],["параметре",{"2":{"294":1}}],["параметр",{"2":{"287":1,"303":1,"349":1,"355":3,"376":2,"435":1,"439":1,"501":1,"528":1}}],["параметром",{"2":{"244":1,"376":1,"435":1,"536":1}}],["параметров",{"2":{"223":1,"282":1,"301":1,"323":1,"381":1,"428":1,"435":1,"439":1,"501":1}}],["параметрам",{"2":{"369":1}}],["параметрами",{"2":{"353":1,"358":2,"451":1}}],["параметра",{"2":{"127":1,"244":2,"255":1,"284":1,"287":1,"292":1,"302":1,"349":1,"354":1,"356":1,"358":1,"376":1,"422":1,"423":1,"429":1}}],["параметры",{"2":{"104":1,"152":2,"252":1,"266":1,"291":1,"345":1,"349":1,"352":1,"355":2,"357":1,"363":1,"446":1,"508":1,"509":1,"545":1}}],["параметру",{"2":{"48":1,"302":1}}],["парадигм",{"2":{"264":1}}],["парадигму",{"2":{"147":1}}],["парадигмы",{"2":{"147":2,"264":1}}],["пара",{"2":{"11":1,"231":1}}],["паре",{"2":{"3":1}}],["пакетных",{"2":{"222":1}}],["пакетами",{"2":{"455":1}}],["пакета",{"2":{"120":1,"125":1,"127":1,"145":1,"152":1,"223":2,"244":3,"332":1,"345":1,"346":1,"349":3,"370":1,"373":1,"388":1,"456":1,"460":1}}],["пакет",{"2":{"86":3,"224":2,"244":1,"293":1,"326":2,"349":1,"374":2,"375":1,"445":1,"457":1,"465":1,"504":1,"539":1}}],["пакеты",{"2":{"5":1,"344":1,"508":1}}],["пакетов",{"2":{"5":1,"223":2,"375":1,"388":1,"457":1,"504":1}}],["п",{"2":{"4":1,"38":1,"109":1,"188":1,"391":1,"461":1,"464":1,"496":1,"507":1}}],["поиграйте",{"2":{"472":1}}],["поизучайте",{"2":{"472":1}}],["поисковых",{"2":{"473":1}}],["поисковыми",{"2":{"308":1,"344":1}}],["поисковиков",{"2":{"473":1}}],["поисковик",{"2":{"473":1}}],["поисковиками",{"2":{"473":2}}],["поисковая",{"2":{"98":1}}],["поисковой",{"2":{"98":1}}],["поиск",{"0":{"48":1},"2":{"16":1,"17":2,"48":2,"79":1,"176":1,"200":1,"227":1}}],["поисках",{"2":{"429":1}}],["поискать",{"2":{"98":1,"454":1}}],["поиска",{"2":{"4":1,"29":1,"48":2,"204":2,"360":1}}],["побуждает",{"2":{"367":1}}],["побочным",{"2":{"323":1,"349":1}}],["побочных",{"2":{"250":1,"268":1}}],["побочные",{"2":{"189":1}}],["пояснить",{"2":{"297":1}}],["появятся",{"2":{"160":1}}],["появляются",{"2":{"224":1,"313":1,"421":1,"457":1}}],["появляется",{"2":{"33":1,"256":1,"308":1,"353":1,"355":1,"446":1,"534":1}}],["появлении",{"2":{"393":1,"516":1}}],["появление",{"2":{"344":2}}],["появлением",{"2":{"147":1,"344":1}}],["появления",{"2":{"224":1,"344":1,"473":1}}],["появлению",{"2":{"152":1,"381":1}}],["появившаяся",{"2":{"385":1}}],["появиться",{"2":{"193":1,"223":1,"238":1,"255":1,"374":1}}],["появится",{"2":{"117":1,"144":1,"155":1,"193":1,"223":1,"227":1,"315":1,"393":1}}],["появились",{"2":{"128":1,"147":1,"182":1,"260":1,"384":1,"463":1}}],["появился",{"2":{"119":1,"238":1,"246":1,"463":1,"473":1}}],["появилась",{"2":{"102":1,"124":1,"295":1,"344":1,"462":1,"507":1}}],["появилось",{"2":{"62":1,"460":1,"463":1}}],["пошагово",{"2":{"255":1}}],["пожалуйста",{"2":{"287":1,"360":1,"427":1}}],["пожалуй",{"2":{"244":1,"263":1,"308":1,"373":1}}],["погрузимся",{"2":{"321":1,"329":1}}],["поговорим",{"2":{"151":1,"359":1,"391":1}}],["погуглим",{"2":{"22":1}}],["поймать",{"2":{"460":1}}],["поймете",{"2":{"174":1,"203":1,"265":1}}],["поймем",{"2":{"148":1,"169":1}}],["пойдем",{"2":{"133":1,"360":1}}],["пойдет",{"2":{"116":1,"385":1}}],["почта",{"2":{"365":1}}],["почтовые",{"2":{"344":1}}],["почти",{"2":{"227":1,"268":1,"316":1,"376":1,"388":1,"472":1}}],["почты",{"2":{"134":1,"187":1,"359":1,"365":2,"366":1,"367":1}}],["почувствовать",{"2":{"216":1}}],["почву",{"2":{"171":1}}],["почему",{"2":{"39":1,"118":1,"146":1,"168":2,"172":3,"174":1,"220":1,"234":2,"251":1,"305":3,"318":1,"381":1,"397":3,"421":1,"429":1,"462":1,"471":1,"472":1}}],["похудеет",{"2":{"460":1}}],["похвастаться",{"2":{"431":1}}],["похож",{"2":{"336":1}}],["похожем",{"2":{"554":1}}],["похожее",{"2":{"355":1}}],["похоже",{"2":{"286":1,"306":1,"366":1}}],["похожей",{"2":{"267":1,"424":1}}],["похожим",{"2":{"297":1,"333":1}}],["похожий",{"2":{"244":1}}],["похожи",{"2":{"85":1,"156":1,"432":1,"435":1}}],["похожие",{"2":{"4":1,"22":1,"178":1}}],["похакать",{"2":{"116":1}}],["порой",{"2":{"472":1}}],["порог",{"2":{"462":1}}],["породили",{"2":{"344":1}}],["породить",{"2":{"201":1}}],["порождать",{"2":{"421":1}}],["порождающие",{"0":{"273":1}}],["порождают",{"2":{"271":1}}],["порождал",{"2":{"250":1}}],["порождает",{"2":{"150":1}}],["порекомендовать",{"2":{"166":1}}],["пор",{"2":{"148":1,"150":1,"159":1,"160":1,"170":1,"197":1,"200":1,"210":1,"221":1,"238":1,"241":1,"244":1,"270":1,"284":1,"300":1,"303":1,"330":1,"344":1,"352":1,"353":1,"355":2,"365":1,"386":1,"421":1}}],["порядки",{"2":{"473":1}}],["порядковому",{"2":{"381":1}}],["порядковым",{"2":{"192":1}}],["порядке",{"2":{"150":1,"192":1,"203":1,"223":1,"224":2,"231":1,"255":1,"256":1,"310":1,"429":1}}],["порядка",{"2":{"150":1,"175":1,"192":1,"198":1}}],["порядку",{"2":{"133":1,"388":1}}],["порядок",{"2":{"118":1,"256":1}}],["портфолио",{"2":{"506":1,"507":1,"508":1}}],["порта",{"2":{"336":1}}],["порталов",{"2":{"134":1}}],["портал",{"2":{"115":1}}],["портрет",{"2":{"317":1}}],["портретная",{"2":{"312":1}}],["портретных",{"2":{"203":1}}],["порт",{"2":{"223":1,"439":1}}],["портом",{"2":{"117":1}}],["поработайте",{"2":{"472":2}}],["поработать",{"2":{"428":1}}],["поработаем",{"2":{"255":1,"293":1}}],["пора",{"2":{"85":1,"238":1,"300":1}}],["повысит",{"2":{"470":1}}],["повысить",{"2":{"419":1,"464":1,"556":1}}],["повышению",{"2":{"414":1}}],["повышение",{"2":{"340":1,"497":1}}],["повышения",{"2":{"295":1,"319":1,"344":1,"419":1}}],["повышается",{"2":{"464":1,"473":1}}],["повышает",{"2":{"79":1,"394":1,"440":1,"445":1}}],["повсеместно",{"2":{"300":1}}],["повседневном",{"2":{"179":1}}],["повсюду",{"2":{"203":1}}],["поводу",{"2":{"186":1,"190":1}}],["повлиять",{"2":{"441":1}}],["повлияют",{"2":{"433":1}}],["повлияет",{"2":{"178":1,"245":1,"352":1,"421":1}}],["повлияли",{"2":{"126":1}}],["повторяйтесь",{"2":{"300":1}}],["повторяйся",{"0":{"268":1}}],["повторяющегося",{"2":{"462":1}}],["повторяющееся",{"2":{"174":1,"243":1}}],["повторяющихся",{"2":{"260":1}}],["повторяемому",{"2":{"237":1}}],["повторяется",{"2":{"193":1,"372":1}}],["повторяет",{"2":{"174":1}}],["повторять",{"2":{"228":1,"325":1}}],["повторяться",{"2":{"225":1,"228":1,"260":1,"325":1}}],["повторения",{"2":{"174":2,"175":1,"250":1,"280":1,"435":1}}],["повторение",{"0":{"174":1},"2":{"174":4}}],["повторно",{"2":{"152":1,"259":1,"347":1}}],["повторного",{"2":{"152":1,"248":1,"250":1,"261":1,"271":1,"284":1,"315":1,"383":1}}],["поверх",{"2":{"148":2,"187":1,"222":1,"359":1,"360":1,"394":1,"431":1}}],["поведенческие",{"0":{"274":1}}],["поведенческих",{"2":{"69":1}}],["поведением",{"2":{"147":1}}],["поведение",{"2":{"69":1,"103":1,"147":1,"153":1,"174":1,"224":1,"231":1,"265":1,"278":1,"462":1}}],["поведения",{"2":{"68":1,"192":1,"204":1,"211":1,"421":1}}],["покрывается",{"2":{"383":1}}],["покрытии",{"2":{"383":3}}],["покрытия",{"2":{"383":2}}],["покрытие",{"0":{"383":1},"2":{"382":1,"383":1}}],["покидают",{"2":{"366":1}}],["покидать",{"2":{"240":1}}],["покупку",{"2":{"210":1}}],["покупках",{"2":{"214":1}}],["покупка",{"2":{"210":1}}],["покупке",{"2":{"145":1,"214":1}}],["покупки",{"2":{"134":1,"209":2,"403":1}}],["покупать",{"2":{"134":1}}],["покупателей",{"2":{"79":1,"473":1}}],["покупателя",{"2":{"79":1}}],["покупаем",{"2":{"134":1}}],["покупок",{"2":{"79":1,"209":1}}],["показывали",{"2":{"472":1,"473":1}}],["показывания",{"2":{"451":1}}],["показываем",{"2":{"365":1}}],["показывает",{"2":{"119":1,"155":1,"186":1,"385":1,"421":1,"430":1,"463":1}}],["показывается",{"2":{"30":2,"31":1,"83":1}}],["показывать",{"2":{"186":1,"265":1,"447":1,"462":1,"473":1}}],["показываться",{"2":{"156":1,"460":1}}],["показываются",{"2":{"447":1}}],["показывают",{"2":{"156":1,"198":1}}],["показывающее",{"2":{"339":1}}],["показывающие",{"2":{"314":1}}],["показывающих",{"2":{"196":1}}],["показывающим",{"2":{"102":1}}],["показывающая",{"2":{"102":1,"187":1}}],["показывая",{"2":{"156":1,"175":1,"184":1,"229":1}}],["показ",{"2":{"79":1,"464":1}}],["показав",{"2":{"421":1}}],["показателей",{"0":{"318":1}}],["показать",{"0":{"176":1},"2":{"187":1,"190":1,"200":1,"390":1}}],["показаться",{"2":{"26":1,"137":1,"151":3,"224":1,"267":1,"297":1,"303":1,"306":1,"308":1,"381":1,"421":1}}],["показана",{"2":{"381":1}}],["показанном",{"2":{"256":1}}],["показанное",{"2":{"204":1}}],["показаны",{"2":{"192":1,"249":1}}],["показано",{"2":{"134":1,"152":1,"246":1,"293":1,"302":1,"322":1,"323":1,"324":1,"328":1,"330":1,"360":1,"415":1,"427":1}}],["показа",{"2":{"47":1,"156":2,"452":1}}],["показе",{"2":{"30":1,"315":1}}],["пока",{"2":{"25":1,"34":1,"41":1,"53":1,"73":1,"96":1,"97":2,"104":1,"105":1,"134":1,"147":1,"148":1,"151":1,"160":2,"192":1,"197":1,"210":1,"228":1,"238":1,"241":1,"244":1,"255":2,"263":1,"267":1,"270":1,"282":1,"284":1,"298":1,"301":1,"303":1,"333":1,"347":1,"349":1,"352":1,"359":1,"365":1,"391":1,"421":1,"429":1}}],["поняли",{"2":{"223":1,"315":1}}],["поняв",{"2":{"160":1}}],["понятен",{"2":{"204":1,"439":1}}],["понять",{"2":{"161":1,"181":1,"203":1,"232":1,"239":1,"278":1,"304":1,"316":1,"331":1,"332":1,"361":1,"375":1,"428":1,"447":1,"463":1,"472":1}}],["понятий",{"2":{"150":1,"320":1}}],["понятийном",{"2":{"68":1}}],["понятиями",{"2":{"178":1,"247":1}}],["понятия",{"2":{"148":1,"150":1,"167":1,"268":1,"291":1,"326":1,"369":1,"396":1,"407":1,"417":1,"464":1}}],["понятии",{"2":{"148":1}}],["понятие",{"2":{"115":1,"149":1,"249":1,"268":1,"384":1,"394":1,"462":1}}],["понятное",{"2":{"422":1}}],["понятно",{"2":{"247":1,"428":1,"507":1}}],["понятной",{"2":{"188":1}}],["понятна",{"2":{"203":1,"329":1}}],["понятные",{"2":{"455":1}}],["понятными",{"2":{"192":1}}],["понятным",{"2":{"118":1,"270":1,"419":1}}],["понятный",{"2":{"68":1,"77":1,"199":1,"323":1}}],["понятную",{"2":{"97":1,"471":1}}],["понятней",{"2":{"83":1}}],["понадобятся",{"2":{"231":1,"295":1,"307":1}}],["понадобится",{"2":{"36":1,"73":1,"104":1,"105":1,"149":1,"231":2,"255":1,"256":1,"287":1,"455":1}}],["понадобиться",{"2":{"34":1}}],["поначалу",{"2":{"151":1}}],["понимаете",{"2":{"355":1,"394":1}}],["понимается",{"2":{"269":1}}],["понимают",{"2":{"190":1,"232":1,"268":1}}],["понимаются",{"2":{"182":1,"452":1}}],["понимании",{"2":{"321":1,"336":1}}],["пониманием",{"2":{"204":1}}],["понимание",{"0":{"151":1},"2":{"171":1,"176":1,"260":1,"323":1,"400":1,"472":1}}],["понимания",{"2":{"65":1,"68":1,"131":1,"145":1,"171":1,"200":1,"260":1,"293":1,"301":1,"303":1,"322":1,"330":1,"402":1,"416":1,"437":1}}],["понимать",{"2":{"115":1,"148":1,"271":1,"361":1,"374":1,"472":1}}],["попробуйте",{"2":{"454":1,"457":1,"472":2}}],["попробует",{"2":{"454":1}}],["попробуем",{"2":{"393":1}}],["попросите",{"2":{"174":1}}],["попап",{"2":{"460":1}}],["попадают",{"2":{"383":1}}],["попадает",{"2":{"190":1,"365":1}}],["попадет",{"2":{"178":1,"228":1}}],["попасть",{"2":{"86":1,"325":1}}],["попытаемся",{"2":{"393":1}}],["попытается",{"2":{"174":1,"379":1}}],["попытаться",{"2":{"141":1,"316":2,"383":1}}],["попытался",{"2":{"62":1}}],["попытка",{"2":{"118":1,"296":1,"373":1}}],["популярности",{"2":{"457":1}}],["популярность",{"2":{"166":1}}],["популярной",{"2":{"386":1}}],["популярном",{"2":{"226":1}}],["популярного",{"2":{"225":1}}],["популярна",{"2":{"217":1,"460":1,"536":1}}],["популярными",{"2":{"306":1,"367":1,"545":1}}],["популярным",{"2":{"198":2,"372":1,"473":1}}],["популярные",{"2":{"195":1,"455":1,"508":1}}],["популярны",{"2":{"189":1,"198":1}}],["популярных",{"2":{"147":1,"222":1,"385":1}}],["популярный",{"2":{"116":1,"222":2,"451":1}}],["популярен",{"2":{"137":1,"140":1,"149":1,"184":1,"290":1,"386":1,"394":1}}],["популяризация",{"2":{"118":2}}],["попутный",{"2":{"65":1}}],["попутно",{"2":{"63":1,"147":1}}],["познавательные",{"2":{"396":1}}],["познакомившись",{"2":{"169":1}}],["познакомились",{"2":{"145":1,"219":1,"419":1,"440":1}}],["познакомился",{"2":{"62":1}}],["познакомимся",{"2":{"131":1,"147":1,"169":1,"224":1,"235":2,"306":1,"368":1}}],["позитивного",{"2":{"377":1}}],["позиционируют",{"2":{"507":1}}],["позицией",{"2":{"367":1}}],["позиции",{"2":{"195":1}}],["позора",{"0":{"216":1}}],["поздно",{"2":{"178":1,"465":1}}],["позаботится",{"2":{"152":1,"224":1,"231":1,"332":1}}],["позже",{"2":{"85":1,"105":1,"134":2,"149":1,"160":1,"222":1,"227":1,"239":1,"247":1,"249":1,"250":1,"255":1,"264":1,"268":1,"315":2,"335":1,"347":1,"349":1,"374":1,"391":1,"428":1,"429":1,"437":1,"473":1}}],["позволили",{"2":{"344":1}}],["позволить",{"2":{"59":1,"286":1}}],["позволит",{"2":{"11":1,"47":1,"86":1,"195":1,"224":1,"247":1,"260":1,"267":1,"304":1,"374":1,"375":1,"400":1}}],["позволял",{"2":{"250":1}}],["позволят",{"2":{"244":1,"394":1,"419":1}}],["позволяя",{"2":{"228":1,"301":1,"442":1}}],["позволяют",{"2":{"184":1,"246":1,"308":1,"351":1,"358":1,"434":1,"444":1,"455":1}}],["позволяющую",{"2":{"349":1}}],["позволяющая",{"2":{"297":1,"368":1,"440":1}}],["позволяющего",{"2":{"385":1}}],["позволяющее",{"2":{"278":1}}],["позволяющему",{"2":{"183":1}}],["позволяющим",{"2":{"365":1}}],["позволяющими",{"2":{"219":1}}],["позволяющих",{"2":{"361":1,"440":1}}],["позволяющие",{"2":{"147":1,"219":1,"267":1,"367":1,"394":1,"507":1}}],["позволяющий",{"2":{"117":1,"128":1,"138":1,"192":1,"252":1,"315":1,"336":1}}],["позволяйте",{"2":{"180":2}}],["позволяет",{"2":{"34":1,"68":1,"69":1,"91":1,"105":1,"125":1,"134":2,"138":1,"148":1,"151":1,"160":1,"190":1,"192":2,"196":1,"197":1,"199":1,"224":3,"244":1,"246":1,"263":1,"271":1,"288":1,"292":2,"303":1,"330":1,"345":1,"352":1,"355":3,"358":1,"375":1,"380":1,"386":2,"391":1,"394":1,"421":1,"422":1,"427":1,"436":1,"445":2,"451":1,"457":1,"462":2,"463":1,"464":1,"473":2,"506":1,"511":1,"513":1,"554":1,"555":1}}],["поэкспериментируйте",{"2":{"472":1}}],["поэкспериментировать",{"2":{"56":1}}],["поэтапного",{"2":{"319":1}}],["поэтапно",{"2":{"61":1}}],["поэтому",{"2":{"13":1,"23":1,"44":1,"65":2,"95":1,"98":1,"108":1,"124":2,"134":1,"137":1,"143":1,"144":1,"148":1,"149":1,"150":1,"152":2,"160":2,"166":1,"167":1,"172":2,"180":1,"188":1,"190":2,"197":1,"203":1,"223":1,"225":1,"226":1,"227":2,"232":1,"237":1,"245":1,"256":1,"262":1,"264":1,"267":1,"280":1,"287":2,"291":1,"295":1,"310":1,"315":2,"316":1,"325":1,"326":1,"336":3,"338":1,"353":1,"358":1,"361":2,"362":1,"366":1,"367":3,"374":1,"375":1,"377":2,"378":1,"381":2,"382":1,"383":1,"388":1,"390":1,"394":1,"420":1,"421":4,"423":2,"424":1,"426":1,"428":1,"431":1,"432":2,"434":1,"439":1,"457":2,"460":1,"462":1,"463":1,"464":1,"473":1}}],["помечает",{"2":{"393":1}}],["помечаем",{"2":{"193":1}}],["помеченный",{"2":{"256":1}}],["помеченных",{"2":{"231":1}}],["поместили",{"2":{"256":1,"316":1}}],["поместим",{"2":{"224":1,"375":1}}],["поместите",{"2":{"225":1,"226":1,"393":1}}],["поместит",{"2":{"151":1,"223":1}}],["поместить",{"2":{"139":1,"316":1,"445":1}}],["помещен",{"2":{"382":1}}],["помещены",{"2":{"136":1,"391":1}}],["помещаться",{"2":{"452":1}}],["помещаем",{"2":{"352":1}}],["помещается",{"2":{"249":1,"548":1}}],["помещаются",{"2":{"209":1,"224":1,"452":1}}],["поменять",{"2":{"40":1,"41":1,"504":1}}],["помните",{"2":{"287":1,"336":1,"376":1,"393":1}}],["помнить",{"2":{"134":1,"150":1,"151":1,"227":1,"245":1,"267":1,"360":2,"361":1,"378":1,"394":1,"432":1,"433":1,"447":1,"463":1}}],["помним",{"2":{"41":1}}],["помимо",{"2":{"119":1,"190":1,"193":1,"198":1,"214":1,"224":1,"291":1,"300":1,"361":1,"370":1,"400":1,"421":1}}],["помогает",{"2":{"160":1,"199":1,"240":1,"267":1,"428":1,"472":1,"507":1}}],["помогают",{"2":{"150":1,"471":1,"472":1}}],["помогающая",{"2":{"148":1}}],["помогут",{"2":{"147":1,"161":1,"176":1,"220":1,"316":1}}],["поможет",{"2":{"119":1,"171":1,"260":2,"295":1,"372":2,"400":2,"472":1}}],["помочь",{"2":{"117":1,"168":1,"186":1,"304":1,"472":1}}],["помощь",{"2":{"246":1,"249":1,"314":1,"378":1}}],["помощью",{"0":{"144":1,"235":1,"237":1,"247":1,"251":1,"318":1,"326":1,"331":1,"386":1,"410":1,"414":1,"431":1},"1":{"236":1,"237":1,"238":2,"239":2,"240":2,"241":2,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"327":1,"328":1,"332":1,"333":1,"334":1,"335":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1},"2":{"35":2,"89":2,"108":1,"116":1,"131":1,"137":1,"143":1,"144":2,"145":1,"151":2,"152":1,"159":2,"160":1,"169":1,"172":1,"184":1,"185":1,"186":1,"188":1,"189":2,"198":1,"203":2,"221":1,"223":2,"224":1,"226":2,"227":1,"229":2,"231":7,"232":1,"234":1,"235":3,"237":1,"238":1,"239":2,"243":1,"244":3,"245":2,"246":1,"247":2,"249":2,"252":1,"254":2,"255":2,"256":2,"259":1,"264":1,"267":1,"289":1,"292":2,"295":2,"300":3,"302":2,"303":1,"304":1,"306":1,"308":4,"309":1,"315":1,"316":1,"317":1,"319":2,"321":2,"325":1,"326":1,"328":1,"330":1,"331":2,"332":2,"335":1,"336":2,"337":1,"338":2,"340":1,"342":1,"344":1,"345":2,"346":1,"347":1,"351":1,"352":2,"355":2,"359":2,"361":1,"363":1,"364":1,"365":1,"366":2,"367":2,"368":1,"370":2,"372":1,"375":1,"376":2,"378":1,"379":1,"380":1,"381":3,"384":3,"390":1,"391":3,"393":2,"395":1,"400":1,"414":1,"416":1,"419":1,"421":1,"423":2,"429":1,"431":1,"432":1,"434":1,"435":1,"437":2,"439":3,"444":1,"457":1,"463":1,"508":1,"509":1,"511":1,"513":1,"519":2,"544":1}}],["помощников",{"2":{"171":1}}],["помощник",{"2":{"89":1,"223":2}}],["помощи",{"2":{"74":1,"222":1}}],["послойное",{"2":{"421":1}}],["послано",{"2":{"381":1}}],["после",{"2":{"39":1,"58":1,"72":1,"79":1,"118":1,"120":1,"121":1,"125":1,"135":1,"136":1,"145":1,"156":1,"159":1,"190":1,"200":1,"207":1,"209":1,"210":1,"218":1,"223":1,"229":1,"230":1,"231":1,"232":1,"238":1,"240":1,"243":2,"246":1,"247":1,"255":1,"256":2,"257":1,"276":1,"280":1,"286":1,"288":1,"292":2,"297":1,"298":1,"301":3,"314":1,"315":2,"316":2,"317":1,"318":1,"330":2,"331":1,"345":1,"346":1,"349":3,"359":1,"362":2,"366":1,"367":1,"370":1,"372":1,"374":2,"375":1,"376":2,"379":2,"384":1,"385":1,"387":1,"390":5,"391":2,"394":1,"421":3,"422":1,"423":1,"428":1,"429":1,"433":1,"438":2,"439":2,"442":1,"444":1,"451":2,"460":1,"463":1,"473":3,"534":1,"540":1,"556":1}}],["последствия",{"2":{"271":1}}],["последующим",{"2":{"376":1}}],["последующих",{"2":{"214":1,"281":2}}],["последующая",{"2":{"346":1}}],["последующей",{"2":{"366":1}}],["последующего",{"2":{"23":1,"306":1,"428":1,"504":1}}],["последующему",{"2":{"144":1}}],["последующем",{"2":{"17":1,"315":1}}],["последовательную",{"2":{"303":1}}],["последовательный",{"2":{"192":1}}],["последовательным",{"0":{"174":1},"2":{"247":1}}],["последовательном",{"2":{"192":1}}],["последовательного",{"2":{"189":1,"421":3}}],["последовательно",{"2":{"179":1,"301":1,"302":1,"336":1,"421":1}}],["последовательности",{"2":{"175":1,"180":1,"240":1}}],["последовательной",{"2":{"166":1}}],["последнего",{"2":{"439":1}}],["последнем",{"2":{"353":1}}],["последнее",{"2":{"186":1,"433":1}}],["последней",{"2":{"151":1,"263":1}}],["последняя",{"2":{"147":1,"388":1,"395":1,"400":1}}],["последним",{"2":{"256":1,"261":1,"303":1,"428":1}}],["последними",{"2":{"86":1}}],["последний",{"2":{"181":1,"286":1,"315":1,"347":1,"381":1,"388":1,"394":1}}],["последних",{"2":{"143":1,"225":1,"451":1}}],["последние",{"2":{"55":1,"76":1,"182":1,"460":1,"536":1}}],["последнюю",{"2":{"25":1,"222":1}}],["посещении",{"2":{"367":1}}],["посвящены",{"2":{"231":1,"271":1}}],["посвящена",{"2":{"221":1,"276":1,"414":1,"421":1}}],["посвященный",{"2":{"176":1}}],["посадочная",{"2":{"189":1}}],["посадочной",{"2":{"189":1}}],["поскольку",{"2":{"134":1,"135":2,"137":1,"148":1,"149":2,"152":1,"160":1,"161":1,"170":1,"171":1,"178":1,"184":1,"189":2,"192":1,"193":2,"200":1,"221":1,"227":2,"231":3,"232":2,"244":1,"256":2,"265":1,"267":1,"286":1,"291":1,"295":1,"296":3,"297":1,"298":1,"300":1,"301":1,"303":1,"316":1,"317":1,"323":1,"325":1,"326":1,"328":1,"330":2,"332":1,"333":1,"336":3,"337":1,"338":2,"347":1,"352":1,"355":2,"358":2,"360":1,"364":2,"365":1,"367":2,"372":3,"373":1,"376":1,"379":1,"381":1,"383":1,"384":1,"390":1,"391":1,"393":1,"394":1,"396":1,"421":2,"424":1,"425":1,"430":1,"431":1,"433":1,"434":1,"439":2}}],["посылать",{"2":{"118":1}}],["посредником",{"2":{"117":1}}],["посредством",{"2":{"40":1}}],["поступившие",{"2":{"395":1}}],["поступления",{"2":{"12":1}}],["пострадать",{"2":{"308":1}}],["построим",{"2":{"331":1,"427":1}}],["построить",{"2":{"83":1,"148":1,"225":1,"232":2,"400":1,"419":1}}],["построчно",{"2":{"292":1,"294":1,"296":1}}],["построено",{"2":{"232":1,"394":1}}],["построен",{"2":{"148":1,"150":1,"229":1}}],["построенные",{"2":{"148":1,"359":1,"394":1,"463":1}}],["построены",{"2":{"135":1,"148":1}}],["построению",{"2":{"235":1,"400":1}}],["построение",{"2":{"76":1}}],["построения",{"2":{"39":1,"148":3,"299":1,"508":1,"542":1}}],["постов",{"2":{"205":1}}],["постоянный",{"2":{"315":1}}],["постоянных",{"2":{"180":1}}],["постоянными",{"2":{"431":1}}],["постоянным",{"2":{"115":1}}],["постоянной",{"2":{"419":1,"440":1}}],["постоянного",{"2":{"315":1,"340":1}}],["постоянно",{"2":{"115":1,"225":1,"243":1,"385":1,"396":1}}],["постсервисное",{"2":{"171":1}}],["постепенной",{"2":{"320":1}}],["постепенно",{"2":{"79":1,"147":1,"148":1,"306":1,"400":1}}],["постепенное",{"2":{"76":1,"308":1}}],["постановка",{"2":{"390":1,"391":1}}],["поставки",{"2":{"389":1}}],["поставляется",{"2":{"318":1}}],["поставляемых",{"2":{"221":1}}],["поставлен",{"2":{"390":1}}],["поставлены",{"2":{"293":1}}],["поставленных",{"2":{"70":1}}],["поставщиков",{"2":{"118":1}}],["поставив",{"2":{"116":1}}],["поставить",{"2":{"112":1,"116":1,"393":1,"457":1,"472":1}}],["постараемся",{"2":{"23":1}}],["посмотрели",{"2":{"340":1}}],["посмотреть",{"2":{"16":1,"109":2,"140":1,"148":1,"223":1,"315":1,"352":2,"366":1,"405":1,"455":1,"457":1,"472":1,"473":1,"508":1}}],["посмотрим",{"2":{"142":1,"181":1,"246":1,"303":1,"309":1,"323":2,"324":1,"332":2,"350":1,"351":1,"354":1,"361":1,"421":1,"429":2,"437":1}}],["посмотрите",{"2":{"22":1,"170":1,"222":1,"236":1,"249":1,"302":1,"307":1,"322":1,"343":1,"371":1,"420":1,"457":1,"472":1}}],["потратьте",{"2":{"457":1,"468":1}}],["потратит",{"2":{"375":1}}],["потребуются",{"2":{"373":1}}],["потребует",{"2":{"38":1,"148":1}}],["потребуется",{"2":{"12":1,"222":1,"228":1,"231":1,"301":1,"342":1,"347":1,"361":1,"376":1}}],["потребностей",{"2":{"304":1,"321":1,"383":1}}],["потребностями",{"2":{"224":1,"231":1}}],["потребностях",{"2":{"137":1}}],["потребляют",{"2":{"301":1}}],["потребительском",{"2":{"169":1}}],["потери",{"2":{"454":1}}],["потеряете",{"2":{"366":1}}],["потеряло",{"2":{"181":1}}],["потерять",{"2":{"115":1}}],["потенциально",{"2":{"421":1}}],["потенциал",{"2":{"344":1,"393":2}}],["потоке",{"2":{"268":1,"301":1,"316":1,"336":1,"421":2,"462":1}}],["потоках",{"2":{"421":1}}],["потоками",{"0":{"321":1,"413":1},"1":{"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1},"2":{"239":1,"249":1,"282":1,"294":1,"306":1,"315":1,"413":1,"426":2}}],["потока",{"0":{"239":1},"2":{"294":1,"301":2,"302":1,"303":1,"323":1,"361":1}}],["поток",{"2":{"148":1,"181":1,"270":1,"301":2,"361":1,"460":1}}],["потоком",{"2":{"127":1,"151":1,"152":1,"276":1,"289":1,"321":1,"322":1,"328":1,"335":1,"340":1,"352":1,"462":1}}],["потоков",{"2":{"11":1,"68":1}}],["поточнее",{"2":{"89":1}}],["потомок",{"2":{"463":1}}],["потомком",{"2":{"463":1}}],["потом",{"2":{"22":1,"26":1,"36":1,"39":1,"40":1,"63":1,"65":1,"99":1,"174":1,"316":1,"463":2,"473":2,"504":1}}],["потому",{"2":{"3":1,"17":1,"48":1,"95":1,"96":1,"115":1,"174":1,"228":1,"280":1,"302":1,"355":1,"439":1,"451":1,"463":1,"473":1}}],["по",{"0":{"48":1,"67":1,"360":1,"365":1,"543":1},"2":{"11":1,"12":1,"13":3,"14":1,"16":1,"17":3,"22":2,"26":2,"41":1,"47":2,"48":4,"69":1,"76":2,"79":2,"86":2,"89":1,"103":1,"105":2,"109":1,"112":1,"115":4,"116":3,"117":3,"123":2,"124":4,"125":1,"129":1,"133":2,"134":2,"135":1,"136":1,"137":2,"140":1,"141":1,"142":1,"143":1,"144":5,"145":2,"147":4,"148":3,"149":1,"150":1,"152":3,"157":1,"159":1,"167":2,"170":1,"175":1,"178":1,"180":1,"183":2,"186":2,"188":1,"190":2,"192":4,"193":1,"194":1,"198":1,"200":1,"201":1,"203":2,"204":1,"207":1,"209":1,"221":3,"222":2,"223":2,"224":2,"226":1,"227":2,"228":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"238":2,"239":3,"241":1,"244":4,"245":3,"246":1,"247":2,"249":9,"250":1,"251":1,"254":1,"255":4,"256":6,"257":3,"259":1,"260":2,"263":2,"264":1,"265":2,"266":1,"267":1,"269":1,"271":1,"272":1,"284":2,"286":1,"287":3,"288":4,"289":1,"291":3,"292":2,"296":1,"301":2,"303":2,"304":1,"307":1,"308":4,"309":1,"311":1,"313":1,"315":1,"317":1,"319":1,"321":1,"323":3,"324":1,"325":3,"330":2,"335":5,"336":3,"343":1,"344":4,"345":3,"346":1,"349":1,"352":4,"354":1,"355":3,"358":5,"360":2,"361":3,"364":1,"365":1,"366":2,"367":5,"368":1,"370":2,"371":2,"372":1,"375":2,"379":1,"381":1,"385":3,"386":1,"388":1,"391":1,"393":1,"394":2,"402":1,"404":1,"418":1,"419":1,"421":4,"425":1,"426":1,"427":1,"432":1,"433":2,"435":1,"439":4,"441":1,"444":1,"445":1,"451":2,"452":4,"453":1,"455":2,"457":2,"460":2,"461":1,"463":6,"464":1,"470":1,"471":1,"472":8,"473":8,"497":1,"504":1,"511":1,"513":1,"518":1,"527":1,"528":1,"536":1,"538":1,"539":1,"540":1}}],["полиморфизмом",{"2":{"464":1}}],["политика",{"2":{"115":1}}],["политиками",{"2":{"59":1}}],["политики",{"2":{"59":2}}],["политик",{"2":{"59":1,"373":1}}],["полтора",{"2":{"463":1}}],["полагаясь",{"2":{"355":1}}],["полагаться",{"2":{"144":1,"365":1}}],["половину",{"2":{"421":1}}],["полосой",{"2":{"421":1}}],["полос",{"2":{"366":1}}],["полоса",{"2":{"193":1}}],["полосу",{"2":{"190":1}}],["поломке",{"2":{"124":1}}],["положить",{"2":{"452":1}}],["положительное",{"2":{"374":1}}],["положительного",{"2":{"79":1,"219":1}}],["положительный",{"2":{"171":1}}],["положительные",{"2":{"130":1,"169":1,"358":1}}],["положено",{"2":{"386":1}}],["положение",{"2":{"120":1,"196":1,"295":1}}],["полгода",{"2":{"86":1}}],["пользуется",{"2":{"463":1}}],["пользу",{"0":{"402":1},"2":{"220":1,"402":1}}],["польза",{"2":{"65":1}}],["пользоваться",{"2":{"89":1,"462":1,"463":1,"471":1,"539":1}}],["пользователем",{"2":{"171":1,"199":1,"200":1,"213":1,"214":1,"231":1,"239":1,"244":1,"250":1,"337":1,"353":1,"361":1,"365":1,"370":1,"462":1,"464":1,"557":1}}],["пользователей",{"2":{"47":1,"59":2,"147":1,"172":1,"174":1,"208":1,"215":1,"222":1,"257":1,"268":1,"308":2,"328":1,"359":2,"360":5,"361":2,"364":1,"366":2,"367":1,"369":2,"372":1,"461":1,"464":1,"473":2}}],["пользователи",{"2":{"115":1,"174":1,"189":1,"190":1,"204":2,"211":1,"222":1,"319":1,"360":1}}],["пользователю",{"2":{"68":1,"115":1,"138":1,"172":1,"174":1,"176":1,"178":1,"179":2,"181":1,"183":1,"184":2,"185":1,"186":2,"189":2,"190":2,"192":3,"194":1,"195":1,"196":1,"197":2,"198":1,"199":1,"201":1,"205":1,"211":1,"212":1,"219":1,"240":1,"244":1,"308":1,"315":2,"336":1,"353":1,"360":1,"361":1,"362":1,"364":1,"365":2,"366":2,"374":1,"393":1,"451":1,"462":1}}],["пользователями",{"2":{"182":1,"219":1,"556":1}}],["пользователям",{"2":{"74":1,"115":1,"199":1,"204":1,"222":1,"381":1}}],["пользователя",{"0":{"360":1},"2":{"47":1,"76":1,"104":1,"115":7,"169":1,"171":2,"172":1,"173":2,"174":2,"179":2,"180":3,"181":4,"183":1,"185":1,"187":2,"188":3,"189":1,"190":4,"192":1,"200":1,"201":1,"207":1,"208":2,"210":1,"211":2,"213":1,"216":1,"217":2,"218":1,"219":1,"231":1,"240":1,"241":1,"256":1,"301":1,"308":3,"315":3,"316":1,"336":2,"344":2,"360":3,"361":2,"363":2,"365":4,"366":5,"367":9,"368":1,"381":1,"421":1,"445":1,"446":2,"451":1,"463":2,"473":3,"496":1}}],["пользовательской",{"0":{"240":1},"2":{"204":1}}],["пользовательского",{"0":{"172":1,"177":1,"235":1,"238":1,"410":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1},"2":{"124":1,"151":2,"158":1,"169":2,"171":2,"172":5,"173":1,"176":3,"178":1,"185":3,"200":1,"205":1,"206":1,"229":1,"231":1,"237":1,"241":1,"249":1,"250":1,"264":1,"265":1,"267":1,"289":2,"297":2,"298":1,"301":1,"308":1,"311":1,"325":2,"344":1,"345":1,"347":1,"384":1,"417":2,"425":1,"432":1}}],["пользовательские",{"2":{"235":3,"239":1,"344":1}}],["пользовательский",{"2":{"176":1,"206":2,"219":1,"225":1,"231":1,"302":1,"315":3,"316":1,"353":1,"421":1,"473":1,"555":1}}],["пользовательским",{"2":{"171":1,"256":1,"261":1}}],["пользовательских",{"2":{"148":2,"171":1,"172":2,"223":1,"233":1,"246":1,"300":1,"355":1,"400":1,"410":1}}],["пользовательская",{"2":{"68":1}}],["пользователь",{"2":{"11":1,"115":6,"158":1,"160":1,"169":1,"178":1,"179":1,"180":2,"181":4,"186":1,"190":1,"192":2,"193":1,"204":1,"209":1,"210":2,"211":2,"212":2,"214":1,"215":2,"216":1,"217":1,"218":1,"229":2,"231":1,"239":1,"240":1,"241":1,"254":1,"308":2,"313":1,"314":1,"315":4,"316":1,"355":1,"360":1,"361":2,"362":1,"365":4,"366":1,"367":1,"393":1,"421":1,"437":1,"460":1,"462":2,"463":1,"504":1,"508":1,"534":1}}],["пользования",{"2":{"41":1}}],["полутора",{"2":{"537":1}}],["полупрозрачным",{"2":{"255":1}}],["полуготовые",{"2":{"62":1}}],["получены",{"2":{"355":1,"437":1}}],["полученном",{"2":{"439":1}}],["полученное",{"2":{"422":1}}],["полученными",{"2":{"439":1}}],["полученный",{"2":{"364":1}}],["полученные",{"2":{"292":1,"342":1,"361":1,"369":1,"423":1,"428":1,"434":1,"436":1,"439":1}}],["полученных",{"2":{"187":1}}],["полученная",{"2":{"125":1}}],["получению",{"2":{"291":1,"336":1}}],["получения",{"2":{"123":1,"128":1,"152":1,"183":1,"231":1,"241":1,"255":2,"279":1,"287":1,"301":1,"325":1,"338":1,"385":1,"437":1}}],["получении",{"2":{"115":1,"429":1}}],["получение",{"0":{"431":1},"1":{"432":1,"433":1,"434":1,"435":1,"436":1,"437":1},"2":{"74":1,"133":1,"143":1,"358":1}}],["получила",{"2":{"303":1}}],["получилось",{"2":{"223":1}}],["получил",{"2":{"152":1,"187":1}}],["получили",{"2":{"135":1,"251":1,"268":1,"344":1,"364":1,"439":1}}],["получившуюся",{"2":{"326":1}}],["получив",{"2":{"136":2,"227":1,"288":1,"361":1,"367":1,"424":1}}],["получим",{"2":{"91":1,"229":1,"235":1,"316":1,"347":1}}],["получите",{"2":{"169":1,"238":1,"376":1,"393":1}}],["получит",{"2":{"154":1,"303":1,"308":1}}],["получить",{"0":{"402":1},"2":{"68":1,"91":1,"115":1,"130":1,"145":1,"152":3,"176":1,"200":1,"231":1,"249":1,"289":1,"295":1,"303":1,"318":1,"336":2,"362":1,"363":1,"369":1,"376":1,"380":1,"383":1,"421":1,"434":1,"442":1,"444":1,"473":1,"536":1}}],["получится",{"2":{"26":1,"282":1,"390":1,"472":1}}],["получай",{"2":{"367":1}}],["получают",{"2":{"323":2}}],["получат",{"2":{"402":1}}],["получатель",{"2":{"439":1}}],["получателя",{"2":{"294":3,"363":1}}],["получателей",{"2":{"293":1}}],["получателе",{"2":{"247":1}}],["получаться",{"2":{"79":1}}],["получать",{"2":{"11":1,"109":1,"116":1,"208":2,"244":1,"249":1,"308":3,"332":1,"344":1,"381":1,"426":1,"434":1,"437":1,"439":1,"472":1,"473":1}}],["получаем",{"2":{"98":1,"112":1,"124":1,"193":1,"231":1,"247":1,"296":1,"303":1,"338":1,"344":1,"361":1,"367":1,"381":1,"394":1,"428":1}}],["получаете",{"2":{"421":1,"444":1}}],["получается",{"2":{"17":1,"152":1,"169":1,"265":1,"303":1,"451":1,"452":1,"460":1,"464":1,"473":4,"504":1}}],["получает",{"2":{"3":1,"115":1,"117":1,"134":1,"243":1,"244":1,"255":1,"256":1,"296":1,"297":1,"301":1,"303":4,"328":1,"332":2,"336":1,"352":1,"354":1,"355":1,"358":1,"366":1,"374":1,"376":1,"422":2,"423":1,"439":1,"473":1}}],["получая",{"2":{"11":1,"287":1,"382":1}}],["полем",{"2":{"231":1,"294":1}}],["полезную",{"2":{"429":1}}],["полезная",{"2":{"393":1}}],["полезна",{"2":{"310":1,"341":1}}],["полезные",{"0":{"458":1},"1":{"459":1,"460":1},"2":{"457":1,"464":1,"472":1,"479":1,"485":1,"545":1}}],["полезным",{"2":{"232":1,"302":1,"303":1,"349":1}}],["полезных",{"2":{"226":1,"310":1,"457":1}}],["полезный",{"2":{"176":1,"244":1}}],["полезны",{"2":{"171":1,"188":1,"297":1,"299":1,"401":1,"421":1,"442":1,"461":1,"473":1}}],["полезного",{"2":{"433":1,"457":1}}],["полезной",{"2":{"361":2,"427":1,"437":1,"451":1}}],["полезное",{"2":{"221":1,"539":1}}],["полезность",{"2":{"181":1,"461":1}}],["полезно",{"2":{"3":1,"4":1,"22":1,"97":1,"145":1,"295":1,"302":1,"322":1,"365":1,"391":1,"467":1}}],["полезен",{"2":{"134":1,"281":1,"291":1,"293":1,"301":1,"330":1,"344":1,"472":1,"473":1}}],["поле",{"2":{"47":1,"48":2,"152":2,"157":1,"231":1,"317":1,"349":2,"352":1,"361":2,"365":3,"381":1,"422":1,"433":1,"439":1,"462":1,"463":1}}],["полей",{"2":{"44":1,"47":2,"48":1,"149":1,"173":1,"310":1,"313":1,"361":1,"433":1}}],["полях",{"2":{"48":1}}],["полям",{"0":{"48":1},"2":{"310":1,"330":1}}],["полями",{"2":{"17":1,"151":1,"152":1,"231":1,"310":1,"362":1,"429":1,"433":2}}],["поля",{"2":{"16":1,"17":1,"18":1,"44":1,"47":2,"48":1,"149":1,"152":3,"183":1,"201":1,"288":1,"294":1,"313":4,"331":1,"349":1,"355":1,"362":1,"422":1,"433":2,"462":1}}],["полна",{"2":{"171":1}}],["полную",{"2":{"137":1,"228":1,"372":1}}],["полные",{"2":{"228":1}}],["полным",{"2":{"137":1,"276":1,"322":1,"325":1,"358":1,"427":1}}],["полный",{"2":{"129":1,"159":1,"170":1,"183":1,"235":1,"255":1,"271":1,"315":1,"349":1,"353":1,"358":3,"376":1,"380":1,"381":1,"388":1,"463":1}}],["полноты",{"2":{"412":1}}],["полноэкранном",{"2":{"311":1}}],["полного",{"2":{"311":1,"335":1,"339":1,"432":1}}],["полно",{"2":{"116":1,"471":1,"512":1}}],["полному",{"2":{"48":1,"231":1}}],["полное",{"2":{"47":1,"91":1,"134":1,"214":1,"219":1,"308":1,"311":1,"439":1}}],["полностью",{"2":{"26":1,"119":1,"127":1,"148":1,"152":1,"156":1,"169":1,"197":1,"203":1,"225":1,"318":1,"344":1,"370":1,"373":1,"421":1,"439":1,"556":1}}],["полноценную",{"2":{"504":1}}],["полноценного",{"2":{"295":1}}],["полноценное",{"2":{"116":1}}],["полноценной",{"2":{"116":1}}],["полноценным",{"2":{"76":1}}],["полноценный",{"2":{"12":1,"237":1}}],["полноценная",{"2":{"12":1,"336":1}}],["полней",{"2":{"4":1}}],["поделился",{"2":{"457":1}}],["поделиться",{"2":{"205":1,"239":2,"308":1,"353":1,"447":1}}],["подтвердили",{"2":{"381":1}}],["подтверждающих",{"2":{"372":1}}],["подтверждать",{"2":{"367":1}}],["подтверждается",{"2":{"22":1,"144":1}}],["подтвержден",{"2":{"365":1}}],["подтверждение",{"0":{"216":1}}],["подтверждения",{"2":{"180":1,"197":1,"209":1,"216":1,"365":1}}],["подтверждении",{"2":{"134":1}}],["подмаршрутов",{"2":{"353":1}}],["подмаршруты",{"2":{"353":1,"355":1}}],["подмена",{"0":{"215":1}}],["поднимают",{"2":{"323":1}}],["подниматься",{"2":{"247":1}}],["поднабор",{"2":{"192":1}}],["подумайте",{"2":{"381":1}}],["подумаем",{"2":{"238":1}}],["подумав",{"2":{"232":1}}],["подумать",{"2":{"4":1,"190":1,"207":1}}],["подводит",{"2":{"410":1}}],["подвохом",{"0":{"208":1},"2":{"208":1}}],["подвижные",{"2":{"297":1}}],["подвесить",{"2":{"302":1}}],["подвергнуть",{"2":{"232":1}}],["подведут",{"2":{"174":1}}],["подведение",{"0":{"145":1,"167":1,"219":1,"233":1,"258":1,"304":1,"319":1,"340":1,"368":1,"396":1,"440":1}}],["подгружается",{"2":{"473":1}}],["подгруппа",{"2":{"200":2}}],["подгруппе",{"2":{"192":1}}],["подготовиться",{"2":{"321":1}}],["подготовились",{"2":{"228":1}}],["подготовим",{"2":{"221":1}}],["подготовлены",{"2":{"160":1,"224":1}}],["подготовки",{"2":{"133":1,"320":1,"362":1,"472":1}}],["подготовка",{"2":{"65":1}}],["подразумевается",{"2":{"171":1,"473":1,"507":1}}],["подразумевает",{"2":{"148":1,"225":1,"263":1,"370":1,"385":1}}],["подробней",{"2":{"554":1}}],["подробнее",{"2":{"115":1,"134":1,"158":1,"276":1,"282":1,"359":1,"361":1,"455":1}}],["подробны",{"2":{"396":1}}],["подробные",{"2":{"352":1}}],["подробный",{"2":{"318":1}}],["подробную",{"2":{"127":1,"178":1,"179":1,"226":1}}],["подробности",{"2":{"367":1,"447":1}}],["подробностями",{"2":{"352":1}}],["подробностей",{"2":{"271":1}}],["подробное",{"2":{"317":1}}],["подробному",{"2":{"241":1}}],["подробной",{"2":{"128":1}}],["подробно",{"2":{"119":1,"120":1,"124":1,"151":2,"152":1,"223":1,"235":1,"239":1,"246":1,"249":1,"251":1,"256":1,"258":1,"289":1,"297":1,"298":1,"306":1,"336":1,"340":1,"344":1,"358":1,"452":1,"527":1}}],["подробная",{"2":{"56":1,"82":1,"117":1}}],["подпапкой",{"2":{"253":1}}],["подпапка",{"2":{"135":1}}],["подписи",{"2":{"361":3}}],["подпись",{"2":{"361":1}}],["подписанных",{"2":{"328":1}}],["подписанным",{"2":{"210":1}}],["подписчиков",{"2":{"291":1}}],["подписывает",{"2":{"326":1}}],["подписываться",{"2":{"326":1}}],["подписываются",{"2":{"291":1}}],["подписывания",{"2":{"115":1}}],["подписок",{"2":{"210":1}}],["подписки",{"2":{"208":1,"210":1,"328":1}}],["поддиректориями",{"2":{"451":1}}],["поддиректории",{"2":{"445":1,"452":1}}],["подделки",{"2":{"361":1}}],["поддержкой",{"2":{"455":1,"463":1}}],["поддержку",{"2":{"222":1,"265":1}}],["поддержки",{"2":{"210":1,"330":1,"365":1,"460":2,"472":1,"536":1}}],["поддержка",{"0":{"74":1},"2":{"67":1,"74":1,"86":2,"171":2,"335":3,"463":2}}],["поддерживаются",{"2":{"460":1}}],["поддерживают",{"2":{"308":1,"543":1,"557":1}}],["поддерживающих",{"2":{"130":1,"367":1}}],["поддерживаемость",{"2":{"471":1}}],["поддерживаемый",{"2":{"331":1}}],["поддерживаемых",{"2":{"183":1,"313":1,"361":1}}],["поддерживает",{"2":{"264":1,"431":1}}],["поддерживается",{"2":{"86":1,"151":1,"152":2,"250":1,"454":1,"555":1}}],["поддерживайте",{"2":{"180":1}}],["поддерживая",{"2":{"158":1}}],["поддерживаться",{"2":{"463":1,"465":1}}],["поддерживать",{"2":{"69":1,"125":1,"254":1,"265":1,"295":1,"394":1,"421":1,"464":1}}],["поддается",{"2":{"269":1,"473":1}}],["поддавайтесь",{"2":{"264":1}}],["поддомена",{"2":{"144":1}}],["поддомен",{"2":{"134":2,"135":1}}],["поддомены",{"2":{"134":3,"141":1,"144":1,"444":1}}],["поддоменов",{"2":{"134":2,"146":1}}],["подарила",{"2":{"473":1}}],["подарочные",{"2":{"4":1}}],["податлив",{"2":{"431":1}}],["подавляющее",{"2":{"358":1}}],["подавление",{"2":{"189":1}}],["подает",{"2":{"245":1}}],["подальше",{"2":{"96":1}}],["подчиняется",{"2":{"352":1}}],["подчинение",{"2":{"2":1}}],["подчеркнуть",{"2":{"267":1}}],["подчеркивающим",{"2":{"185":1}}],["подчеркивания",{"2":{"162":1}}],["подчеркивании",{"2":{"92":1}}],["подчеркивает",{"2":{"148":1}}],["подзадачи",{"2":{"79":1}}],["подключить",{"2":{"349":1,"444":1}}],["подключена",{"2":{"503":1}}],["подключены",{"2":{"319":1}}],["подключении",{"2":{"367":1}}],["подключения",{"2":{"252":1,"367":1,"394":1,"435":1,"445":1,"508":1,"542":1}}],["подключение",{"2":{"41":1,"112":1,"367":2,"504":3,"538":1}}],["подключенными",{"2":{"445":1}}],["подключенных",{"2":{"134":1}}],["подключенный",{"2":{"134":1}}],["подключаются",{"2":{"452":1}}],["подключаемые",{"2":{"367":1,"543":1}}],["подключаемый",{"2":{"252":1}}],["подключаем",{"2":{"120":1,"137":1}}],["подключать",{"2":{"12":1,"452":1,"463":1,"465":2,"539":1}}],["подсоединение",{"2":{"457":1}}],["подсоединяться",{"2":{"40":1}}],["подскажите",{"0":{"456":1}}],["подсказку",{"2":{"315":2}}],["подсказкой",{"2":{"186":1}}],["подсказка",{"0":{"315":1},"2":{"186":1}}],["подсказками",{"2":{"98":1}}],["подсказки",{"0":{"186":1},"2":{"186":1,"315":1}}],["подсказок",{"2":{"174":1}}],["подсказать",{"2":{"89":1}}],["подстановочные",{"2":{"391":1}}],["подсчет",{"2":{"239":1}}],["подсегмент",{"2":{"134":1}}],["подсвечивать",{"2":{"103":1}}],["подсветкой",{"2":{"86":1}}],["подсистему",{"2":{"3":1,"69":1}}],["подсистем",{"2":{"3":1,"263":1,"300":1,"328":1}}],["подсистемы",{"0":{"4":1},"2":{"2":2,"3":1,"4":1,"7":1,"34":3,"41":2,"263":1}}],["подобранных",{"2":{"457":1}}],["подобную",{"2":{"224":1,"339":1}}],["подобная",{"2":{"217":1}}],["подобной",{"2":{"352":1}}],["подобно",{"2":{"157":1,"323":1,"391":1,"394":1}}],["подобному",{"2":{"328":1}}],["подобном",{"2":{"152":1}}],["подобное",{"2":{"34":1,"267":1,"282":1,"331":1,"347":1}}],["подобные",{"2":{"207":1,"395":1,"432":1,"473":1}}],["подобными",{"2":{"190":1}}],["подобный",{"2":{"116":1,"117":1,"299":1,"471":1}}],["подобных",{"2":{"85":1,"89":1,"231":1,"271":1}}],["подождать",{"2":{"244":1}}],["подождите",{"2":{"152":1}}],["подойдут",{"2":{"431":1}}],["подойдет",{"2":{"137":1}}],["подойти",{"2":{"237":1,"366":1,"375":1}}],["подошли",{"2":{"233":1}}],["подошел",{"2":{"39":1}}],["подозрительные",{"2":{"115":1}}],["подходе",{"2":{"203":1,"235":1,"244":1,"366":1,"374":1}}],["подходом",{"2":{"193":1,"203":1,"257":1,"268":1,"447":1,"507":1}}],["подходов",{"2":{"148":1,"241":1,"252":1,"300":1,"336":1,"340":1,"365":1,"372":1,"378":1}}],["подходы",{"2":{"152":1,"169":1,"321":1,"340":1,"352":1,"370":1,"385":1,"400":1,"462":1}}],["подходу",{"2":{"148":1,"237":1,"365":1}}],["подходят",{"2":{"134":2,"321":1,"463":1}}],["подходящая",{"2":{"445":1}}],["подходящей",{"2":{"429":1}}],["подходящее",{"2":{"238":1,"241":1}}],["подходящем",{"2":{"116":1}}],["подходящую",{"2":{"95":1,"98":1}}],["подходящим",{"2":{"200":1,"234":1}}],["подходящие",{"2":{"98":1}}],["подходящий",{"2":{"27":1,"212":1}}],["подходящих",{"2":{"12":1}}],["подход",{"2":{"127":2,"190":1,"197":1,"203":1,"227":1,"235":1,"238":2,"250":1,"253":1,"258":1,"265":1,"271":1,"283":1,"286":3,"287":2,"289":1,"296":2,"300":1,"303":1,"328":2,"330":3,"333":2,"335":1,"337":2,"338":1,"345":1,"360":1,"376":1,"381":1,"385":1,"400":1,"424":2,"471":1,"473":1}}],["подходах",{"2":{"375":1}}],["подхода",{"2":{"105":1,"148":1,"152":1,"244":2,"273":1,"284":1,"308":1,"330":1,"337":1,"344":1,"366":1,"377":2,"400":1}}],["подходите",{"2":{"260":1}}],["подходит",{"2":{"63":1,"237":1,"238":1,"303":1,"330":2,"367":1,"434":1,"457":1,"459":1,"462":1,"464":1,"473":2}}],["подхедер",{"2":{"29":1}}],["подберем",{"2":{"27":1}}],["подбора",{"2":{"9":1}}],["под",{"2":{"4":1,"119":1,"171":1,"173":1,"180":1,"186":1,"199":1,"215":1,"217":2,"221":1,"222":1,"251":1,"255":1,"265":1,"292":1,"308":1,"315":1,"317":1,"336":2,"344":1,"373":1,"376":1,"383":1,"452":1,"461":1,"462":1,"499":1,"507":1,"508":1,"527":1}}],["прыгания",{"2":{"516":1}}],["пр",{"2":{"455":1}}],["прямую",{"2":{"359":1}}],["прямая",{"2":{"323":1}}],["прямым",{"2":{"203":1,"463":1}}],["прямых",{"2":{"193":1,"290":1,"323":1}}],["прямого",{"2":{"313":1,"323":1}}],["прямоугольниками",{"2":{"238":1}}],["прямое",{"2":{"137":1,"212":1,"287":1}}],["прямо",{"2":{"40":1,"137":1,"215":1,"457":1,"507":1}}],["прямой",{"2":{"23":1,"135":1,"205":1,"227":1,"246":1}}],["прятать",{"2":{"4":1}}],["препроцессора",{"2":{"504":1}}],["преподавательской",{"2":{"65":1}}],["презентационный",{"2":{"471":1}}],["презентационного",{"2":{"425":2}}],["прелоадер",{"2":{"447":2,"544":1}}],["прекрасный",{"2":{"472":1}}],["прекрасно",{"2":{"381":1,"394":1}}],["прекратит",{"2":{"192":1}}],["прервет",{"2":{"433":1}}],["прервана",{"2":{"190":1}}],["прерывая",{"2":{"377":1}}],["прерывать",{"2":{"377":1}}],["прерывается",{"2":{"303":1}}],["прерывании",{"2":{"297":1}}],["преобладающим",{"2":{"205":1}}],["преобразуется",{"2":{"251":1,"352":1}}],["преобразует",{"2":{"123":1,"433":1}}],["преобразовать",{"2":{"432":1}}],["преобразованным",{"2":{"296":1}}],["преобразованы",{"2":{"293":1}}],["преобразовано",{"2":{"230":1}}],["преобразованию",{"2":{"258":1}}],["преобразование",{"2":{"134":2,"360":1}}],["преобразования",{"2":{"44":1,"86":1,"150":1,"296":1}}],["преобразовывать",{"2":{"41":1,"295":1,"296":1}}],["преследовали",{"2":{"200":1}}],["преследуете",{"2":{"149":1}}],["пренебрегали",{"2":{"171":1}}],["превышает",{"2":{"421":1}}],["превзошла",{"2":{"250":1}}],["превзойти",{"2":{"152":1}}],["превосходящие",{"2":{"171":1}}],["превращения",{"2":{"310":1,"316":1}}],["превращает",{"2":{"306":1}}],["превращается",{"2":{"151":1}}],["превращая",{"2":{"221":1}}],["превращать",{"2":{"23":1,"319":1}}],["превратим",{"2":{"301":1}}],["превратилось",{"2":{"297":1}}],["превратился",{"2":{"268":1}}],["превратится",{"2":{"159":1}}],["превратить",{"2":{"29":1,"302":1,"308":1,"315":1,"351":1}}],["превратятся",{"2":{"152":1}}],["прежнему",{"2":{"200":1,"250":1,"257":2,"308":1,"344":1}}],["прежним",{"2":{"118":1,"147":1}}],["прежде",{"2":{"148":1,"169":1,"171":1,"180":1,"181":2,"224":1,"244":1,"303":1,"333":1,"346":1,"350":1,"351":1,"355":1,"367":1,"380":1,"381":1,"391":1,"421":1,"433":1,"437":1}}],["претенциозной",{"2":{"460":1}}],["претензий",{"2":{"9":1}}],["претерпела",{"2":{"147":1}}],["префикса",{"2":{"433":1}}],["префиксом",{"2":{"250":1}}],["префиксируем",{"2":{"249":1}}],["префикс",{"2":{"112":2,"154":1,"246":1}}],["преимуществами",{"2":{"148":2,"463":1}}],["преимущества",{"2":{"123":1,"130":1,"220":1,"265":1,"289":1,"303":1,"308":2,"320":1,"344":2,"345":1,"369":1,"375":1,"382":2,"440":1,"441":1}}],["преимущественно",{"2":{"118":1,"462":1,"463":1}}],["преимуществ",{"2":{"48":1,"148":1,"152":2,"224":1,"227":1,"244":1,"308":2,"319":1,"329":1,"330":1,"335":2,"344":1,"373":2,"425":1}}],["преимуществом",{"2":{"150":1,"151":1}}],["преимущество",{"2":{"17":1,"289":1,"421":1}}],["предназначались",{"2":{"472":1}}],["предназначена",{"2":{"401":1}}],["предназначенная",{"2":{"318":1}}],["предназначенный",{"2":{"190":1}}],["предназначенных",{"2":{"147":1}}],["предназначен",{"2":{"303":1,"344":1}}],["предназначено",{"2":{"181":1}}],["преданность",{"2":{"405":1}}],["предисловие",{"0":{"400":1,"497":1},"1":{"498":1}}],["предшествующий",{"2":{"352":1}}],["пределами",{"2":{"336":2,"462":1,"463":1}}],["пределы",{"2":{"160":2,"193":1,"336":1}}],["предвидеть",{"2":{"232":1}}],["предварительных",{"2":{"395":1}}],["предварительный",{"2":{"224":1,"472":1}}],["предварительное",{"2":{"401":1}}],["предварительного",{"2":{"223":1,"233":1}}],["предварительно",{"2":{"213":1,"472":2,"473":1}}],["предварительной",{"2":{"186":1,"192":1,"349":1}}],["предупредить",{"2":{"189":1,"265":1}}],["предусмотреть",{"2":{"360":1}}],["предусмотренный",{"2":{"244":2}}],["предусмотренные",{"2":{"183":1,"417":1}}],["предусмотрены",{"2":{"153":1}}],["предусмотрен",{"2":{"144":1,"184":1,"190":1,"249":1,"336":1}}],["предусмотрена",{"2":{"64":1,"244":1,"347":1}}],["предусматривает",{"2":{"69":1,"232":1}}],["предусматривают",{"2":{"41":1}}],["предсказания",{"2":{"177":1}}],["предстоит",{"2":{"148":1,"257":1}}],["представительное",{"2":{"255":1}}],["представить",{"2":{"150":1,"200":1,"222":1,"237":1,"238":1,"247":1,"254":1,"256":1,"295":1,"300":1,"326":1,"353":1,"366":1,"370":1,"425":1}}],["представим",{"2":{"26":1,"265":1,"297":1,"303":1,"419":2}}],["представьте",{"2":{"134":1,"169":1,"463":1}}],["представлен",{"0":{"399":1},"2":{"349":1,"374":1,"411":1}}],["представлено",{"2":{"265":1,"365":1,"418":1,"421":1}}],["представлены",{"2":{"217":1,"407":1,"412":1,"414":1,"416":1,"417":1}}],["представленная",{"2":{"197":1,"292":1}}],["представленную",{"2":{"181":1}}],["представленные",{"2":{"370":1}}],["представленных",{"2":{"172":1,"361":1,"374":1}}],["представленный",{"2":{"139":1,"193":1,"322":1}}],["представлена",{"2":{"173":1,"301":1,"413":1}}],["представлений",{"2":{"349":1,"353":1,"355":1,"361":1}}],["представлении",{"2":{"198":1,"355":1}}],["представлением",{"2":{"355":1}}],["представление",{"2":{"4":2,"11":2,"68":1,"131":1,"147":1,"150":2,"169":1,"171":1,"190":1,"192":1,"219":1,"224":1,"239":1,"247":1,"251":1,"254":1,"263":1,"265":1,"266":1,"291":1,"293":1,"296":1,"298":1,"302":1,"308":1,"355":1,"361":1,"365":1,"383":1,"421":3,"425":1,"427":1,"437":1}}],["представления",{"0":{"353":1},"1":{"354":1,"355":1},"2":{"3":2,"17":1,"171":1,"196":1,"231":1,"256":1,"310":1,"311":1,"315":1,"369":1,"374":1,"421":1,"462":1}}],["представляем",{"2":{"344":1}}],["представляемых",{"2":{"240":1}}],["представляется",{"2":{"209":1,"438":1}}],["представляет",{"2":{"134":1,"148":1,"151":1,"203":1,"208":1,"212":1,"224":2,"256":1,"311":1,"336":1,"344":1,"361":1,"381":1,"400":1,"407":1,"428":1,"434":1,"438":1,"511":1}}],["представляющая",{"2":{"311":1,"312":2,"349":1}}],["представляющий",{"2":{"224":1,"243":1,"380":1}}],["представляются",{"2":{"179":1,"184":1,"189":1,"192":1}}],["представляют",{"2":{"6":1,"150":1,"177":1,"183":1,"184":1,"195":1,"219":1,"336":1}}],["представлял",{"2":{"147":1}}],["представлять",{"2":{"22":1,"76":1,"231":1,"238":1,"297":1,"463":1}}],["предотвратить",{"2":{"267":1,"315":1}}],["предотвращает",{"2":{"315":1}}],["предотвращать",{"2":{"218":1}}],["предотвращая",{"2":{"151":1}}],["предотвращение",{"0":{"212":1}}],["предотвращения",{"2":{"190":1,"439":1}}],["предостережений",{"2":{"336":1}}],["предостережение",{"2":{"190":1,"264":1,"269":1}}],["предоставили",{"2":{"247":1}}],["предоставило",{"2":{"228":1}}],["предоставить",{"2":{"247":1,"286":1,"308":1,"317":1,"378":1,"446":1}}],["предоставит",{"2":{"229":1,"241":1,"254":1,"315":1,"326":1,"384":1,"387":1,"438":1}}],["предоставленные",{"2":{"402":1}}],["предоставленного",{"2":{"255":1}}],["предоставленное",{"2":{"249":1}}],["предоставлена",{"2":{"287":1}}],["предоставление",{"2":{"181":1,"425":1}}],["предоставления",{"2":{"117":1,"197":1,"211":1,"218":1,"219":1,"247":1,"252":1,"359":1,"372":1}}],["предоставляйте",{"2":{"446":1}}],["предоставляющая",{"2":{"394":1}}],["предоставляющую",{"2":{"359":1}}],["предоставляющие",{"2":{"364":1}}],["предоставляющий",{"2":{"359":1}}],["предоставляющих",{"2":{"166":1,"300":1}}],["предоставляются",{"2":{"153":1,"184":1,"282":1,"379":1,"394":1}}],["предоставляют",{"2":{"116":1,"134":1,"144":1,"147":1,"148":1,"225":1,"266":1,"275":1,"336":3,"359":2,"366":1,"394":1,"425":1,"444":1,"471":1}}],["предоставляя",{"2":{"137":1,"381":1,"425":1}}],["предоставляемой",{"2":{"396":1,"440":1}}],["предоставляемое",{"2":{"244":1}}],["предоставляемого",{"2":{"192":1,"247":1}}],["предоставляемым",{"2":{"425":1}}],["предоставляемыми",{"2":{"340":1,"415":1}}],["предоставляемых",{"2":{"321":1,"331":1,"336":1,"370":1,"372":1}}],["предоставляемый",{"2":{"226":1,"315":1,"433":1}}],["предоставляемые",{"2":{"225":1,"335":1,"355":1,"373":1,"396":1}}],["предоставляемую",{"2":{"144":1}}],["предоставляем",{"2":{"137":1,"247":1,"255":1,"338":1}}],["предоставляемая",{"2":{"124":1,"144":1}}],["предоставляет",{"2":{"116":4,"117":1,"134":1,"144":1,"147":1,"152":1,"159":2,"160":1,"224":1,"227":1,"247":1,"251":1,"252":1,"290":1,"295":3,"303":2,"317":1,"326":1,"331":2,"336":1,"337":1,"350":1,"351":1,"355":3,"358":1,"359":2,"360":1,"375":1,"379":1,"383":1,"394":1,"421":1,"422":2,"431":1,"434":1}}],["предоставляется",{"2":{"58":1,"117":1,"137":2,"160":1,"336":1,"432":1}}],["предоставляться",{"2":{"254":1}}],["предоставлять",{"2":{"117":1,"122":1,"197":1,"244":1,"247":1,"266":1,"308":2,"315":1,"463":1}}],["предприятий",{"2":{"344":1}}],["предписаны",{"2":{"166":1}}],["предписано",{"2":{"160":1}}],["предписанный",{"2":{"151":1}}],["предписывает",{"2":{"148":1,"150":1,"152":1,"271":1,"302":1}}],["предписывается",{"2":{"148":1}}],["предписывают",{"2":{"148":1,"224":1}}],["предпочтение",{"2":{"352":1}}],["предпочтительнее",{"2":{"303":1}}],["предпочтительно",{"2":{"96":1,"156":1}}],["предпосылкам",{"2":{"347":1}}],["предположим",{"2":{"282":1,"353":1,"366":1}}],["предполагают",{"2":{"310":1}}],["предполагающая",{"2":{"216":1}}],["предполагает",{"2":{"372":1,"395":1,"402":1}}],["предполагается",{"2":{"308":2,"365":1,"372":1}}],["предполагаемой",{"2":{"217":1}}],["предполагалось",{"2":{"296":1}}],["предполагая",{"2":{"143":1}}],["предыдущую",{"2":{"472":1}}],["предыдущая",{"2":{"227":1,"342":1}}],["предыдущее",{"2":{"377":1}}],["предыдущей",{"2":{"256":1,"299":1,"313":1,"317":1,"383":1,"421":1}}],["предыдущего",{"2":{"175":1,"203":1,"306":1,"310":1,"331":1,"355":1}}],["предыдущему",{"2":{"385":1}}],["предыдущем",{"2":{"134":1,"174":1,"192":1,"204":1,"205":1,"249":2,"286":1,"294":1,"315":2,"317":1,"329":1,"352":1,"354":1,"355":1,"358":1,"364":1,"365":2,"421":1}}],["предыдущих",{"2":{"151":1,"221":2,"224":1,"246":1,"321":1,"329":1,"335":1,"342":1,"352":1,"365":1,"366":1,"427":1}}],["предыдущими",{"2":{"224":1,"371":1}}],["предыдущим",{"2":{"134":1}}],["предыдущие",{"2":{"133":1,"159":1,"377":1,"388":1}}],["предыдущий",{"2":{"121":1,"141":1,"159":1,"283":1,"291":1,"297":1,"303":1,"315":1,"316":1,"381":1,"422":1,"431":1}}],["предмет",{"2":{"116":1,"313":1}}],["предмета",{"2":{"65":1,"174":1}}],["предъявляемых",{"2":{"69":1}}],["предложенное",{"2":{"223":1}}],["предложенных",{"2":{"89":1}}],["предложено",{"2":{"223":1,"393":1}}],["предложений",{"2":{"462":1}}],["предложением",{"2":{"218":1,"247":1,"336":1}}],["предложение",{"2":{"209":1}}],["предложения",{"2":{"156":1,"189":1,"213":1}}],["предложит",{"2":{"315":1}}],["предложите",{"2":{"174":1}}],["предложить",{"2":{"148":1,"300":1,"308":1,"351":1,"495":1}}],["предложил",{"2":{"62":1,"472":1,"473":1}}],["предлагайте",{"2":{"180":2}}],["предлагаемого",{"2":{"148":1}}],["предлагаемый",{"2":{"10":1}}],["предлагается",{"2":{"211":1,"226":1,"336":1}}],["предлагает",{"2":{"39":1,"40":1,"92":1,"148":1,"150":1,"201":1,"223":1,"226":1,"228":1,"247":1,"310":1,"336":1,"383":2,"386":1,"425":1}}],["предлагающий",{"2":{"227":1}}],["предлагающих",{"2":{"116":1,"217":1}}],["предлагают",{"2":{"144":1,"183":1,"194":1,"395":1,"471":1,"472":1}}],["предлагаю",{"2":{"4":1,"118":1,"292":1}}],["прагматичный",{"2":{"268":1}}],["прайм",{"2":{"174":1}}],["практичности",{"2":{"434":1}}],["практическое",{"2":{"472":1}}],["практической",{"2":{"221":1,"260":1}}],["практического",{"2":{"180":1}}],["практическим",{"2":{"342":1}}],["практических",{"2":{"221":1,"222":1,"342":1}}],["практически",{"2":{"32":1,"125":1,"137":1,"169":2,"189":1,"210":1,"231":2,"241":1,"335":1,"373":1}}],["практикующие",{"2":{"372":1}}],["практику",{"2":{"227":1,"271":1}}],["практикой",{"2":{"161":1,"235":1,"247":1,"352":1,"354":1,"460":1,"463":1}}],["практиками",{"2":{"472":1}}],["практиках",{"2":{"447":1}}],["практика",{"2":{"151":1,"211":1,"310":1,"393":1,"395":1,"439":1,"463":1}}],["практике",{"2":{"125":1,"148":1,"151":1,"189":1,"190":1,"207":1,"223":1,"261":1,"265":1,"268":1,"271":1,"287":1,"300":1,"301":1,"313":1,"318":1,"323":2,"335":1,"336":1,"337":1,"342":1,"372":1,"374":1,"394":1}}],["практик",{"2":{"77":1,"221":1,"265":1,"270":1,"287":1,"472":1,"496":1,"507":2,"508":1}}],["практики",{"0":{"398":1,"447":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"448":1,"449":1,"450":1},"2":{"9":1,"76":1,"115":1,"147":1,"232":2,"267":1,"270":1,"271":1,"346":1,"395":1,"471":1,"472":1,"507":1,"508":1}}],["прав",{"2":{"359":1,"390":1}}],["правая",{"2":{"457":1}}],["права",{"2":{"115":1,"134":1,"365":1}}],["правой",{"2":{"186":1,"313":1}}],["правом",{"2":{"172":1,"174":1,"178":1,"318":2}}],["право",{"2":{"115":3}}],["правками",{"2":{"91":1}}],["правительственных",{"2":{"134":1,"200":1}}],["править",{"2":{"86":1}}],["правильных",{"2":{"472":1}}],["правильным",{"2":{"193":1,"230":1,"268":1,"323":1,"381":1}}],["правильное",{"2":{"381":1}}],["правильность",{"2":{"328":1}}],["правильном",{"2":{"200":1,"421":1}}],["правильно",{"2":{"151":1,"211":1,"232":1,"301":1,"310":1,"314":2,"376":1,"422":1,"432":1}}],["правильного",{"2":{"92":1}}],["правил",{"0":{"180":1},"2":{"172":1,"180":2,"308":1}}],["правилах",{"2":{"180":1,"200":1}}],["правила",{"2":{"68":1,"147":1,"148":1,"151":1,"180":2,"225":1,"261":1,"298":1,"462":1}}],["правило",{"2":{"2":1,"23":1,"68":1,"139":1,"173":1,"189":1,"200":2,"224":1,"268":1,"278":1,"323":1,"358":1,"372":1,"402":1}}],["правда",{"2":{"22":1,"301":1,"372":1}}],["проехать",{"2":{"472":1}}],["проекты",{"2":{"347":3,"386":2,"402":1,"472":1}}],["проекту",{"2":{"221":1,"373":1,"386":1}}],["проектов",{"2":{"130":2,"222":1,"250":1,"271":1,"335":1,"347":2,"383":1,"385":2,"386":1,"394":1,"409":1,"455":1,"462":1,"471":1}}],["проектом",{"2":{"79":1,"221":1,"222":1,"394":1,"409":1,"445":1}}],["проекте",{"0":{"499":1},"2":{"62":1,"112":1,"223":1,"227":1,"228":1,"261":2,"355":1,"370":1,"372":1,"373":1,"374":1,"383":1,"386":1,"445":1,"451":1,"455":1,"463":1,"471":1,"496":1,"503":1}}],["проектированию",{"2":{"400":1}}],["проектирование",{"2":{"172":1,"176":1,"297":1}}],["проектирования",{"0":{"172":1,"177":1,"181":1,"241":1,"260":1,"261":1,"262":1,"271":1,"398":1,"408":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"261":1,"262":1,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1},"2":{"41":1,"103":1,"147":2,"167":1,"169":1,"172":1,"173":1,"176":1,"180":1,"200":1,"207":1,"221":1,"225":2,"229":2,"235":3,"237":1,"238":1,"240":1,"241":1,"243":1,"246":1,"249":1,"250":1,"252":1,"258":1,"260":1,"261":1,"262":1,"270":2,"271":2,"276":1,"289":1,"291":1,"304":1,"305":1,"323":1,"326":1,"337":1,"374":1,"400":3,"401":2,"402":1,"408":1,"413":1,"419":2,"424":1,"425":2,"426":2,"427":1,"440":1,"441":1}}],["проектировании",{"2":{"2":1}}],["проект",{"0":{"61":1,"470":1},"2":{"4":1,"39":1,"58":1,"63":2,"69":1,"76":1,"221":1,"222":1,"223":8,"224":2,"225":1,"227":2,"256":1,"291":1,"304":1,"322":1,"331":2,"345":1,"352":1,"370":1,"374":1,"383":1,"386":2,"409":1,"434":1,"445":1,"451":2,"455":2,"464":1,"468":1,"501":2,"527":1}}],["проектами",{"2":{"252":1,"257":1,"347":1,"499":1}}],["проектах",{"2":{"166":1,"221":2,"227":1,"241":1,"251":1,"271":1,"382":1,"396":1,"445":1,"451":1,"461":1}}],["проекта",{"0":{"4":1,"9":1,"23":1,"58":1,"75":1,"76":1,"80":1,"110":1,"221":1,"223":1,"253":1,"409":1},"1":{"76":1,"77":1,"78":1,"79":1,"111":1,"112":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1},"2":{"10":1,"14":1,"61":1,"64":1,"65":1,"68":3,"76":1,"86":1,"112":1,"116":1,"119":1,"120":1,"126":1,"150":1,"151":1,"152":1,"170":1,"221":1,"223":8,"224":3,"225":1,"226":1,"227":1,"228":1,"235":1,"236":1,"252":1,"253":1,"258":1,"292":1,"322":1,"330":1,"331":1,"337":1,"346":2,"347":2,"348":1,"352":5,"370":1,"372":2,"375":3,"382":1,"383":1,"386":1,"390":1,"391":1,"442":1,"444":1,"445":2,"451":2,"461":1,"470":1,"472":1,"496":1,"507":1}}],["проапгрейдиться",{"2":{"471":1}}],["проанализировав",{"2":{"355":1}}],["проанализировать",{"2":{"249":1}}],["пройден",{"2":{"376":1}}],["пройти",{"2":{"169":1,"362":1,"472":1}}],["процентов",{"2":{"460":1,"536":1}}],["процентные",{"2":{"385":1}}],["процедур",{"2":{"394":1}}],["процедуры",{"2":{"373":1}}],["процессы",{"2":{"271":1,"421":1,"434":1}}],["процессу",{"2":{"237":1,"260":1,"261":1,"423":1,"429":1}}],["процессом",{"2":{"194":1,"241":1,"244":1,"323":1,"421":2}}],["процессор",{"2":{"166":1,"174":1,"457":1}}],["процессора",{"2":{"137":1}}],["процессов",{"2":{"68":1,"219":1,"276":1,"361":1}}],["процессах",{"2":{"213":1}}],["процессами",{"2":{"131":1,"421":2,"425":1}}],["процесса",{"2":{"79":1,"144":1,"149":1,"152":1,"188":1,"190":1,"204":1,"243":1,"260":1,"302":1,"316":1,"321":1,"361":3,"364":1,"365":1,"366":2,"373":1,"377":1,"385":1,"395":1,"421":2,"422":2,"427":2,"438":1,"451":1}}],["процессе",{"2":{"68":1,"69":1,"126":1,"135":1,"148":1,"150":1,"181":1,"224":1,"232":1,"255":1,"268":1,"317":1,"360":1,"361":1,"365":1,"372":1,"373":1,"421":1,"425":1,"434":1,"445":1}}],["процесс",{"2":{"61":1,"126":1,"143":1,"144":1,"150":1,"190":1,"193":1,"232":1,"234":1,"237":1,"240":1,"247":1,"255":1,"268":1,"303":1,"315":2,"316":1,"336":1,"360":1,"361":1,"365":1,"366":4,"367":2,"372":2,"373":1,"385":1,"395":3,"397":1,"421":9,"425":2,"426":2,"427":1,"433":1,"442":1,"461":1}}],["проходит",{"2":{"318":1}}],["прозрачным",{"2":{"447":1}}],["прозрачны",{"2":{"308":1}}],["прозрачный",{"2":{"115":1,"454":1}}],["прозрачное",{"2":{"451":1}}],["прозрачно",{"2":{"297":1,"308":1,"445":1}}],["проникновение",{"0":{"209":1}}],["прокручивается",{"2":{"349":1}}],["прокручиваются",{"2":{"195":1}}],["прокрутить",{"2":{"192":1,"205":1}}],["прокруткой",{"2":{"193":1}}],["прокрутка",{"2":{"192":1,"349":1}}],["прокрутку",{"2":{"192":1}}],["прокрутки",{"2":{"178":1,"192":1,"193":1,"250":2}}],["проксирования",{"2":{"295":1,"296":2}}],["прокси",{"2":{"117":1,"118":1,"140":1,"225":1,"260":1,"271":1,"295":8,"296":6,"297":6,"299":1,"300":2,"316":1,"321":1,"338":2,"425":1,"432":1,"462":1}}],["профессионального",{"2":{"467":1}}],["профессиональной",{"2":{"405":1}}],["профессиональное",{"2":{"270":1}}],["профессиональную",{"2":{"396":1}}],["профессиональные",{"2":{"370":1}}],["профессиональный",{"2":{"176":1}}],["профессор",{"2":{"180":1}}],["профилем",{"2":{"59":1}}],["профиля",{"2":{"4":1}}],["промежутках",{"2":{"366":1}}],["промежутка",{"2":{"366":1}}],["промежуток",{"2":{"365":1}}],["промежуточным",{"2":{"435":1}}],["промежуточных",{"2":{"297":1}}],["промежуточный",{"2":{"224":1}}],["промежуточное",{"2":{"295":1}}],["промежуточного",{"2":{"256":1,"462":1}}],["промптировании",{"2":{"315":1}}],["промптов",{"2":{"90":1}}],["промисная",{"2":{"511":1}}],["промисы",{"2":{"260":1,"378":1}}],["промисов",{"2":{"252":1,"472":1}}],["промис",{"2":{"244":2,"359":1,"367":1}}],["промиса",{"2":{"241":1,"255":1}}],["промышленном",{"2":{"435":1}}],["промышленной",{"2":{"225":1,"317":1}}],["промышленный",{"2":{"172":1}}],["прочтение",{"2":{"405":1}}],["прочную",{"2":{"396":1}}],["прочная",{"2":{"394":1}}],["прочим",{"2":{"464":1}}],["прочие",{"2":{"445":1,"452":1}}],["прочих",{"2":{"224":1,"473":1}}],["прочитаны",{"2":{"336":1}}],["прочитал",{"2":{"187":1}}],["прочитать",{"2":{"169":1,"335":1}}],["прочесть",{"2":{"473":1}}],["прочее",{"2":{"59":1}}],["прочего",{"2":{"36":1}}],["прояснить",{"2":{"295":1}}],["проясняться",{"2":{"152":1}}],["проявлять",{"2":{"421":1}}],["проявляться",{"2":{"261":1}}],["проявляются",{"2":{"308":1}}],["проявляется",{"2":{"210":1,"296":1,"461":1}}],["проявившиеся",{"2":{"152":1}}],["прошла",{"2":{"363":1,"365":1}}],["прошлый",{"2":{"270":1}}],["прошли",{"2":{"167":1,"318":2,"375":1,"376":1}}],["прошлой",{"2":{"89":1}}],["прошел",{"2":{"119":1}}],["пробовать",{"2":{"385":1}}],["пробегаемся",{"2":{"292":1}}],["пробелы",{"2":{"162":1}}],["пробелами",{"2":{"117":1}}],["пробная",{"2":{"222":2}}],["пробного",{"2":{"210":1}}],["проблемой",{"2":{"361":1,"421":2}}],["проблему",{"2":{"133":1,"134":1,"193":1,"271":1,"421":2,"451":1,"452":1,"463":1}}],["проблемам",{"2":{"263":1}}],["проблема",{"2":{"68":1,"86":1,"122":1,"152":1,"246":1,"247":1,"267":1,"303":1,"336":1}}],["проблемы",{"2":{"62":1,"117":2,"147":1,"160":1,"247":1,"260":1,"271":2,"272":1,"361":1,"367":1,"370":1,"385":1,"463":1,"472":1,"473":1}}],["проблем",{"2":{"9":1,"116":1,"148":1,"193":1,"250":1,"260":1,"263":1,"268":1,"302":1,"360":1,"370":1,"386":2,"400":1,"545":1}}],["провайдите",{"2":{"447":1}}],["провайдеры",{"2":{"144":1,"444":2}}],["провайдерами",{"2":{"472":1,"545":1}}],["провайдерах",{"2":{"138":1}}],["провайдера",{"2":{"116":1,"137":1,"464":1}}],["провайдер",{"2":{"116":1,"138":1}}],["провайдеров",{"2":{"116":1,"144":1,"364":1}}],["провизия",{"2":{"247":1}}],["провизию",{"2":{"247":1}}],["проводить",{"2":{"462":1}}],["проводиться",{"2":{"372":2}}],["проводилось",{"2":{"372":1}}],["проводил",{"2":{"193":1}}],["проводнике",{"2":{"224":1}}],["проведения",{"2":{"397":1}}],["проведение",{"2":{"370":1}}],["проведет",{"2":{"318":1}}],["провели",{"2":{"258":1}}],["проверено",{"2":{"473":1}}],["проверена",{"2":{"365":1}}],["проверенная",{"2":{"497":1}}],["проверенное",{"2":{"148":1,"271":1}}],["проверенным",{"2":{"507":1}}],["проверенных",{"2":{"496":1}}],["проверенные",{"2":{"76":1}}],["проверенный",{"2":{"9":1}}],["проверенную",{"2":{"17":1}}],["проверке",{"2":{"376":2}}],["проверку",{"2":{"287":1,"296":1,"361":1,"372":1}}],["проверка",{"2":{"255":1,"295":1,"358":1,"360":1,"366":1,"392":1,"463":3,"545":1}}],["проверки",{"0":{"146":1,"168":1,"220":1,"234":1,"259":1,"305":1,"320":1,"341":1,"369":1,"397":1,"441":1},"2":{"183":1,"360":4,"361":3,"364":2,"366":4,"372":1,"376":1,"378":1}}],["проверили",{"2":{"440":1}}],["проверит",{"2":{"375":1}}],["проверить",{"2":{"134":1,"223":1,"259":1,"302":1,"306":1,"314":1,"361":1,"364":1,"377":1,"378":1,"381":1,"382":1,"390":1,"391":1,"472":1}}],["проверив",{"2":{"115":1}}],["проверьте",{"2":{"125":1,"231":1,"328":1,"473":1}}],["проверок",{"2":{"125":1}}],["проверяются",{"2":{"372":2}}],["проверяем",{"2":{"281":1,"288":1,"292":1,"296":1,"303":1,"316":1,"338":2,"380":1}}],["проверяет",{"2":{"115":2,"231":1,"361":1,"366":1,"451":1,"457":1}}],["проверять",{"2":{"115":1,"360":1,"376":1,"461":1}}],["провести",{"2":{"12":1,"148":1,"212":1,"439":1,"472":1}}],["проталкивает",{"2":{"356":1}}],["протестировали",{"2":{"381":1}}],["протестированы",{"2":{"300":1,"373":1}}],["протестировать",{"2":{"116":1,"373":3,"375":1,"376":1,"378":1,"508":1}}],["противоположную",{"2":{"215":1,"271":1}}],["противоположное",{"2":{"208":1}}],["противоположные",{"2":{"189":1}}],["против",{"0":{"171":1},"2":{"175":1}}],["противном",{"2":{"86":1,"231":1,"245":1,"287":1,"422":1,"430":1}}],["протяжении",{"2":{"150":1,"223":1}}],["прототипа",{"2":{"259":1}}],["прототипов",{"2":{"241":1}}],["прототип",{"2":{"232":1}}],["прототипирования",{"2":{"23":1}}],["протоколе",{"2":{"361":1}}],["протоколирования",{"2":{"297":1}}],["протоколам",{"2":{"147":1}}],["протокола",{"2":{"144":2,"336":1,"361":2}}],["протоколу",{"2":{"143":1,"144":1,"145":1,"419":1,"444":1,"452":1}}],["протокол",{"2":{"134":3,"361":3,"434":2,"512":1}}],["протоколы",{"0":{"118":1},"2":{"118":1,"368":1,"472":1}}],["протоколом",{"2":{"117":1,"361":1,"363":1}}],["прогон",{"2":{"461":1}}],["проговаривание",{"2":{"65":1}}],["програмную",{"2":{"473":1}}],["програмных",{"2":{"400":1}}],["программой",{"2":{"226":1}}],["программ",{"2":{"222":1,"402":1}}],["программистов",{"2":{"462":1,"497":1}}],["программистские",{"2":{"462":1}}],["программистам",{"2":{"462":1}}],["программиста",{"2":{"260":1,"464":1}}],["программист",{"2":{"148":2,"268":1,"460":1,"462":1}}],["программировали",{"2":{"300":1}}],["программированию",{"2":{"472":2}}],["программирование",{"2":{"260":1,"305":1,"405":1,"462":1}}],["программировании",{"2":{"148":3,"265":1}}],["программирования",{"2":{"3":1,"17":1,"116":2,"147":2,"148":1,"247":1,"264":1,"266":1,"316":1,"462":2}}],["программировать",{"2":{"93":1,"464":1}}],["программы",{"2":{"135":1,"148":1,"151":1,"249":1,"325":1,"346":1,"387":1,"444":1,"457":1,"460":1,"462":2}}],["программа",{"2":{"117":1,"148":1}}],["программу",{"2":{"68":1,"148":1,"269":1,"387":1}}],["программный",{"2":{"356":1}}],["программные",{"2":{"171":1}}],["программными",{"2":{"462":1}}],["программным",{"2":{"171":1,"383":1}}],["программном",{"2":{"179":1,"263":1}}],["программному",{"2":{"137":1,"372":1,"440":1}}],["программно",{"2":{"148":1,"349":2,"366":1,"381":2,"460":1}}],["программное",{"2":{"133":1,"137":2,"169":1,"171":2,"217":1,"370":1,"372":2,"385":1,"400":1,"402":1}}],["программной",{"2":{"69":1,"147":1,"148":1,"263":1,"271":1}}],["программного",{"0":{"260":1,"261":1,"271":1,"408":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1},"2":{"61":1,"67":1,"69":1,"76":1,"118":1,"147":1,"169":1,"171":1,"177":1,"179":1,"217":1,"225":1,"229":1,"234":1,"235":1,"239":1,"243":1,"250":1,"260":1,"261":2,"269":1,"270":1,"271":1,"304":1,"326":1,"337":1,"370":3,"372":2,"374":1,"385":2,"395":1,"408":2,"426":1,"461":1}}],["программная",{"0":{"353":1},"1":{"354":1,"355":1},"2":{"2":1,"76":1,"355":1}}],["прогресса",{"0":{"190":1},"1":{"191":1},"2":{"190":1,"258":1}}],["прогресс",{"2":{"169":1,"190":3}}],["прогрессивному",{"2":{"365":1}}],["прогрессивное",{"2":{"315":1}}],["прогрессивность",{"2":{"148":1}}],["прогрессивного",{"2":{"131":1,"147":1,"313":1,"317":1,"400":1}}],["прогрессивные",{"0":{"306":1,"412":1},"1":{"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1},"2":{"306":1,"344":1}}],["прогрессивными",{"2":{"368":1}}],["прогрессивным",{"2":{"168":1}}],["прогрессивный",{"0":{"148":1},"2":{"147":1,"148":2,"300":1,"308":1,"407":1}}],["прогрессивных",{"2":{"147":1}}],["проп",{"2":{"463":1}}],["проприетарных",{"2":{"308":1}}],["пропорционально",{"2":{"302":1}}],["пропустили",{"2":{"296":1}}],["пропустить",{"2":{"227":1}}],["пропускать",{"2":{"59":1}}],["пропсом",{"2":{"255":1}}],["пропсов",{"2":{"245":2,"246":2,"249":1,"325":1,"351":1,"446":1,"463":1}}],["пропсу",{"2":{"249":1}}],["пропсами",{"2":{"352":1,"358":1}}],["пропсам",{"2":{"345":1}}],["пропса",{"2":{"246":1,"255":1,"349":1,"355":1}}],["пропс",{"2":{"191":1,"249":1,"255":2,"325":1,"349":1,"352":1,"355":1}}],["пропсы",{"0":{"162":1,"245":1},"2":{"105":1,"245":1,"246":2,"249":2,"256":1,"446":1,"447":1,"463":1}}],["прописать",{"2":{"451":1,"528":1}}],["прописан",{"2":{"539":1}}],["прописано",{"2":{"157":1}}],["прописаны",{"2":{"148":1}}],["прописывать",{"2":{"41":1}}],["проиграет",{"2":{"473":1}}],["проигнорируем",{"2":{"224":1}}],["проиндексировать",{"2":{"473":1}}],["происхождения",{"2":{"336":1}}],["происхождением",{"2":{"336":1}}],["происходят",{"2":{"308":1}}],["происходящего",{"2":{"190":1}}],["происходящим",{"2":{"181":1}}],["происходить",{"2":{"17":1,"370":1,"451":1,"463":1}}],["происходит",{"2":{"3":1,"130":1,"181":1,"193":1,"231":1,"247":1,"251":1,"254":1,"257":1,"296":2,"302":1,"330":1,"336":1,"355":1,"358":1,"360":1,"365":2,"370":1,"381":1,"395":1,"397":2,"421":4,"429":1,"433":1,"473":1}}],["проиллюстрирован",{"2":{"240":1}}],["проиллюстрировать",{"2":{"203":1}}],["произошла",{"2":{"345":1,"379":1,"422":1}}],["произошло",{"2":{"187":1,"463":1}}],["произойти",{"2":{"308":1,"377":1}}],["произойдет",{"2":{"193":1,"223":1,"231":1,"244":1,"301":1,"325":1,"366":1}}],["произвольные",{"2":{"436":1}}],["произвольный",{"2":{"192":1}}],["произвольное",{"2":{"310":1}}],["производственной",{"2":{"382":1}}],["производственных",{"2":{"227":1}}],["производственные",{"2":{"224":1}}],["производстве",{"2":{"224":1,"292":1}}],["производства",{"2":{"224":2,"228":1}}],["производству",{"2":{"145":1,"224":1}}],["производится",{"2":{"366":1,"388":1}}],["производителен",{"2":{"223":1}}],["производительней",{"2":{"457":1}}],["производительнее",{"2":{"125":1}}],["производительное",{"2":{"462":1}}],["производительной",{"2":{"421":1}}],["производительности",{"2":{"68":1,"130":1,"140":1,"148":2,"227":1,"295":1,"319":1,"340":1,"344":1,"412":1,"414":1,"421":3,"425":1,"430":1,"434":1,"460":1,"463":1,"473":1}}],["производительностью",{"2":{"421":1}}],["производительность",{"2":{"17":1,"69":2,"77":1,"156":1,"308":2,"344":1,"419":1,"421":2,"440":2,"441":1,"465":1}}],["производительных",{"2":{"401":1}}],["производительными",{"2":{"306":1}}],["производительным",{"2":{"123":1}}],["производительная",{"2":{"400":1}}],["производилась",{"2":{"223":1}}],["продвигает",{"2":{"266":1}}],["продвинулись",{"2":{"223":1}}],["продвинутые",{"2":{"242":1}}],["продвинутыми",{"2":{"419":1}}],["продвинутым",{"2":{"232":1}}],["продвинутых",{"2":{"221":1,"352":1}}],["продвинуться",{"2":{"222":1}}],["продвижение",{"2":{"171":1}}],["продвижения",{"2":{"133":1,"147":1,"159":1,"167":1,"232":1,"304":1,"315":1}}],["продуманный",{"2":{"368":1}}],["продуманных",{"2":{"366":1}}],["продуманные",{"2":{"207":1}}],["продуманного",{"2":{"203":1}}],["продуктом",{"2":{"171":1,"181":1}}],["продуктовый",{"2":{"472":1}}],["продуктовое",{"2":{"79":1}}],["продуктов",{"2":{"11":4,"38":1,"39":1}}],["продукте",{"2":{"11":1}}],["продуктами",{"2":{"97":1}}],["продуктах",{"2":{"11":1}}],["продукта",{"2":{"11":1,"13":1,"61":1,"69":1,"74":1,"76":1,"172":1,"205":1,"395":2}}],["продукты",{"2":{"11":1,"171":1}}],["продукт",{"2":{"10":1,"43":1,"65":1,"76":1,"131":1,"171":1,"229":1,"442":1}}],["продолжать",{"2":{"504":1}}],["продолжаться",{"2":{"210":1}}],["продолжаем",{"2":{"342":1}}],["продолжает",{"2":{"302":1,"376":1,"385":1}}],["продолжения",{"2":{"256":1}}],["продолжение",{"2":{"178":2}}],["продолжим",{"2":{"173":1}}],["продолжительность",{"2":{"301":1}}],["продолжить",{"2":{"206":1,"301":1,"391":1}}],["продолжит",{"2":{"125":1}}],["продлевать",{"2":{"144":1}}],["продлить",{"2":{"134":1}}],["продакшен",{"2":{"224":1}}],["продакшне",{"2":{"112":1,"461":1}}],["продает",{"2":{"134":1}}],["продаются",{"2":{"134":1,"211":1}}],["продавалось",{"2":{"169":1}}],["продавать",{"2":{"134":1}}],["продавцам",{"2":{"13":1}}],["продавцов",{"2":{"12":1}}],["проскроллит",{"2":{"534":1}}],["прослойка",{"2":{"473":1}}],["прослушивать",{"2":{"439":2}}],["прослушивание",{"2":{"352":1}}],["прослушивания",{"2":{"267":1}}],["проследим",{"2":{"227":1}}],["просмотр",{"2":{"224":1,"367":1}}],["просмотреть",{"2":{"168":1,"197":1,"227":1,"390":1}}],["просмотра",{"2":{"152":1,"192":1,"193":2,"195":1,"223":1,"233":1,"255":1,"315":1,"339":1,"383":1,"390":1,"431":2}}],["просматривать",{"2":{"11":2,"267":1,"431":1}}],["просишь",{"2":{"115":1}}],["простейший",{"2":{"297":1}}],["пространства",{"2":{"173":1}}],["пространстве",{"2":{"145":1,"189":1,"336":1}}],["пространство",{"2":{"134":1,"336":1,"455":1}}],["простую",{"2":{"133":1,"140":1,"148":1,"180":1,"208":1,"250":1,"302":1,"347":1,"433":1,"434":1}}],["проставить",{"2":{"552":1}}],["проставляем",{"2":{"83":1}}],["проста",{"2":{"203":1,"249":1,"325":1,"329":1,"345":1,"346":1,"360":1,"364":1,"383":1,"428":1,"436":1}}],["простая",{"0":{"360":1},"2":{"119":1,"215":1,"231":1,"315":2,"328":1,"360":1,"386":1,"427":1}}],["прост",{"2":{"119":1,"137":1,"176":1,"247":1,"293":1,"301":2,"315":1,"366":1,"423":1,"435":1}}],["просты",{"2":{"171":1,"473":1}}],["простых",{"2":{"89":1,"123":1,"144":1,"147":2,"192":1,"220":1,"224":1,"235":1,"256":1,"330":1,"359":1,"368":1,"378":1,"391":1,"440":1,"473":1}}],["простым",{"0":{"269":1},"2":{"76":1,"114":1,"181":1,"258":1,"260":1,"269":1,"297":1,"300":1,"313":1,"330":1,"347":1,"365":1,"379":1,"387":1,"422":1,"425":1,"447":1}}],["простыми",{"2":{"11":1,"144":1,"227":1,"429":1}}],["простые",{"2":{"2":1,"22":1,"41":1,"224":1,"225":1,"269":1,"298":1,"299":1,"302":1,"323":1,"430":1,"460":1,"536":1,"553":1}}],["простор",{"2":{"271":1}}],["простому",{"2":{"233":1,"442":1}}],["простом",{"2":{"160":1,"191":1,"295":1,"298":1,"462":1}}],["простого",{"2":{"147":1,"231":1,"249":1,"295":1,"336":1,"366":1,"508":1}}],["простое",{"2":{"123":1,"150":1,"223":1,"228":1,"232":1,"233":1,"246":1,"282":1,"323":1,"422":1,"473":1}}],["простота",{"2":{"39":1,"269":1,"330":1}}],["простоты",{"2":{"7":1,"200":1,"239":1,"310":1,"355":1,"434":1}}],["простой",{"0":{"438":1},"1":{"439":1},"2":{"32":1,"86":1,"115":1,"149":1,"175":1,"193":1,"203":1,"229":1,"231":2,"238":1,"251":2,"252":1,"263":1,"280":1,"288":1,"291":1,"292":1,"296":1,"297":1,"300":1,"303":1,"315":1,"316":1,"319":1,"323":1,"330":1,"336":1,"338":1,"339":1,"349":1,"351":1,"360":1,"376":1,"383":2,"395":1,"400":1,"414":1,"419":2,"421":1,"422":1,"432":1,"436":1,"437":2,"472":1,"531":1,"532":1,"536":1}}],["просто",{"0":{"227":1},"2":{"2":1,"12":1,"86":1,"103":1,"115":1,"121":1,"131":1,"134":2,"137":1,"138":1,"141":1,"152":1,"159":1,"180":1,"193":1,"199":1,"215":1,"223":1,"228":1,"235":1,"249":1,"255":2,"270":1,"282":1,"287":2,"288":1,"292":1,"296":1,"297":1,"302":1,"322":1,"323":1,"324":2,"326":1,"330":1,"333":1,"336":2,"338":1,"346":1,"350":1,"352":1,"359":1,"364":1,"374":1,"388":1,"421":1,"422":2,"423":1,"432":1,"433":1,"436":1,"437":1,"439":1,"444":1,"460":1,"463":3,"464":1,"471":1,"472":1,"504":1,"507":1}}],["проще",{"2":{"2":1,"38":1,"53":1,"116":1,"179":1,"200":1,"265":1,"308":1,"331":1,"335":1,"338":1,"344":1,"460":1,"471":1,"473":1}}],["прирост",{"2":{"421":1,"430":1}}],["природа",{"2":{"370":1}}],["природе",{"2":{"161":1,"303":1}}],["приглашаем",{"2":{"499":1}}],["приглашение",{"2":{"316":1}}],["приглашения",{"2":{"315":2}}],["пригодится",{"2":{"390":1,"472":1}}],["пригодиться",{"2":{"383":1,"457":1}}],["приписываются",{"2":{"367":1}}],["пришли",{"2":{"344":1}}],["пришла",{"2":{"250":1}}],["пришло",{"2":{"143":1,"231":1,"255":1,"256":1,"315":1,"349":1,"352":1,"358":1,"384":1,"427":1,"428":1,"430":1,"433":1}}],["пришлось",{"2":{"56":1,"174":1}}],["признательность",{"2":{"405":1}}],["признаку",{"2":{"256":1}}],["признания",{"2":{"244":1}}],["призывом",{"2":{"205":2}}],["призыв",{"0":{"205":1},"2":{"205":1,"217":1}}],["призывы",{"2":{"188":1}}],["призыва",{"2":{"173":1}}],["придумали",{"2":{"473":1}}],["придумать",{"2":{"305":1}}],["придать",{"2":{"230":1}}],["придерживаются",{"2":{"205":1,"471":1}}],["придерживаться",{"2":{"148":1,"219":1,"301":1,"375":1,"472":1}}],["придется",{"2":{"38":1,"59":1,"148":1,"247":1,"270":1,"281":1,"421":1}}],["приобрела",{"2":{"344":1}}],["приобрести",{"2":{"222":1}}],["приобретают",{"2":{"372":1}}],["приобретаются",{"2":{"134":1}}],["приобретен",{"2":{"134":1,"144":1}}],["приемник",{"2":{"294":1}}],["приемники",{"2":{"293":1}}],["приемнику",{"2":{"293":1}}],["приемы",{"2":{"219":1}}],["приемов",{"2":{"192":1,"206":1,"227":1}}],["приборная",{"2":{"384":1}}],["приборной",{"2":{"383":1}}],["прибегая",{"2":{"196":1}}],["приблизить",{"2":{"473":1}}],["приблизительно",{"0":{"79":1}}],["приближении",{"2":{"17":1}}],["приятный",{"2":{"519":1}}],["приятные",{"2":{"224":1}}],["приятней",{"2":{"471":1}}],["приятно",{"2":{"152":1}}],["приятен",{"2":{"172":1}}],["причем",{"2":{"199":1,"295":1,"301":1,"336":1,"378":1,"381":1,"425":1,"472":2}}],["причудливо",{"2":{"148":1}}],["причина",{"2":{"382":1}}],["причинам",{"2":{"379":1}}],["причине",{"2":{"244":1}}],["причин",{"2":{"64":1,"125":1,"195":1,"295":1,"421":1}}],["причины",{"0":{"62":1},"2":{"295":1,"471":1}}],["приспособленным",{"2":{"400":1}}],["приспособить",{"2":{"145":1}}],["присутствует",{"2":{"463":1}}],["присутствию",{"2":{"134":1}}],["присущей",{"2":{"331":1}}],["приступать",{"2":{"390":1}}],["приступаем",{"2":{"380":1}}],["приступить",{"2":{"224":1,"227":1,"241":1,"346":1,"350":1,"425":1,"433":1}}],["приступили",{"2":{"221":1}}],["пристыдить",{"2":{"216":1}}],["пристальное",{"2":{"205":1,"402":1}}],["присваивать",{"2":{"349":1}}],["присваивание",{"2":{"296":1}}],["присваивая",{"2":{"287":1,"296":1,"355":1}}],["присваиваем",{"2":{"249":1,"286":1,"287":1,"288":1,"296":1,"355":1}}],["присваивает",{"2":{"158":1,"246":1}}],["присваивается",{"2":{"148":1,"158":1,"352":1}}],["присвоено",{"2":{"352":1}}],["присвоение",{"2":{"287":2}}],["присвоения",{"2":{"238":1}}],["присвоении",{"2":{"231":1}}],["присвоить",{"2":{"284":1,"285":1,"296":1}}],["присвоили",{"2":{"249":1}}],["присвоил",{"2":{"193":1}}],["присоединить",{"2":{"246":1}}],["присоединяет",{"2":{"293":1}}],["присоединяем",{"2":{"231":1}}],["присоединять",{"2":{"252":1}}],["присоединяться",{"2":{"63":1}}],["присоединении",{"2":{"158":1}}],["прим",{"2":{"222":1}}],["приманка",{"0":{"210":1,"215":1}}],["примитивах",{"2":{"460":1}}],["примитивам",{"2":{"123":2}}],["примитивов",{"2":{"460":1}}],["примитивные",{"2":{"158":1,"245":1,"463":1}}],["примите",{"2":{"152":1,"363":1}}],["примет",{"2":{"148":1,"241":1}}],["примечание",{"2":{"134":1,"235":1,"245":1}}],["примечателен",{"2":{"32":1}}],["применив",{"2":{"386":1}}],["применительно",{"2":{"308":1}}],["применить",{"2":{"232":1,"237":1,"241":1,"248":1,"298":1,"337":1,"339":1,"342":1,"372":1,"425":1,"427":1}}],["применили",{"2":{"205":1,"230":1,"232":1,"249":1,"258":1,"259":1}}],["применимы",{"2":{"270":1}}],["применим",{"2":{"225":1,"235":1,"251":1,"255":1,"264":1,"287":1,"322":1,"367":1,"432":1}}],["применима",{"2":{"175":1}}],["применимо",{"2":{"169":1}}],["применен",{"2":{"425":1,"516":1}}],["применены",{"2":{"380":1}}],["примененными",{"2":{"229":1}}],["применена",{"2":{"201":1,"226":1}}],["применено",{"2":{"173":1}}],["применений",{"2":{"246":1,"434":1}}],["применению",{"2":{"148":1}}],["применения",{"2":{"145":1,"178":1,"180":1,"203":1,"241":1,"244":1,"267":1,"279":1,"312":1,"370":1,"440":1,"451":1}}],["применении",{"2":{"123":1,"225":1,"374":1}}],["применением",{"2":{"235":1,"342":1}}],["применение",{"2":{"118":1,"179":1,"225":1,"227":1,"229":1,"263":1,"270":1,"271":1,"276":1,"304":1,"308":2,"321":1,"504":1}}],["применяют",{"2":{"432":1}}],["применяются",{"2":{"308":1}}],["применяя",{"2":{"203":1,"231":1,"374":1,"424":1}}],["применяться",{"2":{"186":1,"224":1,"260":1,"261":1,"548":1}}],["применять",{"2":{"148":1,"226":1,"232":1,"260":1,"269":1,"278":1,"304":1,"321":1,"373":1,"396":1}}],["применяет",{"2":{"204":1,"301":1}}],["применяется",{"2":{"115":1,"123":2,"152":1,"203":1,"270":1,"296":1,"301":1,"312":1,"360":1}}],["применяемая",{"2":{"249":1}}],["применяемых",{"2":{"225":1,"439":1}}],["применяем",{"2":{"41":1,"333":1,"378":1}}],["примеру",{"2":{"148":1,"231":1,"282":1,"380":1}}],["примеры",{"2":{"137":1,"142":1,"161":1,"170":1,"187":1,"190":1,"207":1,"225":1,"235":1,"302":1,"304":1,"305":1,"307":1,"321":2,"352":1,"356":1,"374":1,"396":1,"408":1,"415":1,"472":1}}],["примеров",{"0":{"404":1},"2":{"123":1,"132":1,"148":1,"150":1,"152":1,"171":1,"189":1,"217":1,"222":1,"260":1,"266":1,"307":1,"329":1,"334":1,"358":1,"367":1,"371":1,"374":1,"375":1,"400":1,"404":1}}],["примером",{"2":{"76":1,"204":1,"238":1,"336":1,"359":1,"390":1}}],["примере",{"2":{"17":1,"109":1,"121":1,"141":1,"148":1,"149":1,"152":1,"160":1,"173":1,"174":1,"205":1,"209":1,"216":1,"223":1,"225":1,"246":1,"247":2,"249":1,"256":1,"267":1,"287":1,"291":1,"292":1,"295":2,"296":1,"297":1,"315":1,"316":1,"317":1,"323":1,"326":1,"327":1,"328":2,"331":2,"332":1,"339":1,"346":1,"358":1,"364":2,"367":1,"373":1,"383":1,"393":1,"419":1,"423":1,"431":2,"435":1,"440":1}}],["примерное",{"2":{"421":1}}],["примерно",{"2":{"14":1,"17":1,"26":2,"48":1,"97":1,"114":1,"223":2,"249":2,"256":1,"290":1,"318":1,"329":1,"360":1,"365":1,"383":1,"390":1,"391":1,"421":1,"431":1,"463":1,"473":1}}],["примерный",{"2":{"5":1}}],["примерами",{"2":{"160":1,"225":1,"308":1,"344":1,"349":1,"384":1}}],["примерам",{"2":{"134":1,"279":1,"342":1,"402":1,"420":1}}],["примерах",{"2":{"122":1,"158":1,"178":1,"235":1,"246":1,"276":1,"281":1,"300":1,"310":1,"336":1,"342":1,"344":1,"349":1,"358":1,"365":1,"424":1,"508":1}}],["примера",{"2":{"4":1,"135":1,"152":1,"173":1,"203":1,"208":1,"224":1,"229":1,"263":1,"265":1,"296":1,"302":1,"303":1,"307":1,"314":1,"316":1,"318":1,"329":1,"331":1,"339":3,"349":1,"353":1,"354":1,"367":1,"376":1,"383":1,"391":1,"422":1,"430":1,"431":1,"441":1}}],["пример",{"0":{"252":1,"374":1},"1":{"253":1,"254":1,"255":1},"2":{"3":1,"14":1,"17":1,"103":1,"114":2,"117":1,"120":1,"121":2,"122":1,"124":1,"138":1,"140":1,"149":1,"152":1,"157":1,"158":1,"159":1,"160":1,"174":2,"175":2,"184":1,"186":1,"188":1,"189":1,"190":2,"192":1,"196":1,"197":1,"199":1,"203":1,"208":1,"209":1,"215":1,"216":1,"229":1,"235":1,"244":3,"245":2,"249":2,"250":1,"251":1,"255":1,"266":1,"267":1,"284":1,"285":1,"286":1,"288":1,"294":1,"295":1,"296":1,"297":3,"301":2,"303":2,"305":1,"313":3,"315":1,"316":1,"317":2,"318":1,"325":1,"328":1,"331":1,"339":1,"352":1,"355":2,"358":1,"361":1,"374":1,"377":1,"380":1,"381":1,"382":1,"383":1,"392":1,"423":1,"430":1,"431":3,"447":1,"451":2,"463":1,"538":1}}],["прикосновений",{"2":{"519":1}}],["прикосновением",{"2":{"201":1}}],["прикладном",{"2":{"512":1}}],["прикладного",{"2":{"17":1,"247":1,"266":1}}],["прикладную",{"2":{"256":1}}],["прикрыть",{"2":{"255":1}}],["прикрепить",{"2":{"331":1}}],["прикрепив",{"2":{"243":1}}],["прикрепляем",{"2":{"267":1}}],["прикрепляя",{"2":{"121":1}}],["приходила",{"2":{"473":1}}],["приходится",{"2":{"144":1,"152":2,"156":1,"223":1,"247":1,"381":1,"457":1}}],["приходит",{"2":{"137":1,"246":1,"249":1,"314":1}}],["приходите",{"2":{"26":1}}],["приходу",{"2":{"426":1}}],["приходя",{"2":{"464":1}}],["приходятся",{"2":{"462":1,"463":1}}],["приходят",{"2":{"192":1,"378":1}}],["приходящих",{"2":{"118":1}}],["привыкли",{"2":{"333":1}}],["привычный",{"2":{"424":1}}],["привычным",{"2":{"281":1,"394":1}}],["привычными",{"2":{"270":1}}],["привычнее",{"2":{"108":1}}],["привлечь",{"2":{"323":1}}],["привлекает",{"2":{"173":1}}],["приватные",{"2":{"330":1}}],["приватный",{"2":{"137":1}}],["приватному",{"2":{"287":2}}],["привяжем",{"2":{"231":1}}],["привязывайтесь",{"2":{"468":1}}],["привязывание",{"2":{"250":1}}],["привязывается",{"2":{"134":1,"336":1}}],["привязки",{"2":{"351":1}}],["привязку",{"2":{"246":1}}],["привязке",{"2":{"193":1}}],["привязанной",{"2":{"358":1}}],["привязанный",{"2":{"249":1}}],["привязанные",{"2":{"225":1}}],["привязана",{"2":{"232":1,"463":1}}],["приводящую",{"2":{"376":1}}],["приводятся",{"2":{"408":1}}],["приводят",{"2":{"181":1,"237":1,"301":1}}],["приводит",{"2":{"366":1,"376":1,"381":1}}],["приводится",{"2":{"182":1,"271":1}}],["приветствуется",{"2":{"495":1}}],["привет",{"2":{"422":1,"423":1}}],["привел",{"2":{"160":1}}],["привели",{"2":{"152":2,"304":1}}],["привело",{"2":{"147":1,"250":1}}],["приведет",{"2":{"144":1,"178":1,"301":1,"328":1,"336":1,"381":1}}],["приведем",{"2":{"122":1,"124":1,"174":1,"220":1,"244":2,"263":1,"286":1,"313":1}}],["приведена",{"2":{"256":1}}],["приведенной",{"2":{"326":1}}],["приведенном",{"2":{"316":1}}],["приведенного",{"2":{"208":1}}],["приведенным",{"2":{"253":1}}],["приведенные",{"2":{"161":1,"396":1}}],["приведенный",{"2":{"119":1,"284":1,"292":1,"325":1,"367":1,"380":1}}],["приведены",{"2":{"137":1,"187":1,"225":1,"356":1,"392":1}}],["приведен",{"2":{"117":1,"119":1,"137":1,"138":1,"185":1,"267":1,"289":1,"349":1,"358":1,"367":1}}],["привести",{"2":{"68":1,"124":1,"152":1,"189":1,"244":1,"264":1,"265":1,"305":1,"308":1,"323":1,"332":1,"370":2,"377":1}}],["прилагает",{"2":{"421":1}}],["приложить",{"2":{"308":1}}],["приложений",{"0":{"464":1},"1":{"465":1,"466":1,"467":1,"468":1,"469":1,"470":1},"2":{"115":1,"134":1,"144":1,"145":1,"147":2,"148":5,"150":2,"172":1,"211":1,"221":1,"235":2,"260":2,"266":1,"268":1,"304":1,"306":1,"308":7,"310":1,"319":1,"321":2,"330":1,"335":1,"340":1,"344":2,"359":1,"360":2,"361":1,"364":1,"366":2,"368":1,"370":1,"383":1,"391":1,"395":1,"401":2,"402":1,"411":1,"419":1,"473":1}}],["приложению",{"2":{"103":1,"134":1,"141":1,"151":1,"194":1,"224":2,"230":1,"233":1,"243":1,"252":1,"259":1,"316":1,"330":1,"331":1,"335":1,"345":1,"349":1,"350":1,"361":1,"367":1,"420":1,"425":1,"427":1,"430":1,"445":1,"463":1,"542":1}}],["приложениями",{"2":{"137":2,"147":1,"198":1,"271":1,"308":3,"315":1,"318":1,"319":2,"342":1,"344":1,"367":2,"368":1}}],["приложениям",{"2":{"125":1,"342":1,"440":1}}],["приложениях",{"2":{"122":1,"169":2,"176":1,"188":1,"190":1,"195":1,"198":1,"209":1,"226":2,"227":1,"235":1,"272":1,"276":2,"303":1,"359":1,"361":1,"368":1,"373":1,"419":1}}],["приложения",{"0":{"79":1,"120":1,"131":1,"133":1,"135":1,"144":1,"203":1,"232":1,"256":1,"257":1,"306":1,"342":1,"374":1,"411":1,"412":1,"416":1,"452":1,"455":1,"502":1,"541":1},"1":{"132":1,"133":1,"134":2,"135":1,"136":2,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1,"453":1,"454":1,"542":1,"543":1,"544":1,"545":1},"2":{"11":1,"59":1,"83":1,"104":1,"114":1,"118":1,"119":4,"120":5,"121":3,"127":1,"131":6,"133":3,"134":1,"135":4,"136":2,"137":3,"138":1,"139":1,"143":2,"144":1,"145":3,"146":1,"147":2,"148":6,"149":5,"150":4,"151":1,"159":1,"160":1,"185":1,"188":1,"190":1,"195":2,"197":2,"200":1,"202":1,"203":1,"205":3,"219":1,"221":2,"223":1,"224":7,"225":2,"226":1,"228":1,"229":3,"230":1,"231":1,"233":3,"234":2,"237":2,"238":2,"240":1,"241":1,"243":2,"244":2,"247":2,"251":2,"252":2,"255":4,"256":3,"257":1,"258":1,"263":2,"265":1,"267":2,"268":2,"269":1,"274":1,"275":1,"278":1,"287":1,"295":2,"300":1,"304":1,"306":2,"308":8,"309":2,"310":3,"311":3,"312":4,"313":4,"314":1,"315":5,"316":3,"317":1,"318":2,"320":1,"321":3,"322":1,"323":1,"328":5,"329":1,"330":2,"331":1,"334":1,"336":5,"340":1,"342":1,"344":8,"346":3,"349":2,"352":2,"359":2,"360":1,"361":1,"362":1,"363":2,"364":2,"365":2,"366":2,"367":6,"368":1,"369":1,"370":2,"372":2,"373":3,"374":5,"384":1,"395":1,"400":1,"410":1,"414":1,"419":2,"420":1,"421":3,"423":1,"425":1,"427":3,"430":1,"431":1,"435":1,"438":1,"439":1,"440":3,"441":2,"445":2,"446":1,"447":1,"451":1,"452":2,"455":3,"460":1,"461":1,"462":1,"464":2,"465":1,"473":5,"496":1,"504":1,"506":1,"507":3,"508":4,"511":1,"542":5,"544":1,"545":3,"554":1,"555":1,"556":3}}],["приложением",{"2":{"6":1,"131":1,"143":1,"149":1,"169":1,"171":1,"181":1,"197":1,"235":1,"316":1,"400":1,"473":1,"496":2}}],["приложение",{"0":{"119":1,"229":1,"347":1,"418":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"230":1,"231":1,"232":1},"2":{"6":1,"11":1,"55":1,"79":1,"95":1,"116":2,"120":1,"121":1,"125":1,"134":2,"135":4,"136":1,"137":3,"141":1,"143":3,"144":1,"147":1,"148":4,"149":2,"150":2,"151":2,"181":2,"187":1,"190":2,"205":1,"218":1,"221":2,"223":1,"224":4,"225":1,"228":1,"229":4,"231":1,"232":4,"233":2,"234":2,"235":1,"241":1,"256":1,"257":1,"258":1,"263":1,"297":1,"301":1,"306":3,"308":9,"310":1,"311":2,"312":1,"314":1,"315":6,"318":1,"319":1,"320":1,"321":1,"326":1,"331":1,"333":1,"336":1,"342":2,"344":1,"346":1,"347":1,"349":1,"351":1,"355":1,"359":1,"361":1,"365":3,"366":1,"367":1,"368":2,"374":4,"384":1,"416":1,"421":2,"424":1,"425":1,"427":1,"430":1,"431":2,"434":1,"438":1,"445":1,"452":1,"471":1,"472":1,"473":3,"504":2,"508":1,"553":1,"554":1}}],["приложении",{"0":{"149":1},"1":{"150":1},"2":{"5":1,"11":1,"83":1,"102":1,"121":1,"148":1,"149":1,"152":1,"187":1,"225":1,"227":1,"229":1,"230":1,"231":1,"240":1,"241":2,"244":1,"255":3,"256":2,"268":2,"271":1,"277":1,"287":1,"288":1,"294":1,"308":1,"323":1,"328":1,"329":1,"331":1,"333":1,"337":1,"346":1,"347":1,"351":1,"358":1,"361":2,"364":1,"365":1,"379":1,"413":1,"418":1,"421":1,"423":1,"424":1,"427":1,"435":1,"447":1,"452":2,"463":3,"473":1,"513":1,"516":1,"557":1}}],["приличных",{"2":{"65":1}}],["приняли",{"2":{"223":2,"428":1,"429":1}}],["принят",{"2":{"240":1,"255":1}}],["принять",{"2":{"180":1,"211":1,"212":1,"241":2,"255":1,"297":1,"315":1}}],["принятие",{"2":{"179":1}}],["принятия",{"2":{"64":1,"179":1,"197":1,"372":1}}],["принято",{"2":{"150":1,"192":1,"196":2,"224":1,"291":1,"310":1,"385":1}}],["приняты",{"2":{"147":1}}],["принести",{"2":{"220":1,"463":1}}],["принадлежность",{"2":{"365":1}}],["принадлежит",{"2":{"268":1,"364":1}}],["принадлежат",{"2":{"175":1,"463":1}}],["принадлежать",{"2":{"16":1}}],["принадлежт",{"2":{"105":1}}],["принимают",{"2":{"246":1,"249":1,"266":1}}],["принимающей",{"2":{"432":1}}],["принимающую",{"2":{"245":1,"252":1,"326":1}}],["принимающий",{"2":{"117":1,"327":1,"352":1,"439":1}}],["принимаемого",{"2":{"356":1}}],["принимает",{"2":{"244":1,"245":1,"249":1,"251":1,"254":1,"255":1,"256":1,"288":1,"338":2,"356":1,"357":1,"360":1}}],["принимается",{"2":{"124":1,"310":1}}],["принимаешь",{"2":{"89":1}}],["принимать",{"2":{"22":1,"192":1,"251":1,"260":1,"501":1}}],["принципу",{"2":{"266":1,"367":1}}],["принципа",{"2":{"175":1,"225":1,"263":1,"265":1,"267":2,"270":1,"291":1}}],["принципами",{"2":{"173":1,"177":1,"263":1}}],["принципах",{"2":{"169":1,"200":1,"205":1,"401":1}}],["принципом",{"2":{"173":1,"268":1,"305":1}}],["принципов",{"0":{"262":1},"1":{"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1},"2":{"167":1,"171":1,"260":2,"261":1,"270":1,"400":1}}],["принципы",{"0":{"172":1,"181":1,"260":1,"261":1,"408":1,"504":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1},"2":{"172":2,"176":2,"180":1,"181":1,"225":1,"229":2,"232":1,"235":1,"243":1,"250":1,"260":2,"261":2,"262":2,"270":1,"304":1,"326":1,"337":1,"373":1,"374":1,"408":1,"425":1,"426":1}}],["принципе",{"2":{"105":1,"232":1,"270":1,"462":1}}],["принцип",{"0":{"265":1},"2":{"2":1,"117":1,"173":1,"174":1,"176":1,"180":1,"181":1,"228":1,"243":1,"250":2,"263":3,"264":3,"265":2,"266":2,"267":1,"268":1,"269":3,"270":2,"286":1,"292":1,"323":1}}],["при",{"0":{"393":1,"541":1},"1":{"542":1,"543":1,"544":1,"545":1},"2":{"2":1,"22":1,"30":1,"39":2,"40":1,"41":5,"47":1,"59":2,"62":1,"69":1,"76":1,"83":1,"85":1,"86":1,"92":1,"97":1,"102":2,"105":2,"112":1,"115":4,"116":1,"117":2,"118":1,"122":2,"123":3,"130":1,"134":1,"136":2,"141":1,"143":1,"145":2,"146":1,"147":1,"148":6,"149":1,"150":2,"152":1,"154":1,"156":2,"158":1,"160":3,"166":1,"168":1,"171":1,"174":1,"175":2,"176":1,"178":1,"180":1,"185":1,"186":3,"187":1,"189":1,"190":2,"192":2,"193":1,"198":1,"199":1,"200":1,"201":1,"204":1,"205":3,"209":1,"211":1,"214":3,"216":1,"217":2,"223":2,"224":4,"226":1,"227":4,"228":1,"229":1,"230":1,"231":3,"235":1,"243":1,"244":4,"245":1,"246":1,"247":1,"249":1,"251":1,"254":2,"256":1,"260":1,"261":1,"266":1,"271":2,"281":2,"291":1,"295":1,"297":3,"300":1,"301":1,"302":2,"303":1,"304":1,"306":1,"308":2,"310":2,"312":1,"315":3,"316":1,"317":1,"323":2,"328":1,"331":1,"336":3,"337":1,"339":2,"340":1,"345":3,"346":1,"347":2,"349":1,"352":4,"353":3,"358":1,"360":2,"361":3,"363":1,"366":1,"367":4,"369":1,"372":2,"373":1,"374":2,"375":1,"376":3,"377":1,"379":1,"380":1,"382":2,"383":2,"390":1,"393":2,"394":1,"395":1,"401":1,"421":2,"422":1,"423":2,"424":1,"429":1,"430":1,"431":1,"447":1,"451":4,"452":2,"457":2,"460":1,"461":2,"462":3,"471":1,"472":1,"473":8,"496":2,"501":1,"503":1,"504":1,"507":1,"508":3,"511":1,"513":1,"516":1,"545":1,"546":1,"548":1,"555":1,"556":1}}],["чрезвычайно",{"2":{"281":1,"300":1}}],["чрезмерного",{"2":{"269":1,"447":1}}],["чужих",{"2":{"471":1}}],["чужим",{"2":{"394":1}}],["чужие",{"2":{"300":1}}],["чувствительный",{"2":{"365":1}}],["чувствительна",{"2":{"179":1}}],["чувствует",{"2":{"181":1}}],["чувствовать",{"2":{"180":1,"181":1}}],["чувство",{"2":{"180":1,"190":1}}],["чуть",{"2":{"12":1,"473":1}}],["члену",{"2":{"296":1}}],["членов",{"2":{"152":1}}],["член",{"2":{"152":1,"332":1}}],["члены",{"2":{"122":1,"330":1,"332":1}}],["членами",{"2":{"323":1,"332":2,"368":1}}],["членам",{"2":{"152":1,"330":1,"394":1}}],["члена",{"2":{"102":1,"437":1}}],["чаще",{"2":{"154":1,"159":1,"182":1,"209":1,"260":1,"268":1,"270":1,"272":1,"358":1,"376":1,"395":1}}],["чате",{"2":{"497":1}}],["чата",{"2":{"187":1}}],["чат",{"0":{"90":1},"2":{"90":1}}],["частях",{"2":{"192":1,"260":1,"304":2,"427":1,"432":1}}],["частями",{"2":{"197":1,"241":1,"293":1}}],["частям",{"2":{"26":1}}],["частным",{"2":{"337":1}}],["частных",{"2":{"140":1}}],["частной",{"2":{"137":1}}],["частности",{"2":{"14":1,"177":1,"235":1,"308":1,"321":1,"329":1,"385":1,"434":1,"536":1}}],["части",{"2":{"115":1,"134":1,"174":1,"183":1,"192":1,"193":1,"195":2,"196":1,"203":1,"204":1,"205":1,"223":1,"228":1,"239":1,"249":1,"260":1,"263":4,"269":1,"282":1,"297":2,"315":2,"328":1,"361":1,"391":1,"420":1,"472":1,"511":1}}],["частичной",{"2":{"295":1}}],["частичном",{"2":{"295":1}}],["частичного",{"2":{"235":1}}],["частично",{"2":{"39":1,"203":1,"226":1,"306":1,"462":2,"463":3}}],["часто",{"2":{"55":1,"92":1,"134":5,"148":2,"152":1,"153":1,"156":2,"160":1,"168":1,"171":1,"181":1,"184":3,"188":1,"195":2,"196":1,"199":1,"200":1,"207":2,"209":2,"210":2,"213":2,"216":1,"217":1,"221":1,"223":1,"225":1,"231":1,"260":1,"266":1,"271":5,"279":1,"281":2,"291":1,"293":1,"295":1,"310":1,"311":1,"325":1,"355":1,"358":3,"359":1,"366":1,"370":1,"372":1,"401":1,"452":1,"460":1,"472":1,"497":2,"536":1}}],["частей",{"2":{"28":1,"269":1,"300":1,"332":1,"421":1,"439":1,"440":1,"545":1}}],["частью",{"2":{"96":1,"127":1,"137":1,"149":1,"155":1,"174":1,"188":1,"205":1,"243":1,"255":1,"267":1,"270":1,"271":1,"300":1,"302":1,"310":1,"338":1,"367":1,"391":1,"428":1,"463":1,"472":1}}],["часть",{"2":{"2":1,"6":1,"86":1,"118":2,"125":1,"148":1,"151":1,"173":1,"205":1,"230":1,"231":2,"260":1,"267":1,"324":1,"344":1,"361":1,"364":1,"372":1,"383":1,"395":1,"437":1,"457":1,"460":1,"542":2}}],["чёткого",{"2":{"68":1}}],["чтению",{"2":{"183":1}}],["чтения",{"2":{"152":2,"267":1,"336":1,"338":1,"431":1}}],["чтение",{"2":{"59":1}}],["что",{"0":{"64":1,"133":1,"271":1,"344":1,"372":1,"373":1,"385":1,"406":1},"1":{"134":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"3":3,"6":1,"11":2,"12":1,"17":1,"22":3,"25":1,"26":2,"32":1,"33":2,"35":1,"41":2,"43":1,"44":1,"48":1,"53":1,"62":2,"63":1,"68":1,"85":1,"89":1,"93":1,"95":2,"96":1,"97":1,"102":2,"105":1,"112":1,"115":9,"116":2,"117":1,"118":2,"122":1,"124":1,"125":3,"131":1,"134":4,"135":2,"136":2,"137":3,"143":1,"144":1,"146":5,"148":14,"149":3,"150":5,"151":6,"152":12,"155":2,"156":2,"157":1,"158":1,"159":2,"160":1,"168":2,"169":3,"171":3,"172":3,"173":4,"174":4,"175":2,"176":1,"178":2,"179":1,"180":1,"181":4,"186":2,"187":3,"188":1,"189":2,"190":4,"192":1,"193":2,"198":2,"199":1,"200":1,"203":2,"204":3,"205":1,"207":1,"208":1,"209":1,"210":2,"211":2,"212":1,"216":1,"217":1,"219":1,"220":3,"222":3,"223":6,"224":7,"225":2,"226":1,"227":6,"228":4,"230":3,"231":9,"232":5,"237":1,"239":3,"240":1,"244":2,"245":2,"246":3,"247":1,"249":4,"250":1,"251":1,"255":2,"256":3,"259":2,"260":1,"263":2,"264":1,"265":3,"266":1,"267":4,"268":2,"270":3,"271":2,"276":1,"277":1,"278":1,"280":2,"281":2,"282":3,"284":2,"286":1,"287":4,"289":3,"290":1,"291":1,"292":1,"294":1,"295":8,"296":4,"297":10,"299":2,"300":2,"301":2,"302":3,"303":10,"304":1,"305":1,"306":2,"308":5,"310":3,"314":2,"315":5,"316":1,"318":1,"320":2,"323":4,"325":3,"326":1,"328":1,"329":1,"330":1,"331":2,"332":2,"336":6,"337":1,"338":1,"339":1,"341":3,"342":1,"344":6,"345":2,"346":1,"349":7,"352":4,"354":1,"355":5,"357":1,"358":1,"359":1,"360":5,"361":4,"363":1,"364":2,"365":3,"366":4,"367":2,"370":2,"372":6,"373":2,"374":2,"375":3,"376":8,"377":2,"378":1,"379":2,"380":1,"381":7,"382":2,"383":1,"385":3,"386":2,"390":2,"391":4,"393":4,"394":4,"397":4,"402":1,"407":1,"421":10,"422":2,"423":1,"426":3,"427":2,"428":1,"429":1,"430":1,"432":4,"433":2,"434":2,"435":2,"439":4,"441":2,"442":1,"445":2,"451":3,"452":1,"455":2,"460":1,"461":3,"462":3,"463":16,"464":2,"465":1,"471":3,"472":4,"473":4,"507":3,"527":1,"539":1,"557":1}}],["чтобы",{"0":{"176":1,"402":1},"2":{"2":1,"7":1,"16":1,"21":1,"53":1,"68":1,"83":1,"86":1,"89":1,"103":2,"104":1,"115":1,"126":1,"134":1,"136":1,"138":1,"149":1,"151":2,"152":4,"155":1,"159":1,"160":1,"166":2,"168":2,"170":1,"173":2,"174":1,"179":2,"180":1,"184":1,"186":2,"187":2,"191":1,"193":1,"197":1,"200":2,"203":1,"205":3,"208":1,"210":2,"216":1,"222":1,"223":5,"224":1,"225":1,"226":1,"227":2,"228":3,"229":2,"230":1,"231":4,"232":3,"233":1,"235":1,"236":1,"237":2,"238":1,"241":3,"243":1,"244":1,"246":1,"247":1,"249":1,"251":1,"253":1,"255":6,"257":1,"258":1,"259":1,"264":1,"270":1,"280":1,"281":3,"283":1,"288":2,"292":3,"293":1,"295":1,"296":1,"297":1,"298":1,"300":2,"302":3,"304":1,"306":2,"307":1,"308":3,"314":1,"315":2,"316":2,"318":1,"320":1,"322":1,"323":2,"324":1,"325":2,"329":1,"331":2,"335":1,"336":2,"337":2,"338":1,"342":2,"343":1,"344":1,"346":1,"347":1,"348":1,"349":1,"351":1,"352":3,"353":3,"355":1,"358":1,"360":1,"361":1,"363":1,"365":1,"367":3,"369":1,"371":1,"375":2,"376":1,"377":3,"378":2,"379":2,"381":1,"382":2,"384":2,"386":1,"390":3,"393":1,"396":1,"417":1,"420":2,"421":4,"425":2,"426":1,"427":1,"428":1,"429":1,"432":1,"433":1,"435":2,"439":3,"441":1,"444":2,"447":1,"451":1,"452":1,"455":2,"462":2,"463":1,"472":2,"473":5,"504":1,"507":2,"515":1,"528":1}}],["чипом",{"2":{"366":1}}],["чипы",{"0":{"185":1}}],["читать",{"2":{"472":1}}],["читателя",{"2":{"365":2}}],["читателю",{"2":{"4":1,"317":1}}],["читают",{"2":{"211":1}}],["читаемая",{"2":{"472":1}}],["читаемом",{"2":{"460":1}}],["читаем",{"2":{"376":1}}],["читаемым",{"2":{"166":1,"270":1}}],["читается",{"2":{"228":1}}],["читает",{"2":{"208":1}}],["читабельней",{"2":{"105":1}}],["чище",{"2":{"83":1}}],["чисел",{"2":{"134":2,"183":1,"193":1,"303":2,"377":1,"460":1,"536":1}}],["чистого",{"2":{"504":1}}],["чисто",{"2":{"344":1}}],["чистоте",{"2":{"270":1}}],["чистоту",{"2":{"199":1,"225":1}}],["чистом",{"2":{"256":1,"367":1,"421":1,"422":1,"471":1,"504":1}}],["чистым",{"2":{"260":1,"270":1,"323":1}}],["чистые",{"2":{"182":1}}],["чистый",{"2":{"77":1,"86":1,"264":1,"286":1,"468":1}}],["чистая",{"2":{"158":1,"323":1,"537":1}}],["чистую",{"2":{"133":1}}],["чистим",{"2":{"96":1}}],["числовом",{"2":{"376":1}}],["число",{"2":{"102":1,"108":1,"336":1,"358":1,"374":1,"464":1}}],["числом",{"2":{"47":1,"105":1,"302":1}}],["числа",{"2":{"97":1,"149":1,"158":1,"190":1,"193":1,"301":1,"358":1,"374":1,"545":1}}],["числе",{"2":{"7":1,"13":1,"22":1,"25":1,"125":1,"302":1,"355":1,"508":1}}],["честь",{"2":{"211":1}}],["чекбокс",{"2":{"184":1,"185":1}}],["чекбоксы",{"0":{"184":1},"2":{"184":1}}],["человеческий",{"2":{"263":1}}],["человеческой",{"2":{"134":1}}],["человеку",{"2":{"134":1}}],["человекоемкая",{"2":{"385":1}}],["человекоемкой",{"2":{"260":1}}],["человеком",{"2":{"171":1,"372":1}}],["человеко",{"2":{"97":1,"169":1}}],["человека",{"2":{"76":1}}],["человек",{"2":{"26":1,"262":1,"270":1,"457":1,"472":2}}],["черной",{"2":{"421":1}}],["черные",{"2":{"266":1}}],["черед",{"2":{"300":1}}],["через",{"0":{"501":1},"1":{"502":1},"2":{"2":1,"22":1,"34":2,"35":1,"36":1,"40":1,"41":1,"50":1,"53":2,"59":2,"86":1,"104":1,"105":1,"114":1,"115":5,"116":1,"118":1,"119":1,"134":1,"135":1,"136":1,"137":2,"138":1,"143":1,"144":1,"174":2,"201":1,"222":1,"240":1,"246":1,"247":1,"255":1,"256":2,"268":1,"270":1,"277":1,"278":1,"280":1,"282":1,"290":2,"292":1,"308":1,"315":3,"316":1,"317":1,"318":1,"327":1,"330":1,"331":1,"332":2,"354":1,"358":1,"365":2,"367":1,"374":1,"387":1,"388":1,"423":1,"425":1,"430":2,"431":1,"434":1,"446":1,"447":2,"451":1,"452":1,"455":1,"457":1,"460":2,"463":1,"471":1,"504":1,"509":1,"515":1,"547":1,"557":2}}],["черты",{"2":{"264":1,"354":1}}],["чертой",{"2":{"135":1}}],["чертежа",{"2":{"69":1}}],["чего",{"0":{"65":1},"2":{"40":1,"115":1,"181":1,"193":1,"212":1,"216":1,"346":1,"361":1,"460":1,"462":1,"463":1,"536":1}}],["четкая",{"2":{"447":1}}],["четких",{"2":{"197":1}}],["четкий",{"2":{"183":1}}],["четкую",{"2":{"130":1}}],["четкого",{"2":{"421":1}}],["четкое",{"2":{"147":1,"224":1}}],["четкость",{"2":{"118":1}}],["четко",{"2":{"9":1,"151":1,"172":1,"173":2,"237":1,"266":1,"316":1,"331":1,"361":1}}],["четырех",{"2":{"28":1,"134":1}}],["четыре",{"2":{"23":1,"105":1,"115":1,"134":1,"509":1}}],["чему",{"2":{"200":1,"246":1,"258":1,"328":1}}],["чем",{"2":{"2":1,"47":1,"105":1,"114":1,"146":1,"148":1,"152":1,"159":1,"168":1,"169":1,"172":1,"178":1,"180":3,"201":1,"214":1,"223":1,"224":1,"232":1,"239":1,"244":1,"247":1,"258":1,"269":2,"271":1,"287":1,"302":2,"303":1,"305":1,"308":3,"315":1,"320":1,"333":1,"341":1,"342":1,"344":2,"350":1,"351":1,"352":1,"353":1,"355":1,"361":1,"366":1,"367":1,"372":2,"373":1,"385":1,"391":1,"393":1,"397":1,"421":4,"433":1,"435":1,"437":1,"444":1,"455":2,"460":1,"462":1,"463":1,"468":1,"471":1}}],["кб",{"2":{"540":1}}],["киты",{"2":{"507":1}}],["кстати",{"2":{"285":1}}],["квадрат",{"2":{"263":1}}],["квадратов",{"2":{"198":1}}],["кебаба",{"2":{"198":1}}],["кем",{"2":{"148":1}}],["кэша",{"2":{"555":1}}],["кэширующий",{"2":{"463":1}}],["кэшированный",{"2":{"316":1}}],["кэширования",{"2":{"308":1,"315":1,"316":1,"451":1,"555":1}}],["кэшированием",{"2":{"315":1}}],["кэширование",{"2":{"112":1,"344":1,"473":1,"555":1}}],["кэшировать",{"2":{"308":1,"315":1,"316":2}}],["кэшу",{"2":{"316":1}}],["кэш",{"2":{"295":1,"316":8,"555":1}}],["кэшем",{"2":{"545":1}}],["кэше",{"2":{"160":1,"316":1}}],["книжка",{"2":{"472":1}}],["книга",{"0":{"401":1,"406":1},"1":{"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"367":1,"400":2,"401":1,"402":1,"403":1,"472":2,"497":1}}],["книгами",{"2":{"174":1}}],["книгу",{"0":{"403":1},"2":{"180":1}}],["книг",{"2":{"174":1}}],["книги",{"0":{"399":1,"402":1},"2":{"132":1,"143":1,"150":1,"153":1,"170":1,"171":1,"174":1,"200":1,"203":1,"223":1,"225":1,"227":1,"235":1,"237":1,"255":1,"256":1,"260":2,"267":1,"271":2,"304":2,"317":1,"358":1,"360":1,"364":1,"367":2,"371":1,"394":1,"402":1,"404":1,"405":2,"420":1,"472":2,"476":1}}],["книге",{"0":{"161":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1},"2":{"124":1,"145":1,"147":3,"148":1,"152":2,"159":1,"161":2,"167":1,"170":1,"222":2,"227":1,"247":1,"249":2,"250":1,"266":1,"268":1,"272":1,"290":1,"292":1,"297":2,"322":1,"352":1,"402":3}}],["кнопок",{"2":{"173":1,"216":1,"217":2,"255":1}}],["кнопку",{"2":{"160":1,"201":1,"223":1,"231":1,"315":2,"316":1,"323":1,"381":3,"430":1,"464":1}}],["кнопкам",{"2":{"464":1}}],["кнопками",{"2":{"255":1}}],["кнопка",{"2":{"159":1,"172":1,"178":2,"215":1,"232":1,"315":4}}],["кнопке",{"2":{"159":1,"196":1,"324":1}}],["кнопкой",{"2":{"151":1,"313":1,"328":1}}],["кнопки",{"2":{"85":2,"173":2,"178":1,"184":1,"186":1,"217":2,"255":1,"365":1}}],["куча",{"2":{"463":1}}],["кучу",{"2":{"462":1}}],["кучи",{"2":{"460":1,"536":1}}],["кулер",{"2":{"457":1}}],["кулисами",{"2":{"296":1}}],["куда",{"2":{"174":1,"256":1,"361":1,"362":1,"457":1,"462":1}}],["купить",{"0":{"403":1},"2":{"144":2,"444":1}}],["куку",{"2":{"115":1}}],["курсы",{"2":{"169":1,"472":1}}],["курсор",{"2":{"91":1,"178":1}}],["курсов",{"2":{"64":1,"472":1}}],["курс",{"2":{"2":1,"464":1,"472":1}}],["кто",{"2":{"39":1,"68":1,"171":1,"264":1,"295":1,"385":1,"461":1,"462":1,"473":1}}],["креативности",{"2":{"201":1,"385":1}}],["креативность",{"2":{"181":1}}],["крутятся",{"2":{"457":1}}],["крутится",{"2":{"190":1}}],["кругозор",{"2":{"472":1}}],["круговой",{"2":{"256":2}}],["круга",{"2":{"218":1,"507":1}}],["круглой",{"2":{"185":1}}],["кружок",{"2":{"187":1,"190":1}}],["крупнейший",{"2":{"367":1}}],["крупные",{"2":{"207":1}}],["крупных",{"2":{"116":1,"221":1,"372":1}}],["крупномасштабного",{"2":{"414":1}}],["крупного",{"2":{"149":1,"187":1}}],["крупной",{"2":{"137":1}}],["криптовалюты",{"2":{"367":3}}],["криптографическими",{"2":{"367":1}}],["криптографические",{"2":{"367":1}}],["криптографическую",{"2":{"361":1}}],["криптографии",{"2":{"366":1}}],["криптография",{"2":{"115":1}}],["критериям",{"2":{"315":1,"318":1}}],["критериями",{"2":{"39":1}}],["критике",{"2":{"232":1}}],["критика",{"0":{"232":1,"257":1},"2":{"232":1}}],["критически",{"2":{"233":1,"256":1}}],["критической",{"2":{"188":1}}],["критичных",{"2":{"115":1}}],["кроулером",{"2":{"473":1}}],["кровеносной",{"2":{"263":1}}],["кровлю",{"2":{"26":1}}],["кроссплатформенными",{"2":{"222":1}}],["крошкам",{"2":{"196":1}}],["крошки",{"0":{"196":1},"2":{"196":2}}],["кроче",{"2":{"174":1}}],["кроме",{"2":{"69":1,"102":1,"118":1,"152":3,"159":1,"192":1,"200":1,"209":1,"223":1,"228":1,"258":1,"269":1,"270":1,"286":1,"297":1,"308":3,"313":1,"315":1,"354":1,"359":1,"387":1,"419":1,"424":1,"430":1,"439":1,"445":1,"451":3,"455":1,"462":1,"463":2,"465":1,"472":1,"473":2}}],["кроется",{"2":{"68":1}}],["крайний",{"2":{"251":1}}],["крайние",{"2":{"249":1,"435":1}}],["крайних",{"2":{"235":1,"292":2,"373":1}}],["крайними",{"2":{"228":1,"358":1}}],["крайней",{"2":{"221":1,"284":1,"296":1,"301":1,"402":1}}],["красивую",{"2":{"471":1}}],["красиво",{"2":{"439":1,"473":1}}],["красивые",{"2":{"62":1}}],["красивый",{"2":{"26":1}}],["красное",{"2":{"375":1}}],["красным",{"2":{"318":1,"376":1}}],["красе",{"2":{"361":1}}],["красочный",{"2":{"205":1}}],["края",{"2":{"178":1}}],["кражей",{"2":{"115":1}}],["краткий",{"0":{"272":1},"1":{"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1},"2":{"185":1,"297":1,"335":1}}],["кратким",{"2":{"119":1,"182":1,"313":1}}],["краткосрочной",{"2":{"271":1}}],["краткости",{"2":{"239":1,"246":1,"255":2,"364":1}}],["кратковременной",{"2":{"180":1}}],["кратковременную",{"2":{"180":1}}],["кратко",{"2":{"149":1,"168":1,"326":1}}],["краткого",{"2":{"134":1}}],["краткое",{"0":{"506":1},"2":{"109":1,"229":1,"278":1}}],["краткая",{"0":{"232":1},"2":{"47":1}}],["клон",{"2":{"432":1}}],["клонирования",{"2":{"386":1}}],["клонируемого",{"2":{"432":1}}],["клонируем",{"2":{"111":1,"432":1}}],["клетки",{"2":{"263":1}}],["класть",{"2":{"452":1,"463":1}}],["классе",{"2":{"286":1}}],["классом",{"2":{"230":1,"424":1,"556":1}}],["классов",{"0":{"164":1},"2":{"22":1,"148":2,"160":1,"225":1,"226":1,"250":1,"256":1,"264":1,"266":1,"273":1,"379":1,"463":1,"464":1,"471":1,"508":1}}],["классы",{"2":{"225":1,"226":1,"227":1,"231":1,"249":2,"255":1,"297":1,"463":1}}],["класс",{"2":{"191":1,"231":1,"265":1,"268":1,"281":2,"282":2,"284":1,"287":2,"452":1}}],["классификация",{"2":{"310":1,"311":1,"312":1,"313":1}}],["классификаций",{"2":{"276":1}}],["классификаторов",{"2":{"185":1}}],["классифицируются",{"2":{"272":1}}],["классической",{"2":{"180":1}}],["классический",{"2":{"152":1,"215":1,"250":1,"472":1}}],["классически",{"2":{"67":1}}],["классических",{"2":{"47":1}}],["классическим",{"2":{"6":1}}],["классу",{"2":{"152":1,"287":1}}],["классами",{"2":{"329":1,"464":1}}],["классах",{"2":{"268":1}}],["класса",{"2":{"23":1,"256":1,"281":3,"282":1,"290":1,"293":1,"432":1,"463":1,"509":1}}],["кладем",{"2":{"292":1}}],["кладет",{"2":{"115":1}}],["кладется",{"2":{"102":1}}],["клавиатуры",{"2":{"457":1}}],["клавиатуру",{"2":{"457":1}}],["клавиатурой",{"2":{"192":1}}],["клавиатура",{"2":{"180":1}}],["клавишу",{"2":{"229":1,"231":1}}],["клавиши",{"2":{"184":1,"223":1}}],["клавиш",{"2":{"89":1,"180":1,"223":1}}],["клавишей",{"2":{"89":1}}],["ключу",{"2":{"247":1,"460":1,"536":1}}],["ключ",{"2":{"59":2,"296":1,"352":1,"361":4,"431":1,"451":1}}],["ключом",{"2":{"59":1,"247":1,"296":1,"336":1}}],["ключей",{"2":{"245":1,"367":2}}],["ключевая",{"2":{"366":1,"411":1}}],["ключевую",{"2":{"344":1}}],["ключевое",{"2":{"152":2,"303":1,"332":1}}],["ключевой",{"2":{"148":1}}],["ключевые",{"2":{"342":1,"373":1,"407":1,"427":1}}],["ключевыми",{"2":{"413":1}}],["ключевым",{"2":{"137":1,"295":1,"303":1,"323":1,"426":1}}],["ключевых",{"2":{"64":1,"133":1,"336":1,"344":1,"372":1,"373":1}}],["ключе",{"2":{"58":1}}],["ключа",{"2":{"58":1,"59":1,"247":1,"361":1}}],["климов",{"2":{"472":1}}],["клише",{"2":{"268":1}}],["клиентской",{"2":{"428":1}}],["клиентское",{"2":{"427":1}}],["клиентского",{"2":{"297":1}}],["клиентском",{"2":{"294":1}}],["клиенту",{"2":{"293":1,"360":1,"429":1,"436":1,"439":1}}],["клиенты",{"2":{"293":1,"344":1}}],["клиентов",{"2":{"171":1,"293":2}}],["клиентом",{"2":{"144":1,"296":1,"300":1,"439":1,"473":1}}],["клиентами",{"2":{"428":1}}],["клиентам",{"2":{"117":1,"395":1}}],["клиента",{"2":{"117":3,"295":3,"300":1,"362":1,"425":2,"428":1,"473":1,"511":1,"555":2}}],["клиент",{"0":{"6":1},"2":{"9":1,"68":1,"118":2,"295":2,"297":1,"361":1,"429":1,"457":2}}],["клику",{"2":{"518":1}}],["клике",{"2":{"102":1}}],["клик",{"2":{"3":1,"231":1}}],["казаться",{"2":{"473":1}}],["казалось",{"2":{"190":1}}],["капот",{"2":{"472":1}}],["капотом",{"2":{"119":1,"317":1,"376":1,"462":1}}],["кадров",{"2":{"421":2}}],["кадрами",{"2":{"421":1}}],["калькулятором",{"2":{"374":1}}],["калькулятор",{"2":{"374":1}}],["каркас",{"2":{"504":1,"506":1,"507":1,"508":1,"545":1}}],["каркаса",{"2":{"221":1,"223":2,"233":1,"508":2}}],["кардинально",{"2":{"440":1}}],["кардинальность",{"2":{"291":1}}],["карьере",{"2":{"405":1}}],["каруселей",{"2":{"189":1}}],["карусели",{"2":{"189":2}}],["каруселью",{"2":{"205":1}}],["карусель",{"0":{"189":1,"459":1},"2":{"189":3}}],["карты",{"2":{"366":1}}],["карточкой",{"2":{"408":1}}],["карточка",{"2":{"174":1}}],["карточках",{"2":{"109":1}}],["карточками",{"2":{"102":1}}],["карточки",{"2":{"108":3,"174":2,"175":1,"256":1}}],["карточке",{"0":{"102":1},"2":{"102":1}}],["картинками",{"2":{"473":1}}],["картинка",{"2":{"454":1}}],["картинки",{"2":{"452":6,"473":2}}],["картинке",{"2":{"154":1,"473":1}}],["картинок",{"2":{"109":1,"454":1}}],["картины",{"2":{"26":1,"263":1}}],["картину",{"2":{"26":1}}],["канал",{"0":{"498":1}}],["канала",{"0":{"113":1},"1":{"114":1},"2":{"352":1}}],["кандидатов",{"2":{"462":1}}],["кануть",{"2":{"171":1}}],["камне",{"2":{"148":1}}],["каскадно",{"2":{"366":1}}],["каскадные",{"2":{"147":1}}],["касается",{"2":{"352":1,"433":1,"463":1}}],["касались",{"2":{"321":1}}],["касающиеся",{"2":{"396":1}}],["касающимися",{"2":{"247":1}}],["касаются",{"2":{"68":1,"273":1,"274":1}}],["кастомные",{"2":{"471":1}}],["кастомных",{"2":{"464":1}}],["кастомными",{"2":{"455":1}}],["кастомный",{"2":{"444":1,"528":2}}],["кастомную",{"2":{"116":1}}],["кастомизированный",{"2":{"100":1}}],["кастомизировать",{"2":{"63":1}}],["кастомизацию",{"2":{"99":1,"105":1}}],["кастомизация",{"0":{"94":1},"1":{"95":1,"96":1,"97":1,"98":1,"99":1,"100":1},"2":{"504":1,"508":1,"557":1}}],["кастомизации",{"2":{"76":1,"504":1,"506":1,"545":1}}],["качество",{"2":{"69":1,"440":1,"471":1,"496":2}}],["качества",{"2":{"65":1,"69":1,"370":1,"372":1,"454":1,"472":1}}],["качественные",{"2":{"472":2}}],["качественный",{"2":{"457":1}}],["качественно",{"2":{"472":1}}],["качественного",{"2":{"370":1}}],["качественное",{"2":{"171":1}}],["качестве",{"2":{"17":1,"39":1,"122":1,"123":1,"127":1,"132":1,"134":1,"149":1,"152":1,"173":1,"193":1,"203":1,"222":1,"223":3,"229":1,"230":1,"231":1,"232":1,"244":2,"245":3,"249":1,"250":1,"252":1,"263":1,"265":1,"267":2,"277":1,"282":1,"284":1,"288":3,"289":1,"292":2,"296":2,"301":1,"302":1,"308":1,"320":1,"324":1,"332":2,"336":1,"346":1,"349":3,"352":2,"353":1,"354":1,"358":1,"363":1,"364":1,"366":1,"367":2,"368":1,"374":2,"375":1,"376":2,"380":2,"396":1,"409":1,"422":1,"423":1,"425":3,"427":1,"428":1,"429":1,"430":1,"432":1,"433":2,"434":1,"437":2,"439":1,"446":1,"463":1,"473":1,"497":1,"504":2,"511":1,"528":1}}],["кабинетом",{"2":{"59":1}}],["кабинета",{"2":{"36":1,"445":1}}],["кабинет",{"2":{"29":1,"33":1,"79":1}}],["катастрофы",{"2":{"181":1}}],["каталоги",{"2":{"346":1,"391":1}}],["каталогов",{"0":{"126":1},"2":{"119":1,"126":1,"135":3,"223":1,"224":3,"346":1,"390":1}}],["каталогом",{"2":{"11":1,"29":1,"98":1}}],["каталогу",{"2":{"95":1}}],["каталогах",{"2":{"253":1}}],["каталога",{"2":{"16":1,"79":1,"445":1}}],["каталоге",{"2":{"11":1,"108":1,"137":1,"138":1,"140":1,"223":2,"226":1,"230":1,"253":1,"331":1,"346":1,"348":1,"379":1,"380":1,"390":1,"428":1}}],["каталог",{"2":{"11":3,"33":2,"83":1,"95":2,"140":1,"141":1,"223":3,"224":2,"316":1,"346":1,"375":1,"390":1}}],["категорией",{"2":{"463":1}}],["категорически",{"2":{"250":1}}],["категоризации",{"2":{"200":1}}],["категорию",{"2":{"22":1,"43":1,"97":1,"190":1}}],["категорий",{"2":{"3":2,"4":1,"11":3,"22":1,"38":1,"56":1,"79":1,"99":1,"185":1}}],["категории",{"2":{"3":2,"4":1,"7":1,"11":2,"16":2,"22":1,"30":1,"31":1,"47":1,"56":1,"82":1,"83":1,"97":1,"108":3,"137":1,"207":1,"318":1,"344":1,"359":1}}],["категориям",{"2":{"95":1,"137":1,"194":1,"267":1}}],["категориями",{"2":{"43":1,"98":1,"464":1}}],["категориях",{"2":{"43":1,"319":1}}],["категория",{"0":{"16":1,"107":1},"1":{"108":1,"109":1},"2":{"3":1,"16":1,"83":1,"102":1,"318":1}}],["каждым",{"2":{"223":1,"232":1,"361":1,"367":1,"429":1,"473":1}}],["каждый",{"2":{"9":2,"41":1,"86":1,"115":2,"119":1,"123":2,"133":1,"134":2,"139":1,"144":1,"148":1,"152":2,"160":1,"172":2,"182":1,"192":1,"193":1,"224":1,"231":1,"256":1,"263":1,"265":1,"268":1,"281":1,"292":2,"295":1,"297":2,"311":2,"313":1,"318":1,"323":1,"324":1,"326":2,"327":1,"328":2,"331":3,"332":1,"335":1,"336":3,"344":1,"349":1,"352":1,"359":1,"361":1,"366":1,"367":1,"375":1,"385":1,"421":4,"429":1,"434":1,"435":1,"445":1,"455":1,"462":1,"463":3,"511":1}}],["каждая",{"2":{"143":1,"157":1,"173":1,"174":1,"196":1,"230":1,"250":1,"255":1,"297":1,"303":2,"315":1,"316":1,"361":2,"376":1,"385":1,"439":1,"463":1}}],["каждую",{"2":{"67":1,"151":1,"287":1,"288":1,"292":1,"321":1,"352":1,"376":1}}],["каждой",{"2":{"91":1,"102":1,"137":1,"140":1,"144":1,"171":1,"174":1,"192":1,"196":1,"221":1,"229":1,"230":1,"231":1,"297":1,"303":1,"308":1,"317":1,"318":1,"361":1,"367":1,"370":1,"376":2,"391":1,"428":1,"432":1,"433":1}}],["каждому",{"2":{"48":1,"115":1,"221":1,"249":2,"324":1,"349":1,"352":1,"354":1,"359":1,"451":1}}],["каждом",{"2":{"41":1,"86":2,"115":1,"148":1,"184":1,"225":1,"256":1,"260":2,"261":1,"268":1,"330":1,"336":2,"347":1,"355":1,"361":1,"421":1,"435":1,"445":2,"462":1}}],["каждого",{"2":{"13":1,"22":1,"78":1,"79":1,"119":1,"140":1,"144":3,"148":1,"151":1,"160":1,"169":1,"174":1,"192":1,"193":1,"200":1,"205":1,"228":1,"231":3,"239":3,"243":2,"256":1,"281":1,"313":1,"316":1,"317":1,"324":1,"328":1,"336":3,"340":1,"352":2,"355":1,"356":1,"375":1,"382":1,"386":1,"400":1,"434":1,"451":2,"455":1,"509":1,"555":1}}],["каждое",{"2":{"3":1,"69":1,"152":1,"154":1,"164":1,"256":1,"291":1,"295":1,"336":1,"381":3,"427":1,"434":1}}],["кажется",{"2":{"3":1,"152":1,"209":1,"330":1,"421":1}}],["какая",{"2":{"341":1,"383":2,"457":1}}],["какими",{"2":{"259":1}}],["каким",{"2":{"190":1,"218":1,"294":2,"320":1,"379":1}}],["каких",{"2":{"148":1,"169":1,"219":1,"302":1,"332":1,"346":1,"441":1,"473":1,"504":1,"537":1}}],["какие",{"2":{"4":1,"16":2,"22":1,"68":2,"146":3,"147":1,"150":1,"168":1,"169":1,"237":3,"239":1,"240":2,"241":2,"251":1,"259":1,"291":1,"293":1,"305":1,"306":2,"316":1,"320":1,"341":1,"350":1,"361":1,"441":2,"447":1,"458":1,"460":1,"462":1,"472":2,"501":1}}],["какую",{"2":{"23":1,"149":1,"220":1,"239":1,"397":1,"421":1,"507":1}}],["каковы",{"0":{"261":1},"2":{"169":1,"234":2,"320":2,"369":3,"441":1}}],["каком",{"2":{"116":1,"135":1,"190":1}}],["какого",{"2":{"61":1,"186":1,"198":1,"222":1,"421":1}}],["какое",{"2":{"12":1,"147":1,"330":1}}],["какой",{"2":{"3":1,"23":1,"123":1,"148":1,"149":1,"190":1,"228":1,"238":1,"244":1,"256":1,"263":1,"286":1,"287":1,"296":1,"366":1,"390":2,"454":1,"457":1,"465":1,"466":1}}],["как",{"2":{"2":1,"3":1,"9":2,"10":1,"12":1,"21":1,"22":2,"25":1,"26":1,"39":1,"43":1,"44":1,"55":2,"63":1,"68":5,"69":1,"78":1,"82":1,"83":1,"85":1,"102":1,"103":1,"105":1,"108":1,"109":1,"115":5,"116":3,"117":1,"118":4,"119":1,"121":2,"122":1,"124":3,"127":1,"128":1,"134":4,"135":1,"137":1,"140":1,"141":1,"142":1,"143":2,"145":1,"147":1,"148":8,"149":2,"150":6,"151":4,"152":13,"155":1,"156":2,"158":2,"160":1,"166":1,"169":3,"171":7,"172":4,"174":1,"175":2,"176":1,"177":2,"178":2,"179":1,"180":2,"183":1,"185":1,"186":1,"189":4,"190":1,"193":4,"194":1,"198":1,"200":4,"201":1,"203":3,"204":4,"205":2,"206":1,"207":1,"208":1,"209":3,"211":1,"216":1,"218":1,"221":2,"222":1,"223":5,"224":4,"225":6,"226":1,"227":5,"228":1,"229":1,"230":1,"231":9,"232":5,"233":2,"234":1,"235":3,"236":1,"237":3,"238":3,"239":2,"240":2,"242":1,"243":1,"244":4,"245":4,"246":3,"247":5,"248":1,"249":5,"250":1,"251":1,"254":1,"255":4,"256":9,"257":1,"258":1,"259":3,"260":2,"261":1,"263":3,"264":2,"265":3,"266":2,"267":4,"268":3,"270":2,"271":2,"281":1,"284":1,"285":1,"286":1,"287":2,"288":2,"289":2,"291":1,"292":3,"293":1,"295":5,"296":6,"297":3,"298":1,"300":1,"301":2,"302":6,"303":6,"304":2,"305":1,"306":4,"308":5,"309":2,"310":2,"311":2,"312":1,"313":2,"314":2,"315":6,"316":5,"317":1,"318":1,"319":2,"321":2,"322":1,"323":4,"324":2,"325":1,"328":1,"329":3,"330":9,"331":7,"332":3,"333":2,"335":5,"336":3,"337":1,"338":3,"339":3,"341":2,"342":4,"344":8,"345":1,"346":3,"347":3,"349":9,"351":1,"352":8,"353":1,"354":2,"355":2,"358":4,"359":2,"360":2,"361":10,"364":2,"365":2,"366":5,"367":8,"368":3,"369":2,"370":2,"372":6,"373":1,"374":2,"375":1,"376":4,"377":1,"378":3,"380":1,"381":8,"385":3,"386":1,"390":1,"391":4,"393":2,"394":4,"395":1,"396":2,"400":1,"401":1,"402":4,"409":1,"413":1,"415":1,"416":2,"419":4,"421":9,"423":4,"425":6,"427":2,"428":5,"429":2,"430":4,"432":2,"433":2,"434":5,"435":2,"437":3,"439":3,"440":1,"441":2,"445":3,"447":3,"451":2,"452":3,"454":1,"455":3,"457":3,"460":5,"461":1,"462":1,"463":8,"470":2,"471":4,"472":6,"473":10,"477":1,"479":1,"497":2,"507":2,"508":2,"509":1,"513":1,"534":1,"545":1}}],["коврике",{"2":{"473":1}}],["кошелек",{"2":{"367":3}}],["кошельки",{"2":{"367":2}}],["кошелька",{"2":{"367":6}}],["кошельками",{"2":{"367":1}}],["кошельках",{"2":{"367":1}}],["кошельков",{"2":{"367":2}}],["кошельком",{"2":{"367":2}}],["кошмар",{"2":{"23":1}}],["коем",{"2":{"276":1,"336":1,"360":1}}],["кого",{"0":{"401":1},"2":{"270":3,"295":1}}],["когда",{"0":{"278":1},"2":{"3":1,"30":1,"41":1,"62":1,"102":1,"115":4,"116":1,"117":1,"123":4,"126":1,"134":1,"137":1,"143":1,"145":1,"147":1,"148":7,"149":1,"152":3,"155":1,"156":1,"158":2,"159":1,"160":4,"174":1,"180":1,"181":1,"182":1,"183":1,"184":4,"186":1,"192":2,"193":3,"200":1,"201":1,"204":1,"205":1,"215":1,"224":2,"228":1,"231":2,"234":2,"235":1,"238":1,"240":2,"241":1,"246":4,"247":1,"248":1,"251":2,"254":1,"255":1,"257":1,"260":1,"264":2,"265":3,"267":4,"270":2,"278":4,"283":1,"286":1,"291":1,"292":1,"296":4,"297":1,"301":1,"302":2,"303":1,"304":2,"308":1,"311":1,"313":1,"314":1,"315":6,"321":1,"323":1,"328":1,"330":2,"333":2,"335":1,"336":1,"338":1,"341":1,"344":3,"349":1,"351":1,"352":2,"358":1,"359":1,"364":1,"365":2,"369":1,"372":1,"373":1,"377":1,"381":1,"382":1,"385":2,"390":1,"394":1,"397":1,"421":5,"422":1,"427":1,"429":1,"430":1,"432":2,"435":1,"437":1,"445":1,"447":1,"452":1,"460":2,"463":3,"471":1,"472":1,"473":3}}],["координирует",{"2":{"239":1}}],["координировать",{"2":{"148":1}}],["координация",{"2":{"148":1}}],["координации",{"2":{"148":1}}],["ко",{"2":{"137":2,"179":1,"224":1,"261":1,"270":1,"331":1,"378":1,"463":1,"464":1}}],["косой",{"2":{"135":1,"354":1}}],["коридоре",{"2":{"473":1}}],["коричневый",{"2":{"173":1}}],["корпоративном",{"2":{"386":1}}],["корпоративных",{"2":{"134":1,"169":1}}],["корня",{"2":{"354":1}}],["корневую",{"2":{"126":1}}],["корневом",{"2":{"138":1,"247":2,"331":1,"423":1,"446":2}}],["корневому",{"2":{"121":1}}],["корневого",{"2":{"122":1,"128":1,"238":1}}],["корневой",{"2":{"122":1,"135":1,"224":1,"247":1,"375":1,"390":2}}],["корне",{"2":{"120":1,"135":1,"139":1,"141":1,"224":1,"226":1,"310":1,"316":1,"383":1}}],["корень",{"2":{"224":1,"256":1,"316":1,"451":1}}],["коренится",{"2":{"172":1}}],["коробкой",{"2":{"472":1}}],["коробки",{"2":{"225":1,"317":1,"375":1,"379":1}}],["короче",{"2":{"189":1,"429":1}}],["коротким",{"0":{"269":1}}],["короткий",{"2":{"185":1,"188":1,"228":1,"380":1,"429":1,"472":1}}],["короткое",{"2":{"188":1,"311":1}}],["короткоживущий",{"2":{"115":1}}],["корректировку",{"2":{"495":1}}],["корректировки",{"2":{"67":1}}],["корректно",{"2":{"376":1}}],["корректном",{"2":{"224":1}}],["корректный",{"2":{"141":1,"286":1}}],["корректные",{"2":{"83":1}}],["корзину",{"0":{"209":1},"2":{"209":3}}],["корзины",{"2":{"12":1,"98":1,"206":1,"213":1,"216":1}}],["корзина",{"2":{"4":1,"29":1,"33":1,"79":1}}],["коллеги",{"2":{"472":1}}],["коллекцию",{"2":{"433":2}}],["коллекций",{"2":{"157":1,"227":1,"433":1}}],["коллекция",{"2":{"148":1,"225":1,"250":1}}],["коллекции",{"2":{"16":1,"282":1,"433":1}}],["коллизий",{"2":{"247":1}}],["коллизия",{"2":{"243":1}}],["коллизии",{"2":{"193":1}}],["коллоцированный",{"2":{"137":1}}],["количеством",{"2":{"130":1,"137":1,"344":1,"367":1,"460":1,"461":1}}],["количество",{"2":{"123":1,"146":1,"147":1,"172":1,"173":1,"179":2,"180":1,"193":1,"200":2,"211":1,"225":1,"228":1,"231":2,"238":1,"244":1,"269":1,"292":1,"336":2,"355":1,"360":1,"361":1,"364":2,"368":1,"376":2,"381":1,"421":1}}],["количества",{"2":{"115":1,"179":1,"268":1,"364":1}}],["колоночным",{"2":{"468":1}}],["колоночной",{"2":{"203":1,"471":1}}],["колонок",{"2":{"47":1,"108":1,"203":1}}],["колонки",{"2":{"203":2,"238":1}}],["колонка",{"2":{"108":1}}],["колонками",{"2":{"108":1}}],["колонтитуле",{"2":{"205":1}}],["колонтитул",{"2":{"175":1,"255":1}}],["комфорту",{"2":{"473":1}}],["комфортней",{"2":{"457":1}}],["комфортное",{"2":{"238":1}}],["комфортно",{"2":{"55":1,"69":1,"445":1,"463":1}}],["комиксах",{"2":{"186":1}}],["комбинацию",{"2":{"508":1}}],["комбинация",{"2":{"137":1,"336":1}}],["комбинаций",{"2":{"89":1}}],["коммита",{"2":{"391":1}}],["коммит",{"2":{"390":1,"393":1,"394":1,"395":1}}],["коммиты",{"2":{"143":1}}],["коммуникация",{"2":{"421":1}}],["коммуникациях",{"2":{"359":1}}],["коммуникациями",{"2":{"308":1}}],["коммуникации",{"2":{"303":1,"344":1,"360":1,"366":1,"419":1}}],["коммуникационного",{"2":{"268":1,"427":1}}],["коммуникаций",{"2":{"118":1,"361":1,"419":1}}],["комментирование",{"2":{"496":1}}],["комментарию",{"2":{"288":1}}],["комментарием",{"2":{"256":1}}],["комментариев",{"2":{"196":1,"267":1}}],["комментариями",{"2":{"115":1,"504":1}}],["комментариях",{"2":{"64":1}}],["комментарий",{"2":{"89":1,"381":1}}],["комментарии",{"2":{"86":2,"270":2,"316":1}}],["коммерческий",{"2":{"472":1}}],["коммерческих",{"2":{"134":1,"451":1}}],["коммерческого",{"2":{"144":1}}],["компетентные",{"2":{"472":1}}],["компилирует",{"2":{"395":1}}],["компиляции",{"2":{"394":1,"395":1}}],["компиляция",{"2":{"149":1}}],["комплект",{"2":{"389":1}}],["комплексное",{"2":{"115":1}}],["компаниях",{"2":{"372":1,"472":1}}],["компания",{"2":{"211":1}}],["компаниям",{"2":{"211":1}}],["компанией",{"2":{"176":1}}],["компании",{"2":{"115":1,"171":2,"204":1,"207":1,"208":1,"210":1,"211":1,"213":1}}],["компромиссов",{"0":{"241":1},"2":{"241":1}}],["компромиссы",{"2":{"148":1,"237":1,"344":2,"382":1,"385":1,"400":1}}],["компромисс",{"2":{"148":2,"227":1}}],["компромиссами",{"2":{"148":1}}],["компьютере",{"2":{"402":1,"455":1,"473":1}}],["компьютера",{"2":{"457":1}}],["компьютерах",{"2":{"308":1,"315":1}}],["компьютерам",{"2":{"269":1}}],["компьютером",{"2":{"171":1,"268":1}}],["компьютеров",{"2":{"134":3,"195":1,"203":1,"367":1,"402":1}}],["компьютеры",{"2":{"169":1}}],["компьютерного",{"2":{"169":1}}],["компьютерное",{"2":{"169":1}}],["компьютеру",{"2":{"134":1}}],["компьютер",{"2":{"134":1,"190":1,"222":1}}],["композитных",{"2":{"321":1,"330":1}}],["композитные",{"2":{"264":1}}],["композиции",{"2":{"264":1}}],["композицию",{"2":{"235":1}}],["композиция",{"0":{"235":1,"264":1,"410":1},"1":{"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1},"2":{"124":1,"150":1,"151":2,"158":1,"176":1,"229":1,"260":1,"264":1,"265":1,"267":1,"289":1,"297":1,"298":1,"325":1,"345":1}}],["композаблом",{"2":{"463":1}}],["композабле",{"2":{"103":1,"463":1}}],["композабл",{"0":{"103":1,"250":1},"1":{"251":1},"2":{"250":9,"445":1,"460":1,"463":4,"464":1}}],["композаблы",{"2":{"95":1,"464":1}}],["компонуемый",{"2":{"267":1}}],["компоновкой",{"2":{"202":1}}],["компоновки",{"2":{"126":1,"369":1}}],["компоновка",{"2":{"26":1}}],["компонентно",{"2":{"462":1}}],["компонентного",{"2":{"431":1}}],["компонентом",{"2":{"239":1,"240":1,"249":1,"254":1,"255":1,"256":1,"323":1,"336":1,"345":1,"349":1,"380":1,"381":2,"463":2}}],["компонентов",{"0":{"121":1,"151":1,"164":1,"235":1,"237":1,"323":1,"410":1},"1":{"236":1,"237":1,"238":2,"239":2,"240":2,"241":2,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"324":1,"325":1},"2":{"119":1,"121":2,"122":1,"128":1,"145":1,"147":1,"149":1,"150":2,"151":2,"152":2,"159":2,"160":5,"167":1,"176":1,"225":1,"228":2,"229":2,"232":2,"233":1,"235":4,"237":1,"238":5,"239":1,"241":2,"243":2,"244":1,"247":2,"248":1,"251":1,"252":1,"256":1,"259":1,"264":2,"265":4,"266":1,"267":1,"317":1,"321":1,"323":1,"325":2,"326":1,"328":2,"329":2,"330":1,"337":1,"345":1,"355":1,"370":1,"373":1,"374":1,"379":2,"381":1,"397":1,"410":1,"415":1,"428":1,"440":1,"456":1,"463":1,"545":1}}],["компоненту",{"2":{"120":1,"152":1,"232":1,"239":1,"246":1,"249":1,"251":1,"255":1,"299":1,"324":1,"349":1,"356":1,"380":1}}],["компоненте",{"2":{"41":1,"114":1,"124":1,"191":1,"229":1,"231":1,"232":1,"243":1,"245":2,"246":1,"247":5,"249":3,"250":1,"255":1,"256":2,"268":1,"298":1,"324":1,"330":1,"339":1,"352":2,"354":3,"355":1,"359":1,"365":1,"381":1,"430":1,"433":1,"437":1,"463":3,"538":1}}],["компоненты",{"0":{"28":1,"128":1,"160":1,"242":1,"243":1,"248":1,"251":1,"351":1},"1":{"29":1,"30":1,"31":1,"32":1,"243":1,"244":1,"245":1,"246":1,"247":1,"249":1},"2":{"23":2,"26":1,"41":1,"69":1,"95":1,"120":1,"121":1,"122":2,"128":2,"147":1,"150":2,"151":3,"152":2,"158":1,"160":2,"168":1,"224":3,"227":1,"235":2,"237":2,"238":4,"239":3,"242":1,"243":2,"244":2,"246":1,"249":1,"252":1,"254":2,"256":1,"258":2,"259":1,"264":1,"265":2,"266":3,"297":2,"299":1,"321":1,"323":4,"325":1,"326":1,"327":1,"330":1,"345":1,"346":4,"347":1,"350":2,"351":2,"355":4,"372":1,"373":3,"374":1,"378":3,"379":1,"424":1,"445":1,"446":2,"447":2,"462":2,"463":2,"464":1,"466":2,"467":1,"471":3,"508":1,"543":1,"557":1}}],["компонент",{"2":{"23":1,"36":1,"85":2,"89":1,"98":1,"100":1,"105":4,"108":1,"121":1,"122":1,"128":1,"149":2,"150":1,"151":3,"152":4,"160":7,"184":1,"193":2,"224":3,"229":2,"230":5,"232":1,"238":2,"239":2,"240":4,"243":5,"244":7,"245":2,"247":2,"249":10,"250":1,"251":5,"254":1,"255":6,"256":4,"265":9,"267":2,"268":1,"297":1,"298":1,"323":7,"325":2,"326":3,"327":1,"328":2,"330":2,"339":1,"347":1,"349":4,"351":2,"352":6,"355":4,"357":1,"363":1,"365":1,"372":1,"374":2,"380":3,"436":3,"446":2,"452":1,"454":1,"460":1,"462":3,"463":7,"466":1,"471":2,"503":1,"508":1,"543":2,"545":1,"557":1}}],["компонентам",{"2":{"127":1,"228":1,"238":1,"239":1,"246":1,"256":1,"265":1,"323":1,"345":1,"355":1,"446":1}}],["компонентами",{"0":{"466":1},"2":{"124":1,"151":1,"152":2,"158":1,"176":1,"230":1,"235":1,"239":1,"242":1,"243":2,"246":1,"247":1,"250":2,"251":1,"274":1,"275":1,"289":2,"297":1,"298":1,"322":1,"326":1,"329":1,"331":2,"333":2,"335":1,"340":1,"341":1,"345":2,"346":1,"347":1,"352":1,"375":1,"384":1,"428":1,"447":1,"501":1}}],["компонентах",{"2":{"23":1,"41":1,"114":1,"122":1,"128":1,"151":1,"152":1,"176":1,"220":1,"240":2,"243":1,"250":1,"251":1,"258":1,"259":1,"268":1,"297":1,"334":1,"337":1,"338":1,"352":2,"373":1,"382":1,"396":1,"423":1}}],["компонента",{"2":{"22":1,"122":1,"150":1,"151":4,"152":7,"160":4,"190":1,"192":1,"224":1,"225":2,"226":1,"230":2,"231":3,"234":1,"235":1,"238":1,"239":1,"241":1,"243":4,"244":1,"245":3,"246":7,"248":1,"249":3,"250":1,"251":4,"255":7,"256":1,"263":1,"265":1,"267":4,"289":1,"295":1,"298":3,"299":1,"315":4,"323":1,"324":1,"328":2,"332":1,"351":1,"352":2,"355":3,"358":1,"360":1,"374":1,"375":2,"379":1,"380":3,"381":3,"446":1,"463":4,"464":1,"471":2,"513":1,"519":1}}],["кому",{"2":{"115":1}}],["командную",{"2":{"388":1}}],["командного",{"2":{"293":1}}],["командной",{"2":{"221":1,"223":1,"224":1,"233":1,"375":1,"384":1,"386":1,"387":1,"438":1,"455":1}}],["команд",{"2":{"224":2,"293":1,"294":1,"388":1,"451":1,"462":1}}],["командой",{"2":{"176":1,"281":1,"370":1,"372":1,"373":1,"379":1,"393":1,"394":1,"415":1,"473":1}}],["командами",{"2":{"375":1}}],["командах",{"2":{"372":1}}],["команда",{"0":{"293":1},"1":{"294":1},"2":{"166":1,"247":1,"260":1,"293":1,"335":1,"346":1,"386":1,"501":1}}],["команде",{"2":{"148":1,"166":1,"171":1,"176":1,"247":1,"293":1,"427":1}}],["команды",{"2":{"102":1,"148":1,"224":1,"226":1,"243":1,"245":1,"262":1,"293":2,"294":1,"317":1,"326":1,"331":1,"359":1,"368":1,"375":2,"379":1,"383":2,"388":2,"390":2,"391":2,"392":2,"393":1,"394":1,"397":1,"429":1,"437":1}}],["команду",{"2":{"34":1,"91":1,"136":1,"223":3,"231":1,"294":1,"335":1,"346":1,"374":1,"379":1,"383":2,"389":2,"390":2,"393":1,"430":1,"434":1,"438":2}}],["коп",{"2":{"462":1}}],["копейкой",{"2":{"209":1}}],["копейку",{"2":{"209":1}}],["копируются",{"2":{"421":1}}],["копирование",{"2":{"328":1}}],["копирования",{"2":{"145":1,"455":1}}],["копировать",{"2":{"22":1}}],["копии",{"2":{"323":1,"386":1}}],["копия",{"2":{"185":1,"256":1}}],["копию",{"2":{"185":1,"231":1,"240":2,"328":2,"386":1,"391":1,"432":1}}],["копий",{"2":{"157":1,"329":1}}],["копонент",{"2":{"32":1}}],["кот",{"2":{"18":1}}],["которого",{"2":{"122":1,"152":4,"245":2,"251":1,"255":1,"267":1,"311":1,"332":2,"375":1,"421":1}}],["которое",{"2":{"122":1,"123":1,"124":1,"143":1,"144":1,"159":1,"172":1,"173":2,"179":1,"193":1,"197":1,"222":1,"230":1,"231":1,"232":1,"239":1,"244":1,"247":1,"249":1,"255":1,"296":1,"303":1,"328":1,"330":1,"335":1,"336":2,"346":2,"352":1,"361":1,"365":1,"373":2,"374":1,"380":1,"381":2,"383":1,"393":1,"394":1,"421":1,"422":2,"461":1}}],["которой",{"2":{"92":1,"140":1,"149":1,"171":1,"174":1,"180":1,"193":1,"203":1,"219":1,"224":1,"262":1,"295":1,"300":1,"317":1,"347":2,"349":1,"364":1,"376":2,"395":1,"411":1,"422":1,"425":1,"508":1}}],["котором",{"2":{"59":1,"134":1,"147":2,"151":1,"223":1,"224":1,"231":1,"244":2,"251":1,"256":1,"265":1,"294":1,"296":1,"309":1,"316":1,"317":1,"352":2,"360":1,"361":1,"367":1,"370":1,"378":1,"379":1,"421":1,"434":1,"436":1,"444":1,"460":1,"463":1}}],["которому",{"2":{"48":1,"157":1,"333":1,"337":1,"358":1,"377":1,"380":1,"439":1,"446":1}}],["которая",{"2":{"43":1,"62":1,"69":1,"102":1,"118":1,"125":2,"134":1,"137":1,"143":1,"148":1,"149":1,"152":1,"155":1,"190":1,"205":1,"224":1,"231":4,"239":1,"244":1,"250":3,"251":1,"256":2,"263":1,"287":1,"290":1,"295":1,"301":2,"303":1,"328":1,"333":1,"336":5,"338":1,"349":1,"352":1,"359":2,"367":1,"372":1,"375":2,"376":1,"380":1,"381":2,"383":1,"391":1,"425":1,"429":1,"434":1,"438":1,"462":1,"463":2,"471":1,"472":1,"473":1}}],["которым",{"2":{"16":1,"17":1,"117":1,"152":1,"166":1,"172":1,"224":1,"244":1,"250":1,"254":1,"336":1,"349":1,"352":1,"431":1,"446":3,"471":1}}],["которыми",{"2":{"3":1,"4":1,"132":1,"166":1,"179":1,"224":1,"256":1,"295":1,"419":1,"463":1}}],["которые",{"2":{"16":1,"22":1,"36":1,"47":1,"115":1,"117":1,"119":1,"123":1,"130":1,"141":1,"142":2,"145":1,"146":1,"147":5,"149":2,"150":3,"151":1,"152":4,"153":1,"156":1,"159":3,"160":3,"161":1,"171":2,"172":1,"176":2,"177":1,"181":3,"184":1,"190":1,"192":1,"193":1,"198":3,"200":1,"206":1,"209":1,"213":1,"219":2,"220":1,"221":1,"224":4,"225":3,"226":1,"227":3,"229":1,"232":1,"238":1,"239":1,"240":1,"243":2,"244":3,"245":1,"246":3,"247":1,"249":2,"250":1,"260":2,"261":2,"263":2,"266":1,"267":3,"268":2,"269":1,"271":3,"272":2,"275":1,"292":2,"297":1,"300":1,"304":1,"306":2,"308":2,"310":2,"313":1,"315":1,"316":1,"318":1,"323":1,"326":1,"328":1,"330":1,"332":1,"335":2,"336":2,"337":1,"344":1,"347":1,"350":1,"354":1,"355":2,"358":1,"360":1,"361":1,"362":1,"363":1,"364":1,"367":2,"368":1,"372":1,"373":2,"376":2,"380":1,"381":3,"391":1,"393":1,"400":2,"401":1,"419":3,"421":2,"425":1,"427":1,"433":1,"437":1,"438":1,"444":1,"445":2,"447":1,"452":1,"471":1,"472":1,"473":2,"507":1,"508":1,"557":1}}],["которых",{"2":{"12":1,"40":1,"69":1,"119":1,"130":1,"147":1,"148":1,"150":1,"152":1,"157":1,"227":1,"250":1,"255":1,"271":1,"291":1,"297":2,"311":1,"338":1,"346":1,"350":1,"353":1,"355":1,"359":1,"360":1,"364":1,"366":1,"370":1,"394":1,"462":1,"463":1,"473":1}}],["который",{"2":{"3":1,"10":1,"13":1,"35":1,"41":1,"48":1,"63":1,"91":1,"116":2,"117":2,"119":1,"134":4,"137":1,"144":3,"147":1,"148":2,"149":2,"150":1,"151":4,"152":4,"160":2,"161":1,"172":1,"175":1,"190":2,"192":1,"193":1,"195":1,"199":1,"203":2,"204":1,"208":2,"211":1,"213":1,"221":1,"222":1,"223":1,"224":3,"229":2,"230":1,"231":2,"232":1,"237":1,"239":1,"241":1,"244":5,"248":1,"249":1,"250":1,"251":2,"254":1,"255":3,"256":2,"258":1,"265":2,"270":1,"280":1,"282":1,"290":1,"293":1,"295":2,"296":3,"297":3,"298":1,"299":2,"302":1,"303":1,"308":1,"310":1,"314":1,"316":3,"317":1,"321":1,"326":3,"331":3,"333":1,"334":1,"338":2,"344":1,"345":2,"349":5,"352":2,"354":1,"355":3,"360":1,"361":1,"362":1,"363":1,"365":1,"366":1,"367":3,"372":1,"376":2,"378":1,"380":1,"381":1,"382":2,"386":1,"391":1,"409":1,"422":2,"424":1,"425":1,"426":1,"427":1,"428":2,"433":1,"434":1,"438":1,"439":1,"446":1,"452":1,"455":1,"461":1,"462":1,"463":3,"473":2}}],["которую",{"2":{"2":1,"22":1,"89":1,"149":1,"176":1,"186":1,"192":1,"214":1,"215":1,"224":1,"228":1,"256":1,"272":1,"312":1,"314":1,"328":1,"349":1,"355":1,"359":1,"361":1,"363":1,"364":1,"365":1,"376":1,"421":1,"430":1,"432":2,"451":1,"463":1,"472":1}}],["конвейера",{"0":{"427":1},"1":{"428":1,"429":1,"430":1}}],["конвейеров",{"2":{"300":1}}],["конгруэнтным",{"2":{"258":1}}],["конфликтуют",{"2":{"457":1}}],["конфликта",{"2":{"393":1}}],["конфликт",{"2":{"393":1}}],["конфликты",{"0":{"393":1},"2":{"394":1}}],["конфликтов",{"2":{"230":1,"394":1}}],["конфигом",{"2":{"457":1}}],["конфиге",{"0":{"528":1},"2":{"455":1}}],["конфигурирование",{"2":{"221":1,"542":1}}],["конфигурацией",{"2":{"317":1}}],["конфигурационного",{"2":{"451":1,"501":1}}],["конфигурационному",{"2":{"228":1}}],["конфигурационные",{"2":{"509":1}}],["конфигурационный",{"2":{"224":1,"228":1,"379":2,"515":1}}],["конфигурационных",{"2":{"132":1}}],["конфигураций",{"2":{"142":1}}],["конфигурации",{"0":{"137":1,"228":1},"1":{"138":1,"139":1,"140":1,"141":1,"142":1},"2":{"127":1,"135":1,"137":2,"140":1,"223":1,"224":1,"228":2,"265":1,"317":1,"349":1,"382":2,"446":2}}],["конфигурацию",{"2":{"127":1,"136":1,"137":2,"138":1,"141":1,"145":1,"227":1,"228":2,"375":1}}],["конфигурациях",{"2":{"473":1}}],["конфигурация",{"0":{"138":1},"1":{"139":1},"2":{"23":1,"143":1,"457":1}}],["конфиденциальности",{"2":{"219":1,"359":1}}],["конец",{"2":{"223":1,"382":2}}],["конечная",{"2":{"435":1,"439":1}}],["конечную",{"2":{"360":1,"362":1,"363":1,"366":1}}],["конечными",{"2":{"434":1}}],["конечным",{"2":{"361":1}}],["конечных",{"2":{"336":1,"361":1,"438":1}}],["конечные",{"2":{"224":1,"256":1,"439":1}}],["конечный",{"2":{"131":1,"152":1,"224":1,"229":1,"249":2,"256":2,"351":1}}],["конечной",{"2":{"209":1,"434":1}}],["конечному",{"2":{"172":1,"315":1,"366":1}}],["конечном",{"2":{"166":1,"244":1,"395":1}}],["конечного",{"2":{"69":1,"76":1,"134":1,"344":1,"395":2}}],["конечно",{"2":{"17":1,"118":1,"136":1,"229":1,"297":1,"303":1,"306":1,"318":1,"323":1,"328":1,"364":1,"367":1,"372":1,"464":1,"473":1}}],["консистентности",{"2":{"463":1}}],["консоли",{"2":{"460":1}}],["консоль",{"2":{"222":1,"296":2,"302":1,"423":1}}],["константные",{"2":{"163":1}}],["константе",{"2":{"152":1}}],["константа",{"2":{"152":2}}],["константы",{"0":{"163":1},"2":{"152":2,"231":1}}],["константу",{"2":{"152":2,"250":2,"256":1,"330":2}}],["конструкция",{"0":{"254":1},"2":{"256":1}}],["конструкциями",{"2":{"39":1}}],["конструкции",{"2":{"238":1,"463":1}}],["конструктору",{"2":{"349":1,"422":1}}],["конструктором",{"2":{"349":1}}],["конструкторов",{"2":{"231":1,"333":1,"349":1}}],["конструкторе",{"2":{"281":1,"286":1,"287":1,"292":1}}],["конструктора",{"2":{"152":1,"250":1,"255":1,"303":1,"332":1,"338":2,"355":1,"428":1,"508":2}}],["конструкторы",{"2":{"127":1,"163":1,"355":1,"358":1}}],["конструктор",{"2":{"120":2,"127":1,"136":1,"149":1,"152":3,"256":1,"295":1,"296":1,"303":1,"329":1,"330":1,"332":2,"333":1,"335":1,"349":1,"422":2,"424":1,"433":1,"439":1}}],["кончается",{"2":{"115":2}}],["кончился",{"2":{"115":1}}],["контакты",{"2":{"495":1}}],["контактов",{"2":{"218":1}}],["контактам",{"2":{"218":1}}],["контрагентами",{"2":{"462":1}}],["контрастно",{"2":{"205":1}}],["контрастах",{"2":{"205":1}}],["контраста",{"2":{"175":1}}],["контраст",{"0":{"173":1},"2":{"173":3}}],["контролируется",{"2":{"556":1}}],["контролирует",{"2":{"460":1,"462":1}}],["контролировать",{"2":{"2":1,"224":1,"289":1,"351":1}}],["контроллеров",{"2":{"246":1}}],["контроллеры",{"0":{"246":1}}],["контроля",{"0":{"370":1},"1":{"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"180":2,"181":1,"190":1,"222":2,"224":1,"232":1,"265":1,"349":1,"386":1,"415":1}}],["контроль",{"0":{"415":1},"2":{"143":1,"152":2,"181":1,"222":1,"224":1,"228":1,"244":1,"302":1,"317":1,"344":1,"384":1}}],["контейнер",{"2":{"351":1}}],["контейнера",{"2":{"193":1}}],["контенту",{"2":{"205":1}}],["контент",{"2":{"203":2,"217":1,"308":1,"473":1}}],["контентом",{"2":{"189":1,"200":1,"205":1,"257":1,"473":2,"506":1,"508":1}}],["контента",{"0":{"202":1},"1":{"203":1,"204":1,"205":1,"206":1},"2":{"147":1,"149":1,"160":1,"173":1,"189":1,"196":1,"238":1,"473":1}}],["контекстов",{"2":{"317":1}}],["контексту",{"2":{"238":1,"359":1}}],["контекст",{"2":{"228":1,"247":1,"379":1}}],["контексте",{"2":{"228":1,"260":1,"344":1}}],["контекстном",{"2":{"313":1}}],["контекстного",{"2":{"186":1,"322":1}}],["контекстные",{"2":{"186":1}}],["контекстным",{"2":{"186":1}}],["контекстных",{"2":{"186":1}}],["контекстах",{"2":{"311":1,"344":1}}],["контекста",{"2":{"89":1,"152":1,"243":1,"262":1,"272":1,"276":1,"294":1,"306":1,"313":1,"321":1,"360":1,"507":1}}],["концов",{"2":{"300":1,"316":1}}],["концом",{"2":{"297":1}}],["концу",{"2":{"147":1,"169":1,"306":2,"321":1,"342":1,"419":1,"421":1}}],["концептуально",{"2":{"424":1}}],["концептуального",{"2":{"410":1}}],["концептуальной",{"2":{"241":1}}],["концептуальных",{"2":{"419":1}}],["концептуальный",{"2":{"367":1}}],["концептуальные",{"2":{"261":1}}],["концепцией",{"2":{"148":1,"192":1,"331":1,"410":1}}],["концепций",{"2":{"147":1,"300":1,"400":1,"440":1}}],["концепция",{"2":{"147":1,"148":1,"152":1,"169":1,"175":1,"186":1,"187":1,"192":1,"200":1,"201":2,"203":1,"210":1,"222":1,"227":1,"249":1,"265":1,"266":1,"277":1,"293":1,"296":1,"366":1,"368":1,"370":1,"383":1}}],["концепциями",{"2":{"145":1,"235":1,"413":1,"426":1}}],["концепции",{"2":{"135":1,"150":1,"172":1,"174":1,"221":1,"260":1,"321":1,"322":1,"336":1,"370":1,"395":1,"396":1,"400":1,"416":1,"419":1,"427":1,"440":1,"464":1}}],["концепцию",{"2":{"134":1,"152":1,"176":1,"201":1,"205":1,"241":1,"306":1,"326":1,"344":1,"361":1}}],["конце",{"2":{"149":1,"205":1,"208":1,"224":1,"256":1,"300":1,"316":1,"372":1,"421":1}}],["концентрируемся",{"2":{"41":1}}],["конца",{"2":{"61":1,"192":1,"193":1,"360":1,"439":1}}],["конкатенируются",{"2":{"361":1}}],["конкатенированы",{"2":{"354":1}}],["конкатенировать",{"2":{"121":1}}],["конкатенации",{"2":{"361":1}}],["конкретика",{"2":{"265":1}}],["конкретную",{"2":{"265":1,"508":1}}],["конкретная",{"2":{"201":1}}],["конкретным",{"2":{"271":1}}],["конкретных",{"2":{"256":1,"308":1,"317":1,"338":1,"508":1}}],["конкретные",{"2":{"148":1}}],["конкретный",{"2":{"43":1,"435":1,"504":1}}],["конкретного",{"2":{"119":1,"179":1,"241":1,"366":1,"376":1,"447":1}}],["конкретное",{"2":{"117":1,"152":1}}],["конкретно",{"2":{"41":1}}],["конкретном",{"2":{"11":1,"148":1,"355":1,"425":1}}],["конкурируют",{"2":{"185":1}}],["конкурировать",{"2":{"147":1}}],["конкурировали",{"2":{"147":1}}],["конкурентов",{"0":{"21":1},"2":{"22":1,"171":1}}],["кодироваться",{"2":{"452":1}}],["кодирования",{"2":{"303":1,"315":1,"361":2,"372":1,"400":1}}],["кодирование",{"2":{"258":1,"284":1}}],["кодированию",{"2":{"203":1}}],["кодировке",{"2":{"361":1}}],["кодирует",{"2":{"361":1}}],["кодов",{"2":{"366":1}}],["кодовой",{"2":{"287":1,"391":1,"394":1}}],["кодовая",{"2":{"256":1,"308":1}}],["кодовых",{"2":{"161":1,"167":1,"267":1}}],["кодовые",{"0":{"161":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1},"2":{"166":1}}],["кодом",{"2":{"76":1,"116":1,"167":1,"222":1,"231":2,"250":1,"255":1,"300":1,"322":1,"350":1,"365":1,"366":1,"367":1,"370":1,"375":1,"379":1,"382":1,"385":1,"386":1,"391":1,"393":1,"427":1,"438":1}}],["кодера",{"2":{"457":1}}],["коде",{"2":{"82":1,"152":3,"166":1,"168":1,"228":1,"231":2,"241":1,"247":1,"250":1,"267":2,"283":1,"294":1,"297":1,"299":1,"303":2,"315":3,"316":1,"345":1,"352":1,"355":1,"365":1,"372":1,"375":1,"376":1,"381":1,"382":1,"385":1,"396":2,"432":1,"441":1,"462":1,"464":1,"471":1,"504":1,"509":1,"511":1,"512":1,"539":1}}],["коду",{"2":{"41":1,"229":1,"255":1,"270":1,"326":1,"352":1,"361":1,"385":1,"427":1,"433":1}}],["кода",{"0":{"404":1,"515":1},"2":{"40":1,"64":1,"92":1,"114":2,"116":1,"124":1,"125":1,"143":2,"148":2,"149":1,"150":1,"151":2,"152":6,"166":1,"222":3,"227":1,"228":1,"231":2,"232":1,"235":3,"236":1,"248":1,"250":1,"251":1,"254":1,"255":1,"256":2,"261":1,"265":1,"267":2,"268":2,"269":1,"270":1,"271":1,"286":1,"297":1,"301":2,"307":3,"310":2,"315":2,"318":2,"321":1,"331":1,"332":1,"336":1,"339":1,"342":1,"344":1,"345":1,"354":1,"355":2,"358":1,"359":1,"360":1,"361":2,"363":1,"364":1,"365":3,"366":2,"370":3,"371":1,"372":1,"376":2,"383":2,"384":2,"385":2,"386":2,"387":1,"391":3,"393":2,"396":1,"402":2,"404":1,"415":1,"420":2,"421":5,"425":1,"427":1,"429":1,"430":1,"431":1,"432":1,"437":1,"439":1,"440":1,"442":2,"451":1,"457":1,"462":3,"463":1,"465":1,"467":2,"471":2,"472":1,"473":2,"496":1,"507":1,"508":2,"511":1,"515":2}}],["код",{"0":{"270":1,"378":1,"405":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"9":1,"22":1,"77":1,"83":1,"86":1,"89":1,"103":1,"105":1,"114":2,"117":1,"118":1,"136":1,"137":1,"141":1,"146":1,"148":1,"149":2,"150":2,"152":5,"161":1,"166":1,"170":2,"184":1,"192":1,"197":1,"203":1,"222":1,"223":1,"224":5,"225":1,"227":1,"231":4,"232":1,"233":1,"235":1,"236":1,"244":2,"246":1,"250":1,"255":3,"259":1,"260":1,"267":3,"268":2,"270":6,"271":2,"280":1,"281":2,"283":2,"286":2,"296":1,"297":1,"302":1,"303":2,"307":1,"315":1,"316":2,"322":2,"328":1,"329":1,"330":1,"340":1,"343":2,"351":1,"352":3,"355":1,"360":1,"362":1,"363":1,"364":2,"365":5,"366":3,"367":3,"371":2,"372":5,"374":1,"375":2,"378":1,"380":1,"382":3,"385":2,"391":1,"393":1,"394":2,"395":1,"420":1,"421":1,"422":1,"427":1,"429":1,"430":1,"451":1,"457":1,"460":1,"467":1,"472":2,"529":1,"542":1,"556":1}}],["к",{"0":{"205":1,"315":1,"431":1},"1":{"432":1,"433":1,"434":1,"435":1,"436":1,"437":1},"2":{"2":1,"11":1,"16":1,"23":1,"26":1,"38":1,"40":2,"41":4,"50":2,"56":1,"58":1,"59":2,"63":1,"68":1,"69":1,"83":1,"95":1,"108":1,"112":1,"114":1,"115":4,"116":7,"117":6,"119":1,"120":1,"121":1,"123":6,"124":1,"127":3,"128":1,"131":2,"134":7,"135":1,"136":1,"137":4,"139":1,"141":1,"143":1,"144":4,"145":1,"147":3,"148":1,"152":19,"154":1,"158":1,"160":3,"168":1,"169":1,"171":2,"172":1,"173":1,"174":2,"175":3,"176":1,"178":1,"179":1,"180":1,"181":2,"183":1,"184":1,"188":1,"189":2,"192":1,"193":2,"194":1,"195":1,"196":2,"203":6,"204":1,"205":5,"207":3,"209":1,"217":1,"218":1,"221":1,"222":1,"224":4,"225":2,"226":1,"227":1,"228":1,"229":1,"231":3,"232":1,"233":1,"234":1,"235":1,"236":1,"237":4,"238":2,"239":1,"241":2,"243":2,"244":2,"245":1,"246":1,"249":4,"250":2,"252":3,"255":2,"256":1,"258":1,"259":1,"260":1,"264":1,"265":2,"267":3,"268":1,"270":1,"271":1,"273":1,"277":1,"278":3,"282":1,"289":2,"293":1,"295":1,"296":1,"297":2,"300":5,"301":2,"303":5,"304":1,"306":3,"308":5,"310":2,"311":1,"313":1,"315":5,"316":6,"317":1,"318":1,"319":1,"320":1,"321":2,"322":1,"323":4,"325":2,"326":1,"328":2,"330":2,"331":1,"332":3,"333":1,"335":3,"336":7,"337":1,"338":2,"339":1,"342":2,"344":3,"345":3,"346":1,"347":1,"349":2,"350":1,"351":1,"352":4,"353":1,"354":1,"355":1,"356":1,"358":3,"359":1,"360":1,"361":1,"365":3,"366":1,"367":8,"369":1,"370":3,"372":1,"373":1,"374":1,"375":1,"376":3,"377":1,"378":2,"380":6,"381":5,"385":3,"386":1,"390":1,"392":1,"394":1,"400":4,"402":2,"410":1,"419":3,"420":2,"421":7,"422":2,"423":1,"424":1,"425":5,"427":2,"428":2,"429":2,"430":2,"431":1,"432":1,"433":1,"434":1,"435":1,"439":3,"440":3,"444":2,"446":1,"452":1,"457":5,"460":1,"463":2,"464":1,"468":1,"472":3,"473":3,"498":1,"499":1,"507":1,"511":2,"512":1,"513":1,"542":1}}],["вкратце",{"2":{"321":1}}],["вкладок",{"2":{"336":1}}],["вкладка",{"2":{"215":1}}],["вкладки",{"2":{"175":1,"176":1,"336":2}}],["вклад",{"2":{"169":1,"270":1}}],["вкладывание",{"2":{"86":1}}],["включенные",{"2":{"262":1}}],["включенное",{"2":{"184":1}}],["включением",{"2":{"349":1,"436":1}}],["включение",{"2":{"227":1,"367":1,"375":1}}],["включения",{"2":{"225":1,"334":1,"346":1,"354":1,"370":1,"390":1,"391":1,"424":1,"429":1,"460":1}}],["включен",{"2":{"224":1,"243":1,"349":1,"390":1}}],["включено",{"2":{"184":2}}],["включены",{"2":{"172":1,"355":1}}],["включена",{"2":{"144":1,"203":1}}],["включив",{"2":{"379":1,"382":1}}],["включите",{"2":{"225":1,"333":1}}],["включить",{"2":{"137":1,"138":1,"224":1,"227":3,"265":1,"331":1,"346":1,"383":1,"435":1,"439":1}}],["включили",{"2":{"227":1,"349":1,"355":1,"433":1,"439":1}}],["включил",{"2":{"138":1,"504":1}}],["включим",{"2":{"112":1,"225":1,"429":1,"431":1}}],["включать",{"2":{"147":1,"225":1,"227":1,"246":1,"315":1,"355":1,"382":1,"394":1,"395":1,"426":1,"427":1,"457":1}}],["включающий",{"2":{"125":1}}],["включают",{"2":{"69":1,"244":1,"344":1,"394":1,"545":1}}],["включаем",{"2":{"351":1,"352":1}}],["включаемые",{"2":{"124":1}}],["включается",{"2":{"115":1,"301":1,"457":1}}],["включает",{"0":{"133":1,"406":1},"1":{"134":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"69":1,"70":1,"74":1,"125":1,"131":1,"137":1,"171":3,"185":1,"188":1,"198":1,"267":1,"268":1,"291":1,"372":2,"390":1,"394":1,"425":1,"434":1}}],["включая",{"2":{"47":1,"147":1,"264":1,"329":1,"455":1,"457":1,"460":1,"471":1,"545":1}}],["вмешательства",{"2":{"316":1}}],["вместе",{"2":{"118":1,"123":1,"160":1,"169":1,"195":1,"216":1,"221":1,"260":1,"269":1,"318":1,"344":1,"351":1,"355":1,"366":1,"372":1,"393":1,"419":1,"439":1,"465":1}}],["вместо",{"2":{"23":1,"117":1,"121":1,"124":1,"136":2,"150":1,"151":1,"152":1,"205":1,"227":1,"243":1,"249":1,"250":1,"260":1,"264":1,"292":1,"293":1,"297":1,"302":1,"308":1,"316":1,"325":1,"329":1,"333":1,"335":1,"336":2,"352":1,"355":1,"369":1,"373":1,"375":1,"378":1,"389":1,"424":1,"426":1,"455":1,"460":1,"473":1,"512":2,"556":1}}],["втянуть",{"2":{"207":1}}],["вторых",{"2":{"472":1}}],["вторым",{"2":{"376":1}}],["вторично",{"2":{"457":1}}],["вторичным",{"2":{"186":1}}],["вторичный",{"2":{"173":1,"366":1}}],["вторую",{"2":{"439":1}}],["вторая",{"2":{"123":1,"267":1,"421":1}}],["второго",{"2":{"368":1,"380":1}}],["второе",{"2":{"231":1,"365":1,"366":1}}],["втором",{"2":{"115":2,"295":1,"349":1}}],["второстепенных",{"2":{"17":1}}],["второй",{"2":{"17":1,"53":1,"56":1,"58":1,"67":1,"245":1,"281":1,"315":1,"349":1,"366":1,"370":1,"376":2,"435":1,"457":3,"534":1}}],["впрочем",{"2":{"539":1}}],["впредь",{"2":{"319":1}}],["впечатляющей",{"2":{"431":1}}],["впечатляющее",{"2":{"355":1}}],["впечатление",{"2":{"190":1,"192":1,"496":1,"507":1}}],["впервые",{"2":{"394":1}}],["вперёд",{"2":{"344":1}}],["вперед",{"2":{"159":1,"232":1,"304":1,"311":1,"316":1,"330":1,"358":1,"364":1,"392":1}}],["вплоть",{"2":{"148":1,"249":1,"263":1,"379":1,"384":1}}],["вполне",{"2":{"4":1,"59":1,"115":1,"130":1,"223":1,"328":1,"359":1,"360":1,"361":1,"394":1,"434":1,"462":1,"463":1,"472":1,"507":1}}],["входе",{"2":{"473":1}}],["входящего",{"2":{"374":1,"425":1}}],["входящих",{"2":{"376":1,"428":1,"429":1}}],["входящий",{"2":{"139":1}}],["входящие",{"2":{"138":1,"266":1}}],["входят",{"2":{"313":1}}],["входы",{"2":{"298":1,"373":1}}],["вход",{"2":{"297":1,"363":2}}],["входной",{"2":{"298":1}}],["входного",{"2":{"244":1,"374":1}}],["входных",{"2":{"282":1,"290":1,"372":1}}],["входные",{"2":{"239":1,"295":1}}],["входными",{"2":{"232":1}}],["входным",{"2":{"124":1}}],["входов",{"0":{"240":1},"2":{"372":1}}],["входить",{"2":{"237":1,"297":1}}],["входит",{"2":{"117":1,"143":1,"176":1,"364":1,"389":1,"496":1}}],["входа",{"2":{"29":1,"137":1,"151":1,"265":4,"293":1,"364":1,"425":1,"427":1,"462":1,"473":1}}],["вузах",{"2":{"65":1}}],["владельцем",{"2":{"323":1}}],["властвуй",{"2":{"2":1}}],["вложенных",{"0":{"354":1},"2":{"355":1,"447":1}}],["вложенные",{"0":{"353":1},"1":{"354":1,"355":1},"2":{"358":1}}],["вложенном",{"2":{"247":1}}],["вложенному",{"2":{"246":1}}],["вложенного",{"2":{"196":1}}],["вложены",{"2":{"207":1}}],["вложений",{"2":{"62":1}}],["влиять",{"2":{"261":1}}],["влияющий",{"2":{"302":1}}],["влияющее",{"2":{"187":1}}],["влияют",{"2":{"171":1,"267":1,"275":1}}],["влияет",{"2":{"153":1,"184":1,"421":1,"465":1}}],["влияние",{"2":{"69":1,"206":1}}],["вязала",{"2":{"62":1}}],["вновь",{"2":{"422":1,"471":1}}],["вносит",{"2":{"471":1}}],["вносится",{"2":{"370":1}}],["вносите",{"2":{"270":1}}],["вносить",{"2":{"228":1}}],["вносят",{"2":{"147":1}}],["внуку",{"2":{"325":1}}],["внушительная",{"2":{"250":1}}],["внушительное",{"2":{"200":1}}],["внучатому",{"2":{"246":1}}],["внутрь",{"2":{"355":1,"457":1}}],["внутренняя",{"2":{"297":1}}],["внутреннюю",{"2":{"250":1,"328":1}}],["внутренне",{"2":{"297":1}}],["внутреннего",{"2":{"287":1,"292":1,"338":1,"472":1}}],["внутреннее",{"2":{"254":1,"255":2,"335":1}}],["внутренней",{"2":{"160":1,"223":1,"295":1,"319":1,"328":1}}],["внутреннему",{"2":{"284":1,"287":1,"361":1}}],["внутреннем",{"2":{"152":1,"338":1}}],["внутренний",{"2":{"267":1,"338":1,"365":1,"447":1}}],["внутренним",{"2":{"266":1,"297":1,"337":1,"367":1}}],["внутренними",{"2":{"123":1}}],["внутренних",{"2":{"160":1,"169":1,"245":1,"373":1,"432":1}}],["внутренние",{"2":{"125":1,"330":1,"462":1}}],["внутри",{"2":{"48":1,"128":1,"135":1,"148":3,"149":2,"157":1,"184":1,"185":1,"198":1,"203":2,"224":2,"228":2,"230":1,"231":4,"234":1,"244":1,"246":1,"249":2,"253":1,"263":1,"289":1,"298":1,"302":1,"303":2,"308":1,"315":1,"332":1,"333":1,"338":1,"360":1,"363":1,"364":1,"376":3,"419":1,"423":1,"446":1,"452":1,"460":3,"463":1,"542":1,"549":1}}],["вниз",{"2":{"192":1,"205":1,"301":1,"325":1,"497":1,"534":1}}],["внизу",{"2":{"33":1,"188":1,"193":1}}],["внимательно",{"0":{"175":1}}],["вниманию",{"2":{"188":1}}],["внимания",{"2":{"131":2,"187":1,"188":1,"217":1,"287":1}}],["внимание",{"2":{"105":1,"122":1,"123":1,"136":1,"139":1,"147":1,"148":1,"149":3,"151":1,"152":1,"173":2,"175":1,"176":1,"187":1,"200":1,"203":1,"205":2,"208":1,"224":1,"230":2,"231":3,"246":1,"255":1,"256":3,"281":1,"291":1,"296":2,"301":1,"303":1,"308":1,"319":1,"323":1,"325":1,"328":1,"332":1,"335":1,"349":2,"352":1,"355":1,"361":1,"365":1,"376":1,"378":1,"381":3,"391":1,"402":1,"421":2,"423":1,"432":1,"435":1}}],["внедрить",{"2":{"316":1,"349":1,"446":1}}],["внедрена",{"2":{"247":1}}],["внедрения",{"2":{"221":1,"306":1,"317":1,"422":1}}],["внедрении",{"2":{"217":1}}],["внедряйте",{"2":{"446":1}}],["внедряют",{"2":{"224":1,"367":1}}],["внедрять",{"2":{"53":1,"193":1,"225":1}}],["внесите",{"0":{"495":1}}],["внесения",{"2":{"495":1}}],["внесение",{"2":{"385":1}}],["внесенных",{"2":{"148":1}}],["внесем",{"2":{"223":1}}],["внесли",{"2":{"169":1,"330":1}}],["внести",{"2":{"40":1,"146":1,"269":1,"370":1}}],["внешней",{"2":{"463":1}}],["внешнего",{"2":{"147":1,"225":1,"297":1}}],["внешних",{"2":{"373":1}}],["внешние",{"2":{"265":1}}],["внешний",{"2":{"147":1,"226":1,"308":1,"351":1,"365":1,"447":1}}],["вне",{"2":{"128":1,"222":1,"248":1,"301":1,"308":1}}],["вредными",{"2":{"472":1}}],["вредоносные",{"2":{"207":1}}],["времена",{"2":{"471":1}}],["временами",{"2":{"147":1}}],["временно",{"2":{"460":1,"463":1}}],["временной",{"2":{"421":1}}],["временное",{"2":{"117":1}}],["временных",{"2":{"373":1}}],["временным",{"2":{"204":1}}],["временная",{"2":{"361":1}}],["временем",{"2":{"152":1,"291":1,"451":1}}],["времени",{"2":{"62":1,"93":1,"125":1,"134":1,"152":1,"179":2,"183":1,"190":2,"229":1,"250":1,"296":1,"300":1,"301":1,"302":1,"336":1,"344":3,"365":6,"366":1,"384":1,"421":4,"461":1,"467":1,"471":1,"472":1}}],["время",{"0":{"460":1},"2":{"105":1,"112":1,"122":1,"127":1,"134":3,"137":1,"143":1,"148":2,"149":2,"150":1,"152":1,"160":1,"178":1,"179":3,"180":1,"183":1,"188":1,"196":1,"199":1,"205":1,"211":1,"223":1,"224":3,"227":1,"231":1,"232":1,"238":1,"241":1,"244":3,"249":1,"255":2,"256":1,"258":1,"270":1,"284":1,"295":1,"297":1,"298":1,"302":1,"303":2,"315":3,"326":1,"337":1,"340":2,"349":1,"352":2,"358":1,"365":1,"367":1,"368":1,"370":2,"372":1,"374":1,"375":1,"376":1,"384":1,"385":1,"394":1,"400":1,"427":1,"428":1,"430":1,"433":1,"457":1,"460":1,"461":5,"463":1,"464":1,"465":1,"467":1,"472":1,"507":1,"536":1,"542":1}}],["вращение",{"2":{"191":1}}],["вращающихся",{"2":{"191":1,"457":1}}],["вроде",{"2":{"62":1,"109":1,"463":1,"473":1}}],["вручную",{"2":{"38":1,"144":1,"267":2,"306":1,"316":1,"319":1,"372":1,"379":1}}],["вряд",{"2":{"26":1,"370":1,"472":1}}],["взяли",{"2":{"464":1}}],["взяв",{"2":{"462":1}}],["взята",{"2":{"227":1}}],["взять",{"2":{"4":1,"143":1,"148":1,"238":1,"344":1,"374":1,"454":1,"507":1}}],["взлетевших",{"2":{"462":1}}],["взлететь",{"2":{"457":1}}],["взломают",{"2":{"366":1}}],["взглянув",{"2":{"258":1}}],["взглянуть",{"2":{"27":1,"118":1,"256":1}}],["взгляда",{"2":{"169":1,"172":1,"182":1,"198":1}}],["взгляд",{"2":{"152":1,"171":1,"200":1,"204":1,"271":1,"297":1,"303":1,"354":1}}],["взвесить",{"2":{"148":1}}],["взаимоотношения",{"2":{"275":1}}],["взаимопониманием",{"2":{"219":1}}],["взаимозаменяемые",{"2":{"148":1,"302":1}}],["взаимодействуем",{"2":{"344":1}}],["взаимодействует",{"2":{"34":1,"171":1,"181":1}}],["взаимодействуют",{"2":{"321":1,"419":1,"447":1}}],["взаимодействовать",{"2":{"197":1,"237":1,"239":2,"241":1,"255":1,"258":1,"259":1,"319":1,"367":1,"381":1,"441":1}}],["взаимодействии",{"2":{"323":1,"372":1}}],["взаимодействию",{"2":{"300":1}}],["взаимодействие",{"0":{"323":1},"1":{"324":1,"325":1},"2":{"171":1,"231":2,"239":1,"240":2,"244":1,"254":1,"255":1,"278":1,"300":3,"367":1,"372":2,"381":1,"419":1,"426":1,"434":1}}],["взаимодействием",{"2":{"69":1,"194":1,"232":1,"239":1,"240":1,"316":1}}],["взаимодействий",{"0":{"239":1},"2":{"147":1,"181":1,"300":1,"344":1,"359":2,"373":2,"438":1}}],["взаимодействия",{"0":{"194":1,"427":1},"1":{"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"428":1,"429":1,"430":1},"2":{"69":1,"169":2,"171":2,"181":1,"198":1,"204":1,"207":1,"235":1,"239":1,"250":1,"268":1,"271":1,"274":1,"323":2,"342":1,"359":1,"366":1,"367":1,"370":1,"381":1,"383":1,"384":1,"422":1,"426":1,"427":1,"436":1,"464":1}}],["взаимосвязаны",{"2":{"305":1}}],["взаимосвязь",{"2":{"295":1}}],["взаимосвязи",{"2":{"69":1,"370":1}}],["взаимосвязей",{"2":{"68":1,"384":1}}],["вентиляторов",{"2":{"457":1}}],["вело",{"2":{"306":1}}],["велосипед",{"2":{"225":1,"260":1,"292":1,"300":1}}],["великолепным",{"2":{"151":1}}],["ведение",{"2":{"360":1}}],["ведется",{"2":{"211":1,"367":1}}],["ведет",{"2":{"159":1,"295":1,"349":1,"400":1}}],["ведь",{"2":{"352":1,"375":1}}],["ведома",{"2":{"211":1}}],["ведут",{"2":{"156":1,"157":1,"185":1,"249":1,"358":1}}],["ведущие",{"2":{"134":1,"150":1}}],["веток",{"2":{"393":1}}],["ветвью",{"2":{"473":1}}],["ветвей",{"2":{"392":1}}],["ветвями",{"0":{"392":1},"2":{"392":1,"393":1}}],["ветвление",{"2":{"391":1}}],["ветви",{"2":{"130":1}}],["ветки",{"2":{"391":1,"392":4,"393":1,"451":2,"527":1}}],["веткой",{"2":{"391":1,"393":1}}],["ветке",{"2":{"391":2,"392":1,"393":1,"397":1,"527":1}}],["ветку",{"2":{"143":1,"392":3,"393":2,"394":2,"451":2,"527":2}}],["ветках",{"2":{"397":1,"463":1}}],["ветка",{"2":{"112":1,"391":2}}],["вещах",{"2":{"149":1,"421":1}}],["вещи",{"2":{"116":1,"172":1,"380":1,"460":1,"536":1}}],["вещь",{"2":{"25":1,"225":1,"227":1}}],["везде",{"2":{"95":1}}],["веса",{"2":{"471":1}}],["вести",{"2":{"337":1,"473":1}}],["вестись",{"2":{"61":1,"79":1}}],["веских",{"2":{"295":1}}],["весомых",{"2":{"195":1}}],["вес",{"2":{"109":1,"175":1}}],["весьма",{"2":{"98":1,"148":1,"216":1,"328":1,"367":1,"440":1,"539":1}}],["весь",{"2":{"55":1,"123":1,"150":1,"152":1,"192":1,"218":1,"250":1,"268":1,"300":1,"316":1,"344":2,"393":1,"427":1,"555":1}}],["верен",{"2":{"473":1}}],["вероятно",{"2":{"393":1}}],["вероятность",{"2":{"79":1,"148":1,"308":1,"445":1,"461":1}}],["верстку",{"2":{"471":1}}],["верстки",{"2":{"256":1,"504":1}}],["верстать",{"2":{"468":1,"471":1}}],["версионность",{"2":{"445":1,"555":1}}],["версионности",{"2":{"71":1}}],["версией",{"2":{"390":1}}],["версию",{"2":{"222":1,"224":1,"342":1,"387":1,"390":1,"433":1,"451":1,"472":1,"473":1,"545":1}}],["версий",{"0":{"370":1},"1":{"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"35":1,"134":1,"222":2,"395":2,"415":1}}],["версиях",{"2":{"224":1}}],["версиями",{"2":{"86":1,"119":1}}],["версия",{"0":{"33":1},"2":{"80":1,"127":1,"147":1,"222":3,"257":1,"388":1,"400":1,"511":1}}],["версии",{"2":{"29":1,"30":1,"33":2,"47":1,"224":1,"251":1,"295":1,"335":1,"378":1,"451":2,"555":1}}],["вертикали",{"2":{"239":1}}],["вертикальный",{"2":{"250":1}}],["вертикальные",{"2":{"174":1,"198":1}}],["вертикального",{"2":{"203":1}}],["вертикальной",{"2":{"203":1,"250":1}}],["верхняя",{"2":{"542":1}}],["верхний",{"2":{"509":1}}],["верхнее",{"2":{"203":1}}],["верхней",{"2":{"174":1,"192":1,"195":1,"196":1,"203":1,"204":1}}],["верхнем",{"2":{"172":2,"200":1,"204":1,"318":2}}],["верхнего",{"2":{"120":1,"134":3,"146":1,"164":1,"238":1,"249":1,"346":1,"347":1}}],["верха",{"2":{"205":1,"224":1,"349":1}}],["вернулся",{"2":{"471":1}}],["вернуть",{"2":{"152":1,"302":1,"303":1,"367":1,"433":1}}],["вернуться",{"2":{"67":1,"196":1,"316":2,"347":1,"385":2}}],["верно",{"2":{"231":1}}],["верное",{"2":{"148":1}}],["вернемся",{"2":{"255":2,"297":1}}],["вернетесь",{"2":{"270":1}}],["вернет",{"2":{"117":1,"256":1,"333":1,"380":1}}],["вернее",{"2":{"25":1}}],["вебприложения",{"2":{"507":1,"508":1}}],["вебприложение",{"2":{"504":1}}],["веба",{"2":{"471":1}}],["вебсайта",{"2":{"451":1,"496":1,"507":1,"508":1}}],["вебсайт",{"2":{"451":1,"506":1}}],["вебсайты",{"2":{"21":1}}],["вебсервер",{"2":{"444":1,"457":1,"473":1}}],["вебсервере",{"2":{"444":1}}],["вебсервера",{"2":{"117":1,"457":1}}],["веб",{"0":{"133":1,"137":1,"144":1,"149":1,"306":1,"412":1,"427":1,"502":1},"1":{"134":1,"138":1,"139":1,"140":1,"141":1,"142":1,"150":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"428":1,"429":1,"430":1},"2":{"3":1,"11":2,"117":2,"131":5,"133":2,"134":3,"135":3,"136":2,"137":10,"138":1,"139":1,"143":1,"144":5,"145":1,"146":4,"147":4,"148":2,"149":2,"150":2,"151":1,"154":1,"157":1,"169":2,"171":1,"172":1,"188":1,"190":1,"192":1,"193":1,"196":1,"200":1,"219":1,"221":2,"222":2,"223":1,"224":5,"225":1,"227":3,"232":2,"235":3,"237":1,"256":1,"263":2,"265":1,"267":1,"268":2,"269":2,"276":1,"294":1,"300":3,"306":3,"308":13,"313":1,"314":1,"315":1,"317":3,"318":1,"319":1,"320":2,"321":1,"335":1,"336":2,"344":8,"349":1,"356":1,"359":2,"365":1,"367":2,"368":2,"383":1,"384":1,"394":1,"395":1,"401":1,"402":3,"410":1,"411":1,"419":3,"421":5,"426":1,"430":1,"434":2,"438":1,"440":2,"441":1,"445":1,"457":1,"461":1,"464":1,"473":3,"504":1,"506":1,"507":1,"508":2}}],["вдохновения",{"2":{"22":1}}],["вводе",{"2":{"462":1}}],["вводя",{"2":{"381":1}}],["вводом",{"2":{"246":1}}],["вводились",{"2":{"462":1}}],["вводился",{"2":{"325":1}}],["вводим",{"2":{"344":1}}],["вводимых",{"2":{"231":1}}],["вводит",{"2":{"158":1,"365":1}}],["вводить",{"2":{"2":1,"183":1,"227":1,"229":1,"465":1}}],["ввод",{"2":{"231":1,"239":2,"381":1}}],["вводы",{"2":{"185":1}}],["ввода",{"0":{"183":1,"246":1},"1":{"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1},"2":{"158":1,"183":1,"185":1,"229":2,"231":7,"232":1,"241":1,"246":3,"251":1,"256":1,"339":1,"347":1,"365":6,"501":1}}],["вверх",{"2":{"247":1,"284":1,"323":1,"325":1}}],["вверху",{"2":{"188":1}}],["ввели",{"2":{"223":2,"241":1,"369":1,"381":1}}],["введи",{"2":{"464":1}}],["введите",{"2":{"223":5,"375":1,"495":1}}],["введём",{"2":{"393":1}}],["введет",{"2":{"365":1}}],["введенный",{"2":{"460":1}}],["введенных",{"2":{"337":1}}],["введенная",{"2":{"176":1}}],["введен",{"2":{"269":1}}],["введении",{"2":{"372":1}}],["введением",{"2":{"370":1}}],["введение",{"0":{"421":1},"1":{"422":1,"423":1,"424":1},"2":{"266":1,"394":1}}],["введения",{"2":{"134":1,"180":1}}],["введем",{"2":{"149":1,"438":1}}],["ввести",{"2":{"16":1,"183":1,"223":1,"229":1,"365":1,"375":1}}],["ввиду",{"2":{"4":1}}],["валидаций",{"2":{"376":1}}],["валидацией",{"2":{"367":1}}],["валидация",{"2":{"295":1,"365":2,"463":1}}],["валиден",{"2":{"115":1}}],["важен",{"2":{"181":1,"224":1,"266":1,"269":1,"270":1,"289":1,"305":1}}],["важнейших",{"2":{"373":1}}],["важнее",{"2":{"201":1,"344":1}}],["важна",{"2":{"171":1}}],["важная",{"2":{"40":1,"130":1,"368":1,"433":1}}],["важный",{"2":{"255":1,"263":1,"277":1,"303":1,"321":1,"356":1}}],["важны",{"2":{"168":1,"190":1,"461":1}}],["важные",{"2":{"145":1,"148":1,"219":1,"304":1,"358":1,"370":1,"396":1,"407":1,"419":1,"470":1}}],["важными",{"2":{"145":1,"178":1,"219":1,"360":1}}],["важных",{"2":{"69":1,"149":1,"224":1,"277":1,"301":1,"355":1,"440":1}}],["важной",{"2":{"192":1,"205":1,"223":1,"385":1,"391":1}}],["важного",{"2":{"188":1}}],["важное",{"2":{"184":1,"255":1}}],["важность",{"2":{"175":1}}],["важно",{"2":{"144":1,"150":1,"151":1,"152":1,"155":1,"166":2,"174":2,"193":1,"195":1,"199":1,"205":1,"231":1,"250":1,"267":1,"270":1,"291":1,"294":1,"301":1,"305":1,"308":1,"315":1,"344":1,"360":1,"361":1,"385":1,"394":1,"397":1,"433":1,"439":1}}],["ванильному",{"2":{"152":1}}],["варьироваться",{"2":{"216":1}}],["варьируются",{"2":{"134":1}}],["вариаций",{"2":{"291":1}}],["вариациями",{"2":{"271":1}}],["вариации",{"2":{"185":1}}],["вариантом",{"2":{"143":1,"196":1,"200":1,"234":1,"359":1}}],["вариантов",{"2":{"115":1,"137":2,"143":2,"148":1,"149":1,"179":2,"183":1,"184":1,"196":1,"197":1,"198":1,"200":1,"222":1,"228":1,"455":1,"508":2,"544":1,"545":2}}],["варианте",{"2":{"108":1,"230":1,"403":1}}],["варианту",{"2":{"105":1}}],["вариантам",{"2":{"418":1}}],["вариантами",{"2":{"223":1,"227":1,"337":1}}],["вариантах",{"2":{"145":1,"184":1,"195":1,"364":1}}],["варианта",{"2":{"59":1,"105":1,"123":1,"144":2,"235":1,"472":1,"508":2}}],["варианты",{"0":{"116":1,"152":1},"2":{"16":1,"115":1,"119":1,"137":1,"146":1,"147":1,"194":1,"213":1,"295":1,"315":1,"330":1,"336":1,"381":1,"431":1,"444":1,"545":1}}],["вариант",{"2":{"4":2,"17":1,"118":1,"148":2,"184":2,"212":2,"213":1,"222":2,"223":1,"224":1,"243":1,"281":1,"315":1,"349":1,"425":1,"460":1,"472":1}}],["вами",{"2":{"223":2,"231":1}}],["вам",{"2":{"119":2,"123":1,"125":3,"131":1,"135":1,"145":1,"148":4,"149":1,"151":1,"152":2,"161":1,"168":2,"172":1,"176":1,"206":1,"219":1,"220":1,"222":1,"223":1,"249":1,"256":2,"260":3,"267":2,"270":2,"295":4,"304":2,"307":1,"322":1,"325":1,"336":1,"342":1,"387":1,"388":1,"390":1,"400":3,"405":2,"431":1,"444":1,"447":1,"452":1,"455":1,"465":1,"471":1,"472":1,"473":1}}],["вас",{"2":{"119":1,"151":1,"168":1,"180":1,"204":1,"251":1,"253":1,"267":1,"270":1,"303":1,"375":1,"376":1,"389":2,"394":1,"435":1,"460":1,"463":1,"528":2}}],["васи",{"2":{"115":1}}],["вася",{"2":{"115":1}}],["ваши",{"2":{"346":1,"463":1}}],["ваших",{"2":{"176":1,"431":1}}],["ваша",{"2":{"166":1}}],["ваше",{"2":{"148":1,"270":1,"400":1,"421":1,"452":1,"465":1,"495":1,"529":1}}],["вашей",{"2":{"134":1,"148":1,"223":1,"281":1,"287":1,"328":1,"391":1}}],["вашего",{"2":{"117":1,"119":2,"124":1,"134":2,"148":1,"160":1,"223":2,"224":1,"225":1,"271":1,"275":1,"304":1,"316":1,"321":2,"336":1,"421":1,"444":1,"446":1,"447":1,"451":2,"465":2,"467":1,"473":1,"527":1,"528":1,"554":1,"556":2}}],["вашему",{"2":{"114":1,"223":1,"367":1,"441":1,"444":2,"463":1}}],["вашем",{"2":{"114":1,"271":1,"394":1,"402":1,"452":1,"473":1}}],["вашу",{"2":{"114":1,"148":1,"387":1,"388":1}}],["ваш",{"2":{"4":1,"116":1,"134":1,"148":1,"149":1,"166":1,"224":1,"225":1,"390":1,"451":2,"452":1,"460":1,"470":1,"472":1,"473":2,"527":1}}],["всплывающем",{"2":{"198":1,"215":1}}],["всплывающего",{"2":{"198":2}}],["всплывающей",{"2":{"186":2}}],["всплывающее",{"2":{"186":1}}],["всплывающая",{"2":{"186":1}}],["вспомним",{"2":{"301":1}}],["вспомнить",{"2":{"225":1}}],["вспомните",{"2":{"171":1,"366":1}}],["вспоминать",{"2":{"281":1}}],["вспомогательный",{"2":{"329":1}}],["вспомогательные",{"2":{"4":1,"296":1}}],["вспомогательная",{"2":{"231":1,"239":1,"256":2}}],["вскоре",{"2":{"147":1,"176":1,"223":1,"345":1,"421":1}}],["всю",{"2":{"143":1,"195":1,"216":1,"227":1,"231":1,"235":1,"255":1,"271":1,"360":1,"367":1,"373":1,"375":1,"421":1}}],["встающих",{"2":{"507":1}}],["вставке",{"2":{"160":1}}],["вставать",{"2":{"4":1}}],["вступает",{"2":{"150":1}}],["встретит",{"2":{"375":1}}],["встретить",{"2":{"161":1,"166":1,"198":1,"217":1,"265":1,"331":1}}],["встречал",{"2":{"472":1}}],["встречали",{"2":{"353":1}}],["встречающихся",{"2":{"401":1}}],["встречающиеся",{"2":{"134":1,"271":1}}],["встречаются",{"2":{"260":1,"271":1,"272":1}}],["встречается",{"2":{"196":1,"209":1,"210":1,"221":1,"265":1,"300":1}}],["встречавшейся",{"2":{"170":1}}],["встроенную",{"2":{"431":1}}],["встроенная",{"2":{"419":1}}],["встроенным",{"2":{"243":1}}],["встроенный",{"2":{"222":1,"295":1}}],["встроенные",{"0":{"160":1}}],["встроенных",{"0":{"153":1},"1":{"154":1,"155":1,"156":1,"157":1,"158":1,"159":1},"2":{"159":1,"160":1,"361":1}}],["встроенного",{"2":{"147":1}}],["всячески",{"2":{"495":1}}],["всяких",{"2":{"473":1}}],["вся",{"2":{"114":1,"136":1,"144":1,"349":1,"366":1,"375":1,"471":1,"503":1,"548":1}}],["всевозможных",{"2":{"472":1}}],["всей",{"2":{"137":1,"150":1,"216":1,"223":1,"247":2,"287":1,"344":1,"361":1,"367":1,"378":1,"556":1}}],["всеми",{"2":{"224":1,"227":1,"231":1,"331":1,"335":1,"347":1,"361":1,"394":1,"473":3}}],["всемирная",{"2":{"147":1}}],["всем",{"2":{"69":1,"117":2,"137":1,"247":1,"268":1,"277":1,"288":1,"316":1,"329":1,"402":1,"460":1,"464":1}}],["всему",{"2":{"41":1,"103":1,"151":1,"224":1,"256":1,"261":1,"267":1,"330":1,"331":1,"335":1,"349":1,"385":1,"445":1,"463":2}}],["всех",{"2":{"38":1,"56":1,"86":1,"117":1,"119":2,"122":1,"166":1,"174":1,"231":2,"243":1,"245":1,"287":1,"300":1,"302":1,"308":1,"316":1,"329":1,"336":1,"361":1,"364":1,"366":1,"375":1,"376":2,"386":1,"388":1,"397":2,"402":1,"421":2,"435":1,"439":1,"454":1,"462":2,"473":1,"499":1,"503":1}}],["все",{"2":{"36":1,"47":1,"59":1,"83":1,"95":1,"100":1,"102":1,"112":1,"115":1,"122":2,"125":1,"131":1,"133":1,"134":2,"135":1,"137":3,"144":2,"147":3,"148":1,"149":1,"150":1,"151":2,"152":5,"155":1,"159":1,"160":1,"161":1,"166":2,"167":1,"172":2,"174":1,"176":1,"178":1,"180":1,"189":1,"193":1,"200":1,"205":1,"207":1,"219":1,"222":3,"227":4,"229":1,"231":6,"232":3,"244":3,"246":1,"256":1,"257":1,"265":1,"269":1,"277":1,"287":1,"289":2,"297":1,"303":1,"308":3,"310":2,"311":1,"315":2,"316":1,"318":1,"323":2,"324":1,"328":1,"331":1,"335":1,"336":4,"338":1,"340":1,"344":2,"349":1,"355":1,"360":4,"367":4,"368":1,"372":1,"373":1,"375":1,"376":2,"377":1,"378":1,"379":1,"381":1,"390":4,"392":1,"393":1,"394":1,"396":2,"400":1,"421":3,"425":1,"430":1,"431":1,"433":1,"445":1,"460":1,"462":1,"463":2,"471":1,"472":1,"473":1,"513":1,"530":1,"543":1,"557":1}}],["всего",{"2":{"29":1,"34":1,"79":1,"82":1,"115":1,"116":1,"121":1,"134":1,"136":1,"137":1,"154":1,"171":1,"181":2,"182":1,"189":1,"209":1,"231":1,"238":1,"255":1,"256":1,"260":1,"267":2,"268":2,"270":2,"272":1,"308":1,"334":1,"358":1,"360":1,"374":1,"376":1,"420":1,"421":2,"428":1,"435":1,"460":2,"463":1,"472":1,"536":2}}],["всегда",{"0":{"122":1},"2":{"25":1,"122":1,"144":1,"148":2,"151":1,"162":1,"166":1,"203":2,"227":1,"230":1,"280":1,"308":1,"339":1,"365":1,"428":1,"433":1,"435":1,"446":2,"452":1,"463":1,"465":1,"518":1}}],["всём",{"2":{"463":1}}],["всё",{"2":{"2":1,"35":1,"40":1,"55":1,"59":1,"86":1,"95":1,"117":1,"145":1,"336":1,"457":1,"462":2,"464":1,"472":1,"473":1,"496":1,"503":1}}],["выезжает",{"2":{"546":1,"548":1}}],["выезжающий",{"2":{"33":1}}],["выучить",{"2":{"472":1}}],["выясним",{"2":{"429":1}}],["выявлении",{"2":{"473":1}}],["выявления",{"2":{"370":1,"372":1}}],["выявление",{"0":{"241":1}}],["выявить",{"2":{"238":1,"240":1,"263":1}}],["выложить",{"2":{"394":1}}],["вылиться",{"2":{"44":1}}],["выигрывает",{"2":{"263":1}}],["выигрыш",{"2":{"148":1,"434":1,"440":1}}],["выгоде",{"2":{"473":1}}],["выгодно",{"2":{"382":1}}],["выгодные",{"2":{"213":1}}],["выгоды",{"2":{"308":1}}],["выглядело",{"2":{"435":1}}],["выглядел",{"2":{"255":1,"284":1,"379":1}}],["выглядела",{"2":{"228":1,"375":1}}],["выглядеть",{"2":{"14":1,"114":1,"192":2,"226":1,"229":1,"230":1,"238":2,"249":1,"285":1,"287":1,"288":1,"297":1,"318":1,"326":1,"327":1,"331":1,"347":1,"349":1,"353":1,"355":1,"360":1,"365":1,"383":1,"391":1,"422":1,"431":1,"436":1}}],["выглядящий",{"2":{"223":1}}],["выглядят",{"2":{"21":1,"134":2,"179":1,"456":1,"463":1,"511":1}}],["выглядит",{"2":{"97":1,"105":1,"108":1,"121":1,"152":1,"157":1,"255":1,"302":1,"315":1,"339":1,"367":1,"383":1,"384":1,"393":1,"463":1,"473":2}}],["выключен",{"2":{"184":1}}],["выключено",{"2":{"184":2}}],["выключенное",{"2":{"184":1}}],["выровнены",{"2":{"175":1}}],["выражаю",{"2":{"405":1}}],["выраженных",{"2":{"361":1}}],["выражения",{"2":{"251":2}}],["выражение",{"2":{"159":1}}],["выражением",{"2":{"156":1}}],["вырастает",{"2":{"336":1}}],["выравнивания",{"2":{"175":2}}],["выравниванию",{"2":{"175":1,"176":1}}],["выравнивание",{"2":{"175":2,"176":1}}],["выравниванием",{"0":{"175":1},"2":{"175":1}}],["выработаете",{"2":{"169":1}}],["выработайте",{"2":{"152":1}}],["выработки",{"2":{"148":1}}],["вычисление",{"2":{"376":1,"377":1}}],["вычислений",{"2":{"344":1}}],["вычисления",{"2":{"301":1,"302":1,"374":1,"462":1,"464":1}}],["вычислять",{"2":{"301":1}}],["вычисляем",{"2":{"296":1}}],["вычисляемыми",{"2":{"330":1,"332":1}}],["вычисляемых",{"2":{"231":2,"256":1,"332":1}}],["вычисляемые",{"2":{"152":1,"231":1,"232":1,"331":2,"333":2}}],["вычисляемое",{"2":{"231":1}}],["вычислительных",{"2":{"421":1}}],["вычислительные",{"2":{"306":1}}],["вычислительноемкие",{"2":{"425":1}}],["вычислительной",{"2":{"301":1,"344":1,"419":1,"430":1}}],["вычислительном",{"2":{"156":1}}],["вычислительная",{"2":{"137":1,"367":1}}],["выходе",{"2":{"504":1}}],["выходов",{"2":{"372":1}}],["выходом",{"2":{"184":1,"376":1}}],["выходных",{"2":{"372":1}}],["выходные",{"2":{"295":1,"386":1}}],["выходным",{"2":{"124":1}}],["выходят",{"2":{"267":1,"270":1}}],["выходящие",{"2":{"147":1}}],["выход",{"2":{"239":1}}],["выходить",{"2":{"237":1,"240":1,"265":1}}],["выходит",{"2":{"203":1,"225":1,"237":1,"265":1,"268":1,"317":1,"360":1,"364":1,"367":2,"394":2}}],["выхода",{"2":{"200":1}}],["выходы",{"2":{"152":1,"298":1,"373":1}}],["вытекает",{"2":{"295":1}}],["вытеснены",{"2":{"147":1}}],["выталкивая",{"2":{"193":1}}],["вытащить",{"2":{"59":1}}],["выведет",{"2":{"302":1}}],["выведена",{"2":{"302":1}}],["выведено",{"2":{"302":3,"303":1}}],["выведены",{"2":{"177":1}}],["выведенных",{"2":{"117":1}}],["вывести",{"2":{"160":1,"306":1,"370":1}}],["выводимый",{"2":{"380":1}}],["выводим",{"2":{"256":1,"296":1}}],["выводится",{"2":{"249":1,"296":1}}],["выводит",{"2":{"204":1,"302":1,"303":1}}],["выводе",{"2":{"251":1,"352":1}}],["вывода",{"2":{"160":1,"302":1}}],["вывод",{"0":{"36":1,"93":1},"2":{"239":1,"373":1,"381":2,"457":1,"473":1}}],["выдаст",{"2":{"432":1}}],["выдать",{"2":{"381":1}}],["выдан",{"2":{"383":1}}],["выдана",{"2":{"367":1}}],["выданный",{"2":{"362":1}}],["выдавать",{"2":{"286":1,"376":1,"377":1}}],["выдает",{"2":{"246":1,"291":2,"376":1}}],["выдачи",{"2":{"4":1}}],["выделяет",{"2":{"462":1}}],["выделять",{"2":{"431":1}}],["выделяют",{"2":{"297":1}}],["выделяются",{"2":{"177":1}}],["выделена",{"2":{"376":1}}],["выделенная",{"2":{"367":1}}],["выделенные",{"2":{"231":1,"333":1}}],["выделенный",{"2":{"208":1,"421":1}}],["выделениями",{"2":{"355":1}}],["выделение",{"2":{"186":1}}],["выделении",{"2":{"185":1,"186":1}}],["выделим",{"2":{"98":1}}],["выделить",{"2":{"85":1,"114":1,"445":1}}],["выдвигающемся",{"2":{"99":1}}],["вышедшая",{"2":{"472":1}}],["вышеперечисленных",{"2":{"364":1}}],["вышеперечисленные",{"2":{"336":2}}],["вышеизложенными",{"2":{"231":1}}],["вышеуказанного",{"2":{"537":1}}],["вышеуказанной",{"2":{"528":1}}],["вышеуказанных",{"2":{"103":1}}],["вышеупомянутой",{"2":{"310":1}}],["вышеупомянутого",{"2":{"245":1}}],["вышеупомянутые",{"2":{"241":1}}],["вышеупомянутымипротоколами",{"2":{"143":1}}],["выше",{"2":{"79":1,"214":1,"318":1,"335":1,"362":1,"432":1,"473":1}}],["выйти",{"2":{"63":1}}],["выпуске",{"2":{"555":1}}],["выпуска",{"2":{"395":1}}],["выпущенного",{"2":{"395":1}}],["выписан",{"2":{"115":2}}],["выпадающих",{"2":{"201":1}}],["выпадающие",{"0":{"201":1},"2":{"201":1}}],["выпадающим",{"2":{"98":1}}],["выпадающее",{"2":{"192":1}}],["выпало",{"2":{"22":1}}],["выполнено",{"2":{"232":1}}],["выполненные",{"2":{"229":1}}],["выполненных",{"2":{"229":1,"231":3,"376":1}}],["выполнена",{"2":{"159":1,"185":1,"229":1,"231":2,"301":1}}],["выполнении",{"2":{"303":1,"308":1,"367":1,"380":1,"383":1,"431":1}}],["выполнение",{"2":{"293":1,"294":1,"301":1,"302":2,"303":2,"364":1,"372":1,"376":2,"377":3,"421":1,"425":1,"426":1,"433":1}}],["выполнением",{"2":{"150":1,"180":1,"190":1}}],["выполнению",{"2":{"236":1}}],["выполнения",{"2":{"69":1,"144":1,"149":1,"150":3,"159":1,"160":1,"180":1,"188":1,"190":6,"222":1,"235":1,"241":1,"244":1,"249":1,"251":1,"256":1,"271":1,"293":2,"294":1,"297":2,"298":1,"302":1,"303":1,"308":1,"315":1,"352":1,"362":1,"367":1,"370":1,"373":2,"375":2,"376":1,"380":1,"383":1,"387":1,"390":2,"394":2,"396":1,"421":4,"426":1,"431":1,"437":1,"440":1,"451":1,"460":1}}],["выполним",{"2":{"226":1,"302":1}}],["выполнить",{"2":{"244":1,"255":1,"287":1,"296":1,"301":1,"303":1,"309":1,"322":1,"335":1,"346":1,"361":1,"374":2,"383":1,"430":1,"434":1,"464":1}}],["выполните",{"2":{"223":1,"318":1,"346":1,"379":1,"388":1,"389":2,"390":3,"393":3,"438":1}}],["выполнит",{"2":{"150":2}}],["выполнив",{"2":{"136":1,"231":1,"299":1,"383":1}}],["выполняют",{"2":{"367":1,"373":1,"462":1,"463":1,"472":1}}],["выполняются",{"2":{"149":1,"301":2,"336":1,"372":1,"378":1,"380":1}}],["выполняющиеся",{"2":{"421":1}}],["выполняющих",{"2":{"373":1}}],["выполняющимся",{"2":{"336":1}}],["выполняющий",{"2":{"265":2,"268":1}}],["выполняемой",{"2":{"421":1}}],["выполняемых",{"2":{"372":1}}],["выполняемая",{"2":{"174":1}}],["выполняем",{"2":{"137":1,"292":1,"296":1,"335":1,"376":1,"429":1}}],["выполняется",{"2":{"116":1,"122":1,"152":2,"157":1,"190":1,"228":1,"244":1,"303":1,"316":1,"352":1,"360":1}}],["выполняет",{"2":{"69":1,"250":1,"291":1,"294":1,"297":2,"323":1,"360":1,"376":1,"421":1,"429":1,"434":1,"473":1}}],["выполняться",{"2":{"378":1,"382":1,"421":2,"431":1,"434":1,"447":1}}],["выполнять",{"2":{"59":1,"68":1,"140":1,"156":1,"180":1,"222":1,"252":1,"255":2,"265":1,"293":2,"302":2,"323":1,"392":1,"421":2,"425":1,"434":2,"508":1}}],["вынужден",{"2":{"212":1}}],["выносить",{"2":{"291":1}}],["вынос",{"2":{"83":1}}],["выносятся",{"2":{"41":1}}],["вынести",{"2":{"3":1,"105":1,"265":1}}],["высмеять",{"2":{"216":1}}],["высоту",{"2":{"195":1}}],["высоким",{"2":{"504":1}}],["высокий",{"2":{"77":1,"173":2}}],["высокая",{"2":{"344":1,"504":1}}],["высокой",{"2":{"147":1,"419":1}}],["высокого",{"2":{"65":1,"261":1,"373":1}}],["высокоуровневыми",{"2":{"39":1}}],["выступать",{"2":{"277":1,"338":1}}],["выступает",{"2":{"249":1,"425":1}}],["выстроить",{"2":{"288":1,"303":1}}],["выстроив",{"2":{"181":1}}],["выстраиваем",{"2":{"303":1}}],["выстраиваемой",{"2":{"40":1}}],["выстраивать",{"2":{"302":1}}],["выстраивания",{"2":{"173":1}}],["выставочную",{"2":{"62":1}}],["вызван",{"2":{"297":1}}],["вызвало",{"2":{"152":1}}],["вызвать",{"2":{"34":1,"116":1,"189":1,"217":2,"296":1,"315":1}}],["вызывая",{"2":{"256":1}}],["вызывающих",{"2":{"256":1}}],["вызывающим",{"2":{"195":1}}],["вызывающего",{"2":{"192":1}}],["вызываются",{"2":{"267":1}}],["вызывают",{"2":{"169":1,"391":1}}],["вызывать",{"2":{"174":1,"190":1,"228":1,"237":1,"239":1,"240":1,"281":1,"349":1,"394":1,"427":1}}],["вызываться",{"2":{"116":1}}],["вызываем",{"2":{"149":1,"294":3,"352":1,"381":1}}],["вызывается",{"2":{"328":1}}],["вызывает",{"2":{"3":1,"159":1,"180":1,"215":1,"240":1}}],["вызову",{"2":{"303":2}}],["вызове",{"2":{"302":1,"435":1}}],["вызовет",{"2":{"118":1,"193":1,"231":2,"355":1,"363":1}}],["вызовом",{"2":{"285":1,"303":1}}],["вызовов",{"2":{"114":1,"288":1,"302":1,"303":1,"316":1,"373":1,"434":1,"435":1}}],["вызовами",{"2":{"303":1,"434":1}}],["вызовах",{"2":{"281":1}}],["вызова",{"2":{"245":1,"297":2,"301":5,"302":2,"303":4,"423":1,"439":1}}],["вызов",{"0":{"301":1},"1":{"302":1},"2":{"41":1,"149":1,"295":1,"297":1,"301":3,"303":3,"338":1,"360":1,"434":2,"511":1}}],["вызовы",{"2":{"41":1,"260":1,"277":1,"297":1,"298":1,"303":1,"316":1,"344":1,"378":1,"425":1,"434":1,"439":2,"511":1,"512":1}}],["вы",{"2":{"26":2,"68":1,"123":2,"125":2,"134":2,"143":2,"147":1,"148":7,"149":1,"150":2,"151":4,"152":3,"161":1,"166":3,"168":3,"169":2,"174":3,"176":3,"180":2,"184":1,"197":1,"203":4,"206":1,"208":1,"220":2,"222":1,"223":9,"224":5,"225":2,"227":1,"231":1,"234":1,"247":1,"259":1,"260":1,"263":1,"265":2,"266":1,"267":5,"268":2,"270":5,"271":1,"280":1,"286":1,"287":3,"295":3,"297":1,"300":3,"302":1,"305":2,"306":1,"308":3,"314":2,"321":2,"322":2,"336":1,"339":1,"341":1,"342":1,"346":2,"347":1,"352":1,"353":1,"355":2,"359":1,"366":1,"376":5,"386":1,"387":1,"389":1,"390":4,"391":2,"392":1,"393":2,"394":2,"395":1,"397":1,"400":1,"401":1,"402":1,"409":1,"419":1,"421":7,"424":1,"430":1,"432":1,"444":2,"446":3,"447":1,"452":1,"454":1,"455":1,"463":4,"466":1,"468":1,"472":1,"495":1}}],["выброшенной",{"2":{"377":1}}],["выбрасывать",{"2":{"376":1}}],["выбрасывает",{"2":{"303":1}}],["выбрасываем",{"2":{"287":1}}],["выбрав",{"2":{"375":1}}],["выбрано",{"2":{"308":1}}],["выбранная",{"2":{"557":1}}],["выбранными",{"2":{"501":1}}],["выбранных",{"2":{"223":1}}],["выбранные",{"2":{"213":1}}],["выбранного",{"2":{"143":1,"349":1,"367":1,"437":1}}],["выбранному",{"2":{"134":1}}],["выбранной",{"2":{"11":1,"31":1}}],["выбрали",{"2":{"346":1}}],["выбрал",{"2":{"209":1}}],["выбрать",{"2":{"134":1,"184":2,"212":1,"213":1,"223":1,"335":1,"353":1,"375":1,"436":1,"437":1,"457":1,"501":1,"517":1,"549":1}}],["выбирать",{"2":{"212":1}}],["выбирает",{"2":{"149":1}}],["выбираешь",{"2":{"89":1}}],["выбирая",{"2":{"148":2}}],["выберите",{"2":{"144":2,"223":3,"318":2,"387":1,"527":2}}],["выбором",{"2":{"316":1}}],["выбору",{"2":{"123":1,"223":1,"451":1}}],["выбор",{"0":{"37":1,"39":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"39":1,"69":1,"137":1,"179":1,"183":1,"289":1,"437":1,"511":1}}],["выборе",{"2":{"22":1,"39":1,"186":2,"199":1,"214":1,"222":1,"347":1,"353":3,"472":1}}],["выборка",{"2":{"13":1,"353":1}}],["выбора",{"2":{"4":1,"185":1,"198":1,"200":1,"201":2,"506":1,"508":1}}],["визитку",{"2":{"507":1}}],["визитной",{"2":{"408":1}}],["визуализацию",{"2":{"462":1,"463":1}}],["визуализация",{"2":{"366":1}}],["визуализации",{"2":{"185":1,"471":1}}],["визуальные",{"2":{"394":1}}],["визуальный",{"2":{"171":1,"298":1}}],["визуальным",{"2":{"171":1}}],["визуальных",{"2":{"171":1,"172":1,"173":1,"174":2,"462":1}}],["визуальной",{"2":{"496":1}}],["визуальное",{"2":{"298":1,"365":1}}],["визуально",{"2":{"11":1,"200":1,"247":1,"326":1}}],["визуального",{"2":{"3":1,"25":1,"171":1,"174":1,"259":1,"410":1}}],["википедии",{"2":{"178":1,"179":1,"180":1,"269":1}}],["виртуальных",{"2":{"138":1}}],["виртуальный",{"2":{"116":1,"444":1,"472":1}}],["виртуального",{"2":{"140":1}}],["виртуальном",{"2":{"137":1,"146":1}}],["виртуальное",{"2":{"48":1}}],["виртуальная",{"2":{"137":1}}],["витрины",{"2":{"39":1,"76":1,"508":1}}],["витрину",{"2":{"22":1,"62":1,"63":1}}],["витрина",{"0":{"11":1},"2":{"9":1,"12":1,"59":1,"61":1,"79":1,"545":1}}],["видов",{"2":{"517":1,"549":1}}],["виды",{"2":{"372":1,"373":1}}],["видны",{"2":{"366":1}}],["видно",{"2":{"83":1,"115":1,"190":1,"203":1,"208":1,"289":1,"291":1,"299":1,"302":1,"326":1,"329":1,"347":1,"353":1,"366":1,"421":1}}],["видимые",{"2":{"421":1}}],["видимое",{"2":{"421":1}}],["видимости",{"2":{"316":2,"351":1,"367":1}}],["видимостью",{"2":{"255":1}}],["видимость",{"2":{"239":1}}],["видимой",{"2":{"205":1,"454":1}}],["видим",{"2":{"205":1,"228":1,"246":1,"271":1,"296":1,"314":1,"316":1,"354":1,"385":1,"434":1}}],["видит",{"2":{"115":1}}],["видите",{"2":{"26":1,"200":1,"244":1,"245":1,"247":1,"249":1,"255":1,"268":1,"284":1,"289":1,"295":1,"300":1,"302":1,"303":1,"313":1,"315":1,"344":1,"352":1,"360":1,"361":1,"364":1}}],["виджеты",{"2":{"183":1}}],["виджетов",{"2":{"26":1,"463":1}}],["виду",{"2":{"155":1,"173":1,"176":1,"200":1,"203":1,"271":1,"359":1,"360":1}}],["виден",{"2":{"175":1,"231":1,"546":1}}],["видение",{"2":{"68":1}}],["видеть",{"2":{"172":1,"203":1,"286":1}}],["видеоролики",{"2":{"405":1}}],["видеоигры",{"2":{"195":1}}],["видео",{"2":{"170":1,"200":1,"222":1,"236":1,"307":1,"322":1,"343":1,"371":1,"420":1,"452":1,"472":4,"473":1}}],["видели",{"2":{"159":1,"176":1,"248":1,"300":2,"323":1,"325":1,"426":1}}],["виде",{"2":{"17":1,"61":1,"85":1,"102":1,"116":2,"147":1,"148":2,"151":1,"186":1,"199":1,"204":1,"205":1,"223":1,"241":1,"245":2,"247":1,"252":1,"256":1,"266":1,"271":1,"282":1,"296":1,"323":1,"332":1,"344":1,"347":1,"359":1,"360":1,"379":1,"383":2,"425":1,"432":1,"433":2,"437":1,"439":2,"460":1}}],["вид",{"2":{"5":1,"18":1,"147":1,"226":1,"263":1,"298":1,"308":1,"326":1,"351":1,"366":1,"421":1}}],["вида",{"2":{"3":1,"4":1,"147":1,"225":1,"297":1,"373":1,"374":1,"378":1}}],["воды",{"2":{"472":1}}],["водителем",{"2":{"472":2}}],["вождению",{"2":{"472":1}}],["вождения",{"2":{"472":3}}],["вовлеченности",{"2":{"385":1}}],["вовсе",{"2":{"263":1}}],["воркер",{"2":{"496":1}}],["воркером",{"2":{"430":1}}],["воркеры",{"2":{"316":1}}],["воровство",{"2":{"26":1}}],["воровством",{"2":{"26":1}}],["военно",{"2":{"269":1}}],["военного",{"2":{"134":1}}],["воплотить",{"2":{"237":1}}],["вопросом",{"2":{"461":1}}],["вопросов",{"2":{"220":1,"224":1,"361":1,"438":1,"472":1,"497":1}}],["вопросительный",{"2":{"391":1}}],["вопроса",{"2":{"241":1,"373":1}}],["вопросах",{"2":{"225":1,"342":1,"497":1}}],["вопросами",{"2":{"168":1}}],["вопросе",{"2":{"196":1,"472":1}}],["вопросу",{"2":{"134":1,"276":1}}],["вопрос",{"2":{"4":2,"148":2,"208":1,"216":1,"238":1,"239":1,"240":1,"241":1,"251":1,"372":1,"383":2,"472":1,"495":1}}],["вопросы",{"0":{"146":1,"168":1,"208":1,"220":1,"234":1,"259":1,"305":1,"320":1,"341":1,"369":1,"397":1,"441":1},"2":{"4":1,"64":1,"131":1,"168":1,"172":1,"199":1,"237":2,"259":1,"320":1,"341":1,"369":1,"497":1}}],["войдите",{"2":{"223":1}}],["волшебству",{"2":{"300":1}}],["волшебство",{"2":{"193":1,"255":1}}],["волшебства",{"2":{"148":1}}],["волнуйтесь",{"2":{"150":1}}],["воссоздающих",{"2":{"431":1}}],["восстановления",{"2":{"366":1,"367":1}}],["восстановлено",{"2":{"160":1}}],["восклицательных",{"2":{"299":1}}],["восемь",{"0":{"180":1},"2":{"180":1}}],["восьми",{"2":{"134":1}}],["воспользуйтесь",{"2":{"527":1}}],["воспользуемся",{"2":{"426":1}}],["воспользоваться",{"2":{"16":1,"168":1,"264":1,"361":1,"384":1,"457":1,"473":1}}],["воспроизведенные",{"2":{"207":1}}],["воспринимается",{"2":{"326":1}}],["воспринимаются",{"2":{"308":1}}],["воспринимайте",{"2":{"148":1}}],["восприятия",{"2":{"303":1,"304":1,"421":1}}],["восприятие",{"2":{"171":1,"181":1,"556":1}}],["восприятии",{"2":{"68":1}}],["вокруг",{"2":{"114":1,"381":1,"463":1}}],["вот",{"2":{"14":1,"16":1,"62":1,"117":1,"118":1,"120":1,"121":2,"123":2,"140":1,"151":1,"152":2,"157":1,"158":1,"176":1,"180":1,"184":1,"186":1,"188":1,"189":1,"190":2,"192":2,"196":1,"197":1,"198":2,"199":1,"203":1,"208":1,"209":1,"210":1,"216":1,"217":1,"222":1,"227":1,"231":1,"232":1,"244":1,"245":2,"249":1,"251":1,"255":1,"272":1,"278":1,"281":1,"285":1,"288":1,"291":1,"293":1,"296":1,"297":1,"300":1,"303":2,"310":1,"335":1,"339":1,"352":1,"353":1,"358":1,"366":1,"367":1,"376":1,"421":1,"427":1,"429":1,"456":1,"457":1,"463":2,"464":1,"472":1,"537":1,"539":1}}],["возлагает",{"2":{"372":1}}],["вознаграждения",{"2":{"367":1}}],["возникшая",{"2":{"381":1}}],["возникла",{"2":{"376":1}}],["возникли",{"2":{"62":1}}],["возникновения",{"2":{"376":1}}],["возникновении",{"2":{"180":1,"377":1,"422":1}}],["возникнет",{"2":{"376":1}}],["возникнуть",{"2":{"117":1,"186":1,"208":1,"251":1,"421":1,"507":1}}],["возникающими",{"2":{"358":1}}],["возникают",{"2":{"68":1}}],["возникает",{"2":{"148":1,"174":1,"246":1,"359":1,"372":1,"385":1}}],["воздействия",{"2":{"300":1}}],["возврат",{"2":{"316":1}}],["возврата",{"2":{"293":1,"301":1,"303":2}}],["возвращайтесь",{"2":{"472":1}}],["возвращают",{"2":{"373":1}}],["возвращающая",{"2":{"332":1,"460":1}}],["возвращающие",{"2":{"303":1}}],["возвращающей",{"2":{"122":1,"152":1,"245":1}}],["возвращающую",{"2":{"122":1,"244":2,"511":1}}],["возвращать",{"2":{"204":1,"254":1,"344":1,"377":1,"429":1}}],["возвращаться",{"2":{"192":1,"304":1}}],["возвращаемый",{"2":{"381":1}}],["возвращаемся",{"2":{"316":1}}],["возвращаем",{"2":{"250":1,"281":1,"288":2,"296":1,"303":1,"330":1,"338":2}}],["возвращаемое",{"2":{"158":1,"296":1}}],["возвращается",{"2":{"204":1,"358":1,"360":1,"452":1}}],["возвращает",{"2":{"115":2,"116":1,"123":2,"149":2,"152":1,"244":1,"245":1,"250":1,"255":1,"290":1,"293":1,"303":2,"338":1,"352":1,"358":4,"359":1,"377":1,"428":1,"430":1,"433":1}}],["возвращения",{"2":{"41":1}}],["возрастающей",{"2":{"203":1}}],["возрасти",{"2":{"148":1}}],["возьмет",{"2":{"143":1,"149":1}}],["возьмем",{"2":{"12":1,"148":1,"229":1,"238":1,"267":1,"282":1,"345":1,"374":1}}],["возможную",{"2":{"366":1}}],["возможна",{"2":{"243":1,"557":1}}],["возможны",{"2":{"245":1}}],["возможными",{"2":{"337":1}}],["возможным",{"2":{"203":1,"344":2,"463":1}}],["возможные",{"2":{"144":1}}],["возможных",{"2":{"53":1,"142":1,"241":1,"247":1,"256":1,"349":1,"372":1,"376":1,"421":1}}],["возможное",{"2":{"365":1}}],["возможной",{"2":{"305":1}}],["возможного",{"2":{"144":1}}],["возможностях",{"2":{"373":1,"473":1}}],["возможностям",{"2":{"183":1,"336":1}}],["возможностями",{"2":{"131":2,"335":1,"394":1}}],["возможности",{"0":{"469":1},"2":{"147":3,"184":1,"209":1,"224":1,"232":2,"242":1,"245":1,"248":1,"249":1,"252":1,"257":1,"258":1,"265":1,"315":1,"336":1,"359":1,"367":1,"373":1,"384":2,"386":1,"421":1,"431":1,"451":1,"455":1,"460":1,"462":1,"508":2}}],["возможностей",{"0":{"123":1},"2":{"147":1,"176":1,"225":1,"282":1,"303":1,"355":1,"359":1,"373":1,"456":1,"457":1,"460":2,"473":1,"536":1}}],["возможностью",{"2":{"12":1,"85":1,"116":1,"384":1,"444":1,"454":1,"506":1,"508":3,"543":1}}],["возможность",{"2":{"2":1,"11":2,"12":1,"17":1,"39":1,"65":1,"103":1,"105":1,"115":2,"116":3,"124":1,"134":2,"148":1,"152":1,"181":1,"189":1,"195":1,"198":1,"209":1,"225":2,"228":1,"241":1,"261":1,"268":1,"308":1,"315":1,"316":1,"326":1,"337":1,"344":1,"346":1,"347":1,"361":1,"366":1,"439":1,"447":1,"461":1,"462":1,"465":1,"508":2,"545":1}}],["возможно",{"2":{"40":1,"48":1,"59":1,"104":1,"108":1,"116":1,"152":1,"168":1,"203":1,"234":1,"247":1,"277":1,"300":1,"328":1,"353":1,"376":1,"383":1,"393":1,"445":1,"451":1,"462":3,"463":1,"501":1}}],["возможен",{"2":{"16":1}}],["во",{"0":{"463":1},"2":{"3":1,"17":1,"112":1,"115":2,"122":1,"149":3,"150":1,"152":1,"160":1,"166":1,"169":1,"179":2,"188":1,"198":1,"201":1,"207":1,"209":1,"215":1,"224":1,"226":1,"227":1,"230":1,"239":1,"244":2,"247":1,"249":2,"250":1,"260":1,"265":1,"268":1,"277":1,"287":1,"288":1,"295":1,"297":1,"298":1,"302":1,"303":1,"349":2,"352":1,"355":1,"361":1,"365":1,"370":1,"372":2,"376":2,"390":1,"394":1,"397":1,"419":1,"421":1,"425":1,"457":2,"460":5,"461":1,"462":3,"463":7,"471":1,"472":2,"473":1,"542":1}}],["вообще",{"2":{"3":1,"35":1,"105":1,"211":1,"316":1,"452":1,"454":1,"457":2,"473":1}}],["в",{"0":{"42":1,"124":1,"126":1,"127":1,"133":1,"149":1,"153":1,"161":1,"209":1,"242":1,"387":1,"388":1,"389":1,"405":1,"406":1,"421":1,"431":1,"495":1,"499":1,"515":1,"528":1,"540":1,"544":1,"545":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"134":1,"150":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"162":1,"163":1,"164":1,"165":1,"166":1,"243":1,"244":1,"245":1,"246":1,"247":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"422":1,"423":1,"424":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1},"2":{"2":1,"3":4,"4":1,"5":1,"6":1,"7":1,"9":2,"10":1,"11":3,"12":4,"13":2,"14":1,"16":6,"17":9,"18":1,"22":7,"23":7,"25":4,"26":1,"27":1,"29":6,"30":1,"31":1,"32":1,"33":2,"34":3,"39":2,"40":1,"41":7,"43":2,"44":3,"47":7,"48":4,"55":1,"56":2,"58":1,"59":5,"61":1,"62":1,"64":3,"65":1,"68":4,"69":5,"70":2,"74":1,"76":2,"82":2,"83":6,"85":5,"86":9,"87":1,"89":1,"90":1,"91":1,"92":1,"95":11,"96":1,"97":3,"98":2,"99":2,"100":2,"102":7,"103":3,"104":5,"105":6,"106":1,"108":2,"109":2,"112":7,"114":5,"115":20,"116":9,"117":8,"118":1,"119":8,"120":5,"121":5,"122":7,"123":5,"124":7,"125":4,"126":5,"127":9,"128":3,"129":1,"131":4,"132":3,"133":2,"134":20,"135":11,"136":8,"137":9,"138":3,"139":2,"140":6,"141":8,"142":1,"143":5,"144":8,"145":5,"146":4,"147":13,"148":34,"149":13,"150":12,"151":13,"152":37,"153":4,"154":1,"155":1,"156":6,"157":4,"158":5,"159":6,"160":12,"161":3,"162":1,"163":1,"164":1,"165":1,"166":5,"167":2,"168":3,"169":5,"170":6,"171":7,"172":7,"173":5,"174":3,"175":1,"176":7,"177":3,"178":9,"179":5,"180":7,"181":3,"182":2,"183":4,"184":7,"185":8,"186":8,"187":6,"188":6,"189":4,"190":10,"191":1,"192":6,"193":14,"195":8,"196":7,"197":2,"198":5,"199":4,"200":6,"203":9,"204":5,"205":9,"207":2,"208":1,"209":7,"210":3,"211":5,"212":2,"213":2,"214":2,"215":1,"216":2,"217":1,"218":2,"219":3,"220":2,"221":8,"222":13,"223":27,"224":32,"225":26,"226":7,"227":17,"228":10,"229":13,"230":10,"231":40,"232":12,"233":3,"234":1,"235":9,"236":2,"237":1,"238":5,"239":5,"240":6,"241":6,"242":2,"243":7,"244":13,"245":14,"246":9,"247":16,"249":16,"250":14,"251":6,"252":4,"253":3,"254":1,"255":31,"256":23,"258":4,"259":2,"260":4,"261":2,"262":4,"263":8,"264":3,"265":9,"266":6,"267":13,"268":17,"269":5,"270":6,"271":12,"272":4,"276":5,"277":2,"278":1,"279":4,"280":3,"281":6,"282":3,"283":2,"284":3,"285":1,"286":4,"287":10,"288":5,"289":9,"290":2,"291":4,"292":13,"293":5,"294":14,"295":6,"296":14,"297":21,"298":5,"299":5,"300":13,"301":7,"302":6,"303":20,"304":5,"305":1,"306":5,"307":3,"308":15,"309":1,"310":8,"311":5,"312":3,"313":2,"314":4,"315":20,"316":18,"317":11,"318":8,"319":6,"320":3,"321":5,"322":6,"323":4,"324":4,"325":7,"326":5,"327":1,"328":11,"329":6,"330":4,"331":7,"332":8,"333":7,"334":3,"335":12,"336":24,"337":8,"338":10,"339":6,"340":2,"341":3,"342":4,"343":1,"344":19,"345":2,"346":13,"347":5,"348":2,"349":22,"351":5,"352":28,"353":6,"354":7,"355":17,"356":1,"358":16,"359":11,"360":16,"361":22,"362":1,"363":6,"364":11,"365":18,"366":13,"367":19,"368":5,"369":4,"370":10,"371":2,"372":13,"373":6,"374":10,"375":15,"376":18,"377":5,"378":5,"379":5,"380":13,"381":28,"382":13,"383":13,"384":4,"385":9,"386":8,"387":1,"388":6,"389":5,"390":11,"391":9,"392":2,"393":12,"394":9,"395":6,"396":5,"397":3,"400":1,"402":4,"403":1,"405":2,"407":1,"408":1,"409":3,"411":1,"412":1,"413":2,"414":3,"415":2,"416":1,"417":1,"418":1,"419":7,"420":2,"421":24,"422":5,"423":6,"424":4,"425":13,"426":2,"427":6,"428":14,"429":8,"430":4,"431":7,"432":11,"433":14,"434":17,"435":7,"436":1,"437":10,"438":1,"439":12,"440":3,"441":2,"442":2,"444":3,"445":7,"446":3,"447":4,"451":15,"452":15,"454":2,"455":14,"456":2,"457":13,"460":17,"461":5,"462":16,"463":39,"464":5,"465":2,"471":11,"472":11,"473":22,"482":1,"497":3,"498":1,"501":1,"502":1,"503":1,"504":7,"507":5,"508":1,"509":4,"511":4,"512":1,"513":1,"515":2,"516":1,"527":6,"528":2,"532":1,"533":1,"536":4,"537":1,"538":3,"539":3,"542":2,"545":1,"546":4,"548":4,"553":1,"554":2,"555":2,"556":2,"557":4}}],["рисованиями",{"2":{"421":1}}],["рисуйте",{"2":{"470":1}}],["рисует",{"2":{"290":1,"421":1}}],["рисунки",{"2":{"204":1}}],["рисунка",{"2":{"175":1,"203":2,"291":1}}],["рисунке",{"2":{"134":1,"178":1,"192":1,"193":1,"204":1,"256":1,"323":1,"347":1,"360":1}}],["рисунок",{"2":{"134":1,"144":1,"150":1,"173":1,"174":1,"175":1,"176":1,"184":2,"185":1,"186":2,"188":1,"189":2,"190":2,"192":3,"197":1,"198":1,"199":1,"200":2,"203":1,"204":2,"205":1,"208":1,"209":1,"216":1,"217":1,"223":2,"224":1,"226":1,"227":1,"229":1,"238":2,"239":1,"240":1,"247":1,"249":1,"254":1,"256":2,"263":1,"265":1,"291":2,"293":1,"295":1,"297":1,"300":1,"314":1,"315":4,"316":1,"318":2,"323":1,"326":1,"329":1,"331":1,"339":2,"347":2,"353":1,"355":1,"360":1,"361":1,"365":1,"366":1,"374":2,"383":3,"384":1,"387":1,"390":1,"391":2,"393":1,"421":3,"425":1,"427":1,"430":1,"431":1,"436":1}}],["риски",{"2":{"267":1}}],["рынке",{"2":{"169":1}}],["рынка",{"0":{"20":1},"1":{"21":1,"22":1},"2":{"39":1,"125":1}}],["рывка",{"2":{"148":1}}],["ряду",{"2":{"372":1,"376":1}}],["ряде",{"2":{"177":1}}],["ряда",{"2":{"150":1,"297":1,"301":1}}],["рядами",{"2":{"108":1}}],["ряд",{"2":{"144":1,"152":2,"192":1,"198":1,"244":1,"250":1,"308":1,"318":1,"335":1,"360":1,"377":1}}],["рядом",{"2":{"139":1,"176":1,"178":1,"198":1,"231":1,"267":1,"303":1,"308":2,"315":1,"321":1,"375":2,"382":1}}],["рядового",{"2":{"102":1}}],["родился",{"2":{"473":1}}],["родителей",{"2":{"354":2}}],["родителем",{"2":{"255":1}}],["родители",{"2":{"323":1}}],["родителю",{"2":{"245":1,"249":1,"325":1,"355":1}}],["родительским",{"2":{"249":1,"254":1,"323":1,"421":1}}],["родительскими",{"2":{"246":1}}],["родительские",{"2":{"247":1}}],["родительский",{"2":{"240":2,"247":1,"249":5,"256":1,"265":1,"288":1,"323":5,"339":1,"421":2,"425":1,"426":1,"433":1}}],["родительской",{"2":{"246":1,"324":1}}],["родительском",{"2":{"245":2,"247":3,"249":3,"354":1,"425":1,"434":1}}],["родительскому",{"2":{"152":1,"245":1,"249":1,"423":1,"429":1}}],["родительского",{"2":{"151":1,"152":1,"246":5,"255":1,"355":2,"421":1,"422":2}}],["родитель",{"2":{"239":1,"240":1,"246":2,"325":1,"427":2}}],["родителями",{"2":{"321":1}}],["родителя",{"2":{"239":1,"323":3,"325":1,"352":1}}],["родственными",{"2":{"341":1}}],["родного",{"2":{"424":1}}],["родное",{"2":{"188":1,"308":1}}],["родными",{"2":{"308":1,"319":1}}],["рода",{"2":{"198":1,"208":1,"296":1,"323":1}}],["робот",{"2":{"144":1}}],["ростом",{"2":{"386":1}}],["роста",{"2":{"152":1,"370":1,"467":1}}],["рост",{"2":{"130":1}}],["росте",{"2":{"97":1}}],["роли",{"2":{"338":1,"462":1}}],["ролям",{"2":{"115":1}}],["ролью",{"2":{"115":1}}],["роль",{"2":{"69":1,"171":1,"429":1,"462":1,"463":1,"472":1,"508":1}}],["роутами",{"2":{"447":1}}],["роутера",{"2":{"135":1,"345":1,"351":1}}],["роутере",{"0":{"127":1},"2":{"136":1}}],["роутер",{"0":{"345":1},"1":{"346":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1},"2":{"119":1,"135":1,"346":1,"351":1}}],["роуты",{"2":{"97":1}}],["роутинг",{"2":{"7":1}}],["русском",{"2":{"472":2}}],["русский",{"0":{"399":1},"2":{"472":1}}],["рутинного",{"2":{"462":1}}],["рутовский",{"2":{"58":1}}],["рука",{"2":{"457":1}}],["руководящие",{"2":{"260":1}}],["руководствами",{"2":{"169":1}}],["руководствуясь",{"2":{"222":1}}],["руководству",{"2":{"148":1}}],["руководство",{"2":{"69":1,"73":1,"123":1,"169":1,"335":1,"418":1}}],["рублей",{"2":{"444":1}}],["ручная",{"2":{"316":1}}],["ручную",{"2":{"308":1}}],["ручном",{"2":{"451":1,"457":1}}],["ручной",{"2":{"316":1}}],["ручного",{"2":{"144":1,"397":1,"501":1}}],["ручное",{"2":{"72":1,"372":1}}],["рефы",{"2":{"463":2}}],["рефакторите",{"2":{"270":1}}],["рефакторить",{"2":{"22":1}}],["рефакторинга",{"2":{"372":1,"376":1,"385":1}}],["рефакторингуйте",{"2":{"372":1}}],["рефакторинг",{"0":{"100":1,"467":1},"2":{"258":1,"467":1}}],["репликацию",{"2":{"431":1}}],["репозиторием",{"2":{"386":1,"394":6}}],["репозиториев",{"2":{"370":1,"386":1}}],["репозиториями",{"0":{"394":1},"2":{"396":1}}],["репозиториях",{"2":{"225":1}}],["репозитория",{"0":{"503":1},"2":{"143":1,"256":1,"307":1,"352":1,"386":1,"390":1,"394":1,"427":1,"451":4,"527":2,"528":1}}],["репозитории",{"2":{"64":1,"143":1,"170":1,"184":1,"231":1,"235":1,"255":1,"307":1,"315":1,"322":1,"339":1,"352":1,"358":1,"371":1,"374":1,"394":2,"395":1,"420":1,"442":1,"527":1}}],["репозиторий",{"0":{"80":1,"111":1},"2":{"61":1,"80":1,"87":1,"100":1,"106":1,"111":1,"132":1,"334":1,"386":1,"388":1,"390":2,"393":1,"394":5,"395":1,"445":1,"457":1,"527":1}}],["ребенка",{"2":{"366":1}}],["ребенку",{"2":{"323":1}}],["ребенок",{"2":{"323":1,"324":1}}],["рендер",{"2":{"249":1}}],["рендерится",{"2":{"248":1}}],["рендеринга",{"2":{"301":1,"336":1,"349":1,"351":1,"421":4}}],["рендеринг",{"2":{"249":1,"358":1,"421":3}}],["рендерингу",{"2":{"160":1}}],["рендеринге",{"2":{"154":1,"421":1}}],["реорганизация",{"2":{"228":1}}],["редакция",{"2":{"393":1}}],["редактировать",{"2":{"392":1,"393":1}}],["редактирование",{"2":{"239":2,"240":1}}],["редактирования",{"2":{"232":1,"256":1}}],["редактируемых",{"2":{"256":1}}],["редактируем",{"2":{"227":1}}],["редакторы",{"2":{"344":1}}],["редактор",{"2":{"222":2,"387":1,"457":1}}],["редакторе",{"2":{"186":1,"457":1}}],["редких",{"2":{"266":1}}],["редкая",{"2":{"251":1}}],["редко",{"2":{"115":1,"244":2,"265":1,"281":1,"336":1}}],["речевого",{"2":{"186":1}}],["речь",{"2":{"10":1,"180":1,"308":1,"373":1,"385":1}}],["резюме",{"2":{"472":1}}],["резервировать",{"2":{"267":1}}],["резервировании",{"2":{"145":1}}],["резервируем",{"2":{"255":1}}],["результирующее",{"2":{"148":1}}],["результатом",{"2":{"256":1,"367":1,"376":1}}],["результатов",{"2":{"231":1,"257":1}}],["результаты",{"2":{"130":1,"204":1,"207":1,"223":1,"241":1,"331":1,"391":2,"421":1}}],["результат",{"2":{"116":1,"152":1,"178":1,"181":1,"204":1,"223":1,"229":1,"303":1,"359":1,"360":2,"381":1,"429":1,"430":1,"432":1,"433":1,"502":1}}],["результате",{"2":{"115":1,"144":1,"178":1,"188":1,"193":1,"212":1,"238":1,"297":1,"308":1,"347":1,"361":2,"381":1,"382":1,"383":1,"439":1,"507":1}}],["результата",{"2":{"68":1,"251":1,"302":2,"347":1,"363":1,"428":1,"433":1}}],["рейтинг",{"2":{"109":1,"318":2}}],["рейтинги",{"2":{"79":1}}],["реагировать",{"2":{"326":1,"328":1,"352":1,"426":1}}],["реагирования",{"2":{"316":1}}],["реакции",{"2":{"123":1}}],["реактивную",{"2":{"147":1,"152":2,"231":2,"250":3,"323":2,"324":2,"328":1,"330":3,"431":1,"462":1,"463":1}}],["реактивная",{"2":{"123":1,"152":1,"154":2,"255":1,"256":2,"330":1,"460":1,"462":1}}],["реактивные",{"2":{"128":1,"149":1,"152":2,"163":1,"231":2,"242":1,"247":1,"250":1,"256":1,"330":1,"331":1,"333":3,"352":1,"437":1,"460":1,"462":2,"463":3}}],["реактивный",{"2":{"123":1,"231":1,"323":1,"329":2,"331":1,"332":1,"335":1,"337":1,"339":1,"462":2,"463":2}}],["реактивных",{"0":{"123":1},"2":{"123":2,"152":1,"231":1,"315":1,"331":1,"335":1,"400":1,"432":1,"460":1,"462":1}}],["реактивным",{"2":{"122":1,"123":1,"152":2,"329":1,"337":1}}],["реактивными",{"2":{"103":1,"122":1,"123":2,"152":1,"229":1,"295":1,"333":1,"336":1,"432":1}}],["реактивно",{"2":{"331":1,"353":1}}],["реактивного",{"0":{"329":1,"331":1},"1":{"330":1,"332":1,"333":1,"334":1,"335":1},"2":{"250":1,"291":1,"321":1,"328":1,"338":1,"339":1,"340":1,"508":1}}],["реактивное",{"2":{"239":1,"254":1,"255":1,"331":1,"338":1,"432":1}}],["реактивному",{"2":{"249":1}}],["реактивном",{"2":{"148":2,"255":1,"331":1,"462":1}}],["реактивностью",{"2":{"321":1,"432":1,"462":2}}],["реактивность",{"2":{"148":1,"223":1,"240":1,"252":1,"256":1,"296":2,"297":1,"305":1,"323":2,"328":1,"462":2}}],["реактивности",{"2":{"119":1,"123":1,"125":1,"147":1,"295":2,"296":1,"329":1,"462":2,"536":1}}],["реактивной",{"2":{"102":1,"123":1,"152":1,"154":1,"193":2,"332":1,"349":1}}],["реально",{"2":{"333":1,"465":1}}],["реальности",{"2":{"271":1,"366":1}}],["реальном",{"2":{"229":1,"296":1,"297":1,"344":1,"355":1,"374":1,"384":1}}],["реальному",{"2":{"221":1}}],["реальное",{"2":{"137":1,"195":1,"208":1}}],["реальные",{"2":{"233":1,"461":1}}],["реальный",{"0":{"252":1},"1":{"253":1,"254":1,"255":1},"2":{"217":1,"372":1,"472":2}}],["реальным",{"2":{"167":1}}],["реальными",{"2":{"116":1}}],["реальных",{"2":{"148":1,"372":2,"373":1,"386":1}}],["реализовывать",{"2":{"254":1,"258":1,"304":1,"367":1,"425":1}}],["реализовывали",{"2":{"197":1}}],["реализовали",{"2":{"256":1,"294":1,"339":2}}],["реализована",{"2":{"360":1,"509":1,"511":1,"519":1}}],["реализованного",{"2":{"306":1}}],["реализованный",{"2":{"197":1}}],["реализованные",{"2":{"170":1}}],["реализовано",{"2":{"296":1,"323":1,"435":1,"557":1}}],["реализованы",{"2":{"147":1,"148":1,"269":1,"306":1,"330":1,"367":1,"368":1}}],["реализован",{"2":{"127":1,"284":1,"289":1,"294":1,"295":1,"338":1,"437":1}}],["реализовать",{"2":{"12":1,"35":1,"36":1,"40":1,"82":1,"105":1,"188":1,"199":1,"241":1,"244":1,"287":2,"291":1,"292":1,"294":1,"295":1,"303":1,"306":2,"333":1,"341":1,"342":1,"344":1,"353":1,"361":2,"364":1,"419":2,"421":1,"422":1,"424":1,"438":1,"447":1}}],["реализуя",{"2":{"321":1}}],["реализует",{"2":{"246":1,"293":1,"297":1,"324":1,"331":1,"512":1}}],["реализуемого",{"2":{"429":1}}],["реализуемая",{"2":{"395":1}}],["реализуемые",{"2":{"297":1}}],["реализуем",{"2":{"192":1,"250":1,"325":1,"419":2,"434":1,"436":1}}],["реализующая",{"2":{"431":2}}],["реализующих",{"2":{"225":1,"427":1,"432":1}}],["реализующий",{"2":{"184":1,"252":1,"296":1,"504":1}}],["реализуют",{"2":{"290":1,"335":1,"367":1}}],["реализуются",{"2":{"189":1}}],["реализацией",{"2":{"180":1,"256":1,"293":1,"296":1,"339":1,"360":1,"364":1,"365":1,"366":2,"539":1}}],["реализациями",{"2":{"371":1}}],["реализациях",{"2":{"352":1}}],["реализация",{"0":{"255":1,"256":1,"279":1,"326":1,"329":1,"331":1,"422":1},"1":{"280":1,"281":1,"327":1,"328":1,"330":1,"332":1,"333":1,"334":1,"335":1,"423":1,"424":1,"428":1,"429":1,"430":1,"432":1,"433":1,"434":1,"435":1,"436":1,"437":1,"439":1},"2":{"125":1,"143":1,"185":1,"190":1,"192":1,"201":1,"256":1,"269":1,"271":1,"279":1,"280":1,"291":1,"292":3,"293":1,"294":1,"295":1,"303":1,"315":1,"321":3,"325":1,"326":1,"328":1,"329":1,"336":1,"345":1,"355":1,"360":1,"366":1,"426":1,"427":1,"428":1,"431":2,"432":1,"434":1,"436":1,"460":1,"537":1}}],["реализаций",{"2":{"123":1,"192":1,"281":1,"282":1,"300":2,"317":1}}],["реализации",{"0":{"514":1},"1":{"515":1,"516":1},"2":{"39":1,"76":1,"118":1,"120":1,"125":1,"160":1,"167":1,"176":1,"189":1,"193":1,"201":1,"219":1,"221":1,"235":1,"237":1,"238":1,"240":1,"241":1,"247":1,"256":3,"259":1,"260":2,"271":1,"276":1,"279":1,"280":1,"284":1,"286":2,"287":1,"288":1,"289":1,"290":1,"291":2,"293":1,"295":1,"310":1,"316":2,"321":2,"323":1,"326":1,"328":1,"330":1,"331":1,"336":2,"340":1,"353":1,"358":1,"360":1,"361":2,"364":1,"367":1,"373":1,"385":1,"395":2,"408":1,"410":1,"414":1,"421":1,"425":2,"427":1,"434":2,"438":1,"440":1,"460":2,"470":1,"555":1}}],["реализацию",{"2":{"16":1,"41":1,"70":1,"123":1,"189":1,"227":1,"247":1,"255":1,"259":1,"268":1,"271":1,"281":1,"287":2,"292":1,"294":1,"304":1,"324":1,"336":1,"338":1,"360":1,"364":1,"424":1,"440":1,"465":1}}],["релевантные",{"2":{"116":1}}],["релиз",{"2":{"95":1,"388":1}}],["реляционных",{"2":{"43":1,"44":1,"47":1,"48":2}}],["реляционные",{"2":{"17":2}}],["реляционную",{"2":{"39":1}}],["ресурсе",{"2":{"498":1}}],["ресурсом",{"2":{"295":1,"421":1}}],["ресурсов",{"2":{"117":2,"219":1,"227":1,"252":1,"424":1,"445":1,"452":1,"473":1,"555":1,"556":1}}],["ресурсу",{"2":{"115":1,"117":2,"278":1}}],["ресурса",{"0":{"495":1},"2":{"452":1}}],["ресурсами",{"2":{"116":1,"361":1,"421":1,"452":1,"473":2}}],["ресурсам",{"2":{"115":1,"137":2,"277":1,"452":1}}],["ресурсах",{"0":{"0":1}}],["ресурс",{"2":{"115":2,"117":2,"247":1,"252":1,"255":3,"472":1}}],["ресурсы",{"0":{"452":1},"1":{"453":1,"454":1},"2":{"95":1,"137":2,"224":2,"267":1,"301":1,"373":1,"379":1,"421":1,"445":4,"452":4,"455":1,"472":1,"539":1}}],["режимы",{"2":{"308":1}}],["режим",{"2":{"127":2,"136":3,"137":1,"141":1,"349":1}}],["режимов",{"2":{"127":1}}],["режима",{"2":{"117":1,"135":1,"136":1,"145":1,"228":1,"509":1}}],["режимах",{"2":{"95":1,"546":3,"548":2}}],["режиме",{"2":{"12":1,"95":1,"127":1,"135":1,"136":2,"139":1,"146":1,"186":1,"190":1,"224":1,"303":1,"311":1,"317":1,"451":1,"457":2,"461":1,"463":2,"554":1}}],["регулярный",{"0":{"467":1}}],["регулярных",{"2":{"358":1}}],["регулировать",{"2":{"447":1}}],["регулирования",{"2":{"367":1}}],["регулируется",{"2":{"59":1,"134":1}}],["регистрируя",{"2":{"291":1}}],["регистрирует",{"2":{"462":1}}],["регистрируется",{"2":{"292":1}}],["регистрируете",{"2":{"267":1}}],["регистрируем",{"2":{"121":1,"255":1,"267":1,"315":2,"316":2,"328":1,"352":1}}],["регистрировать",{"2":{"243":1,"252":2,"297":1}}],["регистре",{"2":{"162":1,"163":1,"230":1}}],["регистра",{"2":{"164":1}}],["регистраторе",{"2":{"134":1}}],["регистратора",{"2":{"134":3}}],["регистраторы",{"2":{"134":2}}],["регистратором",{"2":{"134":1}}],["регистрацию",{"2":{"267":1}}],["регистрация",{"0":{"121":1},"2":{"243":1}}],["регистрации",{"2":{"58":1,"119":1,"131":1,"206":2,"243":1,"255":1,"256":1,"265":4,"267":1,"287":2,"289":1,"291":1,"292":1,"316":1,"352":1,"545":1}}],["регистр",{"2":{"44":1,"230":3}}],["решетку",{"2":{"352":1}}],["решетки",{"2":{"349":1}}],["решен",{"2":{"421":1}}],["решена",{"2":{"12":1,"122":1,"197":1}}],["решении",{"2":{"507":1}}],["решению",{"2":{"330":1,"400":1}}],["решением",{"2":{"76":1,"79":1,"116":1,"335":1,"365":1,"370":1,"378":1,"385":1,"447":1,"457":1}}],["решение",{"2":{"12":2,"13":1,"59":1,"62":1,"69":1,"89":1,"116":1,"117":2,"118":1,"127":1,"148":1,"172":1,"201":1,"212":1,"241":5,"250":1,"271":1,"297":1,"323":1,"352":1,"365":1,"367":1,"373":1,"400":1,"426":1,"462":1,"472":1,"507":1}}],["решений",{"2":{"10":1,"12":1,"22":1,"39":1,"41":1,"64":1,"69":3,"241":1,"451":1,"473":1}}],["решениями",{"2":{"192":1}}],["решениях",{"2":{"16":1}}],["решения",{"0":{"10":1,"445":1},"1":{"446":1,"447":1,"448":1,"449":1,"450":1},"2":{"9":1,"10":1,"14":1,"39":1,"62":2,"69":1,"160":1,"179":2,"181":1,"193":1,"197":1,"198":1,"239":1,"247":1,"248":1,"260":4,"265":1,"271":1,"292":1,"302":1,"361":1,"367":2,"372":1,"385":1,"386":1,"428":1,"429":1,"473":1,"507":2}}],["решит",{"2":{"421":1}}],["решить",{"2":{"135":1,"186":1,"321":1,"344":1,"358":1,"367":1,"421":1,"451":1,"452":1}}],["решил",{"2":{"386":1}}],["решили",{"2":{"244":1,"428":1,"464":3}}],["решётки",{"2":{"149":1}}],["решат",{"2":{"421":1}}],["решать",{"2":{"286":1,"435":1}}],["решают",{"2":{"272":1,"463":1}}],["решали",{"2":{"147":1}}],["решает",{"2":{"115":1,"148":1,"193":1,"265":1,"312":1,"463":1}}],["решаем",{"2":{"12":1,"239":1}}],["реквизите",{"2":{"355":1}}],["реквизиты",{"2":{"124":1}}],["рекламных",{"2":{"465":1}}],["рекламные",{"2":{"4":1,"217":1}}],["рекламодателям",{"2":{"218":1}}],["рекламодателями",{"2":{"215":1}}],["рекламы",{"2":{"217":2}}],["реклама",{"0":{"217":1}}],["рекламируемым",{"2":{"215":1}}],["рекомендовал",{"2":{"313":1}}],["рекомендует",{"2":{"457":1}}],["рекомендуется",{"0":{"312":1},"2":{"123":1,"143":1,"144":1,"189":1,"190":1,"222":1,"224":1,"230":1,"243":1,"250":1,"266":1,"286":3,"315":1,"336":1,"361":1,"390":1,"402":1,"421":3,"431":1,"434":1,"444":1,"455":1,"512":1,"557":1}}],["рекомендуемые",{"2":{"313":1}}],["рекомендуемым",{"2":{"310":1,"387":1}}],["рекомендуемой",{"2":{"222":1}}],["рекомендуются",{"2":{"460":1}}],["рекомендую",{"2":{"206":1,"222":2,"249":1,"325":1,"335":1,"338":1,"358":1,"539":1}}],["рекомендацией",{"2":{"373":1}}],["рекомендациям",{"2":{"226":1,"255":1}}],["рекомендациях",{"2":{"145":1}}],["рекомендации",{"2":{"142":1,"225":1,"233":1,"260":1,"261":1}}],["рекомендаций",{"2":{"4":1,"161":1}}],["реконнект",{"2":{"118":1}}],["равенства",{"2":{"376":1}}],["равным",{"2":{"355":1}}],["равных",{"2":{"219":1}}],["равна",{"2":{"155":1}}],["равно",{"2":{"152":1,"155":1,"178":1,"287":1,"301":1,"311":1,"472":1}}],["рамок",{"2":{"308":1}}],["рамками",{"2":{"151":1,"238":1}}],["рамках",{"2":{"148":1,"153":1,"229":1,"247":1,"252":1,"258":1,"316":1,"373":1,"434":1}}],["рамки",{"2":{"143":1,"147":1,"148":1,"185":1,"203":1,"225":1,"237":1,"265":1,"267":1,"268":1,"270":1,"317":1,"360":1,"364":1,"367":2,"394":2}}],["радужно",{"2":{"227":1,"344":1}}],["радует",{"2":{"200":1}}],["ради",{"2":{"222":1}}],["радиус",{"2":{"191":1}}],["радиокнопки",{"0":{"184":1},"2":{"184":2}}],["ранней",{"2":{"385":1}}],["ранних",{"2":{"372":1}}],["рано",{"2":{"178":1,"465":1}}],["ранее",{"2":{"83":1,"141":1,"151":1,"226":1,"231":1,"256":1,"258":1,"292":1,"297":1,"308":1,"321":2,"323":1,"352":1,"364":1,"366":2,"380":1,"395":1,"419":1,"426":1,"427":2,"431":1,"435":1,"451":1}}],["раньше",{"2":{"12":1,"223":1,"302":3,"303":1,"329":1,"347":1,"372":1,"421":1,"457":1}}],["рабочая",{"2":{"323":1}}],["рабочим",{"0":{"427":1},"1":{"428":1,"429":1,"430":1},"2":{"323":1,"434":1}}],["рабочие",{"2":{"263":1}}],["рабочих",{"2":{"213":1,"219":1,"316":1,"361":1}}],["рабочий",{"2":{"126":1,"136":1,"145":1,"150":1,"255":1,"315":1,"316":2,"366":1,"367":2,"395":1,"397":1,"409":1,"426":1,"427":1,"442":2}}],["рабочей",{"2":{"221":1}}],["рабочему",{"2":{"268":1,"430":1,"437":1}}],["рабочем",{"2":{"188":1,"190":1,"311":1,"360":1,"361":1,"372":1,"373":1,"416":1}}],["рабочего",{"0":{"221":1,"409":1},"1":{"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1},"2":{"119":1,"120":1,"126":1,"149":1,"150":1,"151":1,"152":1,"188":1,"190":1,"235":1,"236":1,"243":1,"253":1,"292":1,"302":1,"316":1,"317":3,"321":1,"322":1,"361":2,"364":1,"365":1,"366":1,"373":1,"395":2}}],["рабочее",{"2":{"79":1}}],["работоспособного",{"2":{"507":1}}],["работоспособный",{"2":{"361":1}}],["работоспособен",{"2":{"223":1}}],["работник",{"2":{"427":2}}],["работнику",{"2":{"316":1}}],["работника",{"2":{"316":3}}],["работе",{"2":{"41":2,"102":1,"105":1,"123":1,"160":1,"168":1,"175":1,"222":1,"227":1,"256":1,"271":1,"316":1,"320":1,"328":1,"350":1,"361":1,"457":2,"462":2,"507":1}}],["работала",{"2":{"292":1}}],["работало",{"2":{"232":1,"281":1}}],["работали",{"2":{"152":1,"265":1,"267":1}}],["работающую",{"2":{"504":1}}],["работающее",{"2":{"374":1}}],["работающего",{"2":{"307":1,"508":1}}],["работающей",{"2":{"211":1,"234":1}}],["работающими",{"2":{"319":1}}],["работающий",{"2":{"222":1,"225":1,"282":1}}],["работающих",{"2":{"218":1,"269":1,"344":1,"352":1}}],["работают",{"2":{"116":1,"151":1,"172":1,"222":1,"267":1,"269":1,"276":1,"297":1,"301":1,"351":1,"367":1,"368":1,"381":1,"419":1,"421":1,"428":1,"463":1,"553":1}}],["работаем",{"2":{"103":1,"394":1}}],["работаете",{"2":{"176":2,"390":1}}],["работает",{"2":{"55":1,"68":1,"86":1,"92":1,"112":1,"115":2,"130":1,"143":1,"190":1,"223":2,"231":2,"232":1,"251":1,"256":1,"262":1,"280":1,"290":1,"294":1,"295":1,"296":2,"323":2,"326":1,"328":1,"349":1,"361":1,"367":1,"375":1,"376":2,"394":1,"429":1,"430":2,"457":1,"460":3,"462":1,"465":1,"472":1,"473":2,"539":1}}],["работа",{"0":{"55":1,"81":1,"394":1},"1":{"82":1,"83":1},"2":{"38":1,"131":1,"289":1,"390":1,"393":1,"394":2,"434":1}}],["работать",{"2":{"2":1,"25":1,"55":1,"59":1,"102":1,"116":1,"118":1,"148":1,"150":1,"160":1,"224":2,"227":1,"229":1,"242":1,"251":1,"258":1,"290":1,"295":1,"304":1,"308":3,"315":1,"316":1,"330":1,"336":1,"347":1,"358":1,"394":2,"402":1,"421":1,"431":2,"439":1,"445":1,"457":2,"463":1,"473":1}}],["работу",{"2":{"23":1,"47":1,"69":1,"83":1,"222":1,"255":1,"256":1,"328":2,"330":1,"336":1,"367":2,"368":1,"385":1,"391":1,"409":1,"419":1,"420":1,"421":1,"424":2,"447":1,"461":1}}],["работы",{"0":{"66":1,"182":1},"1":{"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1},"2":{"12":1,"17":1,"23":1,"55":1,"63":1,"68":1,"102":1,"115":1,"116":1,"117":1,"143":1,"148":1,"151":1,"159":1,"167":1,"168":1,"193":1,"219":1,"222":2,"223":2,"226":1,"229":2,"231":1,"255":1,"256":1,"257":1,"268":1,"270":1,"300":1,"303":2,"307":1,"308":1,"316":4,"324":1,"336":1,"342":1,"360":1,"365":1,"366":1,"375":1,"376":1,"390":1,"394":1,"419":1,"421":3,"422":1,"426":1,"432":3,"441":1,"452":1,"456":1,"458":1,"473":2,"496":3,"556":1}}],["расшаривать",{"2":{"463":1}}],["расшифровывается",{"2":{"240":1,"359":1}}],["расширим",{"2":{"425":1,"431":1}}],["расширили",{"2":{"258":1}}],["расширить",{"2":{"22":1,"257":1,"472":1}}],["расширено",{"2":{"336":1}}],["расширенные",{"2":{"249":1}}],["расширенными",{"2":{"235":1}}],["расширений",{"2":{"457":1}}],["расширении",{"2":{"402":1,"462":1}}],["расширением",{"2":{"151":1,"224":1}}],["расширение",{"2":{"89":1,"105":1,"310":1,"336":2,"375":1,"539":2,"545":1}}],["расширениями",{"2":{"513":1}}],["расширения",{"0":{"539":1},"2":{"85":1,"117":1,"218":1,"264":1,"297":1,"335":1,"457":2,"460":1,"539":1}}],["расширяет",{"2":{"297":1,"417":1}}],["расширяемость",{"2":{"77":1,"471":1}}],["расширять",{"2":{"18":1,"148":1,"252":1,"396":1,"455":1}}],["расхождения",{"2":{"393":1}}],["расходов",{"2":{"214":1}}],["расходы",{"0":{"214":1},"2":{"329":1}}],["расчеты",{"2":{"336":1}}],["расчетом",{"2":{"12":1}}],["растут",{"2":{"385":1}}],["растущая",{"2":{"225":1}}],["растущим",{"2":{"134":1}}],["растет",{"2":{"256":1}}],["раскрывающимся",{"2":{"527":1}}],["раскрывая",{"2":{"380":1}}],["раскрывается",{"2":{"214":1,"294":1,"361":1}}],["раскрывает",{"2":{"149":1,"295":1,"434":1}}],["раскадровки",{"2":{"176":1}}],["рассказывали",{"2":{"435":1}}],["рассказывается",{"2":{"408":1}}],["рассказано",{"2":{"158":1}}],["рассказать",{"2":{"148":1,"225":1}}],["рассуждений",{"2":{"271":1}}],["рассчитывал",{"2":{"214":1}}],["рассчитать",{"2":{"190":1}}],["рассылку",{"2":{"208":3}}],["расстояния",{"2":{"178":1}}],["расстояние",{"0":{"176":1},"2":{"178":2}}],["рассматривали",{"2":{"205":1,"229":1,"326":1,"337":1,"426":1}}],["рассматриваемое",{"2":{"402":1}}],["рассматриваем",{"2":{"287":1,"364":1}}],["рассматриваемый",{"2":{"193":1}}],["рассматривается",{"2":{"400":1,"437":1}}],["рассматривает",{"2":{"263":1,"473":1}}],["рассматриваете",{"2":{"26":1}}],["рассматриваются",{"2":{"122":1,"124":1,"142":1,"147":1,"170":1,"431":1}}],["рассматриваться",{"2":{"149":1}}],["рассматривать",{"2":{"43":1,"140":1,"150":1,"152":1,"172":1,"200":1,"201":1,"238":1,"249":1,"250":1,"256":1,"263":1,"264":1,"266":1,"297":1,"330":1,"344":1,"358":1,"421":1,"425":2,"426":1}}],["рассмотрите",{"2":{"225":1,"447":1}}],["рассмотрим",{"2":{"10":1,"67":1,"119":1,"133":1,"134":1,"135":1,"141":1,"147":1,"148":1,"149":1,"151":2,"152":1,"153":1,"158":1,"160":2,"169":1,"172":1,"173":1,"175":1,"181":1,"200":1,"203":1,"207":1,"223":1,"224":2,"228":1,"232":1,"233":1,"235":2,"239":1,"242":1,"244":1,"246":3,"249":4,"251":1,"256":1,"260":1,"263":1,"267":1,"268":1,"271":2,"276":1,"279":1,"288":1,"289":1,"290":1,"291":1,"292":2,"295":2,"296":1,"297":2,"298":1,"301":1,"302":2,"309":1,"314":1,"315":3,"316":1,"321":1,"322":1,"329":1,"335":1,"336":1,"340":1,"342":1,"344":2,"346":1,"349":1,"352":2,"355":2,"360":1,"361":4,"365":1,"366":1,"367":2,"370":1,"372":1,"373":2,"380":1,"381":1,"382":1,"383":1,"394":1,"419":2,"434":1,"437":1,"440":1}}],["рассмотренные",{"2":{"330":1,"427":1}}],["рассмотренными",{"2":{"303":1}}],["рассмотренных",{"2":{"200":1,"225":1,"395":1,"425":1}}],["рассмотрении",{"2":{"291":1,"316":1}}],["рассмотрению",{"2":{"222":1,"367":1}}],["рассмотрение",{"2":{"172":1,"317":1,"319":1}}],["рассмотрены",{"2":{"39":1,"297":1}}],["рассмотрели",{"2":{"145":2,"219":2,"242":1,"245":1,"252":1,"256":1,"258":2,"292":1,"295":1,"304":1,"316":1,"319":2,"335":1,"340":1,"369":1,"378":1,"396":1,"427":1,"440":1}}],["рассмотреть",{"2":{"142":1,"224":1,"256":1,"314":1,"315":1,"358":1,"359":1,"367":1,"384":1,"425":1}}],["распознаваемых",{"2":{"354":1}}],["расползлись",{"2":{"463":1}}],["располнела",{"2":{"460":1,"536":1}}],["распологаются",{"2":{"224":1}}],["расположены",{"2":{"515":1}}],["расположенные",{"2":{"307":1}}],["расположенных",{"2":{"247":1}}],["расположенное",{"2":{"205":1}}],["расположена",{"2":{"172":1}}],["расположению",{"2":{"195":1}}],["расположении",{"2":{"180":1}}],["расположения",{"2":{"140":1,"141":1,"174":1,"203":1}}],["расположение",{"2":{"36":1,"140":1,"204":1,"226":1}}],["расположить",{"2":{"36":1}}],["располагались",{"2":{"471":1}}],["располагать",{"2":{"382":1}}],["располагаться",{"2":{"135":1,"137":1,"178":1,"310":1}}],["располагает",{"2":{"227":1}}],["располагается",{"2":{"120":1,"140":1,"178":1,"300":1}}],["располагаются",{"2":{"203":1,"256":1}}],["распределение",{"2":{"473":1}}],["распределения",{"2":{"224":1,"288":1}}],["распределенная",{"2":{"386":1,"393":1}}],["распределенности",{"2":{"386":1}}],["распределенными",{"2":{"367":1}}],["распределенные",{"2":{"367":1}}],["распределенных",{"2":{"269":1,"344":1,"367":2}}],["распределяются",{"2":{"115":1}}],["распространяемы",{"2":{"508":1}}],["распространяется",{"2":{"266":1,"330":1}}],["распространяться",{"2":{"331":1}}],["распространять",{"2":{"308":1}}],["распространяются",{"2":{"181":1}}],["распространяющихся",{"2":{"151":1}}],["распространены",{"2":{"472":1}}],["распространенного",{"2":{"471":1}}],["распространенность",{"2":{"462":1}}],["распространенной",{"2":{"365":1,"415":1}}],["распространенными",{"2":{"147":1,"169":1,"308":1,"316":1,"360":1,"364":1}}],["распространенных",{"2":{"137":1,"219":1,"224":1,"310":1,"374":1,"434":2,"508":1}}],["распространенные",{"2":{"134":1,"137":1,"146":1,"169":1,"185":1,"335":1,"392":1,"462":1}}],["распространенный",{"2":{"9":1,"115":1,"277":1,"394":1}}],["распространение",{"2":{"308":1,"328":1,"344":1}}],["распространения",{"2":{"149":1,"323":1}}],["распространен",{"2":{"149":1,"204":2,"299":1}}],["раза",{"2":{"463":1}}],["разумеется",{"2":{"426":1}}],["разумными",{"2":{"317":1}}],["разумным",{"2":{"203":1}}],["разочаровавшись",{"2":{"386":1}}],["разочарованию",{"2":{"366":1}}],["разобщенности",{"2":{"419":1}}],["разобрались",{"2":{"428":1}}],["разобраться",{"2":{"342":1}}],["разобрать",{"2":{"244":1,"433":1}}],["разобран",{"2":{"224":1}}],["разобьем",{"2":{"97":1,"231":1}}],["разграничению",{"2":{"340":1}}],["разгрузки",{"2":{"294":1}}],["разговаривать",{"2":{"219":1}}],["разбора",{"2":{"429":1}}],["разблокировав",{"2":{"360":1}}],["разбрасывать",{"2":{"267":1}}],["разбросаны",{"2":{"256":1}}],["разберет",{"2":{"223":1}}],["разбиения",{"2":{"462":2}}],["разбиение",{"0":{"4":1},"2":{"2":1,"41":1,"79":1,"244":1}}],["разбираться",{"2":{"351":1,"352":1,"473":1}}],["разбили",{"2":{"256":1}}],["разбивается",{"2":{"445":1}}],["разбивает",{"2":{"263":1}}],["разбивайте",{"2":{"179":1}}],["разбивать",{"2":{"2":1,"3":1}}],["разбивка",{"2":{"14":1,"238":1}}],["разбитым",{"2":{"472":1}}],["разбить",{"2":{"4":1}}],["разбита",{"2":{"2":1}}],["размонтированием",{"2":{"267":1,"352":1}}],["размонтировании",{"2":{"160":1}}],["размышления",{"0":{"135":1},"1":{"136":1},"2":{"270":1}}],["разместили",{"2":{"174":1}}],["разместим",{"2":{"151":1,"230":1,"231":1,"375":2}}],["разместить",{"2":{"108":1,"267":1,"352":1,"382":1,"444":3}}],["разметки",{"2":{"147":1}}],["размеров",{"2":{"171":1,"250":1}}],["размер",{"2":{"152":1,"178":1,"227":1,"244":1,"336":1,"345":1,"349":1,"452":2,"465":1}}],["размеру",{"2":{"134":1,"203":1}}],["размерам",{"2":{"308":1}}],["размерами",{"2":{"203":1,"311":1,"313":1}}],["размера",{"2":{"125":1,"130":1,"148":3,"173":1,"178":1,"192":1,"198":1,"203":1,"244":1,"267":2,"335":1,"452":1}}],["размещали",{"2":{"224":1}}],["размещает",{"2":{"217":1}}],["размещается",{"2":{"203":1,"204":1,"205":2,"310":1,"315":1}}],["размещаем",{"2":{"141":2,"231":1,"256":1}}],["размещаемый",{"2":{"137":1}}],["размещаются",{"2":{"195":1,"224":1}}],["размещайте",{"2":{"176":1}}],["размещать",{"2":{"59":1,"128":1,"134":1,"192":1,"196":1,"224":2,"231":1,"253":1,"375":1}}],["размещена",{"2":{"375":1}}],["размещенный",{"2":{"316":1,"383":1}}],["размещенное",{"2":{"195":1}}],["размещены",{"2":{"225":1,"239":1,"346":1}}],["размещению",{"2":{"375":1}}],["размещение",{"0":{"195":1},"2":{"174":1,"195":1,"204":1,"205":1,"217":1,"381":1}}],["размещении",{"2":{"141":1,"205":1}}],["размещения",{"2":{"116":1,"131":1,"138":1,"149":1,"205":1,"223":1,"394":1,"395":1,"444":1,"473":1,"527":1}}],["размещен",{"2":{"136":1,"223":1,"224":1,"315":2,"338":1,"393":1}}],["размещено",{"2":{"134":2,"135":2,"139":1,"149":1}}],["разная",{"2":{"439":1}}],["разнообразные",{"2":{"344":1}}],["разному",{"2":{"244":1,"473":1}}],["разного",{"2":{"198":1,"462":1}}],["разным",{"2":{"386":1,"393":1}}],["разными",{"2":{"294":1,"385":1}}],["разных",{"2":{"117":1,"192":1,"222":1,"268":1,"276":1,"308":1,"382":1,"446":1,"463":1,"464":1,"482":1,"534":1,"555":1}}],["разный",{"2":{"115":1}}],["разные",{"0":{"152":1},"2":{"115":1,"174":1,"204":1,"241":1,"317":1,"328":1,"355":1,"385":2,"386":1,"455":1,"464":1,"473":1,"545":1}}],["разницей",{"2":{"156":1,"297":1}}],["разницу",{"2":{"123":1,"302":1}}],["разницы",{"2":{"115":1}}],["разница",{"2":{"22":1,"148":1,"168":1,"305":1,"320":1,"341":1,"380":1,"439":1,"472":1}}],["раздувать",{"2":{"515":1}}],["раздутому",{"2":{"68":1}}],["раздаются",{"2":{"473":1}}],["раздражения",{"2":{"216":1}}],["разделу",{"2":{"355":1}}],["разделить",{"2":{"244":1,"263":2,"265":1}}],["разделив",{"2":{"148":1}}],["разделяемые",{"2":{"331":1}}],["разделяется",{"2":{"331":1,"361":1}}],["разделяет",{"2":{"240":1,"297":1,"323":1}}],["разделять",{"2":{"258":1,"463":1}}],["разделяй",{"2":{"2":1}}],["разделом",{"2":{"203":1,"256":1}}],["разделов",{"2":{"189":1,"200":1}}],["разделами",{"2":{"335":1}}],["разделам",{"2":{"195":1}}],["разделах",{"2":{"151":1,"207":1,"349":1,"482":1}}],["раздела",{"2":{"151":1,"173":1,"205":2,"255":1,"331":1}}],["раздел",{"2":{"136":1,"203":1,"205":4,"225":1,"227":1,"231":1,"255":1,"310":1,"339":1,"527":1}}],["разделенной",{"2":{"433":1}}],["разделенные",{"2":{"134":1,"230":1,"361":1}}],["разделенных",{"2":{"117":1,"134":2,"135":1}}],["разделена",{"2":{"263":1}}],["разделению",{"2":{"345":1}}],["разделения",{"2":{"151":1,"196":1,"263":2,"269":1}}],["разделение",{"0":{"263":1},"2":{"34":1,"192":1,"260":1,"263":2,"265":1,"291":1,"425":1,"471":1}}],["разделе",{"2":{"117":1,"149":1,"159":1,"223":1,"230":1,"242":1,"246":1,"252":1,"267":1,"307":1,"316":1,"352":1,"358":1,"373":1,"383":1,"460":1,"527":3}}],["разделы",{"2":{"115":1,"189":1,"203":1,"238":1}}],["различающихся",{"2":{"463":1}}],["различаются",{"2":{"262":1}}],["различают",{"2":{"44":1}}],["различать",{"2":{"301":1}}],["различается",{"2":{"249":1}}],["различия",{"2":{"169":1,"358":1,"393":1}}],["различие",{"0":{"173":1},"2":{"147":1,"148":1,"184":1}}],["различный",{"2":{"151":1}}],["различные",{"2":{"147":2,"192":1,"228":1,"302":1,"308":3,"340":1,"342":1,"358":1,"367":1,"370":1,"389":1,"435":1,"545":2}}],["различных",{"2":{"145":1,"147":1,"189":1,"228":1,"241":1,"245":1,"281":1,"295":1,"308":3,"311":1,"317":1,"336":1,"342":1,"347":1,"360":1,"361":1,"369":1,"372":2,"376":1,"385":1,"421":1,"472":1,"544":1,"545":1}}],["различным",{"2":{"35":1,"41":1,"195":1,"270":1,"308":1}}],["различными",{"2":{"30":1,"116":1,"198":1,"203":1,"227":1,"235":1,"256":1,"263":1,"294":1,"342":1,"361":1,"376":1,"462":1}}],["различного",{"2":{"79":1}}],["развертываемого",{"2":{"508":1}}],["развертывании",{"2":{"226":1}}],["развертыванию",{"2":{"136":1}}],["развертывания",{"0":{"135":1,"526":1},"1":{"136":1,"527":1,"528":1},"2":{"76":1,"127":1,"131":1,"145":1,"228":1,"306":1,"442":1,"451":1}}],["развертыванием",{"2":{"224":1,"451":1}}],["развертывание",{"0":{"71":1,"131":1,"416":1},"1":{"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1},"2":{"67":1,"71":1,"228":1,"309":1,"349":1,"395":1}}],["разве",{"2":{"421":1}}],["разветвление",{"2":{"386":1}}],["разветвлять",{"2":{"386":1}}],["разворачивать",{"2":{"267":1}}],["разворачивание",{"2":{"40":1}}],["развитый",{"2":{"344":1}}],["развитии",{"2":{"344":1}}],["развитием",{"2":{"344":1}}],["развитие",{"0":{"495":1},"2":{"270":1,"425":1}}],["развития",{"0":{"79":1},"2":{"10":1,"63":1,"147":1,"308":1,"507":1}}],["развивается",{"2":{"462":1}}],["развиваться",{"2":{"238":1,"265":1}}],["развиваются",{"2":{"221":1}}],["раз",{"0":{"249":1},"2":{"27":1,"115":3,"145":1,"148":1,"152":1,"154":1,"193":1,"214":1,"227":1,"243":1,"269":1,"277":1,"280":1,"281":1,"286":1,"315":1,"321":1,"333":1,"352":1,"376":2,"381":1,"455":2,"463":1,"473":1}}],["разряда",{"2":{"468":1}}],["разрядной",{"2":{"222":1}}],["разрывные",{"2":{"370":1}}],["разрушить",{"2":{"321":1}}],["разрешив",{"2":{"429":1}}],["разрешили",{"2":{"473":1}}],["разрешил",{"2":{"138":1}}],["разрешить",{"2":{"59":1,"360":1,"428":1,"439":1}}],["разрешающийся",{"2":{"359":1}}],["разрешается",{"2":{"244":1,"254":1,"437":1}}],["разрешает",{"2":{"117":1,"354":1}}],["разрешаться",{"2":{"433":1}}],["разрешать",{"2":{"115":1,"394":1}}],["разрешено",{"2":{"303":1,"393":1}}],["разрешен",{"2":{"117":3}}],["разрешений",{"2":{"464":1,"518":1}}],["разрешение",{"2":{"115":2,"188":1,"255":1,"301":1,"367":1,"393":1,"430":1}}],["разрешениях",{"2":{"516":1}}],["разрешениям",{"2":{"203":1}}],["разрешения",{"2":{"23":1,"115":1,"255":2,"367":1,"378":1,"394":1,"428":1,"433":1}}],["разрабатываешь",{"2":{"464":1}}],["разрабатывается",{"2":{"203":1}}],["разрабатываемые",{"2":{"445":1}}],["разрабатываемого",{"2":{"442":1}}],["разрабатываем",{"2":{"6":1}}],["разрабатывать",{"2":{"69":1,"171":1,"445":1,"462":1,"473":1}}],["разработаем",{"2":{"229":1}}],["разработать",{"2":{"229":1}}],["разработанный",{"2":{"375":1}}],["разработанной",{"2":{"370":1}}],["разработан",{"2":{"148":1}}],["разработана",{"2":{"127":1}}],["разработчику",{"2":{"385":1,"471":1,"472":1,"504":1,"507":1}}],["разработчиком",{"2":{"311":1,"417":1,"472":3}}],["разработчиков",{"2":{"2":1,"161":1,"222":1,"227":1,"228":1,"247":1,"281":1,"367":1,"368":1,"385":3,"386":1,"401":1,"418":1,"461":1,"472":1,"497":1}}],["разработчики",{"2":{"270":1,"300":1,"395":1,"402":1,"471":2}}],["разработчик",{"2":{"68":1,"116":1,"148":1,"206":1,"219":1,"260":1,"463":1,"507":1}}],["разработчиками",{"2":{"169":1}}],["разработчикам",{"2":{"68":1,"372":3,"447":1,"508":2}}],["разработчика",{"2":{"23":1,"149":1,"223":1,"224":1,"300":1,"314":2,"317":1,"318":3,"330":1,"335":2,"339":1,"367":1,"370":2,"376":2,"385":1,"396":1,"402":1,"421":2,"463":2,"470":1,"472":1,"496":1,"511":1}}],["разработкой",{"2":{"69":1,"372":1,"392":1,"461":1}}],["разработка",{"0":{"70":1},"2":{"61":1,"67":2,"70":1,"79":1,"228":1,"234":1,"260":1,"308":1,"360":1,"385":1,"461":1,"479":1,"482":1,"484":1,"485":1}}],["разработки",{"0":{"67":1},"2":{"17":1,"61":1,"69":2,"112":1,"126":1,"148":2,"152":1,"221":1,"222":1,"223":4,"224":3,"226":1,"227":1,"228":3,"231":1,"243":1,"260":1,"266":1,"267":1,"269":1,"270":1,"271":1,"300":1,"304":1,"316":1,"370":2,"372":1,"373":1,"375":1,"384":2,"386":1,"410":1,"444":1,"445":1,"457":3,"460":1,"461":1,"462":1,"463":1,"464":1,"472":1,"507":1}}],["разработку",{"2":{"3":1,"69":1,"148":1,"171":1,"260":1,"368":1,"462":1,"471":2}}],["разработке",{"0":{"544":1},"2":{"3":1,"63":1,"76":3,"117":1,"168":1,"176":1,"222":1,"223":1,"227":1,"234":1,"260":1,"261":1,"269":1,"271":1,"340":1,"344":1,"373":1,"401":1,"434":1,"457":1,"473":1}}],["геттеров",{"2":{"463":1}}],["геттерами",{"2":{"333":1,"463":1}}],["геймификации",{"2":{"206":1}}],["героической",{"2":{"205":1}}],["героический",{"2":{"205":1}}],["герой",{"2":{"205":1}}],["генерации",{"2":{"193":1,"317":1,"344":1,"450":1,"473":1}}],["генерация",{"2":{"92":1,"455":1,"473":1}}],["генерируется",{"2":{"365":1,"433":1,"473":1}}],["генерируемые",{"2":{"344":1}}],["генерируемыми",{"2":{"344":1}}],["генерируют",{"2":{"224":1}}],["генерировать",{"2":{"192":1,"317":1,"451":1}}],["генерить",{"2":{"473":1}}],["генерит",{"2":{"50":1,"89":2,"115":2}}],["гениальное",{"2":{"2":1}}],["гибче",{"2":{"463":1}}],["гибридные",{"2":{"344":1}}],["гибридных",{"2":{"336":1,"349":1,"361":1}}],["гибки",{"2":{"462":1}}],["гибкая",{"2":{"330":1,"336":1}}],["гибкой",{"2":{"326":1}}],["гибкости",{"2":{"140":1,"248":1}}],["гибкость",{"2":{"40":1,"118":1,"148":1,"228":1,"302":1,"463":1}}],["гигантский",{"2":{"330":1}}],["гипертекста",{"2":{"147":1}}],["гуглить",{"2":{"116":2,"472":1}}],["греется",{"2":{"457":1}}],["громоздка",{"2":{"434":1}}],["громоздким",{"2":{"160":1,"316":1,"336":1}}],["грязно",{"2":{"325":1}}],["грубый",{"2":{"237":1}}],["грубое",{"2":{"263":1}}],["грубого",{"2":{"258":1}}],["грубо",{"2":{"115":1,"117":1,"464":1}}],["групповой",{"2":{"270":1}}],["группу",{"2":{"229":1,"376":1}}],["группах",{"2":{"270":1}}],["группами",{"2":{"231":1}}],["группа",{"2":{"199":1,"200":1,"231":1}}],["группировки",{"2":{"199":1,"238":2,"267":1}}],["группе",{"2":{"175":2,"229":1,"306":1,"376":1}}],["группы",{"0":{"176":1},"2":{"134":1,"179":1,"184":1,"231":1,"359":1,"372":1,"376":1,"380":1}}],["групп",{"2":{"134":1,"175":1,"376":1}}],["грузить",{"2":{"116":1,"473":1}}],["грамотная",{"2":{"496":1}}],["грамотно",{"2":{"472":1}}],["грамотному",{"2":{"182":1}}],["грамотной",{"2":{"76":1}}],["градусов",{"2":{"296":1}}],["градусах",{"2":{"296":1}}],["градусы",{"2":{"295":2,"297":1}}],["графическая",{"2":{"293":1}}],["графические",{"2":{"394":1}}],["графически",{"2":{"295":1,"297":1,"360":1}}],["графический",{"2":{"237":1,"387":1}}],["графических",{"2":{"225":1}}],["графическим",{"2":{"175":1}}],["графического",{"2":{"225":1,"344":1,"384":1}}],["графическое",{"2":{"192":1,"263":1,"265":1,"291":1,"293":1}}],["графики",{"2":{"175":1,"308":1}}],["грань",{"2":{"308":1}}],["гранулировано",{"2":{"115":1}}],["границу",{"2":{"192":1,"193":1}}],["границах",{"2":{"148":1,"421":1}}],["границы",{"0":{"9":1},"2":{"68":1,"297":1,"336":1}}],["границ",{"2":{"3":1,"191":1}}],["гарагусо",{"2":{"405":1}}],["гарантирует",{"2":{"204":1,"338":1}}],["гамбургера",{"2":{"198":1,"518":1}}],["гамбургер",{"2":{"195":1,"546":1,"548":1}}],["гамме",{"2":{"184":1}}],["гаммы",{"2":{"26":1}}],["галочка",{"2":{"187":1}}],["гаснет",{"2":{"102":1}}],["где",{"2":{"95":1,"115":1,"116":1,"134":1,"136":1,"137":1,"148":1,"149":1,"151":1,"152":1,"174":1,"179":1,"181":1,"189":1,"195":1,"203":1,"205":2,"217":1,"223":1,"231":1,"255":1,"256":3,"269":1,"294":1,"331":1,"347":1,"351":1,"359":1,"361":2,"367":1,"378":1,"381":2,"385":1,"386":1,"395":1,"419":1,"421":1,"433":1,"436":1,"444":1,"454":1,"461":1,"462":2,"463":1,"467":1}}],["готового",{"2":{"507":1,"508":1}}],["готовое",{"2":{"504":1}}],["готово",{"2":{"430":1}}],["готовом",{"2":{"347":1}}],["готовой",{"2":{"224":1}}],["готовности",{"2":{"318":1}}],["готовность",{"2":{"306":1}}],["готова",{"2":{"286":1}}],["готов",{"2":{"231":1,"315":1,"316":1,"338":1,"374":1,"436":1}}],["готовую",{"2":{"224":1}}],["готовый",{"2":{"507":1}}],["готовым",{"2":{"457":1}}],["готовых",{"2":{"145":1,"159":1,"221":1,"508":1}}],["готовы",{"2":{"136":1,"160":1,"167":1,"168":1,"183":1,"222":2,"226":1,"227":1,"241":1,"346":1,"359":1,"360":1,"379":1,"382":1}}],["готовые",{"2":{"62":1,"136":1,"292":1}}],["городов",{"2":{"353":1}}],["город",{"2":{"353":1}}],["города",{"2":{"200":2,"353":1}}],["горизонтальную",{"2":{"203":1}}],["горизонтальному",{"2":{"203":1}}],["горизонтальные",{"2":{"195":2,"198":2,"203":1}}],["гораздо",{"2":{"137":1,"189":1,"221":1,"263":1,"276":1,"302":1,"308":2,"336":1,"394":1,"460":1}}],["гордо",{"2":{"102":1}}],["гостинице",{"2":{"473":1}}],["гостиниц",{"2":{"213":1}}],["гостей",{"2":{"115":1}}],["государство",{"2":{"2":1,"355":1}}],["говорю",{"2":{"296":1,"302":1}}],["говорит",{"2":{"464":1}}],["говорить",{"2":{"58":1,"336":1}}],["говорили",{"2":{"205":1,"317":1,"352":2}}],["говорилось",{"2":{"166":1,"240":1,"309":1,"358":1,"364":1,"372":1,"391":1}}],["говорил",{"2":{"152":1,"292":1}}],["говоря",{"2":{"115":1,"117":1,"174":1,"179":1,"207":1,"265":1,"347":1,"462":1,"464":1,"473":1}}],["года",{"2":{"472":1,"497":1}}],["годах",{"2":{"269":1}}],["годами",{"2":{"260":1}}],["году",{"2":{"180":1}}],["год",{"2":{"86":1,"270":1,"444":1}}],["годы",{"2":{"55":1,"134":1,"182":1,"460":1,"536":1}}],["глоссарий",{"0":{"496":1}}],["глобален",{"2":{"463":1}}],["глобального",{"2":{"508":1}}],["глобальное",{"2":{"463":1}}],["глобальному",{"2":{"278":1}}],["глобально",{"2":{"241":1,"243":1,"254":1}}],["глобальную",{"2":{"224":1,"351":1,"429":1}}],["глобальная",{"2":{"149":1,"243":1}}],["глобальные",{"0":{"243":1},"2":{"224":1,"225":1,"252":1,"446":1}}],["глобальный",{"2":{"121":1,"243":1,"255":1,"447":1,"463":1,"544":1}}],["глобальными",{"2":{"463":1}}],["глобальным",{"2":{"34":1,"336":1,"463":2,"464":1}}],["глобальных",{"0":{"121":1},"2":{"23":1,"119":1,"243":1,"252":1}}],["глючит",{"2":{"457":1}}],["глубоких",{"2":{"353":1}}],["глубокий",{"2":{"335":1}}],["глубоким",{"2":{"207":1}}],["глубокой",{"2":{"545":1}}],["глубокое",{"2":{"251":1}}],["глубоко",{"2":{"78":1,"246":1,"247":1,"321":1}}],["глубокого",{"2":{"65":1,"303":1}}],["глубины",{"2":{"200":1}}],["глазах",{"2":{"296":1}}],["глаза",{"2":{"204":1}}],["глаз",{"2":{"200":1}}],["гласит",{"2":{"173":1,"179":1,"264":1,"265":1,"270":1,"386":1}}],["главой",{"2":{"260":1,"307":1}}],["глав",{"2":{"221":1,"306":1}}],["главу",{"2":{"135":1,"168":1,"243":1,"262":1,"437":1}}],["главах",{"2":{"148":1,"221":1,"300":1,"321":1,"342":1}}],["глава",{"0":{"169":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1},"1":{"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1},"2":{"132":1,"170":1,"219":1,"221":1,"260":1,"271":1,"304":1,"313":1,"317":1,"342":1,"358":1,"365":1,"371":1,"410":1,"411":1,"413":1,"414":1,"417":1,"420":1}}],["главы",{"2":{"131":1,"147":1,"168":1,"169":1,"170":1,"197":1,"222":1,"223":1,"235":1,"236":2,"250":1,"256":1,"306":1,"318":1,"321":1,"322":1,"336":2,"342":1,"343":1,"345":1,"383":1,"386":1,"394":1,"419":1,"420":1,"425":1}}],["главе",{"2":{"89":1,"120":1,"124":1,"126":1,"127":2,"131":1,"133":1,"135":1,"143":1,"145":1,"147":1,"150":1,"151":3,"152":2,"158":1,"167":2,"169":1,"176":1,"181":1,"184":1,"195":1,"204":1,"205":1,"219":1,"220":1,"222":2,"224":3,"225":1,"228":1,"229":2,"232":1,"233":2,"235":4,"236":1,"239":3,"242":1,"244":1,"247":1,"249":1,"251":1,"253":1,"258":2,"259":1,"260":1,"263":1,"264":1,"267":1,"268":1,"282":1,"289":2,"292":2,"294":1,"295":1,"297":1,"298":1,"300":1,"304":2,"306":3,"309":1,"315":1,"317":1,"319":2,"320":1,"321":1,"322":2,"325":1,"326":1,"336":1,"337":2,"340":2,"341":1,"342":1,"344":2,"349":1,"352":1,"359":1,"368":2,"369":1,"370":3,"374":2,"380":1,"396":1,"407":1,"408":1,"409":1,"412":1,"415":2,"416":1,"419":3,"425":1,"426":1,"435":1,"440":2}}],["главным",{"2":{"267":1,"445":1,"472":1}}],["главных",{"2":{"151":1,"329":1,"373":1}}],["главный",{"2":{"26":1,"204":2,"224":1,"229":1,"243":1}}],["главной",{"2":{"200":1,"205":3}}],["главного",{"2":{"150":1,"198":1,"205":1,"224":1,"294":1,"315":1,"516":1}}],["главном",{"2":{"85":1,"97":1,"102":1,"200":1,"315":2,"425":1}}],["главное",{"2":{"2":1,"196":1,"205":1,"247":1,"361":1}}],["главную",{"2":{"7":1,"96":1,"204":1}}],["главная",{"0":{"205":1},"2":{"7":1,"33":1,"173":1,"204":2,"205":1,"250":1}}],["бюджетных",{"2":{"373":1}}],["бюджету",{"2":{"68":1}}],["бумажном",{"2":{"403":1}}],["бухгалтерская",{"2":{"367":1}}],["булевские",{"2":{"315":1}}],["булево",{"2":{"155":2,"231":1,"255":1}}],["буквы",{"2":{"164":1}}],["буквами",{"2":{"163":1,"166":1}}],["буква",{"2":{"144":1}}],["будто",{"2":{"270":2,"471":1}}],["будь",{"2":{"180":1,"237":1,"308":1}}],["будем",{"2":{"18":1,"22":1,"25":1,"41":1,"53":1,"58":1,"65":1,"86":1,"95":1,"109":1,"140":1,"144":1,"147":1,"148":1,"149":1,"150":2,"151":2,"152":3,"159":1,"161":1,"166":1,"167":1,"172":1,"193":1,"221":3,"222":2,"223":1,"224":1,"226":1,"227":3,"231":1,"232":1,"237":1,"249":1,"250":2,"251":1,"252":1,"254":1,"255":1,"263":1,"271":1,"272":1,"281":1,"292":1,"297":1,"300":3,"301":1,"303":2,"304":3,"310":4,"316":2,"319":1,"321":1,"325":3,"327":1,"332":1,"336":2,"338":2,"346":1,"347":1,"358":2,"359":1,"367":1,"375":1,"376":2,"381":2,"424":2,"425":3,"426":1,"427":1,"428":1,"431":1,"432":1,"451":2}}],["будете",{"2":{"147":1,"225":1,"300":1,"306":1,"342":1,"419":1,"455":1,"472":1}}],["будет",{"0":{"64":1},"2":{"2":1,"3":2,"6":3,"11":2,"12":3,"16":1,"17":2,"22":1,"25":1,"29":5,"34":1,"36":1,"39":1,"40":2,"41":5,"47":1,"59":1,"61":2,"63":1,"64":1,"65":1,"68":1,"73":1,"79":1,"86":1,"92":1,"95":1,"97":1,"104":1,"105":1,"112":1,"114":1,"116":2,"117":1,"118":1,"123":1,"134":5,"135":4,"136":2,"137":4,"139":1,"143":2,"145":1,"148":2,"149":3,"150":2,"152":2,"154":2,"155":3,"156":1,"157":1,"158":1,"159":1,"160":1,"172":2,"192":3,"193":3,"197":1,"200":1,"204":1,"210":1,"221":1,"222":1,"223":5,"224":6,"226":1,"227":2,"228":1,"229":2,"230":3,"231":8,"238":1,"239":5,"243":2,"244":3,"245":1,"246":2,"247":1,"249":3,"251":1,"254":4,"255":3,"265":1,"280":1,"281":1,"285":1,"290":2,"291":1,"293":1,"296":2,"297":2,"301":2,"302":4,"303":3,"304":1,"308":4,"315":5,"316":2,"317":1,"318":2,"322":1,"323":2,"326":1,"327":1,"328":1,"330":1,"331":5,"335":1,"336":1,"337":1,"338":3,"339":1,"346":1,"347":4,"349":9,"352":4,"353":1,"354":1,"355":1,"359":1,"360":2,"361":5,"362":1,"365":3,"366":2,"367":4,"373":1,"374":1,"375":1,"376":2,"380":1,"382":1,"383":2,"390":7,"391":1,"393":1,"394":2,"409":1,"419":1,"421":6,"422":1,"424":1,"425":2,"427":2,"428":3,"429":1,"431":1,"432":2,"433":1,"434":2,"435":1,"436":3,"437":1,"439":3,"451":1,"452":1,"457":1,"461":3,"463":2,"471":1,"472":2,"503":2,"539":1}}],["будучи",{"2":{"295":1,"301":1,"302":1}}],["будущим",{"2":{"400":1}}],["будущими",{"2":{"230":1}}],["будущих",{"2":{"5":1,"409":1}}],["будущего",{"2":{"506":1}}],["будущее",{"2":{"160":1}}],["будущем",{"2":{"22":1,"86":1,"148":1,"187":1}}],["буду",{"2":{"4":1,"222":1}}],["будут",{"2":{"2":1,"4":1,"11":1,"16":2,"44":1,"47":1,"64":1,"95":1,"109":1,"122":1,"136":1,"141":1,"149":1,"152":1,"156":1,"160":1,"163":1,"166":1,"174":1,"179":1,"198":1,"221":1,"224":2,"225":1,"227":2,"231":2,"237":3,"239":2,"240":2,"244":1,"249":1,"251":1,"254":1,"255":1,"261":1,"268":1,"294":1,"297":1,"308":2,"311":1,"315":1,"316":2,"317":1,"327":1,"328":1,"336":1,"346":2,"347":2,"349":1,"351":1,"353":1,"354":2,"355":3,"360":1,"363":1,"370":1,"373":2,"378":1,"379":1,"380":1,"387":1,"391":1,"393":2,"401":1,"431":2,"433":2,"451":1,"460":1,"501":1}}],["бэджем",{"2":{"105":1}}],["бэдж",{"2":{"105":1}}],["бэджик",{"0":{"105":1},"2":{"105":1}}],["бэджиком",{"2":{"102":1}}],["бэкэнд",{"2":{"367":2}}],["бэке",{"2":{"118":1,"462":2}}],["бэкендов",{"2":{"41":1}}],["бэкендом",{"0":{"113":1},"1":{"114":1},"2":{"41":1,"76":1,"114":2,"117":1,"365":1,"479":1,"512":1}}],["бэкенду",{"2":{"11":1,"38":1,"114":1,"511":2}}],["бэкенде",{"2":{"10":1,"44":1,"109":1,"118":1,"365":1,"366":1,"472":2}}],["бэкенд",{"0":{"116":1},"2":{"6":2,"11":1,"12":2,"17":1,"41":2,"47":1,"59":1,"79":1,"115":5,"116":5,"117":2,"360":1,"364":1,"365":1,"366":1,"419":1,"444":1,"461":1,"462":1,"507":1,"512":1,"542":1}}],["бэкенда",{"2":{"3":1,"13":1,"40":1,"41":1,"59":1,"83":1,"116":1,"117":2,"361":1,"366":1,"447":1,"473":1}}],["бэком",{"2":{"118":1}}],["бэкапов",{"2":{"451":1}}],["бэкапить",{"2":{"451":1}}],["бэкапа",{"2":{"71":1}}],["бэка",{"2":{"115":1,"116":1,"462":1}}],["бэк",{"2":{"114":1,"115":2,"116":1,"457":1}}],["боялся",{"2":{"472":1}}],["бояться",{"2":{"125":1}}],["бо́льшая",{"2":{"462":1}}],["бойскаута",{"2":{"270":1}}],["бойлерплейтов",{"2":{"507":1}}],["бойлерплейта",{"2":{"462":1}}],["бойлерплейт",{"2":{"44":1}}],["боковую",{"2":{"203":1,"347":1,"355":1}}],["боковым",{"2":{"445":1,"447":2}}],["боковых",{"2":{"198":1,"199":1}}],["боковые",{"2":{"195":1}}],["боковой",{"2":{"198":1,"200":2,"205":1,"347":1,"352":1,"527":1}}],["бонусная",{"0":{"169":1},"1":{"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1},"2":{"417":1}}],["бонусами",{"2":{"115":1}}],["бороться",{"2":{"115":1}}],["бота",{"2":{"473":2}}],["ботов",{"2":{"473":1}}],["бот",{"0":{"90":1},"2":{"90":1}}],["богатым",{"2":{"53":1}}],["большая",{"2":{"137":1,"148":1,"173":1,"472":1}}],["большом",{"2":{"228":1,"302":1}}],["большому",{"2":{"134":1}}],["большого",{"2":{"148":1,"222":1,"238":1,"364":1}}],["большое",{"2":{"123":1,"124":1,"172":1,"179":1,"180":1,"200":2,"211":1,"264":1,"269":1,"292":1,"336":1,"364":2,"368":1}}],["большой",{"2":{"79":1,"152":1,"169":1,"227":2,"263":1,"271":1,"344":1}}],["большую",{"2":{"69":1,"125":1,"228":1,"269":1,"300":1,"302":1,"344":1,"462":1}}],["больших",{"2":{"152":1,"156":2,"321":1,"383":1,"421":1,"451":1,"461":1,"462":3,"516":1}}],["большинства",{"2":{"203":1,"287":1,"300":1}}],["большинстве",{"2":{"148":1,"225":1,"244":1,"302":2,"308":1,"359":1,"360":1,"367":1,"460":1,"473":1,"536":1}}],["большинством",{"2":{"385":1}}],["большинство",{"2":{"39":1,"47":1,"116":2,"147":1,"172":2,"174":2,"200":2,"205":1,"208":1,"222":1,"251":1,"268":1,"344":1,"358":1,"360":1,"367":1,"378":1,"472":1}}],["больший",{"2":{"144":1,"244":1}}],["большим",{"2":{"137":1,"151":1,"200":1,"203":1,"367":1,"460":1,"461":2}}],["большими",{"2":{"116":1,"189":1,"205":1,"278":1,"462":1}}],["большие",{"2":{"40":1,"115":1}}],["большей",{"2":{"148":1,"152":1,"183":1,"239":1,"260":1}}],["большее",{"2":{"134":1,"361":1}}],["больше",{"0":{"123":1},"2":{"10":1,"47":1,"124":1,"143":1,"149":1,"156":1,"160":1,"161":1,"171":1,"178":2,"179":1,"180":1,"193":1,"196":1,"198":1,"248":1,"263":1,"267":1,"271":1,"276":1,"292":1,"302":2,"308":3,"315":1,"321":1,"336":2,"342":1,"353":1,"361":1,"366":1,"402":1,"421":2,"424":1,"426":1,"457":2,"460":1,"462":2,"472":2,"473":2}}],["более",{"2":{"2":2,"13":1,"14":1,"39":1,"41":1,"65":1,"68":1,"99":1,"105":2,"115":1,"117":2,"118":1,"119":1,"120":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":2,"137":1,"148":1,"149":2,"151":1,"152":3,"157":1,"158":1,"166":1,"171":2,"174":2,"178":1,"179":2,"183":1,"185":1,"187":1,"200":2,"213":1,"219":1,"221":2,"223":2,"224":2,"226":1,"227":1,"228":1,"232":4,"241":2,"242":1,"244":1,"245":1,"246":1,"247":1,"249":1,"251":1,"258":2,"260":1,"263":1,"268":1,"279":1,"281":1,"289":1,"294":1,"295":1,"296":1,"297":2,"300":2,"303":5,"308":2,"316":2,"317":2,"325":1,"330":1,"333":1,"335":1,"336":3,"344":4,"352":2,"353":2,"359":2,"366":2,"368":1,"370":3,"373":2,"376":2,"380":1,"393":1,"394":1,"400":2,"424":2,"425":1,"430":1,"445":1,"447":1,"451":1,"452":1,"455":1,"460":2,"462":3,"463":1,"464":1,"472":2,"527":1}}],["бешено",{"2":{"457":1}}],["бета",{"2":{"395":1}}],["берет",{"2":{"345":1}}],["берем",{"2":{"338":1}}],["беглый",{"2":{"204":1}}],["бегло",{"2":{"150":1}}],["бене",{"2":{"180":1}}],["бен",{"2":{"180":1}}],["бена",{"0":{"180":1}}],["бесконечна",{"2":{"192":1}}],["бесконечного",{"2":{"192":3}}],["бесконечный",{"0":{"192":1},"1":{"193":1},"2":{"192":2,"193":1}}],["бесконечными",{"2":{"178":1}}],["бесполезное",{"2":{"539":1}}],["бесполезно",{"2":{"472":1}}],["бесполезными",{"2":{"472":1}}],["беспокоиться",{"2":{"224":1,"298":1,"390":1,"439":1}}],["беспокойство",{"2":{"190":1}}],["беспарольными",{"2":{"366":1}}],["беспарольный",{"2":{"365":1}}],["беспарольная",{"0":{"365":1},"2":{"365":1}}],["бесплатными",{"2":{"444":1}}],["бесплатных",{"2":{"211":1,"217":1,"364":1}}],["бесплатный",{"2":{"144":1,"222":1,"226":1,"227":1,"309":1}}],["бесплатные",{"2":{"116":3,"444":1,"472":2}}],["бесплатная",{"2":{"89":1,"144":1,"222":2}}],["бесплатно",{"2":{"222":2,"301":1,"472":1}}],["бесплатное",{"2":{"217":1}}],["бесплатной",{"2":{"149":1}}],["бесплатного",{"2":{"40":1,"145":1,"210":1}}],["бесплатность",{"2":{"39":1}}],["белое",{"2":{"173":1}}],["белого",{"2":{"173":1}}],["безвозвратно",{"2":{"456":1,"460":1}}],["безусловно",{"2":{"303":1}}],["безымянном",{"2":{"249":1}}],["безопасен",{"2":{"181":1}}],["безопасные",{"2":{"308":1}}],["безопасны",{"2":{"300":1}}],["безопасным",{"2":{"144":1,"344":1,"366":1}}],["безопасного",{"2":{"361":1}}],["безопасной",{"2":{"244":1}}],["безопасности",{"2":{"59":1,"68":1,"115":2,"133":1,"144":3,"257":1,"267":1,"361":1,"365":1,"366":2,"368":1,"369":1,"434":1,"439":1,"464":1}}],["безопасностью",{"2":{"268":1}}],["безопасность",{"0":{"59":1},"2":{"69":1,"77":1,"115":3,"360":1,"365":1}}],["безопасную",{"2":{"143":1}}],["безболезненного",{"2":{"23":1}}],["без",{"2":{"12":1,"23":2,"62":1,"116":2,"125":1,"134":1,"148":1,"171":1,"174":1,"180":1,"190":1,"211":1,"222":3,"226":1,"228":1,"231":1,"256":1,"263":1,"282":1,"290":1,"297":1,"300":1,"302":1,"307":1,"311":1,"315":1,"316":1,"317":1,"336":1,"344":2,"345":1,"349":1,"355":1,"361":3,"363":1,"393":1,"394":1,"442":1,"446":1,"447":2,"454":1,"457":1,"461":1,"462":2,"463":1,"471":1,"472":2,"473":1,"501":1,"504":2,"507":1,"511":1,"537":1,"548":1,"553":1,"554":1}}],["брейкпойнт",{"2":{"509":1}}],["бремя",{"2":{"317":1,"372":1}}],["брендом",{"2":{"181":1}}],["бренда",{"2":{"171":1,"556":1}}],["бренды",{"2":{"16":1}}],["брали",{"2":{"451":1}}],["брату",{"2":{"325":1}}],["брать",{"2":{"316":1,"462":1}}],["братьями",{"2":{"321":1,"352":1}}],["братья",{"2":{"239":1}}],["браузеру",{"2":{"244":1,"310":1,"421":1,"455":1}}],["браузеры",{"2":{"125":2,"130":1,"183":1,"280":1,"336":3,"421":1,"444":1,"460":1,"473":1}}],["браузерные",{"2":{"306":1,"344":1}}],["браузерных",{"2":{"125":1,"367":1,"419":1}}],["браузерными",{"2":{"104":1}}],["браузере",{"2":{"123":1,"125":1,"149":1,"150":1,"205":1,"223":4,"231":1,"300":1,"311":1,"314":2,"315":1,"316":1,"318":1,"336":3,"344":1,"347":2,"349":1,"361":1,"367":1,"374":1,"378":1,"384":1,"421":1,"434":1,"452":1,"473":3,"502":1,"555":1}}],["браузером",{"2":{"115":1,"440":1,"451":1,"473":1}}],["браузеров",{"2":{"86":1,"125":1,"359":1,"367":1}}],["браузер",{"2":{"115":1,"117":3,"150":4,"151":1,"222":1,"228":1,"244":1,"257":1,"302":1,"308":1,"336":2,"344":1,"402":1,"421":3,"461":1}}],["браузерах",{"2":{"125":1,"223":1,"318":1,"335":1,"336":1}}],["браузерами",{"0":{"125":1},"2":{"86":1,"119":1,"125":2,"147":1,"183":1,"192":1,"308":1,"321":1,"340":1}}],["браузера",{"0":{"336":1},"2":{"55":1,"117":2,"147":1,"150":1,"188":1,"196":1,"222":1,"282":1,"300":1,"301":2,"306":1,"308":2,"311":2,"315":1,"316":1,"318":1,"336":2,"339":1,"358":1,"367":1,"378":1,"379":1,"380":1,"381":1,"419":1,"421":1,"473":1,"545":1,"554":1}}],["бросают",{"2":{"204":1}}],["бригаду",{"2":{"26":1}}],["билдом",{"2":{"461":1}}],["билдер",{"0":{"505":1},"1":{"506":1,"507":1},"2":{"506":1}}],["билде",{"2":{"452":1}}],["билда",{"2":{"71":1,"442":1,"444":1,"451":2,"455":1,"508":1,"540":1,"542":1}}],["бинарные",{"2":{"391":1}}],["битная",{"2":{"387":1}}],["библиотекой",{"2":{"168":1,"225":1,"463":1,"465":1}}],["библиотеками",{"2":{"507":1}}],["библиотекам",{"2":{"277":1}}],["библиотеках",{"2":{"183":1,"331":1}}],["библиотека",{"2":{"148":4,"276":1,"359":2,"431":1,"434":2,"460":1,"463":4,"465":1,"536":1}}],["библиотеку",{"0":{"456":1},"2":{"23":1,"53":2,"114":1,"148":2,"225":1,"316":1,"359":3,"367":1,"401":1,"431":1,"434":1,"463":1,"464":1,"466":1,"471":1,"504":1}}],["библиотеки",{"0":{"471":1},"2":{"23":1,"147":1,"148":3,"150":1,"151":1,"224":1,"225":1,"227":1,"231":1,"233":1,"234":2,"300":2,"308":1,"367":1,"373":2,"380":1,"419":1,"431":1,"434":1,"435":1,"445":1,"455":1,"458":1,"462":1,"466":1,"471":4,"504":2,"555":1}}],["библиотек",{"0":{"466":1},"2":{"23":2,"147":1,"148":2,"167":1,"225":4,"229":1,"233":1,"266":1,"300":1,"336":3,"363":1,"364":1,"367":1,"400":1,"431":2,"454":1,"456":1,"468":1,"471":7,"504":1,"508":1,"544":1}}],["бизнесом",{"2":{"507":1}}],["бизнеса",{"2":{"68":2}}],["бизнес",{"0":{"8":1,"68":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"14":1,"16":1,"67":1,"69":1,"116":1,"232":1,"250":1,"256":3,"268":1,"331":1,"373":1,"421":1,"425":3,"462":1,"463":5,"506":1,"507":1,"508":1,"511":1}}],["бд",{"2":{"17":2,"39":1,"44":1,"53":1,"463":1}}],["бывают",{"2":{"265":1,"267":1,"306":1,"461":1}}],["бывает",{"2":{"55":1,"118":1,"194":1,"207":1,"265":1,"271":1,"463":1}}],["быстрей",{"2":{"455":1,"457":1,"462":1,"468":1}}],["быстрее",{"2":{"125":1,"308":1,"455":1}}],["быстр",{"2":{"431":1}}],["быстрая",{"2":{"192":1,"336":1,"344":1,"431":1}}],["быстрые",{"2":{"308":1}}],["быстрым",{"2":{"200":1,"223":1,"344":1}}],["быстрых",{"2":{"180":1}}],["быстрый",{"2":{"48":1,"137":2,"151":1,"421":1,"457":1}}],["быстрой",{"2":{"188":1,"421":1}}],["быстро",{"2":{"130":2,"148":1,"168":1,"180":1,"192":1,"223":1,"265":2,"267":1,"383":1,"385":1,"464":1,"471":1,"507":3,"508":1}}],["быстрого",{"2":{"17":1,"23":1,"461":1}}],["была",{"2":{"122":1,"125":1,"127":1,"173":1,"224":2,"226":1,"231":1,"253":1,"296":1,"302":1,"342":1,"393":1,"460":1,"471":1,"473":1}}],["были",{"2":{"39":2,"62":1,"126":1,"128":1,"147":3,"172":1,"177":1,"189":1,"240":1,"244":1,"255":1,"315":1,"335":1,"355":1,"358":1,"364":1,"376":1,"377":1}}],["было",{"2":{"9":1,"10":2,"12":2,"47":2,"86":1,"132":1,"134":1,"160":1,"169":1,"187":1,"191":1,"247":1,"263":1,"288":1,"295":1,"296":1,"297":1,"301":4,"304":1,"315":1,"330":1,"344":2,"353":1,"366":1,"367":1,"375":1,"378":2,"381":1,"383":1,"384":1,"385":1,"386":1,"391":1,"393":2,"394":1,"447":1,"460":2,"462":3,"463":1,"504":1}}],["был",{"2":{"9":1,"12":1,"62":1,"89":1,"103":1,"125":1,"127":1,"134":1,"148":1,"166":1,"209":1,"223":1,"224":1,"228":1,"269":1,"280":1,"284":1,"325":1,"338":1,"355":1,"365":1,"386":1,"393":1,"430":1,"432":1,"444":2,"463":2,"473":1,"528":1}}],["бы",{"2":{"9":2,"12":3,"22":1,"83":1,"105":1,"115":1,"131":2,"134":1,"141":1,"145":1,"174":2,"190":1,"218":1,"222":2,"232":1,"235":1,"251":1,"257":1,"259":1,"263":1,"268":3,"284":2,"287":3,"295":1,"296":3,"300":1,"301":4,"313":1,"331":1,"335":1,"337":1,"345":1,"358":1,"359":1,"366":1,"370":1,"374":1,"376":1,"378":3,"381":1,"383":1,"394":1,"421":1,"422":1,"430":1,"463":1,"472":2}}],["быть",{"0":{"174":1},"2":{"2":2,"3":1,"17":1,"44":1,"47":1,"48":1,"67":1,"76":2,"86":1,"95":1,"96":1,"98":1,"105":1,"109":1,"115":1,"119":1,"122":1,"123":2,"124":1,"125":2,"134":3,"144":1,"148":3,"150":1,"151":1,"152":3,"155":1,"156":1,"159":1,"160":3,"173":1,"176":1,"178":1,"181":2,"185":1,"187":1,"188":1,"189":2,"190":1,"194":1,"200":2,"201":1,"207":1,"218":1,"227":1,"228":1,"235":1,"239":1,"241":1,"244":1,"245":2,"246":1,"247":3,"251":1,"256":2,"263":3,"266":2,"268":1,"269":1,"281":1,"289":1,"293":1,"294":2,"295":2,"297":2,"301":1,"303":1,"304":1,"306":1,"307":1,"310":4,"314":1,"315":6,"316":1,"322":1,"326":1,"330":2,"332":1,"333":1,"336":4,"337":1,"338":1,"344":1,"346":1,"355":1,"360":1,"361":3,"365":1,"366":1,"367":1,"368":1,"372":2,"373":1,"375":3,"376":1,"382":1,"385":1,"388":1,"393":1,"400":1,"421":5,"422":4,"425":1,"432":1,"437":2,"439":1,"445":1,"447":4,"451":4,"452":1,"460":1,"461":1,"467":1,"472":3,"473":3,"497":1,"507":1,"508":1,"554":1}}],["блестящих",{"2":{"405":1}}],["близка",{"2":{"300":1}}],["близко",{"2":{"176":1,"473":1}}],["близость",{"0":{"176":1}}],["близости",{"2":{"175":1,"176":1}}],["ближе",{"2":{"152":1}}],["блогов",{"2":{"344":2}}],["блог",{"2":{"115":1,"506":1,"507":1,"508":1}}],["блокчейне",{"2":{"367":1}}],["блокчейном",{"2":{"367":3}}],["блокчейнов",{"2":{"344":1,"367":1}}],["блокчейнами",{"2":{"367":1}}],["блокчейна",{"2":{"367":2}}],["блокчейну",{"2":{"367":2}}],["блокчейны",{"2":{"367":2}}],["блокчейн",{"2":{"367":3}}],["блоков",{"2":{"231":1,"508":1}}],["блоком",{"2":{"141":1}}],["блока",{"2":{"86":1,"231":2,"355":1,"372":1,"377":1,"457":1}}],["блок",{"2":{"86":1,"303":1}}],["блоке",{"2":{"22":1,"231":1,"366":1}}],["блокирующими",{"2":{"421":1}}],["блокируют",{"2":{"301":1}}],["блокировка",{"2":{"336":1}}],["блокировать",{"2":{"336":1}}],["блоки",{"2":{"4":1,"150":1,"242":1,"508":1}}],["благополучия",{"2":{"405":1}}],["благодарю",{"2":{"405":1}}],["благодаря",{"2":{"134":1,"140":1,"180":1,"182":1,"183":1,"198":1,"200":1,"231":1,"246":1,"300":1,"344":1,"433":1,"473":1}}],["благо",{"2":{"102":1}}],["благозвучно",{"2":{"2":1}}],["багов",{"2":{"372":2}}],["баги",{"2":{"2":1,"464":1}}],["байт",{"2":{"336":1}}],["бара",{"2":{"190":1}}],["бары",{"2":{"190":1}}],["балансировщика",{"2":{"140":1}}],["банк",{"2":{"366":1}}],["баннер",{"2":{"315":2}}],["баннеры",{"2":{"4":1}}],["бандла",{"2":{"452":1,"465":1}}],["бандл",{"2":{"116":1,"452":1,"460":1,"471":1,"540":1}}],["бандлер",{"2":{"280":1}}],["бандлеры",{"2":{"280":1}}],["бандле",{"2":{"59":1,"455":1}}],["базой",{"2":{"282":1,"394":1,"419":1,"433":1}}],["базовая",{"2":{"323":1}}],["базовую",{"2":{"225":1,"291":1,"464":1}}],["базового",{"0":{"329":1},"1":{"330":1},"2":{"221":1,"229":1,"321":1,"328":1,"380":1}}],["базовой",{"2":{"183":1,"239":1,"311":1,"409":1}}],["базовом",{"2":{"148":1,"323":1,"331":1,"359":1,"472":1}}],["базовое",{"2":{"147":1}}],["базовые",{"2":{"251":1,"374":1,"401":1}}],["базовым",{"2":{"224":1,"374":1,"429":1}}],["базовый",{"0":{"374":1},"2":{"135":1,"136":1,"223":1,"317":1,"329":1}}],["базовых",{"2":{"85":1,"150":1,"222":1,"246":1,"316":1,"400":1}}],["базе",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1},"2":{"40":1,"59":1,"83":1,"116":3,"125":2,"287":1,"300":1,"360":2,"430":1,"440":1,"463":1}}],["базы",{"2":{"17":2,"39":1,"116":1,"204":1,"336":3,"355":1,"360":1,"391":1,"431":2,"432":1,"433":1}}],["базу",{"2":{"17":2,"40":2,"53":1,"59":1,"116":1,"308":1,"336":2,"431":1,"433":1}}],["баз",{"0":{"17":1},"1":{"18":1,"19":1},"2":{"17":1,"48":2,"336":1,"373":1}}],["базам",{"2":{"457":1}}],["базами",{"2":{"372":1,"419":1}}],["базах",{"2":{"43":1,"44":1,"47":1}}],["база",{"2":{"6":2,"41":1,"79":1,"256":1,"308":1,"336":1,"419":1,"427":1,"431":3,"457":1,"463":1}}],["synctex",{"2":{"457":1}}],["system",{"2":{"385":2}}],["sftp",{"2":{"457":1}}],["sfc",{"2":{"86":2,"151":3,"159":1,"160":1,"224":1,"378":1,"457":2,"462":1}}],["snickerbockers",{"2":{"451":2}}],["snake",{"2":{"44":1,"163":1}}],["s3",{"2":{"444":1}}],["smoothscrolling",{"2":{"457":1}}],["smart",{"2":{"367":1}}],["sms",{"2":{"366":2}}],["smith",{"2":{"123":1}}],["svelte",{"2":{"344":1,"457":3,"462":2}}],["svgo",{"2":{"457":10}}],["svgresources",{"2":{"454":4}}],["svg",{"2":{"224":1,"317":1,"453":2,"454":3,"455":1,"457":2,"513":1}}],["sans",{"2":{"557":1}}],["savenote",{"2":{"432":3}}],["savedposition",{"2":{"349":1}}],["save",{"2":{"317":1,"457":1}}],["saveprompt",{"2":{"315":2}}],["sass",{"2":{"86":1,"457":1}}],["square",{"2":{"290":4}}],["sql",{"2":{"17":3,"39":1,"59":1,"118":1,"431":1,"451":1,"457":1,"463":2,"472":1}}],["slidingheader",{"0":{"534":1}}],["slider",{"2":{"459":1}}],["sln",{"2":{"391":1}}],["slots",{"2":{"249":1}}],["slot=",{"2":{"249":4}}],["slot",{"2":{"249":8}}],["slot>",{"2":{"249":5,"255":2}}],["slug",{"2":{"97":1}}],["skeuomorphism",{"2":{"225":1}}],["ssg",{"0":{"473":1},"2":{"473":3}}],["ssd",{"2":{"457":1}}],["ss06",{"2":{"457":1}}],["ss03",{"2":{"457":1}}],["ss02",{"2":{"457":1}}],["ss01",{"2":{"457":1}}],["ssr",{"0":{"473":1},"2":{"349":1,"391":1,"457":1,"463":2,"473":9}}],["ssl",{"2":{"309":1,"360":1,"444":2}}],["ssh",{"2":{"143":1,"144":2,"451":14,"457":2}}],["sso",{"2":{"115":2}}],["s",{"0":{"144":1},"2":{"131":1,"143":1,"144":4,"145":1,"178":1,"309":1,"416":1,"451":1,"452":1,"455":1,"463":1,"511":1}}],["swagger",{"2":{"472":1}}],["swiper",{"2":{"459":1}}],["switch",{"2":{"184":1,"256":2,"290":1,"294":1,"296":1}}],["sw",{"2":{"112":2,"391":1,"473":1,"496":1}}],["scs",{"2":{"385":1,"386":2}}],["scss",{"0":{"86":1},"2":{"23":1,"86":5,"453":1,"457":1,"504":1,"509":2,"557":1}}],["sc",{"2":{"385":1}}],["scope",{"2":{"362":2,"554":1}}],["scoped",{"2":{"151":2}}],["scoped>",{"2":{"151":1,"191":1,"230":1,"298":1,"335":1,"453":1}}],["scmitem",{"2":{"457":1}}],["scmgroupinline",{"2":{"457":1}}],["scmgroup",{"2":{"457":1}}],["scms",{"2":{"385":1}}],["scm",{"2":{"222":1,"457":2}}],["scaffolding",{"2":{"112":1,"224":1,"501":1}}],["scrollbehavior",{"2":{"349":1}}],["scrolly",{"2":{"250":2}}],["scroll",{"2":{"193":6,"250":2,"460":1}}],["scroller",{"2":{"192":1}}],["screenwidthfactor",{"2":{"509":1}}],["screenshots",{"2":{"313":1}}],["screen",{"0":{"556":1},"2":{"112":2,"203":1,"501":1,"506":2,"508":1,"515":1,"542":1}}],["scripts",{"2":{"224":1,"375":2,"451":1}}],["script>",{"2":{"103":1,"123":1,"149":3,"151":1,"152":5,"160":1,"191":1,"193":1,"230":1,"251":1,"255":1,"267":1,"298":1,"299":1,"324":1,"325":1,"328":1,"330":1,"335":1,"339":1,"352":1,"432":1,"437":1,"448":1,"453":1,"509":1,"513":1,"529":3,"538":1}}],["script",{"0":{"152":1},"2":{"103":1,"122":1,"123":1,"125":1,"130":1,"149":3,"151":2,"152":4,"160":1,"191":1,"193":1,"224":1,"225":3,"229":1,"230":3,"231":2,"243":1,"245":2,"246":1,"250":1,"251":1,"255":2,"267":2,"298":1,"299":1,"315":1,"324":1,"325":1,"328":1,"330":1,"333":1,"335":1,"339":1,"352":3,"358":1,"393":1,"432":1,"437":1,"448":1,"451":2,"453":1,"457":1,"460":1,"504":1,"509":1,"513":1,"529":1,"538":1}}],["src=",{"2":{"149":1,"154":1,"452":3,"453":1,"529":1}}],["src",{"0":{"136":1,"193":1,"349":1,"350":1,"355":1,"376":1,"380":1,"381":1,"432":1,"433":1,"434":1,"437":1},"2":{"95":1,"103":1,"136":1,"154":1,"224":2,"228":2,"230":1,"253":1,"255":5,"256":2,"311":1,"313":1,"317":3,"346":1,"352":1,"374":1,"375":5,"382":1,"452":1,"455":2,"515":1,"538":1}}],["srs",{"2":{"9":1,"69":1}}],["sb",{"2":{"83":3}}],["sdlc",{"2":{"67":1}}],["sdk",{"0":{"50":1},"1":{"51":1,"52":1},"2":{"50":1,"367":1}}],["social",{"2":{"452":1}}],["sockets",{"2":{"360":1}}],["solvery",{"2":{"472":1}}],["solana",{"2":{"367":1}}],["solid",{"2":{"191":1,"227":2,"231":3,"509":1}}],["software",{"0":{"77":1},"2":{"67":1,"69":1}}],["somearr",{"2":{"462":4}}],["someimage",{"2":{"452":1}}],["someid",{"2":{"193":1}}],["somecomponent",{"0":{"450":1},"2":{"250":1}}],["somefunc",{"2":{"116":1}}],["somevalue",{"2":{"52":2,"53":2}}],["some",{"2":{"52":2,"53":2,"244":1,"245":2,"249":2}}],["source",{"0":{"382":1,"385":1},"2":{"12":1,"39":1,"62":1,"300":1,"375":1,"385":3,"397":1,"451":1,"457":3,"499":1,"527":1}}],["seed",{"2":{"512":1}}],["sentry",{"2":{"457":2}}],["senddata",{"2":{"437":2}}],["send",{"2":{"430":1,"437":3}}],["sendrequest",{"2":{"429":4}}],["sendtoserver",{"2":{"363":1,"364":2}}],["sendmessage",{"2":{"328":2}}],["semi",{"2":{"457":1}}],["separate",{"2":{"457":1}}],["separation",{"0":{"263":1},"2":{"260":1}}],["serif",{"2":{"557":1}}],["series",{"2":{"376":3}}],["servers",{"2":{"402":1}}],["server",{"0":{"439":1},"2":{"117":3,"137":1,"141":1,"360":1,"439":1,"451":3,"457":5,"473":1}}],["serviceworker",{"2":{"316":2}}],["services",{"0":{"327":1,"338":1,"428":1,"430":1,"433":1,"435":1},"2":{"114":1,"256":1,"328":1,"330":1,"339":1,"374":1,"376":1,"425":1,"429":4,"430":1,"432":1,"434":2,"435":1,"436":2,"437":1,"511":1}}],["service",{"0":{"316":1,"330":1,"555":1},"2":{"39":1,"79":1,"112":2,"116":1,"166":1,"247":2,"306":1,"308":1,"315":1,"316":5,"317":1,"320":1,"338":1,"361":1,"428":8,"429":3,"430":2,"433":2,"435":2,"457":1,"473":3,"496":1,"501":1,"506":1,"515":1,"542":1,"553":1,"555":2}}],["search",{"2":{"352":1,"457":1}}],["session",{"0":{"339":1}}],["sessionstorage",{"0":{"338":1},"2":{"336":6,"337":2,"338":4,"339":3,"341":2}}],["sessionstore",{"2":{"336":1}}],["self",{"2":{"316":1,"423":4,"424":1,"429":2}}],["selected=ref",{"2":{"432":1}}],["selected",{"2":{"355":1,"432":4}}],["select=id",{"2":{"56":2,"83":3}}],["select=",{"2":{"53":1,"56":1}}],["select",{"2":{"52":2,"59":1,"112":5,"158":1,"201":1,"471":2,"501":5}}],["second",{"2":{"534":1}}],["seconds",{"2":{"365":3}}],["seconds=ref",{"2":{"365":1}}],["security",{"2":{"457":1}}],["secure",{"2":{"143":1,"144":1,"360":1}}],["section>",{"2":{"249":2,"324":2,"432":6,"437":4}}],["section",{"2":{"203":2,"469":1}}],["secrets",{"2":{"451":2}}],["secret",{"2":{"58":1,"361":3}}],["setlocale",{"2":{"538":2}}],["setlogoutcallback",{"2":{"114":1}}],["setoptions",{"2":{"512":1}}],["setsomearr",{"2":{"462":1}}],["setting",{"2":{"451":1,"457":1}}],["settings",{"2":{"451":1,"457":1,"527":1}}],["settimeout",{"2":{"423":2,"430":1}}],["settokencallback",{"2":{"114":1}}],["setvalue",{"2":{"381":2}}],["setimmediate",{"2":{"302":2,"303":1}}],["setitem",{"2":{"104":1,"336":2,"338":1,"451":1}}],["setdbmanager",{"2":{"287":1}}],["setbaseurl",{"2":{"114":1}}],["setup>",{"2":{"123":1,"151":1,"152":1,"160":1,"191":1,"193":1,"230":1,"251":1,"255":1,"267":1,"298":1,"299":1,"324":1,"325":1,"328":1,"330":1,"335":1,"339":1,"352":1,"432":1,"437":1,"448":1,"453":1}}],["setup",{"0":{"152":1},"2":{"103":1,"122":1,"125":1,"130":1,"151":1,"152":5,"229":1,"245":2,"246":1,"250":1,"255":1,"267":1,"333":1,"352":1,"358":1,"451":4,"457":1,"460":1,"463":1,"504":1,"509":1,"513":1,"538":1}}],["set",{"2":{"103":2,"104":2,"114":1,"296":2,"297":1,"338":2,"394":1,"449":1,"454":2}}],["seo",{"0":{"473":1},"2":{"79":1,"97":1,"473":1}}],["sponsors",{"2":{"457":1}}],["sp",{"2":{"361":1}}],["spec",{"2":{"375":1,"457":1}}],["specs",{"2":{"361":1}}],["special",{"2":{"160":1,"251":1}}],["specification",{"2":{"69":1}}],["splide",{"2":{"459":1}}],["splice",{"2":{"292":1}}],["splashscreen",{"2":{"501":1}}],["splash",{"0":{"556":1},"2":{"112":2,"501":1,"506":2,"508":1,"515":1,"542":1,"556":1}}],["spinnercomponent",{"2":{"244":2}}],["spinner",{"0":{"191":1},"2":{"191":2}}],["spree",{"2":{"41":1}}],["span>post",{"2":{"437":1}}],["span>get",{"2":{"437":1}}],["span>",{"2":{"103":1,"157":1,"191":1,"231":2,"324":2,"325":1,"437":2}}],["span",{"2":{"103":1,"157":2,"185":1,"191":1,"231":4,"325":1}}],["spa",{"0":{"136":1,"308":1,"309":1,"344":1,"473":1},"1":{"310":1,"311":1,"312":1,"313":1,"314":1,"315":1},"2":{"6":1,"115":1,"131":2,"135":1,"258":1,"306":3,"308":5,"313":1,"315":1,"316":3,"319":1,"320":1,"342":3,"344":12,"345":1,"358":1,"359":1,"360":3,"361":2,"364":1,"366":4,"367":2,"368":1,"369":3,"412":1,"473":11,"508":1}}],["sum",{"2":{"457":2}}],["summary",{"2":{"83":4}}],["suggestselection",{"2":{"457":1}}],["success=false",{"2":{"429":1}}],["success",{"2":{"428":3,"429":2}}],["suo",{"2":{"391":1}}],["sudo",{"2":{"388":4,"389":1,"451":3}}],["substring",{"2":{"454":2}}],["submodules",{"2":{"445":1,"451":4}}],["submit",{"2":{"365":1}}],["subversion",{"2":{"385":1}}],["sub",{"2":{"291":1,"295":1,"352":2,"353":1,"361":2}}],["sublime",{"2":{"222":1}}],["subtitle",{"2":{"17":1,"18":1}}],["suspense",{"2":{"160":1,"447":1}}],["sue",{"2":{"123":1}}],["surname",{"2":{"123":6}}],["supabase",{"0":{"40":1,"49":1,"50":1,"53":1,"57":1,"82":1},"1":{"50":1,"51":2,"52":2,"53":1,"58":1,"59":1,"83":1},"2":{"39":2,"40":2,"41":4,"50":2,"51":2,"52":8,"53":10,"56":4,"58":1,"59":2,"116":2,"472":1}}],["side",{"2":{"473":1}}],["sidebarlayout",{"2":{"447":2}}],["sidebar>",{"2":{"249":1,"352":2}}],["sidebars",{"2":{"195":1}}],["sidebar",{"0":{"30":1,"99":1},"2":{"28":1,"249":2,"352":8,"355":2}}],["siblings",{"2":{"321":1}}],["size",{"2":{"449":1,"453":5}}],["sizes",{"2":{"311":1,"313":1,"317":3}}],["size=",{"2":{"105":1,"452":1}}],["siri",{"2":{"171":1}}],["sites",{"0":{"141":1},"2":{"140":1}}],["site",{"2":{"117":3,"451":14,"473":1}}],["signinuser",{"2":{"365":2}}],["signature",{"2":{"361":2}}],["sign",{"2":{"115":1}}],["singlequote",{"2":{"457":1}}],["singleclick",{"2":{"457":1}}],["singleton",{"0":{"277":1,"326":1},"1":{"278":1,"279":1,"280":1,"281":1,"327":1,"328":1},"2":{"103":1,"260":1,"273":1,"280":2,"281":6,"287":1,"292":2,"305":1,"321":1,"326":1,"329":1}}],["single",{"0":{"265":1},"2":{"52":1,"115":1,"260":1,"473":1}}],["simplenavbar",{"0":{"550":1}}],["simpleheader",{"0":{"531":1}}],["simplefooter",{"0":{"521":1}}],["simpledrawer",{"0":{"518":1},"2":{"501":2,"519":1}}],["simpledialog",{"2":{"457":1}}],["simplestate",{"0":{"330":1},"2":{"330":1}}],["simple",{"0":{"269":1},"2":{"2":1,"260":1,"330":1,"457":4}}],["shims",{"2":{"457":1}}],["shift+f12",{"2":{"86":1}}],["shrinkwrap",{"2":{"457":2}}],["shnpx",{"2":{"455":1}}],["shpnpm",{"2":{"455":1}}],["shortcuts",{"2":{"313":1}}],["short",{"0":{"269":1},"2":{"311":1,"313":1,"317":1,"554":1}}],["showdocumentation",{"2":{"457":1}}],["showsuggestionsassnippets",{"2":{"457":1}}],["showmessage",{"2":{"328":3}}],["showmodal",{"2":{"256":1}}],["show=",{"2":{"155":1,"231":2,"315":2}}],["show",{"0":{"155":1},"2":{"155":1,"156":3,"160":1,"178":1,"251":1,"255":6,"365":2}}],["shopping",{"2":{"12":1}}],["shallowref",{"2":{"460":2}}],["shaking",{"2":{"454":1,"465":1}}],["shape2",{"2":{"290":2}}],["shape1",{"2":{"290":2}}],["shaming",{"0":{"216":1}}],["sha",{"2":{"148":1}}],["shared",{"2":{"137":1}}],["sharing",{"2":{"117":1,"439":1}}],["shell",{"2":{"143":1,"445":1,"457":1}}],["sheet",{"0":{"488":1},"1":{"489":1,"490":1,"491":1,"492":1,"493":1,"494":1},"2":{"17":1,"489":1,"490":1,"491":1,"492":4}}],["sh$",{"2":{"111":1,"112":2,"136":1,"223":3,"231":1,"317":1,"346":1,"374":2,"375":2,"376":1,"379":2,"383":1,"384":2,"388":2,"390":4,"391":2,"394":4,"431":1,"434":1,"438":2,"501":1,"502":1,"503":1,"506":1}}],["shcurl",{"2":{"53":1,"56":1}}],["sh",{"2":{"51":1,"326":1,"331":1,"457":2}}],["stylus",{"2":{"460":1}}],["stylelint",{"2":{"457":4}}],["styleci",{"2":{"457":2}}],["style=",{"2":{"299":1,"453":2}}],["stylesheet",{"2":{"226":1,"227":3}}],["styles",{"2":{"224":1,"226":1,"350":2}}],["style>",{"2":{"151":1,"191":1,"230":1,"298":1,"335":1,"453":1}}],["style",{"2":{"69":1,"151":2,"191":1,"230":2,"231":1,"298":1,"335":1,"453":1,"457":1,"472":2}}],["steps",{"2":{"451":2}}],["stoploading",{"2":{"449":2,"450":2}}],["storage",{"0":{"339":1},"2":{"339":1}}],["story",{"2":{"239":1,"457":1}}],["stores",{"0":{"333":1},"2":{"335":1,"433":1}}],["store",{"0":{"332":1},"2":{"14":1,"135":1,"222":1,"308":4,"321":1,"391":1,"463":4}}],["storefront",{"2":{"10":1,"41":1,"507":1}}],["study",{"2":{"308":1}}],["studio",{"2":{"222":1,"387":1,"394":1,"402":1}}],["stupid",{"2":{"2":1,"260":1}}],["stickyscroll",{"2":{"457":1}}],["sticky",{"2":{"195":1,"457":1,"531":1,"532":1,"533":1}}],["stackblitz",{"2":{"457":3}}],["stackable",{"2":{"297":1}}],["stash",{"2":{"457":3}}],["staging",{"2":{"391":1,"451":5}}],["staged",{"2":{"457":2}}],["stage",{"2":{"390":1,"391":1,"393":2}}],["standalone",{"2":{"311":2,"313":1,"317":1,"554":1}}],["starbucks",{"2":{"308":1}}],["startloading",{"2":{"449":2,"450":2}}],["startotptimer",{"2":{"365":2}}],["started",{"2":{"256":2}}],["start",{"2":{"172":1,"173":1,"178":1,"311":1,"313":1,"317":1,"374":1,"375":1,"554":1}}],["static",{"2":{"349":1,"452":1,"473":1}}],["status>=200",{"2":{"435":2}}],["status>200",{"2":{"365":1}}],["status",{"2":{"256":2,"360":1,"365":1,"391":1,"435":2}}],["states",{"2":{"353":1,"355":2}}],["stateful",{"2":{"250":1,"463":1}}],["state",{"0":{"127":1,"463":1},"2":{"102":2,"119":1,"330":2,"332":7,"337":1,"353":2,"355":3,"359":1,"362":1,"363":1,"434":1,"457":1,"463":5}}],["string>",{"2":{"449":1}}],["stringhelpers",{"2":{"445":1}}],["strings",{"2":{"356":1}}],["string",{"2":{"243":1,"245":3,"255":2,"362":2,"376":2,"449":1,"452":1,"453":6}}],["stringify",{"2":{"104":1,"336":1,"432":3}}],["strategies",{"2":{"180":1}}],["strong>child",{"2":{"339":1}}],["strong>counter",{"2":{"324":1}}],["strong>state",{"2":{"330":1}}],["strong>received",{"2":{"328":1}}],["strong>",{"2":{"123":4,"324":1,"328":1,"330":1,"339":1,"432":2}}],["strongly",{"2":{"91":1}}],["karma",{"2":{"457":10}}],["known",{"2":{"376":1}}],["komodo",{"2":{"222":1}}],["kobold",{"2":{"205":2}}],["keen",{"2":{"459":1}}],["keepalive",{"2":{"160":2}}],["keep",{"0":{"267":1,"269":1},"2":{"2":1,"260":2,"267":1,"292":1}}],["kebab",{"2":{"230":2}}],["keys",{"2":{"463":1}}],["keyup",{"2":{"231":2}}],["keyframes",{"2":{"191":1}}],["key=",{"2":{"157":1,"193":1,"231":2,"352":1,"355":1,"432":1}}],["key",{"0":{"157":1},"2":{"52":1,"53":6,"157":1,"160":1,"231":1,"247":3,"296":5,"356":2,"361":4,"451":9}}],["kic",{"0":{"267":1},"2":{"260":1,"267":1}}],["kit",{"2":{"23":1}}],["kiss",{"0":{"269":1},"2":{"2":1,"260":1,"269":2}}],["сэкономит",{"2":{"465":1}}],["сэкономить",{"2":{"400":1,"471":1}}],["сжатие",{"2":{"454":1}}],["сдвигает",{"2":{"421":1}}],["сдерживающим",{"2":{"360":1}}],["сделки",{"2":{"216":1}}],["сделав",{"2":{"434":1,"465":1}}],["сделанный",{"2":{"473":1}}],["сделан",{"2":{"432":1}}],["сделана",{"2":{"393":1}}],["сделаны",{"2":{"377":1}}],["сделано",{"2":{"232":1,"315":1,"391":1,"393":1}}],["сделал",{"2":{"270":1,"468":1}}],["сделали",{"2":{"232":2,"235":1,"344":1,"346":1,"390":1,"473":1}}],["сделайте",{"2":{"225":1,"363":1,"466":1,"472":2}}],["сделает",{"2":{"151":1,"166":1,"381":1}}],["сделаем",{"2":{"65":1,"97":1,"169":2,"235":1}}],["сделать",{"2":{"7":1,"11":1,"12":1,"25":1,"35":1,"62":1,"63":1,"82":1,"85":1,"115":2,"116":3,"135":1,"143":1,"145":1,"179":1,"208":1,"216":1,"223":1,"225":1,"227":2,"228":1,"232":3,"241":1,"255":1,"256":1,"257":1,"258":1,"270":2,"300":1,"309":1,"316":1,"321":1,"336":1,"345":1,"349":1,"352":1,"363":1,"364":1,"367":1,"391":1,"393":2,"394":1,"400":1,"421":3,"430":1,"444":1,"447":1,"460":2,"462":1,"463":1,"464":1,"473":1,"555":1}}],["сша",{"2":{"269":1}}],["сформировать",{"2":{"352":1}}],["сформулировал",{"2":{"180":1}}],["сферы",{"2":{"269":1}}],["сцену",{"2":{"240":1}}],["сцены",{"2":{"237":1}}],["сценарием",{"2":{"428":1}}],["сценариев",{"2":{"228":1,"368":1,"400":1}}],["сценариях",{"2":{"308":1,"352":1,"355":1}}],["сценариям",{"2":{"270":1}}],["сценария",{"2":{"121":1,"149":1,"234":1,"237":1,"377":1,"422":1,"447":1}}],["сценарий",{"0":{"526":1},"1":{"527":1,"528":1},"2":{"115":1,"316":1,"542":1}}],["сценарии",{"2":{"68":1,"234":1,"308":2,"365":1,"372":1,"545":1}}],["сюда",{"2":{"224":1,"496":1}}],["сбить",{"2":{"375":1}}],["сбивать",{"2":{"302":1}}],["сбивают",{"2":{"213":1}}],["сброса",{"2":{"231":1}}],["сбоя",{"2":{"316":1}}],["сбоку",{"2":{"186":1}}],["сбор",{"2":{"508":1}}],["сборник",{"2":{"454":1}}],["сборок",{"2":{"227":1,"395":1,"455":1}}],["сбора",{"2":{"171":1,"185":1,"347":1}}],["сборку",{"2":{"243":1,"395":1}}],["сборке",{"2":{"224":1,"225":1,"317":1,"336":1}}],["сборки",{"2":{"135":1,"149":1,"222":1,"228":1,"233":1,"317":1,"382":1}}],["сборка",{"0":{"455":1},"2":{"125":1,"149":1,"228":1,"451":1,"455":1}}],["сборщиков",{"2":{"224":1,"244":1}}],["сборщиком",{"2":{"124":1,"150":1,"151":1,"224":1,"228":1}}],["сборщики",{"2":{"150":1,"244":1}}],["сборщика",{"0":{"150":1},"2":{"127":1,"150":2,"151":1,"152":1,"221":2,"223":1,"317":1,"455":3,"504":1}}],["сборщик",{"2":{"119":1,"126":1,"149":1,"150":2,"151":1,"152":1,"224":2,"267":1,"401":1,"455":3}}],["схожих",{"2":{"373":1}}],["схожи",{"2":{"373":1,"462":1}}],["схожести",{"2":{"176":1}}],["схеме",{"2":{"293":1}}],["схема",{"2":{"109":1,"211":1,"215":1,"216":1,"217":1}}],["схемы",{"2":{"38":1,"205":1,"336":1,"342":1,"355":1}}],["схему",{"2":{"17":1,"140":1,"433":1}}],["сне",{"2":{"460":1}}],["снять",{"2":{"267":1,"292":1,"316":1,"473":1}}],["снятие",{"2":{"287":1}}],["снятии",{"2":{"231":1}}],["снятия",{"2":{"206":1}}],["сняты",{"2":{"128":1}}],["снова",{"2":{"160":1,"193":2,"293":1,"296":1,"361":1,"365":1,"379":1}}],["сначала",{"2":{"147":1,"149":1,"150":1,"151":1,"152":1,"203":1,"223":1,"232":1,"297":1,"301":1,"316":6,"329":1,"331":1,"344":1,"348":1,"362":1,"365":1,"374":1,"433":1}}],["сниппетов",{"2":{"542":1}}],["сниппет",{"2":{"302":2}}],["снизить",{"2":{"300":1,"361":1,"471":1}}],["снизу",{"2":{"29":1,"98":1}}],["снимку",{"2":{"391":1}}],["снимке",{"2":{"173":1,"329":1}}],["снимок",{"2":{"355":1}}],["снимаем",{"2":{"267":1,"317":1,"352":1}}],["снимать",{"2":{"115":1}}],["снимаются",{"2":{"115":1}}],["снижает",{"2":{"473":1}}],["снижают",{"2":{"461":1}}],["снижаться",{"2":{"125":1}}],["снижением",{"2":{"148":1}}],["считывать",{"2":{"463":1}}],["считывателем",{"2":{"366":1}}],["считывает",{"2":{"250":1,"513":1}}],["считаются",{"2":{"310":1}}],["считая",{"2":{"303":1}}],["считает",{"2":{"463":1}}],["считается",{"2":{"117":1,"144":1,"203":1,"205":1,"336":1,"355":1,"361":1,"366":1,"367":1,"472":1}}],["считаем",{"2":{"246":1,"439":1}}],["считаться",{"2":{"320":1}}],["считать",{"2":{"237":1,"310":1,"419":1,"426":1,"464":1}}],["счастливо",{"2":{"227":1}}],["счастью",{"2":{"144":1,"303":1}}],["счетчики",{"2":{"239":1}}],["счетчика",{"2":{"232":1,"323":1}}],["счетчик",{"2":{"223":1,"323":1,"325":1}}],["счет",{"2":{"123":1,"148":1,"175":1,"306":1}}],["сгенеренные",{"2":{"473":1}}],["сгенерировавшего",{"2":{"422":1}}],["сгенерированные",{"2":{"317":1}}],["сгенерированный",{"2":{"224":1}}],["сгенерировать",{"2":{"316":1,"444":1}}],["сгенерился",{"2":{"91":1}}],["сгенерить",{"2":{"89":1}}],["сгорания",{"2":{"472":1}}],["сгруппированы",{"2":{"293":1}}],["сгруппированные",{"2":{"263":1}}],["сгруппированных",{"2":{"263":1}}],["сгруппировать",{"2":{"123":1}}],["сгиба",{"2":{"205":1}}],["ссылок",{"2":{"196":1,"205":2,"267":2,"287":1,"352":1,"355":1}}],["ссылаясь",{"2":{"381":1}}],["ссылаемся",{"2":{"352":1}}],["ссылаемой",{"2":{"158":1}}],["ссылается",{"2":{"338":1,"423":1}}],["ссылаются",{"2":{"296":1}}],["ссылающийся",{"2":{"225":1}}],["ссылаться",{"2":{"121":1,"152":2,"157":1,"224":2,"228":1,"231":1,"246":1,"292":1,"304":1,"381":1}}],["ссылкой",{"2":{"204":1,"205":1}}],["ссылки",{"2":{"163":3,"204":1,"205":1,"221":1,"245":1,"247":1,"255":1,"264":1,"277":1,"308":1,"332":1,"352":1,"355":1,"358":1,"421":1,"428":2,"455":1}}],["ссылке",{"2":{"142":1,"152":1,"323":1,"421":1,"528":1}}],["ссылку",{"2":{"97":1,"136":1,"142":1,"193":3,"226":1,"281":2,"292":1,"315":1,"336":1,"352":1,"428":1}}],["ссылками",{"2":{"29":1,"33":1,"205":1,"247":1}}],["ссылка",{"0":{"204":1},"2":{"22":1,"97":1,"102":1,"123":1,"196":1,"204":2,"205":2,"245":1,"347":1,"428":1}}],["смартфоне",{"2":{"473":1}}],["смартфона",{"2":{"473":1}}],["смарт",{"2":{"367":1}}],["смесь",{"2":{"344":1}}],["смешивает",{"2":{"271":1,"462":1}}],["смешиваясь",{"2":{"176":1}}],["смена",{"2":{"536":1,"547":1}}],["смену",{"2":{"250":1,"462":1}}],["смене",{"2":{"41":1}}],["смог",{"2":{"382":1}}],["смогли",{"2":{"131":1,"174":1,"180":1}}],["смогло",{"2":{"62":1}}],["сможет",{"2":{"303":1,"421":1,"508":1}}],["сможете",{"2":{"222":1,"321":2,"468":1}}],["сможем",{"2":{"227":1,"263":1,"303":1,"333":1,"387":1,"433":1}}],["смонтируем",{"2":{"225":1}}],["смонтирован",{"2":{"152":1}}],["смонтировать",{"2":{"149":1,"380":1}}],["см",{"2":{"125":1,"160":1,"195":1,"239":1,"243":1,"256":1,"292":1,"310":1,"326":1,"336":1,"362":1,"393":1}}],["смысле",{"2":{"156":1,"269":1,"366":1,"463":1}}],["смысл",{"2":{"124":1,"190":1,"352":1,"473":1}}],["смысла",{"2":{"38":1,"209":1}}],["смыслом",{"2":{"16":1}}],["сродни",{"2":{"426":1}}],["срочным",{"2":{"187":2}}],["срока",{"2":{"134":1,"144":1}}],["срок",{"2":{"115":3,"144":1}}],["сроком",{"2":{"115":1}}],["сроков",{"2":{"68":1}}],["средних",{"2":{"330":1}}],["средним",{"2":{"291":1}}],["средний",{"2":{"291":3}}],["среднем",{"2":{"472":1}}],["средней",{"2":{"269":1}}],["среднего",{"2":{"148":2,"335":1,"472":1}}],["среда",{"2":{"223":1,"457":1}}],["средам",{"2":{"171":1,"269":1}}],["среде",{"2":{"219":1,"380":1}}],["среды",{"2":{"184":1,"198":1,"221":2,"250":1,"267":1,"301":1}}],["средство",{"2":{"361":1,"455":1,"507":1}}],["средством",{"2":{"218":1}}],["средствами",{"2":{"460":1,"471":1}}],["средствах",{"2":{"394":1}}],["средства",{"2":{"325":1,"394":3,"460":1,"461":1,"471":1}}],["средств",{"2":{"62":1,"137":1,"172":1,"210":1,"245":1,"366":1,"372":1}}],["среди",{"2":{"39":1,"222":2,"308":1,"332":1,"431":1,"461":1}}],["сработает",{"2":{"377":2}}],["срабатывание",{"2":{"376":1}}],["срабатывания",{"2":{"315":1}}],["срабатывают",{"2":{"349":1}}],["срабатывает",{"2":{"255":1,"303":1,"315":1,"422":2}}],["сравнится",{"2":{"473":1}}],["сравниваются",{"2":{"471":1}}],["сравним",{"2":{"120":1,"152":2}}],["сравнений",{"2":{"376":1}}],["сравнения",{"0":{"212":1},"2":{"255":1}}],["сравнении",{"2":{"148":1}}],["сравнению",{"2":{"124":1,"147":1,"209":1,"224":1,"256":1,"257":1,"319":1,"335":1,"344":1,"371":1,"540":1}}],["сравнение",{"2":{"4":1,"123":1,"212":1}}],["сразу",{"2":{"33":1,"62":1,"65":1,"82":1,"98":1,"115":1,"158":1,"159":1,"293":1,"303":1,"326":1,"419":1,"452":1,"473":2,"508":1,"553":1}}],["скилл",{"2":{"472":1}}],["скидка",{"2":{"109":1}}],["склонений",{"2":{"460":1,"536":1}}],["сквозные",{"2":{"381":1}}],["сквозном",{"2":{"381":1}}],["скажется",{"2":{"227":1}}],["скажем",{"2":{"59":1}}],["скачивает",{"2":{"451":1}}],["скачивания",{"2":{"217":1}}],["скачок",{"2":{"330":1}}],["скачайте",{"2":{"226":1,"227":1}}],["скачает",{"2":{"223":1}}],["скачать",{"0":{"404":1},"2":{"217":2,"227":1,"472":1}}],["сканируют",{"2":{"204":1}}],["сказать",{"2":{"174":1,"239":1,"358":1,"421":1,"462":1}}],["сказано",{"2":{"134":1,"330":1,"367":1}}],["скриншоты",{"2":{"421":1}}],["скриншота",{"2":{"353":1}}],["скриншот",{"2":{"339":1,"347":1}}],["скриншоте",{"2":{"217":1,"421":1}}],["скриптов",{"2":{"383":1}}],["скриптом",{"2":{"336":1}}],["скрипты",{"2":{"344":1,"421":1,"423":1,"424":1}}],["скрипту",{"2":{"336":1}}],["скрипте",{"2":{"255":2}}],["скриптами",{"2":{"473":1}}],["скриптам",{"2":{"461":1}}],["скрипта",{"2":{"224":1,"231":1,"255":1,"317":2,"363":1,"376":1,"422":1,"423":1,"473":1}}],["скрипт",{"2":{"116":2,"317":1,"422":1,"423":1}}],["скрытых",{"2":{"390":1}}],["скрытый",{"2":{"390":1}}],["скрытым",{"2":{"323":1}}],["скрытые",{"0":{"214":1},"2":{"390":1}}],["скрытие",{"2":{"300":1}}],["скрытия",{"2":{"156":1,"201":1}}],["скрыта",{"2":{"212":1}}],["скрыть",{"2":{"200":1,"300":1,"425":1}}],["скрыто",{"2":{"156":1}}],["скрываем",{"2":{"365":1}}],["скрывается",{"2":{"546":1}}],["скрывает",{"2":{"155":1,"212":1,"323":1}}],["скрывать",{"2":{"265":1}}],["скрываться",{"2":{"156":1}}],["скрываются",{"2":{"198":1}}],["скрывают",{"2":{"156":1,"213":1}}],["скрывая",{"2":{"156":1}}],["скролбара",{"2":{"516":1}}],["скролл",{"2":{"250":1}}],["скроллера",{"2":{"192":3}}],["скроллер",{"0":{"192":1},"1":{"193":1},"2":{"192":2,"193":1}}],["скромный",{"2":{"297":1}}],["скромного",{"2":{"297":1}}],["скромное",{"2":{"149":1,"386":1}}],["скроем",{"2":{"95":1}}],["скомпрометирован",{"2":{"361":1}}],["скомпоновать",{"2":{"232":1}}],["скомпилированным",{"2":{"143":1}}],["скомпилировать",{"2":{"143":1}}],["скобок",{"2":{"231":1}}],["скобки",{"2":{"149":1}}],["скопировано",{"2":{"246":1}}],["скопированы",{"2":{"224":1}}],["скопировать",{"2":{"227":1,"352":1}}],["скопируйте",{"2":{"227":1,"465":1}}],["сколько",{"2":{"134":1,"157":1,"190":2,"229":1,"301":1,"336":1,"355":1,"365":1,"366":1,"376":2,"455":1}}],["скоро",{"2":{"385":1}}],["скоростью",{"2":{"148":1,"431":1}}],["скорость",{"2":{"125":1,"452":1}}],["скорости",{"2":{"125":2,"344":1,"473":1}}],["скорее",{"2":{"134":1,"137":1,"421":1}}],["скорей",{"2":{"34":1,"463":1}}],["скоуп",{"2":{"68":1}}],["скелета",{"2":{"112":1}}],["скелет",{"2":{"11":1,"223":1,"507":1}}],["супротив",{"2":{"537":1}}],["суффиксальной",{"2":{"424":1}}],["суффикса",{"2":{"423":1,"428":1}}],["субд",{"2":{"386":1,"393":1}}],["субъективное",{"2":{"497":1}}],["субъекту",{"2":{"292":1}}],["субъекта",{"2":{"291":1,"361":1}}],["субъект",{"2":{"291":5,"292":2}}],["суть",{"2":{"297":1,"331":1}}],["сути",{"2":{"13":1,"105":1,"115":1,"116":1,"203":1,"260":1,"264":1,"287":1,"344":1,"460":1,"463":1}}],["сумме",{"2":{"209":1}}],["суммарный",{"2":{"239":1}}],["сумма",{"2":{"209":1,"214":1}}],["сумму",{"2":{"209":1}}],["существенные",{"2":{"462":1}}],["существенный",{"2":{"270":1,"328":1}}],["существенное",{"2":{"430":1}}],["существенно",{"2":{"302":1}}],["существовало",{"2":{"385":1}}],["существовать",{"2":{"268":1,"277":1,"372":1,"385":1}}],["существование",{"2":{"239":1}}],["существовавшие",{"2":{"128":1}}],["существует",{"2":{"122":1,"125":2,"134":3,"142":1,"143":1,"144":1,"146":1,"147":1,"148":2,"149":1,"152":2,"172":1,"196":1,"198":1,"225":1,"232":1,"239":1,"241":1,"249":1,"256":1,"264":1,"272":1,"276":2,"279":1,"281":2,"292":1,"297":1,"302":1,"315":1,"316":1,"336":3,"346":1,"353":1,"361":3,"364":2,"367":3,"372":1,"375":1,"421":1,"422":1,"434":1,"456":1,"507":1}}],["существующей",{"2":{"501":1}}],["существующего",{"2":{"472":1}}],["существующем",{"2":{"370":1}}],["существующих",{"2":{"12":1,"235":1}}],["существующие",{"0":{"10":1},"2":{"288":1}}],["существуют",{"2":{"68":1,"130":1,"134":1,"146":1,"148":2,"160":1,"189":1,"203":2,"227":1,"239":1,"249":1,"279":1,"300":1,"302":1,"336":1,"364":1,"367":2,"372":1,"373":1,"389":1,"391":1,"462":1}}],["сущность",{"2":{"295":2,"425":2,"463":1}}],["сущностей",{"2":{"16":1,"68":1}}],["сущности",{"0":{"43":1},"2":{"16":1,"23":1,"43":1,"295":2,"300":1,"329":1,"361":1,"425":1,"462":1}}],["сущностями",{"2":{"3":1,"68":2}}],["сабмодулями",{"2":{"445":1}}],["сабхедер",{"2":{"29":1}}],["сахара",{"2":{"333":1}}],["санитизации",{"2":{"232":1}}],["сайд",{"2":{"63":1}}],["сайдбара",{"2":{"548":1}}],["сайдбаром",{"2":{"546":1}}],["сайдбаре",{"2":{"99":1}}],["сайдбар",{"2":{"30":1,"33":2,"35":1,"95":1,"546":1,"548":1}}],["сайтом",{"2":{"215":1,"472":1,"496":1}}],["сайтов",{"2":{"134":3,"205":1,"342":1,"344":1,"473":1}}],["сайту",{"2":{"115":1,"134":1,"316":1,"345":1,"367":1,"444":2}}],["сайте",{"2":{"48":1,"53":1,"115":1,"116":1,"140":1,"195":1,"200":1,"217":2,"226":2,"227":2,"250":1,"335":1,"361":1,"403":1,"405":1,"424":1,"455":1,"460":1,"463":1,"472":1,"473":1,"536":1}}],["сайт",{"0":{"80":1},"2":{"26":1,"80":1,"112":2,"115":1,"144":1,"200":1,"212":1,"217":1,"222":5,"223":6,"224":2,"227":2,"229":1,"344":3,"361":1,"383":2,"394":1,"421":1,"442":1,"444":4,"445":1,"451":1,"464":1,"472":2,"473":2,"507":1,"527":1,"528":1}}],["сайты",{"0":{"22":1},"2":{"22":1,"116":1,"189":1,"336":1,"419":1}}],["сайтами",{"2":{"361":1,"473":1}}],["сайтах",{"2":{"85":1,"98":1,"198":1,"200":1,"217":1,"265":1}}],["сайта",{"0":{"25":1},"2":{"9":1,"25":2,"26":1,"27":1,"39":1,"115":4,"131":1,"133":2,"140":1,"145":1,"169":1,"174":1,"175":1,"189":1,"196":1,"198":1,"199":1,"202":1,"203":1,"205":1,"217":1,"222":1,"226":2,"227":1,"361":1,"374":1,"387":1,"451":2,"460":1,"461":1,"462":1,"464":1,"473":3,"506":1,"508":2,"527":1,"536":2}}],["сама",{"2":{"180":1,"190":1,"312":1,"370":1}}],["самая",{"2":{"130":1,"388":1,"421":1,"445":1}}],["самых",{"2":{"192":1,"256":1,"277":1,"368":1}}],["самые",{"2":{"176":1,"303":1,"431":1,"455":1,"462":1}}],["самыми",{"2":{"316":1}}],["самым",{"2":{"148":1,"151":1,"158":1,"190":1,"203":1,"207":1,"379":1,"387":1,"393":1,"463":1,"473":1}}],["самый",{"2":{"17":1,"22":1,"32":1,"115":1,"244":1,"263":1,"277":1,"280":1,"292":1,"303":1,"325":1,"349":1,"356":1,"360":1,"362":1,"451":1,"461":1,"472":1}}],["сами",{"2":{"137":1,"169":1,"270":1,"444":1,"445":1,"455":1,"472":1,"515":1}}],["самим",{"2":{"11":1,"95":1,"473":1}}],["самую",{"2":{"25":1}}],["самоучитель",{"2":{"472":1}}],["самоуправляемые",{"2":{"367":1}}],["самописный",{"2":{"471":1}}],["само",{"2":{"385":1}}],["самообновляющийся",{"2":{"223":1}}],["самостоятельные",{"2":{"373":1}}],["самостоятельный",{"2":{"116":1,"250":1}}],["самостоятельной",{"2":{"376":1}}],["самостоятельно",{"2":{"133":1,"137":1,"265":1,"365":1,"444":2}}],["самой",{"2":{"34":1,"53":1,"108":1,"223":1,"386":1,"461":1,"473":1}}],["самого",{"2":{"3":1,"161":1,"172":1,"205":1,"224":1,"238":2,"249":1,"349":1,"381":1,"451":1,"507":1}}],["самому",{"2":{"4":1,"26":1,"270":1,"286":1,"462":1,"471":1}}],["самом",{"2":{"3":1,"83":1,"133":1,"137":1,"143":1,"144":1,"148":1,"166":1,"271":1,"323":1,"344":1,"355":1,"359":1,"421":1,"460":1}}],["самое",{"2":{"2":1,"3":1,"33":1,"35":1,"48":1,"85":1,"97":1,"105":1,"115":2,"171":1,"174":1,"224":1,"231":1,"232":1,"247":1,"287":2,"296":1,"308":1,"361":1,"445":1,"457":1,"462":1,"466":1}}],["сам",{"2":{"3":1,"103":1,"112":1,"148":1,"281":1,"291":1,"308":1,"372":1,"400":1,"423":1,"460":1,"463":2,"467":1}}],["сенсорных",{"2":{"519":1}}],["сенсорное",{"2":{"172":1,"189":1}}],["сеансов",{"2":{"336":1}}],["сессий",{"2":{"340":1}}],["сессионного",{"2":{"339":1}}],["сессионное",{"2":{"339":1}}],["сессионные",{"0":{"336":1}}],["сессиях",{"2":{"192":1}}],["сессиями",{"0":{"104":1},"2":{"104":1}}],["сестры",{"2":{"239":1}}],["секретного",{"2":{"361":1}}],["секретный",{"2":{"361":4}}],["секунды",{"2":{"423":1,"430":2}}],["секунду",{"2":{"421":2}}],["секундах",{"2":{"365":1}}],["секунд",{"2":{"189":1,"365":1,"366":1,"457":1}}],["секцию",{"2":{"230":1,"339":1}}],["секцией",{"2":{"205":1}}],["секций",{"2":{"189":1}}],["секции",{"2":{"151":1,"152":1,"175":1,"200":1,"203":2,"225":2,"230":2,"231":4,"243":1,"310":1,"315":1,"361":1,"375":1}}],["секция",{"0":{"205":1},"2":{"4":1,"11":1,"224":1,"361":2,"375":1,"421":1}}],["сегодняшний",{"2":{"169":1,"384":1,"386":1}}],["сегодня",{"2":{"147":2,"169":1,"180":1,"183":1,"198":2,"265":1,"316":1,"344":2,"368":1,"385":1,"434":1}}],["сегментировать",{"2":{"368":1}}],["сегмент",{"2":{"239":1}}],["сегмента",{"2":{"231":1}}],["сегментах",{"2":{"135":1}}],["сегментом",{"2":{"134":1}}],["сегменты",{"2":{"134":1,"231":1}}],["сеттерами",{"2":{"463":1}}],["сетью",{"2":{"367":1}}],["сеть",{"2":{"316":4,"367":2}}],["сетям",{"2":{"367":2}}],["сетями",{"2":{"148":1}}],["сетях",{"2":{"211":1,"310":1}}],["сетке",{"2":{"198":1}}],["сетевое",{"2":{"419":1}}],["сетевой",{"2":{"301":1,"360":1,"434":2,"439":1}}],["сетевым",{"2":{"440":1}}],["сетевыми",{"2":{"308":1}}],["сетевые",{"2":{"303":1,"372":1,"378":1,"419":1,"434":1,"439":1}}],["сетевых",{"2":{"134":1,"316":1,"344":1,"359":3,"373":1,"419":1,"434":2,"435":1,"438":1}}],["сетей",{"0":{"205":1},"2":{"134":1,"205":2}}],["сети",{"2":{"11":1,"109":1,"134":5,"149":1,"218":1,"316":4,"344":1,"367":6,"394":1,"421":1,"430":1,"434":1}}],["семантические",{"2":{"469":1}}],["семантически",{"2":{"96":1}}],["селекторы",{"2":{"149":1}}],["селектору",{"2":{"86":1}}],["селекторов",{"2":{"86":1}}],["сейчас",{"2":{"40":1,"86":1,"150":1,"167":1,"181":1,"297":1,"350":1,"364":1,"365":1,"393":1,"432":1,"444":1,"472":1}}],["себя",{"0":{"133":1,"406":1},"1":{"134":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"39":1,"69":2,"70":1,"74":1,"76":1,"131":1,"137":1,"143":1,"147":2,"148":1,"150":1,"156":1,"157":1,"159":1,"171":2,"185":2,"187":1,"188":1,"228":1,"249":1,"267":1,"268":1,"270":1,"291":1,"295":1,"306":1,"316":1,"337":1,"344":1,"345":1,"349":1,"372":2,"390":1,"394":2,"395":1,"425":1,"434":1,"452":1,"462":2,"463":1,"472":1,"507":1,"511":1,"545":1}}],["себе",{"2":{"26":2,"137":1,"150":1,"169":1,"190":1,"222":1,"265":1,"271":1,"344":1,"370":1,"385":1,"462":1}}],["сериализуя",{"2":{"433":1}}],["сериализуемой",{"2":{"432":1}}],["сериализуемыми",{"2":{"421":1}}],["сериализуемые",{"2":{"421":1,"425":1}}],["сериализован",{"2":{"422":1}}],["сериализованы",{"2":{"293":1}}],["сериализовать",{"2":{"336":1}}],["сериализовываться",{"2":{"294":1}}],["серию",{"2":{"374":1}}],["серия",{"2":{"361":1}}],["серьезной",{"2":{"421":1}}],["серьезная",{"2":{"336":1}}],["серьезных",{"2":{"10":1,"109":1,"180":1}}],["серебряной",{"2":{"241":1,"308":1}}],["середине",{"2":{"29":1}}],["серой",{"2":{"184":1}}],["серая",{"2":{"148":1}}],["сертификация",{"2":{"472":1}}],["сертификации",{"2":{"144":1,"472":1}}],["сертификатов",{"2":{"144":1}}],["сертификат",{"2":{"144":5,"309":1,"444":3}}],["сертификата",{"2":{"133":1,"144":7,"145":1}}],["сертификаты",{"2":{"4":1,"444":1}}],["сертифицированных",{"2":{"144":1}}],["сертифицирующим",{"2":{"144":1}}],["сердечка",{"2":{"102":1,"103":1}}],["сервиcа",{"2":{"116":1}}],["сервису",{"2":{"425":1}}],["сервисом",{"2":{"361":1,"429":1}}],["сервисов",{"2":{"39":1,"116":3,"143":1,"211":2,"344":1,"359":1,"361":1,"364":1,"394":1,"429":2,"435":1,"440":1}}],["сервисе",{"2":{"359":1,"365":1,"376":1,"430":1}}],["сервисный",{"2":{"511":1}}],["сервисных",{"2":{"250":1,"256":1}}],["сервисного",{"2":{"316":3}}],["сервисах",{"2":{"209":1,"373":1,"423":1}}],["сервиса",{"2":{"116":2,"118":1,"247":2,"256":2,"316":1,"317":2,"326":1,"337":1,"360":1,"375":2,"376":1,"395":1,"427":1,"428":1,"432":1,"473":1}}],["сервисами",{"2":{"134":1,"271":1,"335":1,"340":1,"375":1,"384":1,"425":1,"428":1,"508":1}}],["сервисам",{"2":{"41":1,"421":1,"425":2,"440":1}}],["сервисы",{"0":{"40":1},"2":{"115":1,"116":1,"137":1,"166":1,"359":1,"373":1,"394":2,"396":1,"419":1,"425":1,"445":1,"457":1,"463":1,"472":1,"545":1}}],["сервис",{"0":{"114":1},"2":{"10":1,"39":1,"40":2,"41":1,"59":1,"83":1,"114":1,"116":1,"247":1,"288":1,"289":1,"316":4,"326":2,"329":1,"365":2,"367":1,"374":2,"375":1,"382":1,"428":1,"430":2,"435":2,"437":1,"462":1,"472":1,"496":1,"545":1}}],["серверу",{"2":{"144":2,"344":1,"361":3,"364":1,"439":2}}],["серверов",{"2":{"137":1,"140":1,"142":2}}],["сервером",{"2":{"11":1,"116":1,"137":1,"144":1,"224":1,"268":3,"296":1,"300":1,"344":1,"359":1,"360":1,"362":2,"367":1,"376":1,"425":1,"434":1,"439":2,"473":1}}],["серверы",{"0":{"134":1,"142":1},"1":{"136":1},"2":{"134":2,"146":1,"367":1}}],["серверами",{"2":{"431":1,"439":1}}],["серверам",{"2":{"269":1}}],["серверах",{"2":{"144":1,"222":1,"367":1}}],["сервера",{"0":{"137":1,"138":1,"140":1},"1":{"138":1,"139":2,"140":1,"141":2,"142":1},"2":{"117":1,"131":2,"133":1,"134":2,"135":1,"137":3,"140":4,"144":2,"223":1,"268":1,"295":1,"301":1,"308":2,"349":1,"360":2,"364":1,"366":2,"384":1,"394":1,"437":1,"438":1,"439":1,"452":1,"460":1,"473":6,"536":1}}],["сервере",{"2":{"40":1,"71":1,"116":1,"117":2,"134":1,"137":2,"143":3,"144":1,"294":1,"309":1,"316":1,"344":2,"360":3,"361":1,"362":1,"416":1,"434":2,"442":1,"444":1,"451":2,"473":1,"481":1,"482":1}}],["серверному",{"2":{"473":1}}],["серверного",{"2":{"349":1,"439":1}}],["серверной",{"2":{"137":1,"378":1}}],["серверный",{"2":{"360":1}}],["серверным",{"2":{"141":1}}],["серверных",{"2":{"118":1}}],["серверные",{"2":{"40":1,"308":1,"344":1}}],["серверная",{"0":{"6":1}}],["сервер",{"0":{"143":1,"438":1},"1":{"439":1},"2":{"39":1,"53":1,"114":1,"116":2,"117":2,"118":2,"134":1,"135":2,"136":1,"137":9,"138":1,"140":1,"142":1,"143":3,"145":2,"146":1,"223":3,"224":1,"226":1,"231":1,"336":1,"344":1,"359":1,"360":1,"361":2,"363":2,"364":1,"365":2,"366":3,"374":1,"384":2,"395":1,"419":2,"434":2,"436":2,"437":3,"438":1,"439":4,"444":1,"451":2,"457":1,"472":1,"473":3}}],["спуститься",{"2":{"353":1}}],["спальни",{"2":{"473":1}}],["спать",{"2":{"473":1}}],["спагетти",{"2":{"270":2}}],["спам",{"0":{"218":1}}],["спланировать",{"2":{"259":1}}],["спиннера",{"2":{"190":3}}],["спиннер",{"2":{"190":1}}],["спиннеры",{"0":{"190":1},"1":{"191":1},"2":{"190":1}}],["списание",{"2":{"210":1}}],["список",{"0":{"262":1,"272":1},"1":{"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1},"2":{"31":1,"56":2,"104":2,"117":2,"119":3,"129":1,"137":1,"144":1,"152":1,"159":1,"182":1,"183":1,"185":3,"189":1,"192":2,"193":1,"196":1,"201":2,"218":1,"228":1,"229":1,"231":7,"232":2,"235":1,"239":5,"240":1,"257":1,"260":1,"271":1,"272":1,"276":1,"310":1,"318":1,"335":1,"336":1,"344":1,"347":2,"349":1,"352":1,"353":2,"358":3,"376":1,"380":1,"388":1}}],["списках",{"2":{"185":1,"229":1}}],["спискам",{"2":{"176":1}}],["списка",{"2":{"160":1,"174":1,"184":1,"185":1,"192":2,"193":3,"198":1,"221":1,"231":4,"239":1,"256":4,"306":1,"347":1,"421":1,"432":1}}],["списков",{"2":{"156":1,"192":1,"201":1,"347":1,"536":1}}],["списком",{"2":{"11":1,"41":1,"134":1,"232":1,"256":2,"347":1,"352":1}}],["списке",{"2":{"3":1,"193":1,"198":1,"256":1,"286":1,"300":1,"432":1}}],["спроектированного",{"2":{"440":1}}],["спросить",{"2":{"352":1}}],["спровоцировать",{"2":{"189":1}}],["спрайтовых",{"2":{"227":1}}],["справедливо",{"2":{"336":1}}],["справочную",{"2":{"472":1}}],["справочник",{"2":{"304":1,"472":1}}],["справочником",{"2":{"119":1}}],["справочного",{"2":{"289":1}}],["справочный",{"0":{"272":1},"1":{"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1}}],["справку",{"2":{"228":1}}],["справки",{"2":{"186":1}}],["справиться",{"2":{"169":1,"190":1,"358":1}}],["справа",{"2":{"29":1,"98":1,"134":1,"184":2,"188":2}}],["спрятана",{"2":{"114":1}}],["спектру",{"2":{"331":1}}],["спектр",{"2":{"225":1,"282":1}}],["сперва",{"2":{"65":1,"89":1,"454":1,"463":1,"472":1,"473":1}}],["специфичных",{"2":{"507":1}}],["специфичной",{"2":{"143":1}}],["специфичное",{"2":{"118":1}}],["специфической",{"2":{"366":1}}],["специфического",{"2":{"243":1}}],["специфические",{"2":{"228":1,"435":1}}],["спецификаций",{"2":{"473":1}}],["спецификацию",{"2":{"313":1,"512":1}}],["спецификациях",{"2":{"336":1}}],["спецификация",{"2":{"310":1,"472":1}}],["спецификациями",{"2":{"440":1}}],["спецификациям",{"2":{"225":1}}],["спецификации",{"2":{"69":1,"70":1,"148":1,"310":3,"359":1}}],["специализированном",{"2":{"169":1}}],["специализированным",{"2":{"117":1,"169":1}}],["специальную",{"2":{"153":1}}],["специальным",{"2":{"251":1}}],["специальные",{"0":{"248":1},"1":{"249":1},"2":{"134":1,"153":1,"235":1,"249":1,"367":1}}],["специальный",{"0":{"377":1,"378":1},"2":{"128":1,"138":1,"160":1,"250":1,"251":2,"303":1,"390":1}}],["специальных",{"2":{"117":1,"247":1,"258":1,"308":1,"372":1}}],["специальная",{"2":{"124":1,"125":1,"391":1}}],["специальной",{"2":{"330":1,"349":2}}],["специально",{"2":{"190":1,"232":1,"237":1,"308":1,"318":1,"344":1,"393":1}}],["специального",{"2":{"118":1,"428":1}}],["специальному",{"2":{"13":1,"246":1}}],["спецпредложений",{"2":{"4":1}}],["спорным",{"2":{"507":1}}],["спонсировать",{"2":{"335":1}}],["способами",{"2":{"235":1,"259":1,"294":1}}],["способа",{"2":{"231":1,"323":1,"473":1}}],["способов",{"2":{"227":1,"239":1,"256":1,"279":1,"284":1,"300":1,"353":1,"360":1,"367":1}}],["способом",{"2":{"149":1,"151":1,"189":1,"192":1,"232":1,"269":1,"284":1,"303":2,"323":2,"330":1,"380":1,"383":1,"387":1}}],["способе",{"2":{"152":1,"501":1,"503":1}}],["способный",{"2":{"137":1}}],["способности",{"0":{"26":1}}],["способы",{"2":{"69":1,"203":1,"279":1,"302":1,"360":1,"389":1}}],["способ",{"0":{"120":1},"2":{"53":1,"115":1,"119":1,"120":1,"152":3,"249":1,"259":1,"280":1,"290":1,"292":1,"302":1,"311":1,"316":1,"323":1,"325":1,"328":1,"332":1,"351":1,"352":1,"353":1,"360":2,"364":1,"383":1,"392":1,"395":1,"421":1,"423":1,"432":1,"451":2,"455":1,"473":1}}],["спойлер",{"2":{"4":1}}],["сигнатура",{"2":{"435":1}}],["сигнал",{"2":{"376":1}}],["сигнализирует",{"2":{"303":1}}],["сигналы",{"2":{"245":1}}],["сигнальные",{"2":{"239":1}}],["симулированный",{"2":{"378":1}}],["симуляции",{"2":{"370":1}}],["символов",{"2":{"227":1,"336":1}}],["символом",{"2":{"185":1}}],["символ",{"2":{"172":1,"196":1,"336":1}}],["сиблингу",{"2":{"239":1}}],["ситуацией",{"2":{"463":1}}],["ситуаций",{"2":{"349":1,"360":1}}],["ситуациях",{"2":{"464":1}}],["ситуация",{"2":{"251":1,"352":1,"462":1}}],["ситуациями",{"2":{"190":1}}],["ситуацию",{"2":{"169":1,"247":1}}],["ситуации",{"2":{"148":1,"179":1,"330":1,"385":1}}],["сих",{"2":{"150":1,"159":1,"170":1,"200":1,"221":1,"244":1,"300":1,"330":1,"344":1,"353":1,"355":2}}],["синтез",{"2":{"463":1}}],["синтаксического",{"2":{"333":1}}],["синтаксисов",{"2":{"245":1}}],["синтаксисом",{"2":{"53":1,"152":1,"160":1,"244":1,"303":2,"381":1}}],["синтаксису",{"2":{"244":1,"303":1}}],["синтаксисы",{"2":{"151":1}}],["синтаксис",{"2":{"125":1,"151":2,"152":6,"244":3,"246":2,"247":1,"249":3,"303":3,"335":1,"376":1,"378":1,"424":2,"504":1}}],["синтаксисе",{"2":{"123":1,"229":1,"245":2,"298":1,"333":1}}],["синтаксиса",{"2":{"121":1,"122":1,"130":1,"147":1,"151":1,"244":1,"249":2,"303":1,"332":1}}],["синдицированных",{"2":{"364":1}}],["синхронного",{"2":{"370":1}}],["синхронность",{"2":{"302":1}}],["синхронной",{"2":{"301":3,"302":1}}],["синхронный",{"0":{"302":1}}],["синхронные",{"2":{"301":1,"373":1}}],["синхронизация",{"2":{"434":1}}],["синхронизации",{"2":{"352":1}}],["синхронизацию",{"2":{"143":1,"158":1,"394":1,"431":1}}],["синхронизирует",{"2":{"386":2}}],["синхронизируется",{"2":{"339":1}}],["синхронизированном",{"2":{"394":1}}],["синхронизирован",{"2":{"338":2}}],["синхронизировано",{"2":{"335":1,"339":1}}],["синхронизироваться",{"2":{"394":1}}],["синхронизировать",{"2":{"297":1,"330":1,"337":1,"394":2}}],["синглтоном",{"2":{"428":1}}],["синглтоны",{"2":{"281":1}}],["синглтонами",{"2":{"280":1}}],["синглтона",{"2":{"279":1,"285":1,"287":1}}],["синглтон",{"2":{"225":1,"256":1,"260":1,"271":1,"277":1,"281":2,"288":2,"292":1,"327":1,"331":1,"337":1,"338":1,"352":1,"463":1}}],["синоним",{"2":{"134":1}}],["силами",{"2":{"269":1}}],["сила",{"2":{"251":1,"359":1}}],["сильный",{"2":{"249":1}}],["сильные",{"2":{"245":1}}],["сильное",{"2":{"454":1}}],["сильно",{"2":{"3":1,"22":1,"26":1,"29":1,"47":1,"55":1,"79":1,"83":1,"85":1,"112":1,"118":1,"133":1,"134":1,"152":2,"267":1,"380":1,"455":1,"460":1,"461":1,"462":2,"466":1,"471":1,"472":2,"473":1,"536":1,"555":1}}],["силу",{"2":{"12":1}}],["системные",{"2":{"388":1}}],["системным",{"2":{"188":1}}],["системой",{"2":{"300":1,"308":2,"313":1,"336":1,"387":1,"415":1}}],["системе",{"2":{"69":1,"140":1,"308":2,"310":1,"339":1,"370":1,"386":1,"390":2,"402":1,"462":1}}],["систему",{"2":{"3":1,"115":1,"137":1,"197":1,"263":2,"265":1,"269":1,"323":1,"336":1,"363":2,"364":1,"365":1,"370":1,"387":1,"388":1,"421":1}}],["систематическое",{"2":{"308":1}}],["системах",{"0":{"387":1,"388":1,"389":1},"2":{"222":1,"308":1,"315":1,"388":2,"389":1}}],["система",{"2":{"2":1,"69":1,"76":1,"115":2,"137":1,"171":1,"190":2,"213":1,"229":1,"263":2,"268":1,"269":1,"300":1,"308":1,"330":1,"422":1,"511":1}}],["системами",{"2":{"2":1,"306":1,"308":2,"344":1,"462":1}}],["системы",{"0":{"370":1},"1":{"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"2":1,"12":1,"41":2,"69":3,"115":2,"144":1,"171":1,"184":1,"247":1,"252":1,"263":1,"272":1,"295":1,"308":2,"360":1,"365":1,"370":1,"372":1,"387":1,"439":1,"462":1,"464":1,"471":1}}],["систем",{"2":{"2":1,"385":1,"400":1,"440":1,"462":1}}],["слышат",{"2":{"394":1}}],["слышали",{"2":{"203":1}}],["слияний",{"2":{"393":1,"394":1}}],["слияния",{"2":{"393":1,"395":1}}],["слияниями",{"0":{"392":1}}],["слиянии",{"0":{"393":1},"2":{"393":1}}],["слияние",{"2":{"386":1,"392":1,"393":4}}],["слишком",{"2":{"152":1,"179":1,"180":1,"181":1,"228":1,"265":1,"269":1,"367":1,"421":3}}],["сладко",{"2":{"344":1}}],["слайдер",{"0":{"459":1}}],["слайдеров",{"2":{"189":1}}],["слайдеры",{"0":{"189":1},"2":{"189":3}}],["слабо",{"2":{"265":1,"445":1}}],["слабом",{"2":{"115":1}}],["слабосвязные",{"2":{"41":1}}],["слабосвязанными",{"2":{"7":1}}],["слабосвязанные",{"2":{"3":1,"4":1}}],["слабую",{"2":{"34":1}}],["слабая",{"0":{"34":1},"2":{"445":1}}],["слушатель",{"2":{"426":1}}],["слушателей",{"2":{"336":1,"462":1}}],["слушателями",{"2":{"291":1}}],["слушателя",{"2":{"250":1,"315":2}}],["служат",{"2":{"462":1}}],["служебный",{"2":{"374":1}}],["службе",{"2":{"361":1,"439":1}}],["службу",{"2":{"210":1,"366":1,"433":1,"434":1}}],["службы",{"2":{"135":1,"425":1}}],["служб",{"2":{"134":1,"316":1}}],["служит",{"2":{"117":1,"439":1}}],["служить",{"2":{"73":1,"373":1}}],["случаи",{"2":{"248":1,"249":1,"265":1,"267":1,"328":1,"435":1}}],["случаям",{"2":{"358":1}}],["случаями",{"2":{"228":1,"358":1}}],["случая",{"2":{"149":1,"241":1,"243":1,"270":1,"328":1,"372":2,"376":1,"421":1}}],["случаях",{"2":{"4":1,"123":1,"160":1,"169":1,"171":1,"183":1,"185":1,"190":1,"200":1,"209":1,"217":1,"223":1,"225":1,"241":1,"279":1,"281":1,"301":1,"311":1,"323":1,"344":1,"361":1,"367":1,"377":1,"382":1,"421":1,"441":1,"447":1,"463":2,"548":1}}],["случается",{"2":{"361":1}}],["случаен",{"2":{"289":1}}],["случаев",{"2":{"115":1,"225":1,"231":2,"235":1,"266":1,"292":3,"301":1,"302":2,"303":1,"308":1,"317":1,"373":1,"374":1,"447":1,"456":1,"460":2,"473":2,"536":1}}],["случае",{"2":{"12":1,"22":1,"41":1,"47":1,"85":1,"86":1,"115":3,"116":1,"117":1,"133":1,"135":1,"137":2,"140":2,"143":1,"144":2,"148":2,"149":1,"151":1,"152":1,"166":1,"172":1,"177":1,"181":1,"185":1,"186":1,"192":2,"205":1,"212":1,"214":1,"225":1,"231":3,"232":1,"244":1,"245":1,"246":2,"249":1,"250":1,"256":2,"263":1,"270":1,"276":1,"285":1,"287":2,"291":1,"293":1,"294":1,"295":1,"297":1,"303":5,"315":1,"316":1,"317":1,"326":1,"328":1,"329":1,"330":1,"332":1,"333":1,"336":2,"345":1,"352":3,"353":2,"355":2,"359":2,"360":3,"365":1,"366":2,"367":3,"372":1,"373":2,"375":1,"376":4,"378":1,"380":2,"381":2,"383":1,"388":1,"391":1,"393":1,"421":1,"422":1,"425":2,"430":1,"433":1,"439":1,"444":1,"445":1,"451":1,"455":1,"460":2,"462":1,"463":1}}],["случайно",{"2":{"204":1}}],["случай",{"0":{"377":1,"378":1},"2":{"9":1,"102":1,"251":1,"376":1,"378":1,"394":1,"451":1,"472":1}}],["слою",{"2":{"425":1}}],["сложен",{"2":{"300":2}}],["сложнее",{"2":{"263":1,"269":1,"303":1,"372":2}}],["сложную",{"2":{"208":1,"269":1}}],["сложны",{"2":{"304":1}}],["сложный",{"2":{"296":1,"463":1}}],["сложные",{"2":{"158":1,"179":1,"245":1,"247":1,"323":1,"344":1,"355":1}}],["сложных",{"2":{"123":1,"147":1,"183":1,"200":1,"245":1,"295":1,"316":1,"321":1,"353":1,"400":1,"419":1,"471":1}}],["сложным",{"2":{"3":1,"137":1,"300":1,"336":1,"338":1,"372":1,"473":1}}],["сложными",{"2":{"2":1,"123":1,"462":1}}],["сложная",{"2":{"118":1}}],["сложно",{"2":{"431":1,"472":1}}],["сложному",{"2":{"300":1,"380":1}}],["сложное",{"2":{"264":1}}],["сложностей",{"2":{"440":1}}],["сложностям",{"2":{"264":1}}],["сложность",{"2":{"114":1,"200":2,"269":1,"300":2,"321":1,"385":1,"425":1}}],["сложности",{"2":{"2":1,"147":1,"152":1,"179":1,"263":1,"300":1,"308":1,"344":1,"366":1,"370":2,"386":1,"462":2,"497":1}}],["сложной",{"2":{"41":1,"316":1,"345":1,"422":1}}],["сложного",{"0":{"2":1}}],["слоев",{"2":{"297":1,"421":1}}],["слоте",{"2":{"249":1}}],["слотом",{"2":{"249":2}}],["слотов",{"2":{"249":4,"254":1}}],["слотам",{"2":{"380":1}}],["слотами",{"2":{"249":1}}],["слота",{"2":{"249":3,"446":1}}],["слоту",{"2":{"249":1}}],["слот",{"2":{"249":4,"255":1}}],["слоты",{"0":{"249":3},"2":{"249":5}}],["сломает",{"2":{"232":1}}],["сломать",{"2":{"115":1}}],["слов",{"2":{"208":1,"230":1,"394":1}}],["словами",{"2":{"442":1,"463":1,"473":1,"507":1}}],["словарь",{"2":{"428":1}}],["словаря",{"2":{"288":1,"292":1}}],["слова",{"2":{"186":1,"230":1}}],["слово",{"2":{"149":1,"152":3,"164":1,"166":1,"295":1,"303":1,"332":1,"423":1,"495":1}}],["словом",{"2":{"130":1,"303":1}}],["слой",{"2":{"59":1,"291":1,"471":1,"511":1,"542":1}}],["слоями",{"2":{"425":1}}],["слоя",{"2":{"40":1,"425":3}}],["следам",{"2":{"385":1}}],["следит",{"2":{"462":1}}],["следить",{"2":{"292":1,"352":1,"391":1,"462":1}}],["следите",{"0":{"175":1}}],["следовало",{"2":{"330":1,"333":1,"335":1}}],["следовать",{"2":{"226":1,"266":1,"349":1,"402":1}}],["следовательно",{"2":{"149":1}}],["следование",{"2":{"195":1}}],["следствия",{"2":{"179":1}}],["следствием",{"2":{"178":1}}],["следуйте",{"2":{"253":1,"322":1}}],["следуя",{"2":{"225":2,"255":2,"263":1,"279":1,"313":1,"347":1,"365":1,"387":1,"427":1}}],["следуют",{"2":{"172":1,"207":1,"246":1,"323":1}}],["следующую",{"2":{"136":1,"148":1,"223":3,"231":1,"302":1,"346":1,"374":1,"376":1,"379":1,"383":1,"384":1,"390":2,"434":1,"438":1,"472":1}}],["следующего",{"0":{"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"175":1,"203":1,"225":1,"231":1,"246":1,"249":1,"255":1,"260":1,"302":1,"316":1,"355":1,"359":1,"363":1,"372":1,"374":1,"378":1}}],["следующем",{"2":{"159":1,"223":2,"229":1,"231":1,"246":2,"247":1,"255":1,"316":1,"363":1,"373":1,"382":1}}],["следующему",{"2":{"134":1,"174":1,"238":1,"289":1,"300":1,"325":1,"355":1}}],["следующее",{"2":{"91":1,"122":1,"133":1,"159":1,"169":1,"170":1,"222":2,"223":1,"227":1,"229":1,"230":1,"231":1,"235":1,"236":1,"249":2,"255":2,"256":1,"287":1,"306":1,"307":1,"316":1,"322":1,"336":2,"342":1,"343":1,"345":1,"360":1,"361":1,"371":1,"373":1,"382":2,"390":3,"393":3,"402":1,"420":1,"423":1,"464":1}}],["следующей",{"2":{"89":1,"143":1,"167":1,"232":1,"233":1,"243":1,"258":1,"292":1,"304":1,"317":1,"326":1,"331":1,"340":1,"344":1,"352":1,"359":1,"361":1,"367":1,"368":1,"375":1,"379":1,"385":1,"390":1,"391":1,"394":1,"425":1,"440":1}}],["следующий",{"2":{"159":1,"228":1,"231":1,"232":1,"246":1,"249":1,"256":1,"267":1,"358":1,"379":1,"380":1,"421":1,"428":1,"430":1}}],["следующим",{"2":{"131":1,"134":2,"135":1,"150":1,"157":1,"179":1,"192":2,"205":1,"223":1,"226":3,"228":2,"229":1,"230":2,"231":1,"238":2,"240":1,"247":2,"249":1,"254":1,"255":3,"256":1,"284":1,"287":1,"289":1,"295":1,"297":1,"300":1,"302":1,"303":1,"306":1,"308":1,"315":1,"317":1,"326":1,"327":1,"347":1,"348":1,"349":1,"353":1,"355":2,"362":1,"365":1,"367":1,"375":1,"379":1,"383":1,"384":2,"388":1,"390":1,"393":1,"422":2,"431":1,"435":1,"436":1,"438":1,"511":1}}],["следующими",{"2":{"112":1,"168":1,"181":1,"231":1,"292":1,"296":1,"316":1,"332":1}}],["следующие",{"2":{"68":1,"125":1,"134":1,"147":1,"151":1,"152":1,"177":1,"202":1,"206":1,"221":1,"223":1,"226":1,"231":2,"237":1,"250":1,"252":1,"255":3,"259":1,"280":1,"295":1,"297":1,"298":1,"301":1,"313":1,"315":1,"316":1,"318":1,"320":1,"321":1,"330":1,"331":1,"333":1,"346":2,"349":1,"351":1,"362":1,"369":1,"372":2,"374":1,"375":2,"376":1,"386":1,"388":1,"390":1,"391":1,"393":1,"394":1,"419":1,"422":1,"425":1,"431":1,"433":1,"520":1}}],["следующих",{"2":{"67":1,"144":1,"148":1,"245":1,"271":1,"300":1,"349":1,"542":1}}],["следующая",{"2":{"17":1,"231":1,"433":1}}],["следует",{"2":{"119":1,"123":1,"130":1,"135":1,"139":1,"148":1,"166":1,"182":1,"184":1,"186":1,"195":1,"198":1,"200":1,"219":1,"220":1,"227":2,"238":1,"241":1,"250":1,"251":1,"256":2,"260":1,"265":1,"271":1,"278":1,"308":1,"313":1,"316":1,"317":1,"323":1,"344":1,"349":1,"352":1,"360":2,"367":1,"378":1,"384":1,"420":1,"421":1,"435":1,"463":1,"473":1}}],["слева",{"2":{"28":1,"29":1,"30":2,"33":1,"35":1,"99":1,"184":2,"205":1,"546":1}}],["ступенькой",{"2":{"429":1}}],["студенты",{"2":{"402":1}}],["стирают",{"2":{"308":1}}],["стимулировать",{"0":{"174":1}}],["стиля",{"2":{"255":1,"496":1,"508":1}}],["стилями",{"2":{"229":1,"231":2,"315":1}}],["стилях",{"2":{"23":1,"235":1}}],["стиль",{"2":{"155":1,"156":1,"166":1,"230":1,"471":1}}],["стиле",{"2":{"532":1,"533":1}}],["стилем",{"2":{"147":1,"183":1}}],["стилей",{"2":{"86":1,"147":1,"151":2,"171":1,"174":1,"185":1,"224":2,"225":1,"226":2,"227":2,"229":1,"230":1,"231":1,"235":1,"312":1,"351":1,"352":1,"432":1}}],["стилизованной",{"2":{"471":1}}],["стилизовать",{"2":{"184":1}}],["стилизации",{"2":{"182":1,"190":1,"508":2}}],["стилизацию",{"2":{"98":1,"184":1,"462":1,"466":1}}],["стилизацией",{"2":{"25":1}}],["стили",{"2":{"105":1,"151":2,"217":1,"231":1,"235":1,"249":1,"255":1,"266":1,"351":1,"471":4}}],["стилю",{"2":{"69":1,"175":1}}],["стоящих",{"2":{"507":1}}],["сторы",{"2":{"463":2,"482":1,"484":1}}],["стором",{"2":{"463":1}}],["сторов",{"2":{"332":1,"463":1}}],["стороной",{"2":{"361":1}}],["сторонами",{"2":{"361":1}}],["сторона",{"2":{"206":1,"210":1}}],["стороне",{"2":{"169":1,"370":1,"428":1,"432":1,"473":2,"555":1}}],["стороны",{"2":{"117":1,"148":1,"180":1,"190":1,"239":1,"260":1,"507":1}}],["стороннюю",{"2":{"504":1}}],["сторонняя",{"0":{"361":1},"2":{"465":1}}],["сторонней",{"2":{"463":1}}],["стороннего",{"2":{"117":1,"473":1}}],["стороннее",{"2":{"13":1}}],["сторонние",{"2":{"224":2,"233":1,"234":1,"504":1,"555":1}}],["сторонних",{"0":{"466":1},"2":{"117":1,"118":1,"229":1,"300":1,"363":1,"367":1}}],["сторонний",{"2":{"115":1,"217":1}}],["сторонним",{"2":{"12":1,"76":1,"117":3,"211":1,"218":1}}],["сторон",{"2":{"9":1}}],["сторе",{"2":{"332":1,"338":1,"463":1}}],["стор",{"2":{"331":6,"332":1,"333":3,"334":1,"335":2,"463":4}}],["сторами",{"2":{"463":1}}],["сторам",{"2":{"335":1}}],["стора",{"0":{"331":1},"1":{"332":1,"333":1,"334":1,"335":1},"2":{"332":6,"335":1,"336":1,"338":1}}],["столкнетесь",{"2":{"421":1}}],["столкнулась",{"2":{"386":1}}],["столкнуться",{"2":{"148":1,"295":1,"349":1}}],["стола",{"2":{"395":1}}],["столбце",{"2":{"353":1}}],["столе",{"2":{"188":1,"311":1}}],["столько",{"2":{"157":1,"336":1,"355":1,"366":1,"376":2}}],["стоимость",{"2":{"109":1}}],["стоит",{"2":{"105":1,"125":1,"130":1,"143":1,"168":1,"180":1,"189":1,"247":1,"250":1,"256":1,"270":1,"276":1,"298":1,"329":1,"359":1,"447":1}}],["степенью",{"2":{"419":1}}],["степени",{"2":{"126":1,"147":1,"152":1,"172":1,"176":1,"260":1,"301":1,"376":1,"381":1,"385":1}}],["стейты",{"2":{"463":1}}],["стейт",{"2":{"462":1,"463":2}}],["стейта",{"2":{"250":2,"460":1,"463":3}}],["стейтом",{"2":{"34":1,"463":5}}],["стековые",{"2":{"198":1}}],["стек",{"0":{"23":1}}],["стрелку",{"2":{"333":1}}],["стрелками",{"2":{"223":2}}],["стрелочную",{"2":{"302":1}}],["стремитесь",{"2":{"180":1}}],["стремимся",{"2":{"137":1,"326":1}}],["стремящихся",{"2":{"130":1}}],["страшном",{"2":{"460":1}}],["стратегия",{"2":{"555":1}}],["стратегиями",{"2":{"316":1,"342":1}}],["стратегию",{"2":{"316":2,"349":1}}],["стратегий",{"2":{"316":2,"317":1,"472":1}}],["стратегией",{"2":{"316":1,"317":2}}],["стратегии",{"2":{"65":1,"316":1,"320":1}}],["страдает",{"2":{"152":1}}],["страну",{"2":{"355":1}}],["страны",{"2":{"353":1,"355":1}}],["страна",{"2":{"353":1}}],["странички",{"2":{"473":1}}],["страничной",{"2":{"251":1}}],["страничным",{"2":{"192":1}}],["страничный",{"2":{"180":1}}],["страниц",{"2":{"36":1,"147":2,"180":1,"192":2,"203":1,"316":1,"318":1,"336":1,"344":4,"367":1,"471":1}}],["страницей",{"2":{"192":1,"195":1}}],["странице",{"2":{"22":1,"36":1,"47":1,"117":1,"147":1,"148":1,"149":2,"157":1,"160":2,"189":1,"204":1,"217":1,"257":1,"336":2,"352":1,"421":2,"452":1,"461":1}}],["страницах",{"2":{"199":1,"271":1}}],["страницами",{"2":{"192":1,"345":1,"347":1,"349":1}}],["страницам",{"2":{"117":3}}],["страница",{"2":{"4":1,"7":2,"30":1,"102":1,"108":1,"117":2,"147":1,"150":1,"151":1,"173":1,"189":1,"204":2,"227":1,"347":7,"473":1}}],["страницы",{"0":{"28":1,"237":1},"1":{"29":1,"30":1,"31":1,"32":1,"238":1,"239":1,"240":1,"241":1},"2":{"4":1,"22":1,"30":1,"36":1,"108":1,"117":2,"136":1,"149":2,"150":2,"173":2,"192":2,"196":3,"200":1,"204":2,"205":3,"224":1,"232":1,"238":1,"300":1,"318":1,"336":3,"344":3,"361":1,"367":1,"400":1,"421":5,"447":1,"473":4}}],["страницу",{"2":{"3":1,"7":1,"96":1,"134":1,"144":1,"150":2,"173":1,"192":1,"193":2,"204":2,"205":1,"217":2,"224":1,"235":1,"238":1,"315":2,"336":1,"339":1,"344":2,"347":1,"352":3,"421":2,"473":3,"534":1}}],["странным",{"2":{"151":1,"349":1}}],["странно",{"2":{"150":1}}],["строчек",{"2":{"537":1}}],["строчкой",{"2":{"270":1}}],["строчками",{"2":{"104":1}}],["строя",{"2":{"370":1}}],["строятся",{"2":{"159":1}}],["строим",{"2":{"331":1}}],["строится",{"2":{"395":1}}],["строить",{"2":{"235":2,"321":1}}],["строительные",{"2":{"150":1,"242":1}}],["строительную",{"2":{"26":1}}],["строгость",{"2":{"118":1}}],["строковых",{"2":{"361":1}}],["строковые",{"2":{"336":2}}],["строковому",{"2":{"288":1}}],["строкой",{"2":{"47":1,"98":1,"328":1,"336":1,"352":1,"358":1,"430":1}}],["строк",{"2":{"245":2,"265":1,"352":1,"367":1,"391":1,"439":1,"465":1,"473":1}}],["строки",{"2":{"149":1,"152":1,"158":1,"221":1,"223":1,"224":1,"231":1,"233":1,"256":1,"292":1,"303":2,"328":2,"332":1,"333":1,"336":1,"352":2,"354":1,"361":2,"362":1,"375":3,"376":2,"381":1,"384":1,"386":1,"387":1,"393":1,"422":1,"429":1,"430":1,"432":1,"433":3,"438":1,"439":1,"455":1}}],["строке",{"2":{"89":1,"141":4,"193":2,"231":9,"255":12,"292":2,"296":4,"298":2,"299":4,"303":3,"312":1,"324":1,"325":4,"328":3,"330":1,"332":1,"333":3,"335":4,"338":2,"349":7,"367":1,"369":1,"376":2,"380":4,"381":9,"391":1,"421":1,"428":7,"429":3,"432":2,"433":4,"437":1,"439":1}}],["строку",{"2":{"82":1,"115":1,"117":1,"139":1,"239":1,"251":1,"288":1,"297":1,"303":1,"356":1,"358":1,"361":1,"363":1,"364":2,"381":1,"383":1,"384":1,"388":1,"393":2,"423":1,"432":1,"433":1,"460":1}}],["строках",{"2":{"228":1,"231":2,"316":1,"381":1}}],["строками",{"2":{"117":1,"292":1,"316":1,"358":1}}],["строка",{"2":{"29":1,"98":1,"117":1,"227":1,"231":1,"239":2,"249":1,"251":1,"294":1,"303":2,"311":2,"312":3,"313":2,"324":3,"330":5,"332":4,"333":3,"336":1,"338":4,"349":2,"361":2,"362":1,"367":1,"393":1,"421":1,"422":1,"428":3,"429":3,"433":1,"439":9}}],["стройматериалы",{"2":{"26":1}}],["структурируя",{"2":{"467":1}}],["структурированное",{"2":{"69":1}}],["структурированность",{"2":{"17":1}}],["структур",{"2":{"273":1,"295":1}}],["структура",{"0":{"224":1},"2":{"148":1,"196":1,"224":1,"287":1,"353":1}}],["структурные",{"0":{"275":1},"2":{"147":1}}],["структурных",{"2":{"69":2}}],["структурой",{"2":{"135":1,"147":1,"218":1}}],["структуры",{"2":{"126":1,"148":1,"196":1,"221":1,"224":1,"293":1,"326":1,"428":1}}],["структуре",{"2":{"120":1,"135":1,"196":1,"224":1,"225":1,"473":1}}],["структуру",{"2":{"17":1,"22":1,"26":1,"223":2,"224":4,"225":1,"271":1,"326":1}}],["стакан",{"2":{"472":1}}],["стационарности",{"2":{"440":1}}],["стабильного",{"2":{"391":1}}],["стабильной",{"2":{"390":1}}],["стабильный",{"2":{"388":1}}],["стабильных",{"2":{"373":1}}],["стабилен",{"2":{"137":1}}],["ставшее",{"2":{"394":1}}],["ставший",{"2":{"198":1}}],["ставится",{"2":{"349":1}}],["ставиться",{"2":{"294":1}}],["ставить",{"2":{"115":1,"222":1}}],["ставим",{"2":{"87":1,"95":1,"100":1,"106":1,"112":1}}],["сталкивались",{"2":{"256":1}}],["сталкиваемся",{"2":{"137":1}}],["стал",{"2":{"184":1,"195":1,"198":1,"210":1,"222":1,"256":1,"372":1,"386":1,"429":1}}],["стала",{"2":{"176":1,"203":1,"297":1,"345":1,"463":1}}],["стало",{"2":{"174":1,"344":1,"346":1,"462":1,"463":1}}],["стали",{"2":{"2":1,"147":1,"182":1,"460":1,"463":1,"471":1}}],["станут",{"2":{"152":1,"270":1,"332":1,"333":2}}],["станет",{"2":{"149":1,"349":1,"385":1,"432":1}}],["становиться",{"2":{"308":1}}],["становится",{"2":{"125":1,"152":1,"205":1,"243":1,"251":1,"316":1,"352":1,"359":1,"463":1}}],["становились",{"2":{"171":1}}],["становятся",{"2":{"117":1}}],["стандартов",{"2":{"219":1,"361":1,"368":1,"434":1}}],["стандартом",{"2":{"176":1,"184":1,"203":1,"222":1,"247":1,"316":1,"346":1,"361":1,"365":1,"417":1,"512":1}}],["стандартная",{"2":{"439":1}}],["стандартной",{"2":{"359":1}}],["стандартного",{"2":{"336":1,"456":1,"460":2}}],["стандартному",{"2":{"195":1}}],["стандартную",{"2":{"313":1}}],["стандартный",{"2":{"253":1,"290":1,"364":1,"546":1}}],["стандартных",{"2":{"198":1,"220":1,"308":2,"319":1,"368":1,"419":1}}],["стандартные",{"2":{"183":1,"368":1,"369":1}}],["стандартными",{"2":{"182":1}}],["стандартным",{"2":{"174":1,"195":1,"338":1}}],["стандартизирован",{"2":{"195":1}}],["стандартизации",{"2":{"147":1}}],["стандарты",{"0":{"469":1},"2":{"147":1,"148":1,"195":1,"359":1,"471":1}}],["стандарту",{"2":{"136":1,"137":1}}],["стандарте",{"2":{"117":1,"190":1,"361":1}}],["стандартами",{"2":{"147":1,"166":1,"172":1}}],["стандарта",{"2":{"115":1}}],["стандарт",{"2":{"115":1,"117":1,"118":1,"172":1}}],["старайтесь",{"2":{"468":1,"472":1}}],["старается",{"2":{"421":1}}],["старой",{"2":{"451":1}}],["старого",{"2":{"125":1,"225":1}}],["старте",{"2":{"545":1,"556":1}}],["стартер",{"2":{"507":1}}],["старт",{"2":{"374":1}}],["стартовый",{"2":{"315":1}}],["стартовать",{"2":{"311":1}}],["стартовом",{"2":{"230":1}}],["стартового",{"2":{"148":1,"223":1}}],["стартапе",{"2":{"461":1}}],["старта",{"2":{"83":1,"542":1}}],["старых",{"2":{"125":2}}],["старыми",{"0":{"125":1},"2":{"125":2}}],["старый",{"2":{"62":1}}],["старший",{"2":{"115":1}}],["стадию",{"2":{"67":1}}],["стадии",{"0":{"67":1},"2":{"68":1,"79":1,"160":1}}],["статистики",{"2":{"434":1,"455":1,"542":1}}],["статистика",{"2":{"385":1}}],["статичен",{"2":{"352":1}}],["статическое",{"2":{"224":1}}],["статических",{"2":{"344":1,"355":1}}],["статическими",{"2":{"344":1}}],["статическим",{"2":{"280":1}}],["статически",{"2":{"244":1}}],["статический",{"0":{"244":1},"2":{"137":1,"344":1,"349":1,"383":1}}],["статические",{"2":{"137":1,"225":1,"344":1,"353":1}}],["статичной",{"2":{"147":1}}],["статичный",{"2":{"473":2}}],["статичных",{"2":{"444":1}}],["статичным",{"2":{"76":1,"464":1}}],["статичные",{"2":{"6":1}}],["статуса",{"2":{"359":1}}],["статус",{"2":{"256":1,"360":1}}],["статей",{"2":{"205":1,"471":1}}],["стать",{"2":{"200":1,"252":1,"271":1,"421":1,"429":1,"472":2}}],["статья",{"2":{"117":1,"461":1}}],["статье",{"2":{"115":1,"456":1,"460":1,"471":1}}],["статьи",{"0":{"0":1},"2":{"118":1,"160":1,"205":1,"308":1,"390":1}}],["сваливает",{"2":{"462":1}}],["светлой",{"2":{"557":1}}],["светлый",{"2":{"308":1}}],["свете",{"2":{"337":1}}],["сведем",{"2":{"326":1,"419":1}}],["сведите",{"2":{"179":1}}],["сверху",{"2":{"29":2,"35":1,"108":1,"301":1,"315":1,"497":1}}],["свыше",{"2":{"47":1}}],["связать",{"2":{"346":1}}],["связали",{"2":{"314":1}}],["связана",{"2":{"267":1,"296":1}}],["связан",{"2":{"180":1,"218":1,"310":1}}],["связано",{"2":{"136":1,"204":1,"223":1,"373":1,"393":1,"432":1,"433":1}}],["связанную",{"2":{"361":1,"426":1}}],["связанная",{"2":{"206":1,"314":1}}],["связанными",{"2":{"152":1}}],["связанные",{"2":{"131":1,"180":1,"445":1,"446":1}}],["связанный",{"2":{"114":1,"349":1}}],["связанных",{"2":{"69":1,"147":1,"231":1,"381":1}}],["связанного",{"2":{"268":1}}],["связанное",{"2":{"55":1,"249":1}}],["связанность",{"0":{"34":1},"2":{"34":1,"445":1}}],["связаны",{"2":{"2":1,"3":2,"115":1,"141":1,"176":1,"202":1,"237":1,"240":1,"373":1,"464":1}}],["связывание",{"2":{"428":1}}],["связыванием",{"2":{"158":1}}],["связываем",{"2":{"324":1}}],["связывает",{"2":{"154":1,"159":1}}],["связью",{"2":{"322":1}}],["связь",{"2":{"118":1,"180":1,"181":1,"268":2,"289":1,"323":1,"326":1,"425":1,"432":1}}],["связей",{"0":{"239":1},"2":{"68":1}}],["связями",{"2":{"17":1}}],["связи",{"0":{"113":1},"1":{"114":1},"2":{"6":1,"43":1,"74":1,"114":2,"119":1,"144":1,"152":1,"173":1,"190":1,"231":1,"235":1,"238":1,"256":1,"298":1,"308":1,"342":1,"344":1,"370":1,"372":2,"385":1,"419":1,"421":1,"444":1,"447":1,"512":1,"542":1}}],["своя",{"2":{"451":1,"460":1}}],["сворачивать",{"2":{"267":1}}],["сводка",{"2":{"256":1}}],["сводки",{"2":{"256":1}}],["сводные",{"2":{"256":1}}],["свою",{"2":{"149":1,"151":1,"173":1,"180":1,"263":2,"303":1,"316":1,"324":1,"344":1,"354":1,"367":1,"376":1,"386":1,"445":1,"463":2,"464":1,"465":1,"545":1}}],["свободный",{"2":{"361":1}}],["свободного",{"2":{"361":1}}],["свободно",{"2":{"184":1,"224":1,"431":1}}],["свободна",{"2":{"63":1}}],["свободу",{"2":{"137":1,"152":1}}],["свое",{"2":{"156":1,"211":1,"224":1,"303":1,"330":1,"359":1,"366":1,"400":1,"472":1}}],["своей",{"2":{"102":1,"116":1,"140":1,"166":1,"180":1,"260":1,"264":1,"303":1,"473":1}}],["своего",{"2":{"40":1,"116":2,"118":1,"134":1,"208":1,"291":1,"296":1,"318":1,"323":1,"402":1,"439":1,"473":1}}],["своему",{"2":{"224":1,"336":1,"393":1,"421":1,"440":1,"455":2}}],["своем",{"2":{"40":1,"225":1,"359":1,"367":1,"421":1,"471":1}}],["своё",{"2":{"26":1,"47":2}}],["свойству",{"2":{"284":1,"296":1}}],["свойств",{"2":{"123":2,"231":2,"256":1,"282":1,"296":1,"332":1,"358":1,"372":1}}],["свойством",{"2":{"123":1,"337":1}}],["свойство",{"0":{"122":1},"2":{"122":1,"231":2,"255":2,"265":1,"286":1,"296":1,"338":1,"380":1}}],["свойстве",{"2":{"119":1,"255":1,"285":1}}],["свойствах",{"2":{"284":1}}],["свойствами",{"2":{"122":1,"123":1,"231":1,"295":1,"332":1,"333":1,"380":1,"473":1}}],["свойствам",{"2":{"83":1,"380":1,"381":1}}],["свойства",{"2":{"16":1,"122":1,"124":1,"152":1,"231":5,"232":1,"252":1,"296":1,"331":1,"333":5,"338":1,"352":1,"428":1}}],["свой",{"0":{"116":1},"2":{"4":1,"12":1,"23":1,"39":1,"41":1,"59":2,"116":2,"143":1,"151":1,"152":2,"172":1,"225":1,"267":1,"270":4,"315":1,"372":1,"394":1,"444":2,"451":1,"472":3}}],["своих",{"2":{"144":1,"171":1,"176":1,"226":1,"285":1,"325":1,"326":1,"354":1,"419":1,"421":1,"473":1}}],["своими",{"2":{"224":1,"421":1,"451":1}}],["своим",{"2":{"41":1,"59":1,"112":1,"183":1,"239":1,"323":1,"385":1,"391":1,"457":1,"463":1}}],["свои",{"2":{"3":1,"23":2,"123":1,"166":1,"181":1,"233":1,"248":1,"259":1,"292":1,"293":1,"300":1,"319":1,"328":1,"342":1,"344":1,"360":1,"375":1,"385":1,"395":1,"396":1,"445":1,"455":2,"462":1,"463":2,"466":1,"471":2}}],["соцсетями",{"2":{"542":1}}],["социальных",{"0":{"205":1},"2":{"205":3,"211":1,"310":1}}],["социальными",{"2":{"148":1}}],["сорс",{"2":{"472":1}}],["сортировки",{"2":{"198":1}}],["соединяться",{"2":{"367":1}}],["соединению",{"2":{"309":1}}],["соединений",{"2":{"137":1}}],["соединение",{"2":{"137":1,"308":1,"424":1}}],["соединения",{"2":{"118":1,"137":1,"336":1}}],["сопутствующей",{"2":{"463":2}}],["сопутствующие",{"2":{"463":1}}],["сопутствующих",{"2":{"214":1}}],["сопоставлены",{"2":{"358":1}}],["сопоставленный",{"2":{"228":1}}],["сопоставляет",{"2":{"345":1}}],["сопоставимое",{"2":{"461":1}}],["сопоставимости",{"2":{"323":1}}],["сопоставить",{"2":{"337":1}}],["сопровождение",{"2":{"368":1}}],["сопровождения",{"2":{"166":1}}],["сопровождаемым",{"2":{"210":1}}],["сопровождаемость",{"2":{"69":1,"261":1}}],["сопровождать",{"2":{"190":1}}],["сопровождаться",{"2":{"185":1}}],["сотен",{"2":{"269":1}}],["сотрудничества",{"2":{"219":1}}],["сотрудничестве",{"2":{"171":1}}],["сотни",{"2":{"206":1,"372":1}}],["сочетании",{"2":{"157":1,"188":1,"278":1,"290":1}}],["сокращайте",{"2":{"180":1}}],["сокращения",{"0":{"496":1}}],["сокращение",{"0":{"154":1,"159":1},"2":{"159":1,"372":1}}],["сокращенное",{"2":{"249":1}}],["сокращенный",{"2":{"154":1}}],["сокращенайте",{"2":{"180":1}}],["сократить",{"2":{"134":1}}],["соглашается",{"2":{"218":1,"308":1,"315":1}}],["соглашению",{"2":{"246":1,"250":1}}],["соглашений",{"2":{"161":1,"166":1,"167":1,"225":1,"267":1}}],["соглашениям",{"2":{"352":1}}],["соглашения",{"0":{"161":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1},"2":{"166":3,"168":1,"224":1,"247":1,"270":1}}],["соглашением",{"2":{"247":1}}],["соглашение",{"2":{"152":1,"211":1,"247":1,"346":1,"375":2}}],["согласия",{"2":{"315":2}}],["согласиться",{"2":{"315":1}}],["согласие",{"2":{"211":1,"336":2}}],["согласовать",{"2":{"281":1}}],["согласования",{"2":{"308":1}}],["согласование",{"2":{"69":1}}],["согласованность",{"2":{"227":1}}],["согласованности",{"2":{"174":1}}],["согласны",{"2":{"166":1}}],["согласно",{"2":{"134":1,"136":1,"174":1,"203":1,"269":1,"310":1,"377":1}}],["сослаться",{"2":{"353":1}}],["сосредоточен",{"2":{"231":1}}],["сосредоточились",{"2":{"287":1,"321":1}}],["сосредоточиться",{"2":{"199":1,"372":1,"373":2,"421":1,"432":1}}],["сосредоточимся",{"2":{"149":1,"228":1,"250":1,"256":1,"306":1,"321":1,"336":1,"342":1,"367":1,"370":1}}],["состав",{"2":{"364":1}}],["составному",{"2":{"536":1}}],["составной",{"2":{"250":1}}],["составными",{"2":{"321":1}}],["составление",{"0":{"237":1},"1":{"238":1,"239":1,"240":1,"241":1}}],["составлять",{"2":{"239":1}}],["составляющая",{"2":{"344":1}}],["составляющие",{"2":{"134":1,"333":1,"366":1}}],["составляют",{"2":{"171":1,"344":1}}],["составляет",{"2":{"134":1,"336":1}}],["составителя",{"2":{"497":1}}],["составит",{"2":{"59":1}}],["состоящую",{"2":{"263":1}}],["состоящее",{"2":{"134":1}}],["состоять",{"2":{"463":1}}],["состоят",{"2":{"134":1,"263":1,"269":1,"428":2}}],["состоянию",{"2":{"239":1,"278":1,"332":2}}],["состоянии",{"2":{"184":2,"190":1,"255":1,"256":1,"267":1,"303":2,"322":1,"360":1,"394":1}}],["состояний",{"2":{"166":1,"232":1,"256":4,"337":1}}],["состояния",{"0":{"329":1},"1":{"330":1},"2":{"158":1,"160":1,"184":2,"231":1,"232":1,"237":1,"239":2,"240":2,"254":1,"255":1,"256":2,"316":1,"321":1,"328":2,"330":1,"335":1,"340":1,"391":1}}],["состояниями",{"2":{"119":1,"256":2,"258":1,"335":1,"413":1}}],["состояние",{"2":{"156":2,"160":1,"185":1,"190":1,"195":1,"239":3,"254":1,"255":1,"256":3,"329":2,"330":2,"331":2,"332":1,"335":1,"362":1,"463":2}}],["состоянием",{"2":{"119":1,"127":2,"239":1,"249":1,"329":2,"330":1,"331":3,"341":1,"352":1,"401":1,"464":1}}],["состоит",{"2":{"28":1,"67":1,"69":1,"144":1,"147":1,"150":1,"151":1,"300":1,"332":1,"425":1,"513":1}}],["солидно",{"2":{"456":1}}],["солидных",{"2":{"97":1}}],["соли",{"2":{"148":1}}],["содержатся",{"2":{"439":1}}],["содержат",{"2":{"267":1,"426":1,"439":1,"471":1}}],["содержать",{"2":{"150":1,"152":1,"231":2,"244":1,"313":1,"331":2,"336":1,"352":1,"361":2,"362":1,"365":1,"367":1,"422":1,"534":1}}],["содержащая",{"2":{"361":1,"422":1,"463":1}}],["содержащее",{"2":{"200":1}}],["содержащиеся",{"2":{"376":1}}],["содержащим",{"2":{"349":1}}],["содержащимся",{"2":{"294":1}}],["содержащий",{"2":{"151":1,"152":1,"256":1,"313":1,"332":1}}],["содержащих",{"2":{"144":1,"394":1}}],["содержанием",{"2":{"196":1}}],["содержание",{"2":{"168":1,"171":1,"255":1}}],["содержимого",{"2":{"180":2,"189":1,"192":1,"193":1,"199":1,"249":1,"501":1,"547":1}}],["содержимое",{"2":{"149":2,"151":1,"175":1,"203":1,"205":1,"223":1,"224":1,"230":1,"249":6,"254":1,"421":1,"473":1}}],["содержимым",{"2":{"160":1,"255":1,"348":1}}],["содержится",{"2":{"361":1,"422":1}}],["содержите",{"2":{"270":1}}],["содержит",{"2":{"117":2,"151":1,"152":1,"154":1,"224":1,"239":1,"250":1,"256":2,"295":1,"361":2,"364":1,"380":1,"381":1,"422":1}}],["соблюсти",{"2":{"264":1}}],["соблюдения",{"2":{"308":1}}],["соблюдение",{"2":{"247":1}}],["соблюдаем",{"2":{"325":1}}],["соблюдаться",{"2":{"261":1}}],["соблюдая",{"2":{"225":1}}],["соблюдали",{"2":{"166":1}}],["соблазн",{"2":{"208":1}}],["собеседованию",{"2":{"472":1}}],["собеседник",{"2":{"187":1}}],["соберет",{"2":{"149":1}}],["собирают",{"2":{"432":1}}],["собираются",{"2":{"160":1,"211":1,"270":1}}],["собирать",{"2":{"366":2}}],["собирались",{"2":{"268":1}}],["собирает",{"2":{"239":1,"360":1,"386":1,"455":1}}],["собираемся",{"2":{"223":1}}],["собираемого",{"2":{"127":1}}],["событии",{"2":{"267":1}}],["событий",{"0":{"239":1,"326":1},"1":{"327":1,"328":1},"2":{"231":1,"244":1,"245":1,"246":2,"250":1,"291":4,"292":2,"300":1,"327":1,"329":1,"341":1,"345":1,"352":2,"379":1,"381":1,"394":1,"426":1}}],["событию",{"2":{"231":1,"255":1,"267":1,"324":1}}],["событиях",{"2":{"426":1}}],["событиям",{"2":{"250":1,"380":1}}],["событиями",{"2":{"247":1,"276":1,"291":1}}],["события",{"0":{"165":1,"245":1},"2":{"152":1,"237":1,"239":2,"240":2,"245":2,"246":3,"250":1,"256":1,"267":3,"291":1,"292":1,"315":2,"316":1,"323":2,"325":1,"326":2,"328":3,"349":1,"352":2,"355":1,"381":5,"391":1,"426":1,"429":1}}],["событием",{"2":{"267":2,"324":1,"426":1}}],["событие",{"2":{"124":1,"159":4,"185":1,"187":1,"192":1,"240":2,"246":2,"267":1,"291":4,"292":3,"296":1,"315":5,"316":1,"326":2,"328":2,"352":1,"355":1,"374":1,"381":8,"390":1,"422":3,"427":1}}],["собственная",{"2":{"431":1}}],["собственную",{"2":{"336":1,"338":1,"376":2,"386":1}}],["собственными",{"2":{"421":1}}],["собственные",{"2":{"153":1,"166":1,"183":1,"231":1,"300":1,"373":1}}],["собственный",{"2":{"151":1,"172":1,"315":1,"361":1,"372":1,"382":1,"428":1}}],["собственных",{"2":{"137":1,"396":1}}],["собственной",{"2":{"360":2,"364":1,"375":1,"376":1,"434":1}}],["собственно",{"2":{"207":1,"347":1}}],["собственного",{"2":{"192":1,"338":1,"369":1,"439":1}}],["собственное",{"2":{"188":1,"201":1,"224":1,"300":1,"367":1}}],["собственном",{"2":{"145":1,"308":1,"348":1,"421":1}}],["собственному",{"2":{"134":1}}],["собственности",{"2":{"134":1}}],["собрана",{"2":{"250":1}}],["собранных",{"2":{"360":1}}],["собранные",{"2":{"136":1}}],["собранной",{"2":{"239":1}}],["собранную",{"2":{"224":1}}],["собрано",{"2":{"151":1}}],["собрать",{"2":{"136":1,"224":1,"365":1,"455":1}}],["собой",{"2":{"3":1,"6":1,"17":1,"134":1,"147":2,"148":1,"150":1,"151":1,"177":1,"183":1,"195":1,"203":1,"208":1,"219":1,"224":2,"231":1,"237":1,"238":1,"243":1,"256":1,"267":1,"297":1,"305":1,"311":1,"312":1,"323":1,"336":2,"344":1,"361":1,"381":1,"407":1,"428":1,"434":1,"438":1,"457":1}}],["соображения",{"0":{"447":1},"1":{"448":1,"449":1,"450":1},"2":{"287":1,"369":1}}],["сообщает",{"2":{"391":1}}],["сообществе",{"2":{"386":1}}],["сообщество",{"2":{"228":1}}],["сообщением",{"2":{"393":1}}],["сообщение",{"2":{"187":1,"295":1,"316":1,"375":1,"393":2,"422":4,"423":1,"426":1,"427":1,"428":2,"429":1,"430":1,"434":1,"495":1}}],["сообщений",{"2":{"118":2,"321":1,"325":1,"326":4,"327":1,"329":1,"341":1,"365":1,"376":1,"421":1,"428":1,"429":1}}],["сообщениями",{"2":{"394":1,"422":1,"428":1}}],["сообщения",{"2":{"118":1,"188":1,"327":1,"365":1,"421":1,"426":2,"428":2,"439":1}}],["сообщить",{"2":{"190":1,"244":1,"365":1}}],["соотношения",{"2":{"385":1}}],["соотноситься",{"2":{"239":1}}],["соответствовал",{"2":{"223":1}}],["соответствовать",{"2":{"135":1,"303":1,"308":1,"320":1,"349":1}}],["соответствует",{"2":{"137":1,"148":1,"231":1,"284":1,"318":2,"345":1,"355":1,"451":1}}],["соответствуют",{"2":{"135":1,"182":1,"376":1,"434":1}}],["соответствующую",{"2":{"136":1,"229":1,"331":1,"375":1,"384":1,"451":1}}],["соответствующим",{"2":{"267":1,"360":1,"380":1}}],["соответствующих",{"2":{"225":1,"263":1,"410":1,"435":1,"507":1}}],["соответствующий",{"2":{"112":1,"249":1,"256":1,"294":1,"352":1,"361":1,"426":1,"429":1,"434":1,"460":1}}],["соответствующие",{"2":{"56":1,"346":1,"352":1,"355":1,"359":1,"372":1,"420":1}}],["соответствующему",{"2":{"293":2,"356":1,"425":1}}],["соответствующем",{"2":{"267":1}}],["соответствующее",{"2":{"157":1}}],["соответствующей",{"2":{"59":1,"434":1,"504":1}}],["соответствующего",{"2":{"17":1,"321":1,"366":1,"374":1}}],["соответствия",{"2":{"255":1,"359":1,"370":1,"372":1}}],["соответствии",{"2":{"135":1,"148":1,"184":1,"224":1,"231":2,"238":1,"268":1,"293":1,"294":2,"308":1,"316":1,"317":1,"360":1,"365":1,"372":1,"387":1,"440":1,"472":1,"554":1}}],["соответствие",{"2":{"69":1,"355":1,"372":1,"381":1,"440":1}}],["соответственно",{"2":{"47":1,"59":2,"117":1,"127":1,"131":1,"228":1,"255":1,"360":1,"421":1,"471":1,"473":1}}],["сохраненные",{"2":{"431":1}}],["сохранения",{"2":{"152":1,"160":1,"376":1}}],["сохранением",{"2":{"250":2,"536":1}}],["сохранение",{"0":{"104":1},"2":{"336":1,"337":1}}],["сохранил",{"2":{"451":1}}],["сохранили",{"2":{"299":1}}],["сохранив",{"2":{"300":1}}],["сохранится",{"2":{"339":1}}],["сохраните",{"2":{"231":1,"393":2}}],["сохранить",{"2":{"34":1,"115":1,"199":1,"295":1,"315":1,"360":1,"367":1,"393":1,"421":1,"473":1}}],["сохраним",{"2":{"223":1,"255":1,"267":1}}],["сохраняющий",{"2":{"297":1}}],["сохраняются",{"2":{"250":1,"336":1}}],["сохраняем",{"2":{"281":1,"299":1,"315":1,"428":1,"437":2}}],["сохраняется",{"2":{"148":1,"336":1}}],["сохраняет",{"2":{"115":1,"160":1,"281":1,"296":1,"451":1,"455":1}}],["сохраняя",{"2":{"227":1,"297":1}}],["сохраняться",{"2":{"347":1}}],["сохранять",{"2":{"104":2,"116":1,"225":1,"385":1}}],["сохранялся",{"2":{"104":1}}],["софт",{"2":{"63":1}}],["сожалению",{"2":{"56":1,"181":1,"207":1,"268":1,"457":1,"472":1}}],["создаётся",{"2":{"555":1}}],["создателем",{"2":{"386":1}}],["создать",{"2":{"26":1,"58":1,"63":1,"65":1,"95":1,"134":2,"146":1,"171":2,"176":1,"181":1,"219":1,"224":1,"228":1,"229":1,"231":1,"233":1,"235":2,"241":2,"255":1,"259":1,"263":1,"269":1,"298":2,"326":1,"331":1,"337":1,"345":1,"346":1,"348":1,"349":1,"350":1,"352":1,"355":1,"365":1,"376":3,"386":1,"390":1,"392":1,"394":1,"422":1,"426":1,"432":1,"437":1,"452":1,"457":1,"463":1,"464":1,"506":1,"507":1}}],["создающим",{"2":{"507":1}}],["создающий",{"2":{"370":1}}],["создающего",{"2":{"507":1}}],["создают",{"2":{"157":1,"225":1,"271":1,"306":1,"336":1,"434":1}}],["создаются",{"2":{"134":1,"219":1,"300":1,"412":1}}],["создайте",{"2":{"253":1,"255":1,"346":1,"348":1,"375":1,"379":1,"380":1,"392":1,"393":1,"428":1,"438":1,"527":1}}],["создав",{"2":{"238":1,"329":1,"338":1,"393":1}}],["создавали",{"2":{"353":1}}],["создавалось",{"2":{"325":1}}],["создавало",{"2":{"122":1}}],["создаваемый",{"2":{"336":1}}],["создаваемой",{"2":{"317":1}}],["создавая",{"2":{"190":1,"192":1,"227":1,"344":1,"421":1,"447":1}}],["создавать",{"2":{"59":2,"147":2,"153":1,"231":1,"233":1,"246":2,"252":1,"264":1,"269":1,"297":1,"304":1,"306":1,"336":1,"342":1,"345":1,"347":2,"353":1,"355":1,"379":1,"381":1,"415":1,"427":1,"431":1,"471":1,"507":1,"508":1}}],["создаст",{"2":{"152":1,"223":1,"349":1,"501":2}}],["создастся",{"2":{"112":1}}],["созданы",{"2":{"390":1,"473":1}}],["создано",{"2":{"374":1,"431":1}}],["создана",{"2":{"224":2,"451":1}}],["созданном",{"2":{"372":1,"473":1}}],["созданному",{"2":{"152":1}}],["созданного",{"2":{"316":1,"375":1}}],["созданные",{"2":{"421":1}}],["созданными",{"2":{"338":1}}],["созданных",{"2":{"231":1}}],["созданный",{"2":{"223":1,"386":1,"422":1}}],["создан",{"2":{"125":1,"193":1,"237":1,"383":1,"390":1,"497":1}}],["созданию",{"2":{"152":1,"224":1,"250":1,"273":1}}],["создания",{"2":{"61":1,"112":1,"120":1,"121":1,"123":1,"134":2,"145":1,"148":4,"149":2,"150":2,"152":1,"160":1,"172":1,"179":1,"180":1,"203":1,"221":1,"223":2,"224":2,"231":1,"232":1,"233":2,"235":1,"237":2,"247":1,"249":1,"251":1,"252":1,"256":1,"266":1,"267":1,"290":2,"295":1,"300":2,"306":1,"307":1,"308":1,"317":1,"319":1,"321":1,"326":1,"329":1,"332":1,"337":1,"340":1,"344":1,"345":1,"346":1,"347":1,"352":1,"353":1,"355":1,"361":2,"362":1,"374":1,"375":1,"376":1,"380":1,"381":1,"384":1,"390":2,"400":1,"401":1,"411":1,"414":1,"423":2,"427":1,"428":1,"430":1,"431":1,"432":3,"438":2,"439":4,"461":1,"462":1,"507":2}}],["созданием",{"2":{"59":1,"131":1}}],["создание",{"0":{"58":1,"110":1,"409":1,"455":1},"1":{"111":1,"112":1},"2":{"221":1,"224":1,"234":1,"246":1,"278":1,"308":1,"313":1,"345":1,"360":1,"370":2,"385":1,"395":1,"422":1,"455":2,"457":1,"473":1,"504":1,"507":1,"508":2,"557":1}}],["создании",{"0":{"135":1,"541":1},"1":{"136":1,"542":1,"543":1,"544":1,"545":1},"2":{"41":1,"85":1,"117":1,"122":1,"148":3,"293":1,"297":1,"321":1,"337":1,"352":1,"375":1,"508":2}}],["создаем",{"2":{"105":1,"108":1,"111":1,"149":1,"159":1,"193":1,"231":2,"246":1,"247":1,"250":2,"255":2,"288":1,"292":1,"325":1,"330":1,"335":1,"338":2,"349":2,"352":1,"362":1,"409":1,"422":1,"428":1,"433":1,"439":1}}],["создается",{"2":{"149":1,"241":1,"315":1,"361":1,"391":1}}],["создает",{"2":{"48":1,"115":1,"134":1,"175":1,"224":1,"231":1,"232":1,"240":1,"281":1,"289":1,"308":1,"330":1,"366":1,"386":1,"460":1,"511":1}}],["создадим",{"2":{"56":1,"109":1,"133":1,"221":1,"223":2,"230":2,"252":1,"258":1,"267":1,"287":1,"300":1,"338":1,"342":1,"374":1,"376":1,"391":1,"427":1,"429":1,"431":2,"432":1,"434":1}}],["создали",{"2":{"17":1,"232":1,"233":1,"238":1,"255":1,"256":1,"258":1,"314":1,"347":1,"352":1,"368":1,"433":1}}],["совпадении",{"2":{"473":1}}],["совпадения",{"2":{"391":1}}],["совпадать",{"2":{"355":1}}],["совпадают",{"2":{"289":1,"361":1,"451":1}}],["совпадает",{"2":{"249":1}}],["совокупность",{"2":{"336":1,"373":1}}],["совсем",{"2":{"299":1,"347":1,"462":1,"473":1}}],["совместим",{"2":{"376":1}}],["совместимости",{"2":{"152":1,"250":1}}],["совместимость",{"0":{"125":1},"2":{"119":1,"125":3,"295":1}}],["совместимых",{"2":{"144":1}}],["совместимым",{"2":{"119":1}}],["совместному",{"2":{"252":1}}],["совместного",{"2":{"246":1,"248":1,"328":1,"337":1}}],["совместно",{"2":{"137":1,"152":1,"329":1,"382":1,"386":1,"394":1,"421":1}}],["совместное",{"2":{"117":1,"250":1}}],["совместную",{"2":{"69":1}}],["совершенствования",{"2":{"234":1}}],["совершенствование",{"2":{"232":1}}],["совершенствовать",{"2":{"232":1,"342":1,"427":1}}],["совершенно",{"2":{"151":1,"160":1,"336":1}}],["совершается",{"2":{"210":1}}],["совершать",{"2":{"91":1}}],["совершить",{"2":{"207":1,"255":1}}],["советуется",{"2":{"451":1,"460":1}}],["советы",{"0":{"458":1},"1":{"459":1,"460":1},"2":{"64":1,"464":1,"479":1,"485":1}}],["совет",{"2":{"22":1,"152":1,"156":1,"166":1,"265":1,"270":1,"287":1,"367":1,"472":1,"512":1}}],["современный",{"2":{"222":1,"402":1,"454":1,"455":1,"460":1,"472":1}}],["современных",{"2":{"222":1,"300":1,"335":1,"340":1,"368":1,"402":1,"440":2}}],["современными",{"2":{"183":1,"340":1}}],["современным",{"2":{"151":1,"504":1}}],["современные",{"0":{"469":1},"2":{"44":1,"62":1,"269":1,"306":1,"359":1,"394":1,"444":1,"455":1}}],["современная",{"2":{"147":1}}],["современной",{"2":{"222":1,"266":1,"396":1}}],["современном",{"2":{"150":1,"421":1}}],["современного",{"2":{"86":1,"125":1,"508":1}}],["современное",{"2":{"2":1}}],["со",{"0":{"125":1},"2":{"11":1,"12":1,"17":1,"25":1,"41":1,"59":1,"76":1,"85":1,"112":2,"117":2,"123":2,"125":2,"131":1,"135":1,"152":1,"154":1,"163":1,"169":1,"175":1,"180":1,"190":1,"195":1,"205":2,"223":2,"224":2,"227":1,"231":4,"245":1,"251":1,"255":1,"256":1,"287":1,"291":1,"296":1,"300":1,"303":1,"306":1,"315":1,"316":1,"317":1,"323":1,"328":2,"332":1,"335":1,"338":1,"347":2,"348":1,"349":1,"352":2,"355":1,"361":2,"380":2,"421":1,"429":1,"430":1,"438":1,"440":1,"451":1,"454":1,"460":1,"463":1,"473":4}}],["с",{"0":{"55":1,"81":1,"113":1,"119":1,"144":1,"182":1,"208":1,"225":1,"235":1,"237":1,"247":1,"251":1,"318":1,"326":1,"331":1,"337":1,"386":1,"394":1,"410":1,"414":1,"418":1,"419":1,"427":1,"431":1},"1":{"82":1,"83":1,"114":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"226":1,"236":1,"237":1,"238":2,"239":2,"240":2,"241":2,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"327":1,"328":1,"332":1,"333":1,"334":1,"335":1,"338":1,"339":1,"420":1,"421":1,"422":1,"423":1,"424":1,"425":1,"426":1,"427":1,"428":2,"429":2,"430":2,"431":1,"432":2,"433":2,"434":2,"435":2,"436":2,"437":2,"438":1,"439":1,"440":1,"441":1},"2":{"2":2,"3":5,"6":1,"9":3,"11":3,"12":2,"17":3,"22":1,"23":1,"29":2,"30":1,"33":1,"34":2,"35":4,"38":2,"39":2,"40":1,"41":3,"43":1,"47":1,"48":1,"53":1,"55":3,"59":1,"62":1,"63":1,"67":1,"68":1,"69":3,"74":1,"76":4,"79":1,"85":2,"86":4,"89":2,"91":1,"92":1,"95":1,"97":1,"98":4,"102":3,"103":3,"104":1,"105":3,"108":1,"114":3,"115":13,"116":10,"117":3,"118":4,"119":4,"120":1,"123":3,"124":4,"125":1,"130":2,"131":5,"132":1,"134":5,"135":1,"136":1,"137":7,"139":1,"140":4,"141":2,"143":4,"144":4,"145":4,"147":4,"148":9,"149":3,"150":3,"151":8,"152":5,"153":1,"156":2,"157":1,"158":1,"159":4,"160":1,"161":1,"163":2,"164":1,"166":1,"167":1,"169":7,"171":5,"172":4,"173":3,"174":2,"175":1,"176":4,"177":1,"178":1,"179":1,"180":4,"181":3,"182":2,"183":1,"184":3,"185":2,"186":3,"187":1,"188":3,"189":4,"190":2,"192":2,"193":3,"195":2,"197":1,"198":4,"199":1,"200":2,"202":1,"203":5,"204":2,"205":2,"206":2,"207":2,"208":1,"209":1,"210":2,"213":2,"215":1,"216":1,"217":2,"218":3,"219":4,"221":6,"222":6,"223":10,"224":11,"226":4,"227":7,"228":2,"229":5,"230":4,"231":20,"232":4,"234":3,"235":9,"237":3,"238":5,"239":6,"240":3,"241":2,"242":1,"243":3,"244":5,"245":3,"246":2,"247":8,"249":10,"250":7,"251":3,"252":1,"253":1,"254":2,"255":14,"256":8,"257":1,"258":2,"259":3,"260":3,"261":1,"263":3,"264":2,"265":2,"266":2,"267":8,"268":6,"270":1,"271":3,"276":3,"278":1,"279":1,"281":2,"282":2,"284":1,"287":1,"289":3,"290":1,"292":3,"293":3,"294":3,"295":6,"296":1,"297":7,"298":3,"300":9,"301":1,"302":5,"303":15,"304":3,"306":3,"307":1,"308":14,"309":1,"310":2,"311":4,"313":3,"314":2,"315":5,"316":7,"317":4,"318":2,"319":6,"321":6,"322":1,"323":3,"324":2,"325":3,"326":3,"328":6,"329":2,"330":5,"331":2,"332":3,"333":3,"335":3,"336":8,"337":4,"338":7,"339":3,"340":2,"342":8,"344":8,"345":5,"346":3,"347":4,"349":8,"350":1,"351":3,"352":8,"353":4,"354":3,"355":7,"356":2,"358":8,"359":4,"360":2,"361":3,"362":1,"363":1,"364":4,"365":4,"366":9,"367":11,"368":3,"370":4,"371":1,"372":11,"373":4,"374":3,"375":8,"376":10,"377":1,"378":1,"379":4,"380":2,"381":14,"382":1,"383":2,"384":4,"385":3,"386":5,"387":2,"388":1,"390":4,"391":4,"392":1,"393":9,"394":10,"395":1,"400":3,"402":1,"404":1,"410":2,"413":1,"414":2,"415":2,"416":1,"419":5,"420":1,"421":6,"423":3,"424":3,"425":7,"426":3,"427":5,"428":5,"429":3,"430":2,"431":5,"432":8,"433":5,"434":3,"435":2,"436":1,"437":3,"439":7,"440":3,"441":2,"444":4,"445":4,"447":4,"451":4,"452":3,"454":2,"455":3,"456":1,"457":4,"458":1,"460":4,"461":4,"462":3,"463":11,"464":5,"465":1,"466":1,"468":1,"472":12,"473":11,"479":1,"496":3,"501":3,"504":2,"506":1,"507":5,"508":6,"509":1,"511":1,"512":1,"513":3,"519":2,"527":1,"533":1,"536":3,"539":1,"540":1,"542":1,"543":1,"544":1,"545":2,"546":1,"554":1}}],["дня",{"2":{"472":1}}],["дней",{"2":{"468":1,"472":1}}],["дни",{"2":{"264":1,"364":1}}],["дюймов",{"2":{"457":1}}],["дэвиду",{"2":{"268":1}}],["думать",{"2":{"400":1}}],["думаю",{"2":{"265":1}}],["дубликаты",{"2":{"292":1}}],["дубликата",{"2":{"256":1}}],["дублированию",{"2":{"336":1}}],["дублирование",{"2":{"232":1,"268":1,"276":1,"336":1}}],["дублировать",{"2":{"115":1,"382":1}}],["дыхательной",{"2":{"263":1}}],["длительных",{"2":{"303":1,"336":1}}],["длительному",{"2":{"370":1}}],["длительное",{"2":{"190":1}}],["длительного",{"2":{"190":2}}],["длиной",{"2":{"265":1}}],["длину",{"2":{"231":1}}],["длинных",{"2":{"235":1,"303":1}}],["длинными",{"2":{"228":1}}],["длинный",{"2":{"192":1}}],["для",{"0":{"65":1,"116":1,"135":1,"146":1,"168":1,"182":1,"194":1,"202":1,"210":1,"220":1,"234":1,"259":1,"270":1,"305":1,"320":1,"341":1,"369":1,"397":1,"401":1,"438":1,"441":1,"526":1},"1":{"136":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"203":1,"204":1,"205":1,"206":1,"273":1,"274":1,"275":1,"276":1,"439":1,"527":1,"528":1},"2":{"2":1,"3":1,"4":1,"7":2,"9":2,"10":1,"12":2,"13":1,"17":5,"18":1,"22":4,"23":3,"27":2,"35":1,"36":1,"39":2,"40":2,"41":3,"47":3,"48":1,"50":1,"53":1,"55":1,"58":1,"59":4,"62":1,"63":3,"67":1,"68":2,"69":2,"71":1,"76":3,"78":1,"79":2,"82":1,"86":1,"89":2,"90":1,"95":3,"97":3,"98":1,"102":1,"103":1,"104":2,"108":1,"109":1,"112":1,"114":1,"115":4,"116":3,"117":3,"118":6,"119":2,"120":1,"121":5,"122":1,"123":5,"125":5,"127":2,"128":1,"130":3,"131":4,"133":3,"134":20,"135":1,"136":2,"137":5,"140":2,"141":2,"142":2,"143":3,"144":10,"145":1,"146":1,"147":4,"148":8,"149":5,"150":5,"151":9,"152":11,"156":2,"157":2,"159":3,"160":6,"161":1,"163":1,"166":4,"167":1,"168":2,"169":3,"171":4,"172":4,"173":2,"174":3,"175":2,"176":2,"177":1,"178":1,"179":3,"180":3,"181":5,"183":2,"184":2,"185":6,"186":4,"187":1,"188":3,"189":4,"190":3,"191":3,"192":3,"193":2,"195":4,"196":2,"197":1,"198":5,"199":3,"200":5,"201":1,"203":6,"205":1,"208":1,"209":1,"210":1,"213":2,"216":1,"217":1,"219":3,"221":3,"222":7,"223":8,"224":8,"225":2,"227":8,"228":13,"229":2,"230":3,"231":22,"233":2,"235":2,"237":2,"238":1,"239":7,"241":7,"243":3,"244":3,"245":2,"246":3,"247":5,"248":2,"249":5,"250":3,"251":2,"252":3,"254":1,"255":14,"256":11,"258":1,"260":4,"263":2,"264":3,"265":1,"266":1,"267":4,"268":1,"269":1,"270":3,"271":7,"277":1,"279":1,"281":3,"282":2,"284":1,"286":3,"287":6,"288":5,"289":2,"291":1,"292":5,"293":5,"294":2,"295":6,"296":7,"297":4,"298":1,"299":1,"300":10,"301":7,"303":15,"304":2,"306":5,"307":2,"308":12,"310":3,"311":3,"312":1,"313":2,"315":6,"316":12,"317":4,"318":1,"319":2,"320":2,"321":6,"322":3,"323":4,"324":1,"325":3,"327":1,"328":5,"329":4,"330":4,"332":2,"333":1,"334":2,"335":7,"336":15,"337":1,"338":4,"339":2,"340":2,"341":2,"342":1,"344":6,"345":2,"346":4,"347":3,"348":1,"349":3,"352":6,"353":1,"354":2,"355":5,"356":2,"358":3,"359":8,"360":3,"361":13,"362":3,"363":1,"364":3,"365":9,"366":6,"367":14,"368":2,"369":2,"370":5,"372":5,"373":5,"374":6,"375":7,"376":5,"377":1,"378":3,"379":3,"380":4,"381":3,"382":2,"383":6,"384":6,"385":4,"386":5,"387":2,"388":1,"390":1,"391":3,"392":2,"393":1,"394":6,"395":2,"396":4,"397":2,"400":3,"401":3,"402":2,"403":1,"405":1,"408":1,"409":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"418":1,"419":4,"420":1,"421":7,"422":2,"423":1,"424":4,"425":3,"426":2,"427":3,"428":2,"429":1,"430":3,"431":3,"432":7,"433":3,"434":7,"435":4,"436":1,"437":5,"438":5,"439":10,"440":2,"441":1,"442":1,"444":3,"445":4,"447":2,"450":1,"451":12,"452":2,"453":1,"454":2,"455":8,"456":2,"457":9,"458":1,"459":1,"460":8,"461":3,"462":8,"463":6,"464":1,"466":1,"467":2,"468":1,"470":1,"471":2,"472":6,"473":18,"497":1,"503":1,"504":5,"506":1,"507":6,"509":2,"511":1,"512":3,"513":1,"516":1,"518":2,"527":1,"529":1,"536":4,"539":2,"542":6,"545":5,"552":1,"555":4,"556":1}}],["дриллинг",{"2":{"463":1}}],["др",{"2":{"222":1,"308":1,"545":1}}],["драйверами",{"2":{"198":1}}],["древовидной",{"2":{"196":1,"326":1}}],["древней",{"2":{"169":1}}],["дружелюбие",{"2":{"177":1}}],["дружественный",{"0":{"218":1}}],["дружественные",{"2":{"134":1}}],["дружественного",{"2":{"134":1}}],["другую",{"2":{"215":1,"244":1,"297":1,"330":1,"336":1,"338":1,"352":1,"360":1,"377":1,"392":1,"466":1}}],["другу",{"2":{"176":1,"239":1,"426":1}}],["другая",{"2":{"295":1,"297":1,"498":1}}],["друга",{"2":{"86":1,"173":1,"200":1,"207":1,"239":1,"297":1,"323":1,"367":1,"375":1,"382":1}}],["другого",{"2":{"96":1,"128":1,"133":1,"152":1,"200":1,"209":2,"235":1,"268":1,"270":2,"287":1,"295":1,"296":1,"300":1,"346":1,"373":1,"439":1,"463":2}}],["другой",{"0":{"120":1},"2":{"34":1,"39":1,"41":2,"117":1,"148":1,"150":1,"175":1,"231":1,"244":1,"256":1,"259":1,"260":1,"287":1,"291":1,"294":1,"302":1,"315":2,"328":1,"335":1,"344":1,"352":1,"359":1,"365":1,"447":1,"451":1,"463":4,"464":1,"472":1,"507":1,"511":1}}],["другое",{"2":{"26":1,"36":1,"89":1,"140":1,"148":1,"152":1,"160":1,"223":1,"239":1,"242":1,"255":1,"303":1,"315":1,"367":1,"394":1,"463":1}}],["другому",{"2":{"246":1,"256":1,"270":1,"293":1}}],["другом",{"2":{"2":1,"3":1,"69":1,"116":1,"152":1,"176":2,"178":1,"203":1,"225":1,"235":1,"237":1,"239":1,"243":1,"259":1,"267":1,"301":1,"321":2,"332":1,"336":1,"445":1,"454":1,"508":1}}],["другими",{"2":{"105":1,"137":2,"169":1,"171":1,"173":1,"192":1,"216":1,"224":1,"241":1,"263":1,"267":1,"274":1,"278":1,"290":1,"300":1,"303":1,"308":1,"315":1,"344":1,"345":1,"352":1,"376":1,"419":1,"421":1,"428":1,"442":1,"463":1,"464":1,"473":1,"507":1}}],["другим",{"2":{"65":1,"105":1,"134":1,"148":1,"152":1,"171":1,"178":1,"194":1,"196":1,"224":1,"239":1,"330":1,"336":1,"365":1,"367":1,"383":1,"393":1,"424":1}}],["другие",{"0":{"128":1,"129":1,"142":1,"206":1},"2":{"4":1,"59":1,"104":1,"109":1,"116":1,"118":1,"119":3,"126":1,"137":1,"147":3,"148":1,"150":1,"151":3,"152":2,"159":1,"172":1,"182":1,"190":1,"206":1,"227":1,"230":1,"239":1,"243":1,"244":1,"248":1,"249":1,"258":1,"266":1,"280":1,"287":1,"291":1,"295":1,"296":1,"303":1,"308":1,"309":1,"321":1,"330":1,"336":2,"346":1,"349":1,"352":1,"353":1,"354":1,"367":1,"373":2,"376":1,"382":2,"384":1,"389":1,"392":1,"394":1,"401":1,"407":1,"417":1,"423":1,"431":1,"432":1,"444":1,"447":1,"452":1,"457":1,"462":1,"470":1,"473":1,"545":2}}],["других",{"0":{"0":1},"2":{"16":1,"21":1,"41":1,"89":1,"95":1,"130":1,"134":3,"142":2,"148":2,"160":2,"173":1,"185":1,"200":4,"212":1,"221":1,"224":1,"225":1,"227":1,"233":1,"238":1,"250":1,"251":1,"264":1,"265":1,"270":1,"279":1,"281":2,"282":1,"310":1,"328":2,"331":1,"359":1,"394":1,"400":1,"421":1,"423":1,"432":1,"434":1,"435":1,"439":2,"444":1,"462":2,"507":1,"545":1}}],["друг",{"2":{"2":1,"3":1,"69":1,"86":1,"173":1,"176":3,"178":1,"200":1,"203":1,"207":1,"235":1,"237":1,"239":3,"259":1,"267":1,"297":1,"301":1,"321":2,"323":1,"367":1,"375":1,"382":1,"426":1,"445":1,"508":1}}],["д",{"0":{"240":1},"2":{"68":2,"116":1,"119":1,"120":1,"124":1,"148":1,"149":1,"151":1,"152":2,"158":1,"160":1,"171":5,"175":2,"180":2,"184":1,"186":1,"187":1,"188":1,"192":2,"222":1,"224":3,"227":1,"249":1,"250":1,"257":2,"263":1,"288":1,"291":1,"295":1,"298":1,"303":1,"308":3,"310":1,"311":1,"312":1,"323":1,"344":3,"349":1,"358":1,"359":1,"360":1,"364":1,"365":1,"366":2,"370":1,"372":3,"373":1,"376":3,"378":1,"379":1,"392":1,"395":1,"421":1,"422":1,"434":1,"469":1,"473":1,"506":2,"508":4}}],["динамичного",{"2":{"543":1,"545":1}}],["динамично",{"2":{"452":1,"462":1,"508":1,"509":1}}],["динамичным",{"2":{"265":1,"513":1}}],["динамичными",{"2":{"38":1}}],["динамичных",{"2":{"237":1}}],["динамическая",{"2":{"345":1}}],["динамической",{"2":{"473":1}}],["динамическому",{"2":{"251":1}}],["динамического",{"2":{"244":2,"251":1,"349":1}}],["динамическое",{"2":{"153":1,"244":1,"358":1}}],["динамических",{"2":{"344":1,"355":1,"360":1}}],["динамически",{"2":{"251":1,"344":1,"352":1,"473":1}}],["динамические",{"0":{"251":1},"2":{"237":1,"240":1,"335":1,"345":1,"353":1}}],["динамический",{"0":{"244":1},"2":{"224":1,"244":1}}],["диспетчере",{"2":{"292":1}}],["диспетчером",{"2":{"291":1}}],["диспетчера",{"2":{"291":2,"292":1,"327":1,"429":1}}],["дисплее",{"2":{"172":1}}],["дистрибутивов",{"2":{"388":1}}],["дистрибутивах",{"2":{"388":2}}],["дистрибутива",{"2":{"136":1,"143":1,"145":1,"388":1}}],["дистрибуция",{"2":{"171":1}}],["дисциплине",{"2":{"405":1}}],["дисциплину",{"2":{"372":1,"374":1}}],["дисциплина",{"2":{"372":1,"385":2}}],["дисциплинах",{"2":{"265":1}}],["дисциплинами",{"2":{"171":2}}],["дисциплиной",{"2":{"260":1}}],["дисциплины",{"2":{"169":1,"171":1,"372":1,"374":1}}],["диске",{"2":{"402":1}}],["дисковое",{"2":{"336":1,"455":1}}],["дискуссия",{"2":{"186":1}}],["диска",{"2":{"141":1}}],["диск",{"2":{"115":1,"457":1}}],["диалога",{"2":{"254":2,"255":2,"256":1}}],["диалоге",{"2":{"197":1,"198":1}}],["диалог",{"2":{"197":2,"216":1,"240":2,"241":3,"254":2,"255":4}}],["диалоги",{"0":{"197":1},"2":{"180":1,"197":1,"239":1,"241":1,"252":1,"347":1}}],["диалоговые",{"2":{"238":1}}],["диалоговое",{"2":{"215":1}}],["диалогов",{"0":{"240":1},"2":{"180":1,"197":1,"239":1,"240":1,"241":1,"247":1,"258":1}}],["диапазоны",{"2":{"192":1}}],["диапазон",{"2":{"134":1}}],["диаграмме",{"2":{"240":2,"263":1}}],["диаграмму",{"2":{"150":1}}],["диаграмма",{"0":{"14":1},"2":{"14":2}}],["диаграммы",{"2":{"5":1,"14":2,"68":1,"239":1,"326":1,"421":1,"425":1,"470":1}}],["директивой",{"2":{"249":1}}],["директиве",{"2":{"231":1,"246":1}}],["директиву",{"2":{"193":1,"246":2,"249":1}}],["директивы",{"2":{"151":1,"153":2,"156":1,"159":2,"168":1,"224":1,"231":2,"246":1,"249":1,"252":1}}],["директив",{"0":{"153":1},"1":{"154":1,"155":1,"156":1,"157":1,"158":1,"159":1},"2":{"121":1,"159":1,"160":2,"167":1,"251":1}}],["директивами",{"2":{"153":1}}],["директива",{"0":{"245":1},"2":{"105":2,"153":1,"154":1,"155":1,"158":1,"159":1,"249":1}}],["директорий",{"2":{"453":1}}],["директория",{"2":{"451":2}}],["директориях",{"2":{"346":1}}],["директории",{"2":{"109":1,"135":2,"227":1,"256":1,"375":1,"383":1,"391":1,"438":1,"501":2,"513":1,"515":1}}],["директорию",{"2":{"96":1,"451":1}}],["дирректорию",{"2":{"95":1}}],["дизайна",{"0":{"171":1},"2":{"172":2,"173":1,"174":1,"177":1,"178":1,"199":1,"203":1,"205":1,"225":1,"238":1,"259":1,"344":1,"360":1,"410":1,"462":1,"506":1,"508":1}}],["дизайну",{"2":{"22":1,"315":1}}],["дизайнерское",{"2":{"352":1}}],["дизайнером",{"2":{"225":1,"417":1}}],["дизайнер",{"2":{"172":2,"173":1,"174":1,"176":1}}],["дизайнеру",{"2":{"172":1}}],["дизайнерами",{"2":{"169":1,"219":1}}],["дизайне",{"2":{"22":2,"172":1,"256":1,"372":1}}],["дизайн",{"0":{"1":1,"24":1,"25":1,"69":1,"171":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"25":1,"26":1},"2":{"25":2,"26":1,"67":1,"69":2,"171":4,"180":1,"181":1,"203":1,"232":1,"237":3,"238":3,"255":1,"256":1,"275":1,"372":2,"496":1}}],["дойти",{"2":{"473":1}}],["дойдем",{"2":{"193":1}}],["доскролил",{"2":{"460":1}}],["дословно",{"2":{"316":1}}],["достойны",{"2":{"472":1}}],["достоинствами",{"2":{"264":1}}],["достигается",{"2":{"306":1,"361":1}}],["достигнем",{"2":{"263":1}}],["достигнет",{"2":{"178":1}}],["достижению",{"2":{"178":1}}],["достижений",{"2":{"151":1}}],["достижения",{"2":{"76":1,"200":1,"231":1,"263":1,"347":1}}],["достичь",{"2":{"65":1,"203":1}}],["доступе",{"2":{"472":1}}],["доступен",{"2":{"134":1,"336":1,"386":1,"444":1,"528":1}}],["доступной",{"2":{"463":1}}],["доступное",{"2":{"336":1}}],["доступном",{"2":{"336":1}}],["доступно",{"0":{"543":1},"2":{"255":1,"336":1,"542":1}}],["доступный",{"2":{"336":1,"527":1}}],["доступные",{"0":{"542":1},"2":{"227":1,"308":1,"335":1,"349":1,"425":1,"508":1}}],["доступными",{"2":{"335":1}}],["доступным",{"2":{"192":1,"232":1,"243":1,"249":1,"322":1,"329":1}}],["доступных",{"2":{"179":1,"183":1,"316":1,"358":1,"400":1,"431":1,"503":1}}],["доступны",{"2":{"152":1,"172":1,"246":1,"247":1,"251":1,"341":1,"358":2,"452":1,"520":1}}],["доступна",{"2":{"143":1,"336":1,"403":1,"463":1}}],["доступом",{"2":{"137":1}}],["доступ",{"0":{"59":1},"2":{"53":1,"59":1,"114":1,"115":3,"116":3,"117":8,"137":1,"144":3,"152":4,"192":1,"200":1,"205":1,"218":1,"231":1,"249":1,"278":1,"295":1,"318":1,"331":1,"332":2,"336":2,"342":1,"360":1,"365":1,"369":1,"380":1,"381":1,"421":2,"430":1,"434":1,"444":1,"446":1,"452":1,"463":2}}],["доступа",{"0":{"431":1},"1":{"432":1,"433":1,"434":1,"435":1,"436":1,"437":1},"2":{"17":1,"40":1,"50":1,"58":1,"115":5,"116":1,"117":1,"123":1,"134":2,"137":1,"152":1,"241":1,"249":1,"277":1,"278":1,"281":1,"323":1,"361":1,"419":1,"421":1,"425":3,"427":1,"439":1,"440":1,"451":1,"457":1}}],["доставка",{"0":{"395":1},"2":{"394":1,"395":2,"442":1}}],["доставки",{"2":{"4":1,"71":1,"79":1,"143":1,"149":1,"395":1}}],["достаточным",{"2":{"374":1}}],["достаточный",{"0":{"173":1}}],["достаточную",{"2":{"197":1}}],["достаточная",{"2":{"86":1}}],["достаточное",{"2":{"225":1,"228":1}}],["достаточно",{"2":{"40":1,"58":1,"59":1,"89":1,"140":2,"185":1,"190":1,"224":1,"228":1,"231":1,"239":1,"249":1,"250":1,"255":1,"268":1,"280":1,"289":1,"297":1,"302":1,"308":1,"315":2,"323":1,"324":1,"325":1,"328":1,"336":2,"338":1,"346":1,"350":1,"360":1,"364":2,"383":1,"384":1,"393":1,"396":1,"422":1,"424":1,"427":1,"435":1,"436":1,"445":1,"456":1,"457":1,"460":1,"462":1,"473":1,"507":1}}],["дождаться",{"2":{"315":1}}],["допускает",{"2":{"381":1}}],["допускают",{"2":{"308":1}}],["допустимы",{"2":{"359":1}}],["допустим",{"2":{"249":1,"360":1,"464":1}}],["дополненного",{"2":{"439":1}}],["дополнением",{"2":{"313":1}}],["дополнение",{"2":{"289":1}}],["дополнениями",{"2":{"228":1}}],["дополнили",{"2":{"300":1}}],["дополнительную",{"2":{"361":1}}],["дополнительных",{"2":{"152":1,"223":1,"227":1,"231":1,"240":1,"313":2,"359":1,"367":1,"371":1,"372":1,"375":1,"420":1,"440":1,"442":1}}],["дополнительными",{"2":{"198":1,"224":1,"344":1,"425":1}}],["дополнительным",{"2":{"150":1,"257":1,"328":1}}],["дополнительные",{"2":{"147":1,"148":1,"228":1,"293":1,"297":1,"359":1,"379":1,"394":1,"414":1,"425":1,"473":1}}],["дополнительный",{"2":{"29":1,"209":1,"225":1,"303":1}}],["дополнительная",{"2":{"109":1}}],["дополнительного",{"2":{"307":1,"368":1,"385":1}}],["дополнительной",{"2":{"148":2,"297":1}}],["дополнительное",{"2":{"48":1,"223":1,"349":1,"361":1}}],["дополнительно",{"2":{"16":1}}],["дополняем",{"2":{"299":1}}],["дополнять",{"2":{"298":1}}],["дополняющего",{"2":{"297":1}}],["дорогой",{"2":{"373":1}}],["дорогостоящим",{"2":{"370":1}}],["дорогостоящей",{"2":{"366":1}}],["дорогим",{"2":{"295":1}}],["дороги",{"2":{"156":1}}],["доработаем",{"2":{"255":1}}],["доработки",{"2":{"232":1}}],["дорабатывать",{"2":{"221":1}}],["договаривается",{"2":{"336":1}}],["договоре",{"2":{"211":1}}],["догадались",{"2":{"151":1,"223":1,"287":1}}],["доходит",{"2":{"192":1,"364":1}}],["додо",{"2":{"171":1}}],["дочерняя",{"2":{"246":1,"325":1}}],["дочернему",{"2":{"246":1,"324":1}}],["дочернем",{"2":{"245":1,"247":2,"339":1,"355":1}}],["дочернего",{"2":{"152":1,"246":2,"324":1}}],["дочерний",{"2":{"240":1,"245":1,"265":2,"325":1}}],["дочерними",{"2":{"246":1}}],["дочерним",{"2":{"239":1,"246":1,"256":1,"323":2}}],["дочерних",{"2":{"231":1,"240":1,"247":1,"249":1,"323":1,"325":1,"329":1}}],["дочерние",{"2":{"160":1,"323":3,"354":2,"355":1}}],["доведем",{"2":{"229":1}}],["доверенных",{"2":{"117":2}}],["доводить",{"2":{"167":1}}],["довольно",{"2":{"3":1,"9":1,"25":1,"39":1,"89":1,"116":2,"118":1,"131":1,"137":1,"199":1,"209":1,"210":1,"211":1,"223":1,"227":2,"228":1,"255":1,"271":1,"281":1,"290":1,"295":2,"296":1,"303":1,"315":1,"323":1,"325":1,"345":1,"364":1,"390":1,"393":1,"421":1,"422":1,"426":1,"431":1,"457":1,"472":2,"473":1,"507":3,"539":1}}],["документ",{"2":{"471":1}}],["документируйте",{"0":{"470":1},"2":{"447":1}}],["документирован",{"2":{"431":1}}],["документированная",{"2":{"431":1}}],["документирования",{"2":{"239":1,"470":1}}],["документирование",{"0":{"73":1},"2":{"67":1}}],["документов",{"2":{"431":2}}],["документом",{"2":{"210":1}}],["документной",{"2":{"421":1}}],["документа",{"2":{"120":1,"155":1,"250":2}}],["документаций",{"2":{"473":1}}],["документацию",{"2":{"140":1,"148":1,"160":1,"221":1,"270":1,"335":1,"507":1}}],["документации",{"2":{"119":1,"128":1,"129":1,"137":1,"138":1,"142":1,"159":1,"160":1,"172":1,"222":1,"249":1,"251":1,"303":1,"316":1,"317":1,"336":1,"349":1,"358":2,"376":2,"380":1,"388":1,"389":1,"424":1,"435":1,"447":1,"451":1,"452":1,"472":1,"496":1}}],["документацией",{"2":{"73":1,"222":1,"338":1,"367":1,"394":1}}],["документация",{"2":{"56":1,"68":1,"239":1,"447":1,"463":1,"472":4,"497":1}}],["доброжелательные",{"2":{"472":1}}],["добрый",{"2":{"62":1}}],["добились",{"2":{"257":1,"258":1}}],["добиться",{"2":{"203":1,"318":1,"346":1}}],["добавятся",{"2":{"393":1}}],["добавьте",{"2":{"228":1,"231":1,"393":1,"423":1,"433":1,"451":1}}],["добавив",{"2":{"226":1,"376":1,"393":1}}],["добавили",{"2":{"152":1,"256":1}}],["добавились",{"2":{"91":1}}],["добавит",{"2":{"117":1,"375":1,"390":1}}],["добавить",{"2":{"29":1,"227":1,"297":1,"308":1,"382":1,"384":1,"388":1,"390":2,"457":1,"464":2,"471":1}}],["добавим",{"2":{"36":1,"85":1,"231":1,"375":1,"430":1,"435":1}}],["добавленные",{"2":{"393":1}}],["добавлен",{"2":{"209":2}}],["добавления",{"2":{"148":1,"231":1,"264":1,"294":1,"295":1,"297":3}}],["добавление",{"2":{"12":1,"79":1,"226":1,"310":1,"358":1,"429":1,"460":1,"462":1,"495":1,"504":1,"542":1}}],["добавляются",{"2":{"473":1}}],["добавляют",{"2":{"397":1}}],["добавляя",{"2":{"291":1,"299":1}}],["добавлялись",{"2":{"147":1}}],["добавляется",{"2":{"452":1}}],["добавляет",{"2":{"117":1,"124":1,"297":1,"420":1,"433":1,"464":1,"471":1,"519":1,"529":1,"552":1}}],["добавляем",{"2":{"86":1,"97":1,"98":1,"250":1,"256":1,"352":1,"394":1}}],["добавлять",{"2":{"18":1,"209":1,"257":1,"300":1,"330":1}}],["долларов",{"2":{"134":1}}],["доля",{"2":{"125":1}}],["дольше",{"2":{"115":1,"421":1}}],["долгосрочной",{"2":{"69":1}}],["долгого",{"2":{"39":1}}],["должна",{"2":{"76":1,"86":1,"148":1,"151":1,"152":1,"160":1,"174":1,"190":1,"219":1,"247":1,"263":3,"301":1,"323":1,"362":1,"367":1,"381":1,"437":1,"451":1,"472":1}}],["должны",{"2":{"22":1,"41":1,"76":1,"122":1,"123":1,"148":1,"150":2,"173":2,"176":1,"178":2,"180":1,"181":1,"188":1,"193":1,"197":1,"206":1,"225":1,"227":1,"231":2,"232":1,"239":1,"246":1,"247":1,"249":1,"255":1,"260":1,"261":2,"265":1,"266":3,"268":1,"269":1,"270":1,"271":1,"292":1,"303":1,"308":1,"314":1,"318":1,"322":1,"325":1,"328":1,"330":1,"332":1,"346":1,"355":1,"360":3,"361":1,"365":1,"376":1,"382":1,"421":1,"426":1,"434":1,"445":1,"452":1,"460":1,"467":1}}],["должном",{"2":{"471":1}}],["должно",{"2":{"11":1,"44":1,"79":1,"115":1,"116":1,"159":1,"181":1,"204":1,"229":1,"246":2,"308":3,"310":1,"311":1,"312":1,"320":1,"332":1,"355":1,"372":1,"374":1,"375":1,"376":1,"377":4,"421":1,"461":1,"508":1}}],["должен",{"2":{"11":1,"23":2,"48":1,"76":1,"95":1,"115":1,"122":1,"134":1,"144":1,"148":2,"157":1,"181":2,"184":1,"204":1,"211":1,"219":1,"223":1,"226":1,"229":1,"244":1,"245":1,"246":1,"255":2,"264":1,"265":1,"267":1,"268":1,"277":1,"285":1,"287":2,"291":1,"294":1,"295":1,"298":3,"308":1,"310":2,"313":1,"315":1,"316":1,"323":1,"328":1,"360":1,"361":2,"364":1,"365":1,"367":1,"372":1,"375":1,"382":1,"383":1,"402":1,"421":2,"422":1,"429":1,"451":2,"463":1,"473":1,"554":1}}],["домашний",{"2":{"205":1,"473":1,"554":1}}],["домашняя",{"0":{"204":1},"2":{"204":1}}],["домашнюю",{"2":{"173":1}}],["домашнего",{"2":{"134":1}}],["домашней",{"2":{"134":1}}],["домене",{"2":{"134":2}}],["домену",{"2":{"134":1}}],["доменным",{"2":{"140":1}}],["доменные",{"2":{"134":1}}],["доменных",{"0":{"134":1},"1":{"136":1},"2":{"134":1}}],["доменное",{"2":{"133":1,"134":2}}],["домены",{"0":{"134":1},"1":{"136":1},"2":{"134":3,"141":1,"144":1}}],["доменов",{"2":{"117":1,"134":1,"263":1}}],["доменом",{"2":{"112":1,"117":1,"135":1}}],["домен",{"2":{"117":1,"134":9,"135":1,"143":1,"144":1,"146":1,"209":1,"435":1,"444":3,"472":1,"528":2}}],["доменами",{"2":{"134":1}}],["домена",{"2":{"117":4,"131":1,"134":4,"135":1,"139":1,"144":1,"145":1,"146":2,"336":1,"431":1,"439":2,"444":1}}],["дом",{"2":{"26":1}}],["до",{"0":{"309":1},"1":{"310":1,"311":1,"312":1,"313":1,"314":1,"315":1},"2":{"22":1,"61":1,"102":1,"121":1,"125":1,"134":2,"144":1,"147":2,"148":2,"150":1,"152":1,"159":1,"160":1,"167":2,"170":1,"178":1,"183":1,"192":1,"193":1,"197":1,"200":1,"205":1,"209":1,"210":1,"216":1,"221":1,"225":4,"229":1,"233":1,"238":1,"241":1,"244":2,"249":1,"263":1,"270":1,"284":1,"295":1,"297":1,"298":1,"300":1,"303":1,"312":1,"316":1,"330":2,"338":1,"344":1,"345":1,"349":2,"352":1,"353":1,"355":2,"360":1,"364":1,"365":2,"372":2,"379":1,"384":1,"394":1,"395":1,"410":1,"421":4,"452":1,"460":1,"473":3,"508":1}}],["декларируемое",{"2":{"463":1}}],["декомпозиции",{"2":{"462":1}}],["декодирован",{"2":{"361":1}}],["декодированной",{"2":{"358":1}}],["декодирует",{"2":{"361":1}}],["декораторов",{"2":{"297":2}}],["декораторы",{"2":{"297":3,"299":1}}],["декораторами",{"2":{"300":1}}],["декораторам",{"2":{"297":1}}],["декоратора",{"2":{"271":1,"297":2,"299":1,"300":1,"338":1}}],["декоратор",{"0":{"297":1},"1":{"298":1,"299":1},"2":{"225":1,"260":1,"296":1,"297":3,"298":2,"338":2}}],["дебаге",{"2":{"460":1}}],["дебажить",{"2":{"53":1}}],["девопс",{"2":{"442":1}}],["девичестве",{"2":{"55":1}}],["децентрализованные",{"2":{"367":2}}],["децентрализованных",{"2":{"344":1,"367":1}}],["детей",{"2":{"472":1}}],["детьми",{"2":{"321":1}}],["детали",{"0":{"514":1},"1":{"515":1,"516":1},"2":{"352":1,"470":1}}],["детализирована",{"2":{"263":1}}],["детализации",{"2":{"200":1}}],["деталей",{"2":{"269":1}}],["деталях",{"0":{"242":1},"1":{"243":1,"244":1,"245":1,"246":1,"247":1},"2":{"158":1,"361":1}}],["деталям",{"2":{"131":2,"353":1}}],["детальную",{"2":{"464":1}}],["детального",{"2":{"258":1}}],["детально",{"2":{"56":1,"172":1}}],["детальный",{"2":{"14":1}}],["дефисами",{"2":{"230":1}}],["деятельность",{"2":{"187":1}}],["деятельностью",{"2":{"65":1}}],["деактивации",{"2":{"184":2}}],["демонстрации",{"2":{"176":1,"400":1}}],["демонстрирующий",{"2":{"263":1,"331":1}}],["демонстрируют",{"2":{"170":1}}],["демонстрирует",{"2":{"175":1,"193":1,"283":1,"385":1,"463":1}}],["деньги",{"2":{"457":1}}],["день",{"2":{"134":1,"169":1,"180":1,"384":1,"386":1}}],["денег",{"2":{"63":1}}],["держи",{"0":{"269":1},"2":{"260":2}}],["держим",{"2":{"22":1}}],["держателем",{"2":{"251":1}}],["держать",{"2":{"223":1,"472":1}}],["деревьев",{"2":{"353":1}}],["дереву",{"2":{"247":1,"284":1,"323":1,"325":2,"463":1}}],["дереве",{"2":{"239":1,"246":1,"328":1}}],["дерево",{"2":{"150":1,"264":1}}],["дерева",{"2":{"128":1,"160":1,"225":1,"239":1,"325":1}}],["де",{"2":{"118":1,"346":1,"512":1}}],["деплое",{"2":{"451":1}}],["деплоится",{"2":{"451":1}}],["деплоить",{"2":{"451":1}}],["деплой",{"2":{"451":1,"481":1,"482":1}}],["деплоя",{"2":{"71":1,"394":1,"451":4,"472":1,"508":1,"542":1,"545":1}}],["депозитами",{"2":{"115":1}}],["действовало",{"2":{"306":1}}],["действовать",{"2":{"298":1,"360":1}}],["действительному",{"2":{"364":1}}],["действительно",{"2":{"217":1,"289":1,"297":1,"447":1,"454":1,"461":1}}],["действительная",{"2":{"115":1}}],["действию",{"0":{"205":1},"2":{"173":1,"205":3,"217":1}}],["действии",{"0":{"405":1},"2":{"150":1,"170":1,"197":1,"222":1,"223":1,"231":1,"236":1,"266":2,"300":1,"307":1,"321":1,"322":1,"343":1,"371":1,"405":1,"420":1}}],["действием",{"2":{"185":1,"186":1}}],["действие",{"2":{"115":2,"150":1,"185":1,"186":1,"208":1,"217":1,"241":1,"243":1,"294":1,"297":1,"392":1}}],["действиями",{"2":{"198":1}}],["действиях",{"2":{"173":1,"180":1}}],["действия",{"2":{"91":1,"115":1,"144":1,"180":2,"186":1,"190":1,"198":1,"207":2,"246":1,"250":1,"252":1,"255":2,"291":1,"318":1,"346":1,"374":1,"394":2,"421":2,"434":1,"461":1}}],["действий",{"2":{"64":1,"174":1,"180":1,"190":2,"216":2,"217":1,"328":1,"427":1,"442":1}}],["действуя",{"2":{"316":1}}],["действующего",{"2":{"300":1}}],["действуют",{"2":{"3":1}}],["действует",{"2":{"23":1,"144":1,"271":1,"295":1,"316":1,"361":1,"367":1}}],["дестабилизируют",{"2":{"271":1}}],["десктоп",{"2":{"473":1}}],["десктопными",{"2":{"344":1}}],["десктопных",{"2":{"227":1}}],["десктопе",{"2":{"33":1}}],["десятилетнем",{"2":{"454":1}}],["десятилетиям",{"2":{"17":1}}],["десяток",{"2":{"180":1}}],["десятками",{"2":{"48":1}}],["десятки",{"2":{"47":1,"455":1,"457":1}}],["делиться",{"2":{"250":1,"300":1,"463":1}}],["делится",{"2":{"192":1}}],["делсостояние",{"2":{"239":1}}],["делсобытия",{"2":{"239":1}}],["дело",{"2":{"238":1,"265":1,"295":1,"364":2}}],["дел",{"2":{"221":1,"229":1,"231":7,"232":1,"235":2,"239":5,"240":1,"256":2,"347":2,"352":1}}],["делайте",{"2":{"465":1,"467":1}}],["делающее",{"2":{"463":1}}],["делаются",{"2":{"43":1,"515":1}}],["делают",{"2":{"41":1,"227":1,"305":1,"336":1,"373":2}}],["делая",{"2":{"297":1,"306":1}}],["делали",{"2":{"231":1,"321":1,"344":1,"380":1,"435":1,"452":1}}],["дела",{"2":{"134":1,"353":1,"464":1}}],["делать",{"2":{"35":1,"38":1,"41":1,"47":1,"55":1,"85":1,"95":1,"103":1,"105":1,"116":1,"117":1,"141":1,"181":2,"186":1,"189":1,"229":1,"263":1,"265":1,"271":1,"308":1,"332":1,"353":1,"372":1,"376":1,"391":1,"421":1,"457":1,"460":1,"463":1,"473":2,"557":1}}],["делаться",{"2":{"34":1,"204":1}}],["делается",{"2":{"59":1,"104":1,"115":1,"134":1,"152":1,"266":1,"296":1,"360":1,"400":1,"447":1,"504":1}}],["делает",{"2":{"48":1,"83":1,"115":1,"118":1,"123":1,"146":1,"149":1,"151":1,"180":1,"181":1,"200":1,"222":1,"230":1,"244":1,"255":1,"284":1,"287":1,"303":1,"326":1,"328":1,"333":1,"344":2,"365":1,"368":1,"372":1,"376":1,"393":1,"394":1,"424":1,"430":1,"455":1,"457":1,"462":1,"463":1,"527":1}}],["делаете",{"2":{"26":1}}],["делаем",{"2":{"22":1,"59":1,"65":1,"98":1,"152":1,"267":1,"303":1,"364":1,"423":1,"439":1}}],["делегатора",{"2":{"429":1}}],["делегировать",{"2":{"268":1,"287":1}}],["делегируется",{"2":{"293":1}}],["делегирует",{"2":{"256":1}}],["деле",{"2":{"3":1,"137":1,"166":1,"271":1,"421":1}}],["даны",{"2":{"221":1}}],["данную",{"2":{"262":1}}],["данная",{"2":{"193":1,"221":1,"292":1,"393":1,"433":1,"462":1,"473":1}}],["данном",{"2":{"121":1,"135":1,"141":1,"144":2,"148":1,"149":1,"151":1,"152":1,"173":2,"181":1,"192":1,"209":1,"212":1,"214":1,"223":1,"231":2,"232":1,"241":1,"244":1,"247":1,"249":1,"256":1,"287":2,"323":1,"328":1,"329":1,"344":1,"353":1,"355":1,"364":1,"365":1,"367":1,"376":1,"380":2,"381":2,"429":1,"431":2,"433":1,"435":1,"439":1,"445":1,"451":1,"462":1,"463":1,"498":1,"501":1,"503":1}}],["данное",{"2":{"73":1,"374":1,"508":1}}],["данной",{"2":{"68":1,"115":1,"143":1,"153":1,"179":1,"203":1,"204":1,"225":1,"237":1,"240":1,"260":1,"265":1,"267":1,"271":1,"317":1,"360":1,"364":1,"367":2,"394":1,"472":1,"555":1}}],["данного",{"0":{"76":1,"495":1},"2":{"65":1,"185":1,"198":1,"229":1,"237":1,"295":1,"316":1,"329":2,"421":1,"422":1,"430":1,"451":1,"460":1,"463":1,"464":1}}],["данным",{"2":{"117":1,"192":1,"277":1,"323":1,"366":1,"419":1,"472":1}}],["данными",{"0":{"182":1},"1":{"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1},"2":{"17":1,"38":1,"39":1,"41":1,"47":1,"103":1,"116":3,"144":1,"232":1,"239":1,"246":1,"247":1,"250":1,"297":1,"323":1,"328":1,"329":1,"330":1,"341":1,"344":1,"360":1,"361":1,"426":1,"439":1,"447":1,"554":1}}],["данный",{"2":{"11":1,"16":1,"36":1,"43":1,"53":1,"134":1,"152":1,"200":1,"224":1,"228":1,"255":1,"262":1,"265":1,"284":1,"291":1,"294":1,"296":1,"352":1,"379":1,"471":1,"497":1,"501":1,"504":1,"517":1,"520":1,"536":1,"542":1,"549":1}}],["данные",{"0":{"44":1,"109":1},"1":{"45":1,"46":1,"47":1},"2":{"3":1,"11":2,"17":2,"47":2,"103":1,"109":1,"115":2,"116":3,"117":1,"163":1,"211":1,"230":1,"239":2,"244":1,"246":2,"247":4,"249":1,"256":1,"266":2,"292":3,"293":2,"295":1,"297":1,"299":1,"323":2,"325":3,"326":1,"328":1,"336":7,"337":1,"355":2,"360":4,"361":1,"362":1,"363":1,"366":2,"367":2,"421":3,"422":1,"423":1,"425":1,"426":1,"427":1,"428":2,"433":1,"434":5,"435":1,"436":2,"437":2,"439":2,"446":4,"447":1,"460":2,"462":4,"463":3,"472":1,"473":3}}],["данных",{"0":{"15":1,"17":1,"42":2,"239":1,"321":1,"336":1,"413":1},"1":{"16":1,"17":1,"18":2,"19":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1},"2":{"3":1,"6":2,"11":1,"16":1,"17":8,"39":3,"40":2,"41":1,"43":1,"44":1,"47":1,"48":3,"53":1,"59":2,"62":1,"68":1,"79":1,"83":1,"116":7,"117":1,"118":1,"123":2,"127":1,"148":2,"152":3,"157":1,"158":1,"171":1,"185":1,"192":5,"231":1,"239":1,"240":1,"245":3,"247":1,"249":1,"252":1,"267":1,"273":1,"276":1,"282":3,"289":1,"290":1,"293":1,"300":1,"306":1,"315":1,"316":1,"321":1,"323":3,"328":4,"329":1,"330":1,"335":1,"336":13,"337":2,"340":1,"344":2,"349":1,"352":1,"353":1,"355":2,"360":8,"361":2,"365":1,"366":2,"372":2,"373":1,"413":1,"419":3,"422":2,"430":1,"431":6,"432":2,"433":3,"434":1,"437":1,"439":1,"440":1,"447":1,"457":2,"462":2,"463":4,"464":1,"472":1,"473":1}}],["дат",{"2":{"460":1,"536":1}}],["дата",{"0":{"460":1}}],["датами",{"2":{"456":1}}],["датой",{"2":{"451":1,"460":1}}],["дату",{"2":{"395":2,"451":1}}],["датчики",{"2":{"250":1}}],["даты",{"2":{"183":2}}],["дать",{"2":{"115":1,"131":1,"180":1,"219":1,"241":1,"336":1,"383":1,"508":2}}],["даст",{"2":{"119":1,"327":1,"331":1,"462":1}}],["дал",{"2":{"211":1,"224":1,"463":1}}],["далеко",{"2":{"116":1,"201":1,"222":1,"223":1,"268":1,"367":1,"461":1,"465":1}}],["далее",{"0":{"121":1},"2":{"95":2,"112":1,"115":1,"143":1,"148":1,"152":1,"166":1,"178":1,"181":1,"195":1,"223":2,"224":1,"230":2,"231":1,"250":1,"263":2,"279":1,"302":1,"306":1,"308":2,"314":1,"335":1,"337":1,"352":1,"360":1,"363":1,"366":1,"367":1,"372":1,"381":1,"383":1,"394":1,"434":1,"439":1}}],["дальше",{"2":{"115":1,"148":1,"186":1,"223":1,"228":1,"391":1,"468":1}}],["дальнейшего",{"2":{"181":1,"367":1,"394":1,"507":1}}],["дальнейшей",{"2":{"69":1,"160":1,"168":1,"200":1,"506":1,"508":1}}],["дальнейшем",{"2":{"11":1,"16":1,"18":1,"29":1,"34":1,"40":1,"58":1,"59":1,"97":1,"104":1,"150":1,"159":1,"193":1,"271":1,"363":1,"471":1,"509":1,"511":1}}],["дальнейшая",{"2":{"38":1,"394":1}}],["дальнейших",{"2":{"9":1,"12":1,"405":1}}],["дальнейшую",{"2":{"3":1}}],["дала",{"2":{"103":1}}],["дает",{"2":{"91":1,"115":1,"118":2,"152":1,"155":1,"190":1,"228":1,"260":1,"271":1,"296":1,"323":1,"331":1,"345":1,"374":1,"380":1,"421":1,"441":1,"460":1}}],["даёт",{"2":{"65":1,"91":1,"457":1,"462":1,"472":1}}],["давид",{"2":{"405":1}}],["давным",{"2":{"169":1}}],["давно",{"2":{"39":1,"169":1,"190":1}}],["давайте",{"2":{"119":1,"120":1,"133":1,"142":1,"148":2,"149":1,"151":1,"152":2,"161":1,"172":1,"181":1,"207":1,"221":1,"225":1,"226":1,"227":1,"237":1,"244":1,"246":1,"249":1,"251":1,"255":4,"271":1,"276":1,"283":1,"289":1,"291":1,"292":1,"295":1,"296":1,"301":1,"308":1,"309":1,"323":1,"324":1,"325":1,"326":1,"329":1,"332":1,"344":1,"345":1,"346":1,"347":1,"350":1,"351":1,"361":3,"373":1,"375":1,"382":1,"386":1,"391":1,"393":1,"421":1,"429":2,"430":1,"431":1,"437":1}}],["давать",{"2":{"115":1}}],["давая",{"2":{"2":1,"308":1}}],["дают",{"2":{"17":2,"133":1,"396":1}}],["даже",{"2":{"12":1,"40":1,"48":1,"68":1,"115":1,"117":1,"144":1,"147":2,"148":2,"160":1,"167":1,"171":2,"174":1,"176":1,"189":1,"204":1,"207":2,"227":2,"232":1,"243":1,"247":1,"248":1,"249":1,"262":1,"268":1,"271":1,"286":1,"294":1,"295":1,"300":1,"308":1,"316":1,"319":1,"325":1,"330":1,"339":1,"344":2,"352":1,"353":2,"355":1,"361":1,"366":2,"367":1,"370":1,"372":1,"373":1,"375":1,"381":1,"384":1,"385":1,"394":1,"421":2,"431":1,"460":1,"462":1,"463":2,"471":1,"472":3,"536":1}}],["да",{"2":{"10":1,"152":2,"223":1,"228":1,"234":1,"281":1,"297":1,"303":1,"338":1}}],["двинемся",{"2":{"391":1}}],["двигателя",{"2":{"472":1}}],["двигаться",{"2":{"228":1,"392":1}}],["двигаясь",{"2":{"344":1}}],["движок",{"2":{"431":1}}],["движущихся",{"2":{"300":1,"421":1}}],["движению",{"2":{"300":1}}],["движение",{"2":{"250":1}}],["движения",{"2":{"178":1}}],["движки",{"2":{"306":1}}],["движке",{"2":{"222":1,"308":1,"336":1}}],["движка",{"2":{"125":1,"334":1,"433":1}}],["двойной",{"2":{"433":1}}],["двойных",{"2":{"231":1}}],["двойные",{"2":{"149":1}}],["двойная",{"2":{"187":1}}],["двоеточия",{"2":{"159":1,"355":1}}],["двоеточие",{"2":{"154":1,"349":1}}],["двум",{"2":{"228":1,"267":1}}],["двумя",{"2":{"104":1,"224":1,"227":1,"296":1,"347":1,"433":1,"440":1}}],["двусмысленное",{"2":{"463":1}}],["двусторонним",{"2":{"158":1}}],["двуслешные",{"2":{"86":1}}],["двунаправленную",{"2":{"118":1}}],["двухдневный",{"2":{"472":1}}],["двухфакторная",{"0":{"366":1},"2":{"365":1}}],["двух",{"2":{"105":1,"137":1,"143":1,"148":1,"173":1,"247":1,"251":1,"308":1,"349":1,"366":1,"381":1,"439":1,"517":1,"549":1}}],["двадцатилетней",{"2":{"472":1}}],["дважды",{"2":{"268":1}}],["два",{"2":{"3":2,"17":2,"47":1,"58":1,"115":1,"123":1,"125":1,"134":1,"144":1,"152":1,"157":1,"160":1,"171":1,"184":2,"192":1,"231":4,"232":1,"243":1,"244":1,"255":3,"270":1,"290":1,"291":1,"296":1,"301":1,"303":1,"311":1,"315":3,"332":1,"338":1,"351":1,"355":1,"361":1,"366":1,"376":1,"382":1,"419":1,"424":1,"434":1,"435":1,"445":1,"447":1,"464":1,"472":2,"473":2,"534":1}}],["двери",{"2":{"268":1}}],["две",{"2":{"2":1,"16":1,"115":1,"118":1,"135":1,"152":1,"173":1,"231":1,"256":1,"303":2,"338":1,"355":1,"365":1,"376":1,"419":1,"439":1}}],["иллюстрации",{"2":{"504":1}}],["илья",{"2":{"472":1}}],["или",{"0":{"37":1,"118":1,"173":1,"185":1,"187":1,"189":1,"308":1,"365":1,"459":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"3":1,"16":1,"17":1,"22":1,"40":1,"41":2,"48":1,"55":1,"62":1,"63":1,"64":1,"67":1,"98":1,"102":2,"104":1,"105":1,"109":1,"114":2,"115":2,"116":1,"117":4,"118":2,"121":1,"123":2,"124":1,"125":1,"131":2,"134":7,"135":2,"137":2,"138":1,"140":1,"143":3,"148":9,"149":2,"150":1,"151":1,"152":6,"153":1,"155":4,"156":3,"157":1,"158":1,"159":1,"160":3,"169":1,"171":6,"172":4,"173":2,"174":2,"175":3,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"183":1,"184":7,"185":4,"186":3,"188":1,"189":1,"190":2,"192":3,"194":1,"195":2,"198":2,"200":3,"201":2,"202":1,"203":5,"204":1,"205":3,"207":3,"208":1,"209":1,"210":1,"211":2,"212":3,"213":1,"214":2,"215":1,"216":1,"217":1,"218":3,"221":1,"222":5,"223":4,"224":1,"225":7,"227":1,"228":2,"229":2,"230":2,"231":5,"232":5,"234":1,"235":1,"237":2,"238":2,"239":1,"240":2,"241":3,"243":2,"244":2,"245":2,"246":1,"247":3,"248":3,"249":3,"250":2,"252":2,"255":2,"256":3,"257":2,"258":1,"259":1,"263":2,"264":3,"265":3,"266":1,"267":1,"268":4,"269":2,"270":3,"271":3,"272":1,"278":2,"280":1,"282":3,"287":3,"288":1,"289":1,"290":1,"291":2,"293":2,"294":2,"295":6,"296":2,"297":4,"298":2,"300":5,"301":3,"302":2,"303":5,"304":1,"306":1,"308":5,"310":4,"315":6,"316":3,"318":3,"321":1,"325":1,"326":2,"328":2,"329":1,"330":1,"333":1,"335":2,"336":4,"338":4,"339":1,"341":1,"344":1,"346":3,"347":1,"349":2,"352":2,"353":1,"354":1,"355":1,"359":4,"360":5,"361":2,"362":1,"365":2,"366":7,"367":4,"370":4,"372":3,"373":6,"375":3,"376":4,"378":1,"381":1,"382":1,"383":2,"385":2,"387":1,"388":1,"390":2,"393":1,"394":1,"395":1,"397":1,"402":2,"421":6,"423":2,"425":6,"426":2,"427":1,"428":1,"429":1,"431":2,"432":1,"436":1,"437":1,"444":1,"445":1,"446":3,"452":1,"454":1,"455":2,"460":3,"462":2,"463":11,"464":1,"465":1,"466":2,"471":3,"472":5,"473":3,"495":3,"504":1,"507":4,"511":1,"536":1}}],["иерарxичную",{"2":{"471":1}}],["иерархия",{"2":{"238":1,"248":1}}],["иерархические",{"2":{"256":1}}],["иерархический",{"2":{"196":1}}],["иерархическому",{"2":{"247":1}}],["иерархичных",{"2":{"17":1}}],["иерархичного",{"2":{"17":1,"462":1}}],["иерархичное",{"2":{"2":1}}],["иерархию",{"2":{"173":1,"233":1,"238":1}}],["иерархии",{"2":{"151":1,"224":1,"235":1,"238":2,"239":1,"246":1,"248":1,"287":1,"289":1,"463":2}}],["ивент",{"2":{"463":1}}],["ивенты",{"2":{"463":1}}],["ивентов",{"2":{"463":1}}],["ищутся",{"2":{"372":1}}],["играет",{"2":{"462":1}}],["играй",{"2":{"367":1}}],["игры",{"2":{"367":1}}],["игру",{"2":{"208":1}}],["игрушек",{"2":{"63":1}}],["игрушки",{"2":{"19":1,"62":2}}],["игрушка",{"2":{"18":1}}],["игнорировать",{"2":{"280":1}}],["игнорируют",{"2":{"239":1}}],["игнорируйте",{"2":{"224":1}}],["иконографическое",{"2":{"239":1}}],["иконографических",{"2":{"229":1}}],["иконографию",{"2":{"225":1}}],["иконография",{"2":{"176":1}}],["иконок",{"2":{"198":1,"205":1,"225":1,"227":7,"233":1,"235":1,"308":1,"313":1,"513":1}}],["иконке",{"2":{"105":1}}],["иконкой",{"2":{"105":2,"231":1,"315":1}}],["иконкам",{"2":{"112":1}}],["иконками",{"2":{"85":1,"98":1,"227":1,"452":1}}],["иконка",{"0":{"102":1},"2":{"102":2,"190":1,"198":5,"473":1}}],["иконки",{"0":{"198":1,"205":1},"2":{"98":1,"198":1,"205":1,"224":1,"227":1,"235":1,"452":2,"454":1,"455":1,"513":1,"543":1}}],["иконку",{"2":{"95":1,"103":1,"105":1,"311":1,"452":2,"518":1,"546":1,"548":1}}],["идущими",{"2":{"247":1}}],["идущие",{"2":{"108":1}}],["идею",{"2":{"425":1,"473":1}}],["идеально",{"2":{"375":1,"434":1,"462":1}}],["идеале",{"2":{"23":1,"463":1}}],["идее",{"2":{"263":1}}],["идеей",{"2":{"234":1,"382":1}}],["идентифицировал",{"2":{"439":1}}],["идентифицировать",{"2":{"345":1,"367":1}}],["идентифицирует",{"2":{"336":1}}],["идентифицирующее",{"2":{"255":1}}],["идентификацией",{"2":{"367":1}}],["идентификационных",{"2":{"366":1}}],["идентификационный",{"2":{"134":1}}],["идентификационная",{"2":{"361":1}}],["идентификацию",{"2":{"355":1,"367":1}}],["идентификации",{"2":{"223":1,"255":1,"359":1,"367":1,"375":1,"428":1}}],["идентификаторы",{"2":{"513":1}}],["идентификатору",{"2":{"367":1}}],["идентификатора",{"2":{"332":1,"367":1,"428":1}}],["идентификаторов",{"2":{"193":1}}],["идентификатором",{"2":{"149":1,"428":1}}],["идентификатор",{"2":{"152":1,"349":1,"352":2,"361":1,"362":1,"367":2}}],["идет",{"2":{"180":1,"205":1,"308":1,"373":1,"457":1,"497":1}}],["идете",{"2":{"26":1}}],["идея",{"2":{"160":1,"268":1,"269":1,"297":1,"306":1,"365":1,"463":1,"507":1}}],["итерируйте",{"2":{"238":1}}],["итерацией",{"2":{"367":1}}],["итераций",{"2":{"67":1}}],["итеративный",{"2":{"232":1,"234":1}}],["итераторе",{"2":{"157":1}}],["итак",{"2":{"86":1,"148":1,"237":1,"286":1,"295":1,"300":1,"331":1,"361":1,"375":1}}],["итог",{"0":{"130":1}}],["итоговый",{"2":{"471":1}}],["итогов",{"0":{"145":1,"167":1,"219":1,"233":1,"258":1,"304":1,"319":1,"340":1,"368":1,"396":1,"440":1}}],["итогового",{"2":{"79":1}}],["итого",{"2":{"115":1}}],["итоге",{"0":{"540":1},"2":{"47":1,"99":1,"104":1,"166":1,"244":1,"265":1,"268":1,"366":1,"457":1,"463":1}}],["имитировать",{"2":{"381":1}}],["имитирует",{"2":{"461":1}}],["имитируют",{"2":{"431":1}}],["имитирующая",{"2":{"431":1}}],["имитирующей",{"2":{"380":1}}],["имитирующих",{"2":{"372":1}}],["имитирующую",{"2":{"372":1}}],["имитируя",{"2":{"217":1}}],["имитацией",{"2":{"373":1}}],["имитации",{"2":{"251":1}}],["ими",{"2":{"134":1,"239":1,"246":1,"252":1,"308":1,"345":1,"396":1,"425":1,"447":1,"539":1}}],["импорты",{"2":{"365":1}}],["импорт",{"0":{"244":1},"2":{"225":1,"228":2,"244":1,"463":1}}],["импорта",{"2":{"148":1,"231":1,"244":1,"250":1,"255":2,"280":1,"292":1,"330":1,"332":1,"333":1,"338":1,"349":2,"381":1,"423":1,"424":1,"428":1,"429":2,"432":1,"453":1}}],["импортирую",{"2":{"463":1}}],["импортируя",{"2":{"160":1,"328":1}}],["импортируется",{"2":{"152":1}}],["импортирует",{"2":{"150":1}}],["импортируем",{"2":{"120":1,"149":1,"152":2,"229":1,"247":2,"256":3,"283":1,"328":1,"330":1,"335":1,"349":2,"355":1,"367":1,"376":2,"380":2,"430":1,"433":1,"435":1,"437":1,"439":1}}],["импортировав",{"2":{"250":1}}],["импортировали",{"2":{"230":1,"244":1,"299":1}}],["импортированы",{"2":{"452":1}}],["импортированными",{"2":{"243":1}}],["импортированным",{"2":{"243":1}}],["импортированных",{"2":{"230":1}}],["импортирование",{"2":{"228":1}}],["импортирован",{"2":{"148":1,"224":1,"280":1}}],["импортировать",{"2":{"120":1,"148":1,"149":1,"150":1,"152":2,"224":1,"228":1,"230":1,"243":2,"250":1,"255":1,"280":1,"288":1,"289":1,"334":1,"349":1,"359":1,"376":1,"423":1,"452":2,"454":1}}],["импорте",{"2":{"62":1,"224":1,"228":1}}],["имя",{"2":{"95":1,"133":1,"134":3,"152":2,"166":1,"223":6,"224":1,"230":2,"246":2,"249":6,"255":2,"288":2,"292":1,"310":3,"311":2,"313":1,"332":1,"338":1,"352":2,"355":2,"358":1,"366":1,"375":1,"388":1,"422":1,"451":1,"495":1}}],["им",{"2":{"89":1,"115":1,"247":1,"250":1,"355":1,"372":1,"471":1,"473":1,"507":1}}],["имейте",{"2":{"359":1}}],["имея",{"2":{"171":1,"222":1,"308":1}}],["имели",{"2":{"150":1,"171":1}}],["имеющую",{"2":{"439":1}}],["имеющих",{"2":{"134":1}}],["имеются",{"2":{"358":1}}],["имеют",{"2":{"124":1,"151":1,"152":2,"153":1,"172":1,"173":1,"175":1,"195":1,"209":1,"256":1,"265":2,"268":1,"297":1,"303":1,"308":1,"316":1,"323":3,"336":1,"396":1,"421":2,"428":1,"460":1,"463":1,"471":1}}],["именованного",{"2":{"349":1}}],["именованных",{"2":{"353":1}}],["именованными",{"2":{"249":1}}],["именованные",{"0":{"353":1},"1":{"354":1,"355":1},"2":{"249":2,"353":2}}],["именование",{"2":{"247":1}}],["именовании",{"2":{"246":1,"247":2,"250":1,"270":1}}],["именования",{"2":{"198":1}}],["именовать",{"2":{"44":1}}],["имени",{"0":{"360":1},"2":{"134":1,"223":1,"245":1,"247":2,"249":1,"255":4,"287":1,"288":2,"289":1,"292":1,"295":1,"298":1,"300":1,"311":1,"336":1,"345":1,"355":1,"360":3,"366":1,"368":1,"430":1,"452":1,"513":1,"543":1}}],["именам",{"2":{"288":1,"352":1,"433":1}}],["именами",{"2":{"231":1,"303":2,"355":1,"360":1,"361":1,"385":1,"452":1}}],["имена",{"0":{"164":1,"165":1},"2":{"117":1,"134":2,"149":1,"288":1,"303":1,"317":1,"355":1,"513":1}}],["именем",{"2":{"117":1,"124":1,"226":1,"230":1,"231":1,"247":2,"249":2,"251":1,"255":2,"297":1,"298":1,"315":1,"336":1,"338":1,"349":3,"355":1,"381":1,"423":1,"433":1,"454":1}}],["имен",{"0":{"134":1},"1":{"136":1},"2":{"44":1,"134":1,"238":1,"243":1,"245":1,"289":1,"296":1,"354":1,"361":1}}],["именно",{"2":{"2":1,"39":1,"115":1,"134":1,"136":1,"139":1,"144":1,"147":2,"150":1,"151":1,"152":1,"207":1,"221":1,"224":2,"227":1,"240":1,"246":1,"291":1,"296":1,"301":1,"308":1,"323":1,"328":1,"332":1,"347":1,"352":1,"355":1,"366":1,"372":1,"380":1,"423":1,"424":2,"462":1,"463":1,"472":2}}],["имеем",{"2":{"41":1,"137":1,"144":1,"152":1,"224":1,"256":1,"364":1}}],["имеет",{"2":{"38":1,"41":1,"55":1,"115":4,"116":1,"118":1,"122":1,"123":2,"125":1,"130":1,"136":1,"137":1,"140":1,"149":1,"152":1,"155":1,"157":1,"172":1,"181":1,"183":1,"184":1,"209":1,"213":1,"227":1,"238":1,"239":1,"244":3,"245":1,"248":1,"255":1,"263":1,"267":1,"281":1,"289":1,"292":1,"295":1,"296":1,"308":1,"310":1,"311":1,"315":2,"323":1,"326":1,"328":2,"330":1,"336":1,"349":1,"360":1,"361":2,"371":1,"373":1,"375":1,"381":1,"385":1,"422":1,"425":1,"434":1,"462":2}}],["имеется",{"2":{"4":1,"195":1,"225":1,"328":1}}],["иметь",{"2":{"11":1,"18":1,"23":1,"124":1,"128":1,"134":3,"137":1,"147":1,"152":1,"155":1,"166":1,"173":2,"176":1,"181":1,"193":1,"200":1,"228":1,"231":1,"232":1,"237":1,"241":1,"246":2,"257":1,"265":1,"271":1,"280":1,"287":1,"291":1,"310":1,"316":1,"328":1,"354":1,"358":1,"360":2,"366":1,"375":2,"386":1,"393":1,"402":1,"419":1,"446":1,"457":1,"463":1}}],["изнутри",{"2":{"423":1}}],["изначально",{"2":{"29":1,"431":1,"445":1,"473":1}}],["изложенные",{"2":{"419":1}}],["излишняя",{"2":{"265":1}}],["издателя",{"2":{"291":1}}],["издревле",{"2":{"2":1}}],["измерения",{"2":{"372":1}}],["измерить",{"2":{"319":1}}],["измеримые",{"2":{"177":1}}],["изменено",{"0":{"477":1,"479":1,"482":1,"485":1},"2":{"148":1}}],["изменении",{"2":{"148":1,"203":1,"231":1,"337":1,"339":1,"462":2}}],["изменений",{"0":{"474":1},"1":{"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1},"2":{"119":3,"123":2,"129":1,"130":1,"148":1,"157":1,"222":1,"240":1,"335":1,"344":1,"352":2,"370":1,"376":1,"379":1,"382":1,"384":1,"385":2,"386":1,"390":2,"434":1,"442":1,"460":1,"495":1}}],["изменениям",{"2":{"400":1,"418":1}}],["изменениями",{"2":{"291":1,"339":1,"352":1,"379":1,"431":1,"457":1,"462":2}}],["изменениях",{"2":{"188":1,"256":1,"291":1,"463":1}}],["изменения",{"0":{"124":1,"126":1,"127":1,"128":1,"129":1},"2":{"40":1,"41":1,"119":7,"120":1,"126":1,"130":1,"141":1,"146":1,"147":3,"203":1,"223":1,"228":1,"231":1,"245":1,"256":1,"267":2,"271":1,"297":1,"300":1,"330":1,"336":1,"352":1,"370":2,"386":3,"390":1,"393":1,"394":3,"395":2,"396":1,"460":2,"482":1,"511":1}}],["изменение",{"2":{"38":2,"124":1,"127":1,"135":1,"136":1,"240":1,"245":1,"250":1,"256":2,"303":1,"328":1,"329":1,"330":1,"331":1,"332":1,"335":1,"385":1,"393":1}}],["изменяя",{"2":{"357":1}}],["изменяет",{"2":{"298":1,"323":1,"325":1,"330":2,"349":1}}],["изменяете",{"2":{"297":1,"397":1}}],["изменяется",{"2":{"148":1,"291":1,"303":1,"397":1}}],["изменяем",{"2":{"256":1,"299":2}}],["изменяются",{"2":{"250":1}}],["изменяющие",{"2":{"147":1,"176":1}}],["изменяться",{"2":{"316":2,"462":1}}],["изменять",{"2":{"138":1,"147":1,"152":1,"227":1,"239":1,"332":1,"355":1,"462":1,"555":1}}],["изменит",{"2":{"375":1}}],["измените",{"2":{"228":1,"317":1}}],["изменится",{"2":{"160":1,"374":1,"430":1,"457":1}}],["изменить",{"2":{"135":2,"152":1,"156":1,"171":1,"224":1,"230":1,"295":2,"302":1,"329":1,"366":1,"382":1,"433":1,"441":1,"462":1,"464":1,"471":1}}],["изменил",{"2":{"385":1}}],["изменилась",{"2":{"303":1}}],["изменили",{"2":{"259":1}}],["изменилось",{"2":{"120":1,"152":1,"354":1,"385":1}}],["изменился",{"2":{"115":1,"120":1,"226":1}}],["изменим",{"2":{"95":1,"283":1,"352":1,"379":1,"435":1}}],["изощренных",{"2":{"457":1}}],["изоляции",{"2":{"281":1,"366":1}}],["изолированные",{"2":{"150":1}}],["изобретено",{"2":{"462":1}}],["изобретайте",{"2":{"300":1}}],["изобретать",{"2":{"225":1,"260":1,"292":1}}],["изображению",{"2":{"311":1}}],["изображение",{"2":{"238":1}}],["изображений",{"0":{"189":1},"2":{"183":1,"189":4,"257":1}}],["изображениями",{"2":{"189":1,"205":1}}],["изображения",{"2":{"16":1,"173":1,"175":1,"224":1,"311":1,"313":3,"391":1,"452":2}}],["изобразить",{"2":{"150":1}}],["извлеченного",{"2":{"432":1}}],["извлечения",{"2":{"336":1,"431":1,"432":1}}],["извлекать",{"2":{"381":1}}],["извлекает",{"2":{"381":1}}],["извлекаем",{"2":{"149":1,"433":1}}],["известен",{"2":{"268":1}}],["известную",{"2":{"434":1}}],["известно",{"2":{"361":1}}],["известной",{"2":{"211":1,"222":1}}],["известны",{"2":{"365":1}}],["известных",{"2":{"315":1,"345":1,"367":1}}],["известный",{"2":{"137":1,"349":1,"361":1,"459":1,"460":1}}],["известными",{"2":{"310":1,"367":1}}],["известным",{"2":{"134":1}}],["известные",{"2":{"9":1,"331":2}}],["изучайте",{"2":{"472":1}}],["изучаемые",{"2":{"432":1}}],["изучающей",{"2":{"172":1}}],["изучать",{"2":{"22":1,"148":1,"174":1,"477":1,"479":1}}],["изучили",{"2":{"368":1}}],["изучите",{"2":{"169":1}}],["изучить",{"2":{"21":1,"68":1,"143":1,"148":1,"181":1,"225":1,"249":1,"313":1,"424":1,"451":1,"508":1}}],["изучим",{"2":{"147":1,"342":1}}],["изученных",{"2":{"320":1}}],["изученный",{"2":{"9":1}}],["изучению",{"2":{"241":1,"376":1}}],["изучении",{"2":{"225":1,"306":1,"507":1}}],["изучения",{"2":{"167":1,"260":1,"271":1,"303":1,"374":1,"472":2}}],["изучение",{"0":{"21":1,"153":1,"472":1},"1":{"154":1,"155":1,"156":1,"157":1,"158":1,"159":1},"2":{"206":1,"400":1,"468":1,"472":1}}],["из",{"0":{"503":1},"2":{"14":1,"23":1,"28":1,"34":1,"39":1,"41":2,"48":1,"55":2,"67":1,"69":2,"76":1,"79":1,"86":3,"89":1,"95":1,"102":1,"105":1,"112":1,"115":1,"116":1,"118":1,"119":1,"120":2,"123":3,"126":1,"134":4,"135":1,"137":1,"143":1,"144":1,"147":3,"148":5,"149":2,"150":2,"151":2,"152":7,"153":1,"155":1,"156":2,"157":1,"160":1,"169":1,"172":1,"174":1,"175":1,"178":2,"179":1,"182":1,"184":2,"185":1,"186":1,"189":3,"190":1,"191":1,"192":1,"194":1,"195":1,"196":1,"197":1,"198":1,"203":3,"204":2,"205":2,"206":1,"207":1,"208":1,"216":1,"217":2,"219":1,"221":1,"222":3,"223":1,"224":3,"225":3,"227":6,"229":1,"230":3,"231":5,"235":1,"237":1,"238":1,"239":1,"241":2,"244":1,"245":3,"246":2,"247":2,"248":1,"249":2,"250":2,"251":1,"255":3,"256":2,"261":1,"263":3,"264":1,"265":2,"267":1,"269":1,"270":2,"276":1,"277":1,"279":1,"281":2,"285":1,"287":1,"291":3,"292":1,"295":1,"297":4,"300":3,"301":2,"302":4,"303":3,"306":2,"307":1,"308":2,"310":1,"311":1,"313":1,"315":3,"316":1,"317":1,"321":3,"323":1,"325":1,"326":1,"328":1,"329":3,"330":1,"331":2,"332":2,"333":1,"335":1,"336":5,"338":4,"339":1,"344":3,"345":1,"347":1,"349":3,"352":5,"353":2,"354":1,"355":6,"358":1,"359":2,"360":1,"361":3,"366":2,"367":1,"369":1,"370":2,"373":2,"374":1,"375":2,"376":5,"379":2,"380":2,"381":1,"382":1,"385":3,"386":3,"390":1,"393":1,"394":3,"421":6,"426":1,"427":1,"428":4,"429":2,"432":1,"433":1,"434":4,"437":1,"439":3,"451":4,"452":5,"453":1,"455":2,"460":1,"461":1,"462":1,"463":5,"464":1,"468":1,"472":2,"473":2,"507":1,"511":1,"513":2,"517":1,"549":1}}],["избыточности",{"2":{"268":1}}],["избавляет",{"2":{"193":1}}],["избегаемы",{"2":{"460":1}}],["избегаем",{"2":{"435":1}}],["избегания",{"2":{"268":1}}],["избегание",{"2":{"189":1}}],["избегая",{"2":{"250":1}}],["избегать",{"2":{"195":1,"206":1,"218":1,"220":1,"243":1,"265":1}}],["избегайте",{"0":{"465":1},"2":{"179":1,"265":1,"447":1}}],["избежание",{"2":{"230":1}}],["избежания",{"2":{"9":1,"545":1}}],["избежать",{"2":{"44":1,"180":1,"205":1,"226":1,"235":1,"247":1,"267":1,"280":1,"281":1,"462":1}}],["избранном",{"2":{"102":1}}],["избранного",{"2":{"98":1}}],["избранное",{"0":{"101":1},"1":{"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"4":1,"29":1,"33":1,"102":3,"104":2,"105":1}}],["исчезновении",{"2":{"516":1}}],["исчезают",{"2":{"257":1}}],["исчезла",{"2":{"169":1,"393":1}}],["исчерпывающий",{"2":{"260":1}}],["исчерпывающим",{"2":{"119":1,"152":1}}],["исчерпывающее",{"2":{"214":1}}],["истинным",{"2":{"380":1}}],["истины",{"2":{"268":1,"330":1,"331":1}}],["истечения",{"2":{"144":1,"365":1}}],["истечении",{"2":{"134":1,"144":1,"244":1}}],["историю",{"2":{"356":1,"386":1}}],["история",{"0":{"474":1},"1":{"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1},"2":{"171":1,"297":1,"386":1}}],["истории",{"2":{"127":2,"135":1,"136":1,"137":1,"139":1,"145":1,"146":1,"358":2}}],["историческим",{"2":{"385":1}}],["исторически",{"2":{"44":1,"463":1}}],["источники",{"2":{"472":1,"497":1}}],["источнику",{"2":{"117":1,"472":1}}],["источник",{"2":{"117":1,"247":1,"330":1,"331":1,"386":1}}],["источников",{"2":{"117":3,"439":2}}],["искренне",{"2":{"405":1}}],["искренней",{"2":{"232":1}}],["исключительных",{"2":{"473":1}}],["исключительным",{"2":{"269":1}}],["исключить",{"2":{"382":1}}],["исключают",{"2":{"382":1}}],["исключается",{"2":{"224":1}}],["исключена",{"2":{"336":1}}],["исключение",{"2":{"204":2}}],["исключением",{"2":{"133":1,"188":1,"204":1,"224":1,"235":1,"266":2,"373":1,"432":1,"463":1}}],["исключения",{"2":{"148":1,"204":1,"390":1}}],["искусственной",{"2":{"430":1}}],["искусственного",{"2":{"171":1}}],["искушению",{"2":{"264":1}}],["искушение",{"2":{"85":1}}],["искать",{"2":{"48":1,"174":2,"400":1,"454":1}}],["исходящие",{"2":{"266":1}}],["исходящими",{"2":{"218":1}}],["исходя",{"2":{"230":1,"313":1,"321":1,"323":1,"352":1}}],["исходному",{"2":{"267":1,"338":1}}],["исходном",{"2":{"247":1,"376":1,"381":1,"382":1,"396":1}}],["исходного",{"2":{"143":2,"256":1,"297":1,"336":1,"372":1,"385":1,"386":1,"437":1,"457":1}}],["исходные",{"2":{"386":1}}],["исходными",{"0":{"386":1}}],["исходным",{"2":{"370":1,"375":1,"382":1,"385":1,"391":1,"427":1}}],["исходных",{"0":{"415":1},"2":{"222":1,"224":2,"384":1,"385":1}}],["исходный",{"2":{"170":1,"192":1,"216":1,"231":1,"240":1,"288":1,"296":1,"316":1,"338":1,"371":1,"375":1,"391":1,"393":1}}],["исходная",{"2":{"12":1}}],["исхода",{"2":{"79":1}}],["исследование",{"0":{"359":1},"1":{"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1}}],["исследований",{"2":{"177":1,"372":1}}],["исследования",{"2":{"39":1,"169":1}}],["исследовать",{"2":{"4":1,"224":1}}],["исследуем",{"2":{"21":1,"303":1}}],["испытываем",{"2":{"364":1}}],["испортит",{"2":{"461":1}}],["испорчен",{"2":{"361":1}}],["исполнение",{"2":{"293":1}}],["исполнения",{"2":{"149":1}}],["использовалось",{"2":{"331":1}}],["использовал",{"2":{"174":1,"386":1}}],["использовались",{"2":{"370":1,"460":1}}],["использовали",{"2":{"86":1,"103":1,"246":1,"258":1,"268":1,"287":1,"335":1,"344":1,"352":1,"355":2,"358":1,"378":1}}],["использованы",{"2":{"176":1,"361":2}}],["использована",{"2":{"152":1,"160":1}}],["использован",{"2":{"148":1,"152":1}}],["использовано",{"2":{"134":1,"303":1}}],["использованию",{"2":{"182":1,"226":1,"231":1,"233":1,"252":1,"308":1,"377":1,"390":1,"433":1,"460":1}}],["использованием",{"2":{"135":1,"173":1,"206":1,"211":1,"221":1,"240":1,"249":1,"251":1,"258":2,"265":1,"279":1,"284":1,"287":1,"303":1,"308":1,"319":1,"321":1,"336":1,"337":1,"342":1,"353":1,"367":1,"372":1,"373":1,"376":1,"377":1,"388":1,"428":2,"440":1,"452":1,"473":1}}],["использование",{"0":{"52":1,"149":1,"375":1,"390":1,"538":1},"1":{"150":1,"376":1,"391":1},"2":{"40":1,"59":1,"77":1,"117":1,"134":1,"143":1,"144":1,"148":1,"152":2,"160":1,"170":1,"175":1,"180":1,"186":1,"189":1,"192":2,"196":1,"200":1,"203":1,"216":1,"220":1,"221":1,"225":1,"227":2,"228":1,"244":1,"246":1,"250":2,"251":1,"255":1,"256":2,"267":1,"290":1,"300":1,"303":1,"308":1,"316":2,"330":1,"332":1,"333":1,"335":2,"338":1,"344":3,"352":1,"354":1,"358":1,"360":1,"361":1,"364":1,"366":1,"372":1,"373":2,"376":2,"377":1,"378":1,"392":1,"400":1,"440":1,"441":1,"462":1,"463":2,"471":1,"473":1,"496":1,"504":1}}],["использовании",{"2":{"39":1,"118":1,"122":1,"123":1,"130":1,"136":1,"143":1,"145":1,"146":1,"150":2,"152":1,"156":1,"171":1,"175":1,"190":1,"200":1,"203":1,"211":1,"213":1,"227":1,"230":1,"231":1,"246":1,"331":1,"344":1,"345":1,"358":1,"367":1,"386":1,"401":1,"421":2,"423":1,"424":1,"447":1}}],["использования",{"2":{"23":1,"76":1,"91":1,"103":1,"123":1,"124":1,"125":2,"134":2,"143":1,"148":1,"149":2,"152":2,"181":2,"190":1,"200":1,"206":1,"220":1,"227":1,"231":1,"237":1,"241":1,"243":2,"245":1,"248":2,"249":1,"250":1,"261":1,"267":1,"271":1,"281":1,"282":1,"284":1,"287":1,"288":1,"292":1,"295":1,"300":1,"305":1,"306":1,"308":2,"317":1,"320":1,"328":1,"329":1,"331":1,"336":2,"337":2,"342":1,"345":1,"352":1,"355":1,"356":1,"359":1,"361":1,"363":1,"365":2,"366":1,"367":1,"369":1,"382":1,"391":1,"394":1,"419":1,"431":1,"433":1,"447":1,"460":1,"463":1,"472":1,"473":1,"504":1,"512":1,"538":1}}],["использоваться",{"2":{"76":1,"136":1,"154":1,"185":1,"189":1,"190":1,"223":2,"227":1,"243":1,"261":1,"331":1,"347":1,"349":1,"361":1,"409":1,"428":1,"511":1}}],["использовать",{"0":{"278":1},"2":{"10":1,"17":1,"39":1,"53":1,"59":2,"68":1,"86":1,"89":1,"96":1,"102":1,"116":1,"118":1,"123":5,"125":1,"136":1,"137":1,"141":1,"143":2,"148":7,"149":2,"150":2,"151":7,"152":4,"155":1,"158":1,"159":3,"160":2,"161":1,"166":2,"169":1,"182":1,"184":1,"187":1,"190":1,"192":1,"196":1,"198":1,"221":1,"222":4,"223":2,"224":1,"225":1,"227":5,"228":1,"230":2,"238":1,"241":3,"243":2,"244":1,"249":2,"250":2,"251":1,"252":1,"255":4,"259":1,"260":1,"264":1,"268":2,"271":1,"272":1,"280":1,"281":1,"283":1,"286":1,"288":1,"292":3,"297":1,"298":1,"300":3,"302":2,"303":5,"304":1,"306":1,"308":2,"310":2,"312":2,"313":1,"314":1,"316":11,"317":1,"320":1,"323":1,"325":1,"326":1,"328":2,"329":2,"331":1,"332":1,"333":1,"334":1,"335":2,"336":3,"337":1,"338":3,"339":1,"345":1,"346":2,"352":1,"354":2,"355":2,"358":2,"359":4,"360":1,"361":1,"362":1,"363":2,"367":4,"368":1,"369":2,"375":1,"376":1,"378":1,"381":2,"382":1,"385":1,"386":2,"390":2,"391":1,"401":1,"419":1,"421":2,"424":5,"425":1,"427":1,"428":1,"431":2,"432":1,"434":2,"440":2,"445":3,"452":3,"455":1,"462":2,"463":1,"464":3,"468":1,"504":1,"508":1,"509":1,"513":1}}],["используйте",{"0":{"176":1,"466":1,"468":1,"469":1},"2":{"123":2,"151":2,"156":2,"166":1,"183":1,"223":1,"225":1,"341":1,"369":1,"376":1,"460":2,"466":1,"471":1}}],["использующей",{"2":{"504":1}}],["использующем",{"2":{"365":1}}],["использующего",{"2":{"117":1,"326":1}}],["использующим",{"2":{"367":1}}],["использующими",{"2":{"333":1,"421":1}}],["использующие",{"2":{"366":1}}],["использующий",{"2":{"175":1}}],["использующая",{"2":{"250":1}}],["используют",{"2":{"125":1,"147":1,"161":1,"189":1,"201":1,"222":1,"247":1,"306":1,"325":1,"367":1}}],["используются",{"2":{"22":1,"68":1,"85":1,"115":1,"127":1,"137":1,"146":1,"148":1,"160":1,"168":1,"171":1,"183":1,"185":1,"224":1,"231":1,"241":1,"244":2,"245":1,"276":1,"289":1,"295":1,"303":2,"306":1,"310":1,"340":1,"361":1,"364":1,"451":1,"455":1,"462":1,"555":1}}],["использую",{"2":{"108":1,"149":1,"463":1}}],["используя",{"2":{"91":1,"116":1,"134":1,"137":1,"148":1,"150":1,"152":1,"174":1,"223":1,"225":3,"230":1,"231":1,"233":1,"235":1,"247":1,"249":2,"256":1,"264":1,"270":1,"296":1,"300":1,"301":1,"316":1,"317":1,"325":1,"333":1,"335":1,"336":1,"338":1,"349":3,"353":1,"355":1,"361":1,"367":1,"376":2,"381":1,"395":1,"402":1,"409":1,"427":1,"428":1,"432":1,"451":1,"455":2,"495":1}}],["используете",{"2":{"125":1,"270":1,"387":1,"466":1}}],["использует",{"2":{"53":1,"123":2,"136":1,"173":1,"176":1,"189":1,"225":1,"228":1,"251":1,"295":1,"308":1,"317":1,"349":1,"360":1,"374":1,"375":1,"376":1,"384":1,"432":1,"451":1,"453":1,"455":1,"460":2,"463":1,"513":1,"527":1}}],["используется",{"2":{"7":1,"23":1,"55":1,"115":1,"117":1,"134":3,"136":1,"137":1,"138":1,"147":1,"152":1,"157":1,"159":1,"173":2,"184":1,"186":1,"188":1,"190":1,"192":1,"196":1,"198":2,"199":2,"200":2,"213":1,"215":1,"216":1,"224":1,"231":1,"243":1,"249":1,"256":1,"267":1,"278":1,"292":1,"295":1,"300":1,"311":1,"312":1,"330":1,"332":1,"335":1,"349":1,"358":1,"361":2,"382":1,"385":1,"391":1,"393":1,"425":1,"451":1,"455":1,"460":1,"462":2,"472":1,"497":1,"504":4,"512":1,"555":1}}],["используемую",{"2":{"311":1,"361":1}}],["используемом",{"2":{"226":1}}],["используемое",{"2":{"199":1,"311":1}}],["используемого",{"2":{"117":1,"121":1,"144":1,"148":1,"192":1,"395":1}}],["используемая",{"2":{"148":1}}],["используемым",{"2":{"241":1}}],["используемыми",{"2":{"235":1,"358":1}}],["используемых",{"2":{"142":1,"358":1,"368":1,"431":1,"434":1}}],["используемые",{"2":{"125":1,"150":1,"152":1,"153":1,"183":1,"224":1,"355":1,"358":1,"445":1}}],["используемый",{"2":{"115":1,"160":1,"186":1,"213":1,"231":1,"246":1,"308":1,"359":1,"361":1,"434":1}}],["используем",{"2":{"17":1,"23":3,"53":1,"86":1,"98":2,"112":1,"122":1,"134":1,"135":1,"137":1,"141":1,"149":2,"151":2,"152":2,"154":1,"158":1,"193":3,"227":2,"230":3,"231":1,"232":1,"246":1,"247":1,"249":4,"250":1,"256":2,"281":2,"283":1,"288":1,"294":1,"296":1,"302":1,"328":1,"330":1,"332":1,"333":2,"335":1,"336":2,"337":1,"347":1,"349":1,"352":3,"354":1,"361":2,"362":1,"364":1,"365":1,"376":1,"380":1,"381":1,"393":1,"423":2,"428":1,"433":1,"434":1,"437":1,"439":1}}],["исправить",{"2":{"318":1,"381":1,"393":1}}],["исправление",{"2":{"74":1,"482":1}}],["исправлять",{"2":{"2":1}}],["испускающую",{"2":{"326":1}}],["испускает",{"2":{"292":1}}],["испускаемые",{"2":{"381":1}}],["испускаем",{"2":{"124":1}}],["испуская",{"2":{"240":1}}],["иная",{"2":{"462":1}}],["иначе",{"2":{"151":1,"159":1,"172":1,"211":1,"222":1,"360":1,"376":1,"380":1,"463":1}}],["ингридиент",{"2":{"461":1}}],["инкремента",{"2":{"323":1,"324":1,"325":1}}],["инкапсуляций",{"2":{"250":1}}],["инкапсуляции",{"2":{"166":1,"225":1,"250":1,"286":1,"300":1,"352":1}}],["инкапсуляция",{"0":{"3":1,"266":1},"2":{"260":1,"266":1}}],["инкапсулировав",{"2":{"377":1}}],["инкапсулировать",{"2":{"278":1}}],["инкапсулировали",{"2":{"103":1,"462":1}}],["инкапсулируя",{"2":{"425":1}}],["инкапсулируют",{"2":{"227":1}}],["инкапсулирует",{"2":{"151":1,"428":1,"462":1}}],["иным",{"2":{"383":1}}],["иные",{"2":{"304":1}}],["иных",{"2":{"64":1,"473":1}}],["инвокер",{"2":{"281":1,"285":1,"287":1,"293":2,"294":2}}],["инвокеру",{"2":{"281":1,"293":1}}],["инвертирует",{"2":{"148":1}}],["инициировать",{"2":{"426":1}}],["инициируя",{"2":{"316":1}}],["инициирует",{"2":{"315":1}}],["инициирующей",{"2":{"117":1}}],["инициализация",{"0":{"502":1},"2":{"512":1,"538":1}}],["инициализации",{"2":{"330":1,"513":1,"529":1}}],["инициализировать",{"2":{"358":1}}],["инициализирован",{"2":{"390":1}}],["инициализированную",{"2":{"328":1}}],["инициализировано",{"2":{"292":1}}],["инициализируя",{"2":{"338":1}}],["инициализируем",{"2":{"250":1,"296":1}}],["инициативе",{"2":{"315":1}}],["инъекцией",{"2":{"284":1}}],["инъекцию",{"2":{"252":1,"283":1,"325":1}}],["инъекция",{"0":{"247":1,"282":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"2":{"246":1,"260":1}}],["инъекциях",{"2":{"112":1}}],["инъекции",{"0":{"515":1},"2":{"241":1,"247":1,"248":1,"258":1,"282":1,"284":1,"287":1,"317":1,"515":1}}],["инноваций",{"2":{"200":1}}],["инжектируете",{"2":{"447":1}}],["инжектируется",{"2":{"367":1}}],["инжектирует",{"2":{"351":1}}],["инжектируемого",{"2":{"508":1}}],["инжектируем",{"2":{"255":2}}],["инжектируемый",{"2":{"247":1,"252":1,"255":1}}],["инжектируемых",{"2":{"163":1}}],["инжектируемые",{"2":{"163":1}}],["инжектируйте",{"2":{"255":1}}],["инжектировать",{"2":{"446":1}}],["инжектироваться",{"2":{"254":1,"317":1}}],["инжектированный",{"2":{"256":1,"367":1}}],["инжектированы",{"2":{"247":1}}],["инженеру",{"2":{"442":1}}],["инженерные",{"2":{"232":1}}],["инженерной",{"2":{"172":1}}],["инженер",{"2":{"219":1}}],["инженерии",{"2":{"147":1,"148":1,"263":1,"271":1}}],["интрасетей",{"2":{"134":1}}],["интеллектуальные",{"2":{"367":1}}],["интеллекта",{"2":{"171":1}}],["интегрирует",{"2":{"387":1}}],["интегрируется",{"2":{"375":1}}],["интегрируются",{"2":{"308":1,"379":1,"553":1}}],["интегрирующие",{"2":{"263":1}}],["интегрированные",{"2":{"267":1}}],["интегрированной",{"2":{"221":1}}],["интегрировать",{"2":{"224":1,"233":1,"234":1,"383":1}}],["интеграцию",{"2":{"504":1}}],["интеграционное",{"2":{"372":1}}],["интеграционные",{"2":{"72":1,"461":1}}],["интеграция",{"0":{"225":1,"395":1},"1":{"226":1},"2":{"79":1,"221":1,"394":1,"395":1,"442":1,"463":1,"545":1}}],["интеграции",{"2":{"41":1,"143":1,"234":1,"303":1,"306":1,"313":1,"340":1,"372":1,"508":2}}],["интерактивные",{"2":{"344":1}}],["интерактивных",{"2":{"237":1,"344":1}}],["интерактивность",{"2":{"344":2,"381":1}}],["интерактивности",{"0":{"240":1},"2":{"238":1,"344":2,"462":1}}],["интересная",{"2":{"498":1}}],["интересными",{"2":{"497":1}}],["интересный",{"2":{"451":1}}],["интересное",{"2":{"221":1,"463":1}}],["интересного",{"2":{"134":1,"424":1}}],["интересующих",{"2":{"296":1}}],["интерес",{"2":{"224":1}}],["интересам",{"2":{"213":1}}],["интервал",{"2":{"176":1}}],["интервалам",{"2":{"176":1}}],["интервалом",{"2":{"175":1,"189":1}}],["интерполяции",{"2":{"231":1}}],["интерполяцией",{"2":{"149":1,"157":1}}],["интерполируем",{"2":{"298":1}}],["интерполируя",{"2":{"231":1}}],["интерполированное",{"2":{"157":1}}],["интерпретатору",{"2":{"303":1}}],["интерпретатора",{"2":{"68":1}}],["интерпретации",{"2":{"152":1}}],["интерпретируют",{"2":{"211":1}}],["интерпретируются",{"2":{"149":1}}],["интерпретируется",{"2":{"205":1}}],["интерпретировано",{"2":{"155":1}}],["интерпретировать",{"2":{"150":1,"151":1}}],["интернационализационным",{"2":{"460":1,"536":1}}],["интернационализации",{"2":{"460":1,"536":1}}],["интернационализация",{"2":{"78":1,"446":1,"460":1,"544":1}}],["интернету",{"2":{"137":1,"319":1}}],["интернет",{"2":{"117":4,"137":1,"144":1,"147":1,"205":1,"300":1,"472":1}}],["интернета",{"2":{"116":1,"207":1,"344":1,"367":1,"395":1,"472":1}}],["интернете",{"2":{"27":1,"62":1,"95":1,"98":1,"116":1,"118":1,"131":2,"134":3,"145":1,"146":1,"189":1,"215":1,"225":2,"319":1,"361":1,"385":1,"395":1,"434":1,"471":1,"472":1}}],["интерфейсе",{"2":{"384":1}}],["интерфейсной",{"2":{"256":1}}],["интерфейсом",{"2":{"256":1,"261":1,"300":1,"425":1}}],["интерфейсов",{"2":{"69":1,"148":2,"172":2,"176":1,"179":1,"180":1,"223":1,"233":1,"235":1,"237":1,"300":1,"308":2,"355":1,"400":1,"410":1}}],["интерфейс",{"0":{"384":1},"2":{"68":1,"143":1,"151":1,"171":1,"174":1,"176":1,"225":1,"247":1,"252":1,"266":1,"290":1,"297":1,"299":1,"300":1,"302":1,"315":3,"316":1,"331":1,"336":3,"344":1,"353":1,"366":1,"383":1,"387":1,"421":1,"425":1}}],["интерфейсами",{"2":{"172":1}}],["интерфейса",{"0":{"172":1,"177":1,"235":1,"238":1,"410":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1},"2":{"68":1,"116":1,"124":1,"151":2,"158":1,"169":1,"171":2,"172":6,"173":2,"176":3,"178":1,"185":2,"189":1,"200":1,"205":1,"229":1,"237":1,"249":1,"250":1,"264":1,"265":2,"267":1,"289":2,"297":2,"298":1,"301":1,"308":1,"311":1,"325":1,"336":1,"344":1,"345":1,"384":1,"417":1,"429":1,"432":1,"461":1}}],["интерфейсы",{"2":{"23":1,"171":1,"174":1,"207":1,"235":2,"344":1}}],["интерьерные",{"2":{"62":1}}],["информирования",{"2":{"188":1}}],["информатике",{"2":{"385":1}}],["информативную",{"2":{"180":1}}],["информативен",{"2":{"172":1}}],["информационной",{"2":{"451":1}}],["информационного",{"2":{"321":1}}],["информационный",{"2":{"132":1,"170":1,"219":1}}],["информацией",{"2":{"151":1,"186":1,"188":1,"223":1,"293":1,"321":1,"325":1,"352":1,"361":2,"451":1}}],["информации",{"2":{"82":1,"83":1,"115":1,"128":1,"171":1,"180":1,"183":1,"189":1,"218":2,"239":1,"321":2,"322":1,"323":1,"328":1,"336":1,"361":1,"394":1,"413":1,"437":1,"472":1,"497":2}}],["информация",{"2":{"31":1,"47":1,"56":1,"109":1,"115":1,"186":1,"323":1,"341":1,"353":1,"375":1,"396":1,"432":1,"497":1,"498":1}}],["информацию",{"2":{"11":1,"127":1,"160":1,"178":1,"179":1,"181":1,"183":1,"185":1,"186":1,"197":1,"223":1,"226":1,"239":1,"355":1,"358":1,"360":1,"361":3,"383":1,"426":1,"427":1,"432":1,"436":1,"439":1,"446":1,"472":1}}],["инфраструктуры",{"2":{"137":1}}],["инфраструктуре",{"2":{"134":1}}],["инсталируемым",{"2":{"400":1}}],["инсталляторов",{"2":{"387":1}}],["инсталляторах",{"2":{"179":1}}],["инстанцированный",{"2":{"290":1}}],["инстанцировании",{"2":{"281":2}}],["инстанцирования",{"2":{"264":1,"278":1,"281":1,"286":1,"424":1}}],["инстанцирование",{"2":{"120":2}}],["инстанцировать",{"2":{"225":1,"421":1,"423":1}}],["инстанцию",{"2":{"121":1}}],["инструкцию",{"2":{"302":1}}],["инструкций",{"2":{"145":1}}],["инструкциями",{"2":{"256":1}}],["инструкциям",{"2":{"225":1,"253":1,"322":1,"387":1}}],["инструкция",{"2":{"144":1}}],["инструкции",{"2":{"144":2,"225":1,"451":1}}],["инструменту",{"2":{"318":1}}],["инструментах",{"2":{"335":1,"370":1,"372":1,"391":1}}],["инструментария",{"2":{"271":1}}],["инструментам",{"2":{"228":1,"421":1}}],["инструментами",{"2":{"143":1,"318":1,"374":1,"415":1}}],["инструмента",{"2":{"222":2,"224":1,"318":1,"381":1,"395":1,"507":1}}],["инструментов",{"2":{"221":2,"233":1,"264":1,"289":1,"316":1,"330":1,"331":1,"335":1,"340":1,"370":2,"372":1,"373":1,"375":1,"378":1,"394":1,"400":1,"402":1,"421":1}}],["инструменты",{"0":{"223":1},"2":{"131":1,"221":1,"222":3,"233":1,"235":1,"314":2,"318":2,"320":1,"339":1,"367":1,"373":2,"376":1,"378":1,"379":1,"387":2,"394":1,"396":2,"409":1,"412":1,"421":1,"440":1,"442":1,"473":1}}],["инструмент",{"2":{"55":1,"149":1,"224":2,"228":1,"248":1,"249":1,"317":1,"331":1,"383":1,"384":1,"470":1}}],["инета",{"2":{"116":1}}],["индустрии",{"2":{"368":1,"396":1}}],["индивидуальных",{"2":{"308":1}}],["индивидуальные",{"2":{"212":1}}],["индивидуально",{"2":{"115":1}}],["индикатором",{"2":{"190":2}}],["индикаторов",{"2":{"190":1}}],["индикаторы",{"2":{"190":1}}],["индикатора",{"2":{"190":1}}],["индексный",{"2":{"433":1}}],["индексу",{"2":{"381":1}}],["индексировать",{"2":{"473":1}}],["индексироваться",{"2":{"308":1,"433":1}}],["индексированные",{"2":{"433":1}}],["индексируемыми",{"2":{"433":1}}],["индексируется",{"2":{"473":1}}],["индексирует",{"2":{"48":1}}],["индексы",{"2":{"157":1}}],["индекс",{"2":{"157":1}}],["индексация",{"2":{"48":1}}],["индексации",{"2":{"17":1,"344":1,"473":2}}],["индекса",{"2":{"17":1}}],["ином",{"2":{"271":1,"460":1}}],["иной",{"2":{"119":1,"127":1,"148":2,"175":1,"342":1,"451":1,"507":1}}],["иное",{"2":{"59":1,"123":1,"310":1,"507":1}}],["иного",{"2":{"22":1,"471":1}}],["иногда",{"2":{"4":1,"171":1,"232":1,"291":1,"302":1,"344":1,"395":1,"445":2,"463":1,"471":1,"473":2}}],["их",{"2":{"2":1,"12":1,"23":1,"26":1,"38":1,"62":1,"69":3,"85":1,"97":1,"98":1,"116":1,"123":3,"124":1,"134":4,"136":1,"145":1,"148":3,"150":2,"151":2,"152":1,"160":4,"166":1,"167":1,"175":1,"179":1,"180":2,"184":1,"190":1,"198":1,"201":1,"206":1,"207":1,"218":1,"219":1,"220":1,"221":1,"223":1,"224":7,"225":3,"227":4,"228":1,"229":1,"237":1,"239":1,"240":1,"244":2,"245":3,"246":1,"247":2,"249":2,"250":1,"252":2,"256":1,"260":1,"263":2,"266":1,"267":1,"270":1,"271":1,"276":1,"279":1,"283":1,"288":1,"289":1,"291":1,"293":2,"297":1,"300":1,"301":2,"303":2,"304":2,"306":2,"308":3,"310":1,"316":2,"321":1,"325":1,"327":1,"328":2,"330":1,"333":1,"335":4,"336":4,"342":2,"344":4,"347":1,"348":1,"349":1,"352":2,"354":2,"358":4,"359":2,"360":2,"361":1,"364":1,"365":1,"366":1,"367":1,"368":1,"370":1,"372":2,"373":1,"374":1,"375":3,"376":1,"379":1,"381":2,"382":1,"386":1,"387":1,"390":1,"391":1,"393":1,"396":2,"412":1,"419":2,"421":2,"426":1,"429":2,"431":1,"433":1,"434":1,"436":1,"439":1,"440":1,"441":1,"446":4,"447":3,"451":1,"452":4,"456":1,"460":1,"461":1,"462":3,"463":6,"466":1,"467":1,"472":1,"504":1,"508":1,"513":1}}],["и",{"0":{"1":1,"3":1,"16":1,"59":1,"69":1,"72":1,"75":1,"80":1,"87":1,"106":1,"109":1,"115":1,"120":1,"121":1,"124":1,"126":1,"127":1,"128":1,"134":1,"137":1,"152":1,"156":1,"157":1,"159":1,"162":1,"164":1,"165":1,"174":1,"175":1,"176":1,"184":1,"190":1,"192":1,"194":1,"205":1,"215":1,"223":1,"224":1,"238":1,"239":1,"240":1,"241":1,"243":1,"244":1,"245":1,"247":1,"249":1,"250":1,"260":1,"269":1,"326":1,"336":1,"337":1,"348":1,"353":1,"360":1,"361":1,"370":1,"372":1,"375":1,"385":1,"392":1,"395":1,"398":1,"408":1,"415":1,"447":1,"455":1,"460":1,"466":1,"469":1,"471":1,"473":1,"496":1,"502":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"76":1,"77":1,"78":1,"79":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"191":1,"193":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"251":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"327":1,"328":1,"338":1,"339":1,"349":1,"350":1,"354":1,"355":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":2,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"448":1,"449":1,"450":1},"2":{"2":2,"3":6,"4":5,"6":1,"7":1,"9":4,"10":1,"11":4,"12":2,"13":1,"16":2,"17":5,"18":1,"21":2,"22":5,"23":3,"26":5,"28":1,"34":1,"35":1,"36":2,"38":2,"39":3,"40":2,"41":2,"43":2,"44":1,"47":3,"48":2,"53":1,"55":4,"56":1,"58":2,"59":4,"61":1,"62":3,"63":3,"64":1,"65":1,"67":4,"68":8,"69":10,"71":2,"74":2,"76":4,"78":1,"79":5,"82":1,"83":4,"86":3,"87":1,"89":5,"91":1,"92":1,"95":7,"96":1,"97":3,"98":4,"100":2,"102":2,"103":4,"104":4,"105":6,"106":1,"108":3,"109":1,"112":3,"114":3,"115":23,"116":16,"117":3,"118":4,"119":10,"120":4,"121":3,"122":1,"123":8,"124":7,"125":8,"126":2,"127":6,"130":2,"131":8,"133":1,"134":10,"135":2,"136":2,"137":11,"138":2,"139":1,"140":4,"141":4,"142":2,"143":6,"144":15,"145":8,"146":4,"147":24,"148":29,"149":15,"150":9,"151":15,"152":33,"153":1,"156":3,"157":1,"158":4,"159":4,"160":9,"161":2,"162":1,"163":4,"164":1,"165":1,"166":5,"167":4,"168":1,"169":13,"171":17,"172":5,"173":6,"174":8,"175":9,"176":8,"177":2,"178":4,"179":2,"180":11,"181":7,"182":1,"183":6,"184":10,"185":3,"186":4,"187":3,"188":4,"189":11,"190":8,"191":2,"192":13,"193":7,"194":2,"195":4,"196":2,"197":1,"198":8,"199":2,"200":6,"201":5,"202":1,"203":4,"204":4,"205":13,"206":4,"207":2,"208":1,"209":2,"210":2,"211":3,"212":2,"213":2,"215":1,"216":2,"217":1,"218":1,"219":7,"220":2,"221":7,"222":14,"223":21,"224":22,"225":13,"226":2,"227":17,"228":10,"229":8,"230":3,"231":26,"232":11,"233":5,"234":1,"235":8,"236":1,"237":4,"238":5,"239":10,"240":2,"241":6,"242":2,"243":4,"244":8,"245":5,"246":7,"247":12,"248":1,"249":6,"250":11,"251":2,"252":6,"254":1,"255":23,"256":15,"257":2,"258":5,"259":2,"260":13,"261":5,"262":1,"263":6,"264":2,"265":13,"266":7,"267":14,"268":9,"269":5,"270":6,"271":9,"272":2,"273":1,"274":1,"275":1,"276":6,"277":4,"280":3,"281":4,"283":1,"284":1,"285":1,"286":1,"287":3,"288":3,"289":4,"290":2,"291":8,"292":10,"293":6,"294":1,"295":11,"296":13,"297":13,"298":2,"299":2,"300":10,"301":5,"302":6,"303":23,"304":5,"305":2,"306":9,"308":35,"310":5,"311":2,"312":3,"313":4,"314":2,"315":11,"316":11,"317":8,"318":4,"319":7,"320":3,"321":9,"322":3,"323":15,"324":2,"325":6,"326":5,"327":1,"328":11,"329":8,"330":10,"331":8,"332":7,"333":5,"335":13,"336":31,"337":5,"338":6,"339":5,"340":4,"341":3,"342":2,"344":33,"345":10,"346":4,"347":5,"349":18,"350":1,"351":4,"352":14,"353":8,"354":2,"355":9,"356":1,"357":1,"358":13,"359":5,"360":19,"361":20,"362":1,"363":3,"364":8,"365":11,"366":16,"367":24,"368":8,"369":3,"370":15,"372":22,"373":15,"374":9,"375":17,"376":20,"377":1,"378":3,"379":6,"380":2,"381":20,"382":4,"383":5,"384":5,"385":11,"386":10,"387":3,"388":3,"390":3,"391":10,"392":3,"393":11,"394":12,"395":10,"396":6,"397":4,"400":11,"401":5,"402":6,"405":3,"407":1,"408":2,"410":1,"412":1,"413":2,"414":1,"416":1,"417":3,"418":1,"419":6,"421":22,"422":2,"423":2,"424":4,"425":8,"426":6,"427":4,"428":12,"429":7,"430":9,"431":10,"432":6,"433":7,"434":6,"435":4,"436":2,"437":5,"438":1,"439":9,"440":9,"442":3,"444":5,"445":11,"446":2,"447":6,"451":18,"452":7,"455":8,"456":3,"457":20,"460":19,"461":6,"462":24,"463":34,"464":11,"465":1,"467":5,"468":4,"469":2,"470":2,"471":22,"472":37,"473":31,"482":2,"495":1,"496":3,"497":7,"498":1,"499":1,"501":2,"503":2,"504":5,"506":4,"507":10,"508":14,"509":2,"512":1,"513":3,"518":2,"519":1,"527":2,"536":2,"538":1,"539":1,"542":2,"545":8,"546":6,"548":2,"553":2,"554":1,"555":3,"556":1,"557":2}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexru.eKe3q1b4.js b/assets/chunks/@localSearchIndexru.eKe3q1b4.js deleted file mode 100644 index 79208b933..000000000 --- a/assets/chunks/@localSearchIndexru.eKe3q1b4.js +++ /dev/null @@ -1 +0,0 @@ -const t='{"documentCount":558,"nextId":558,"documentIds":{"0":"/ru/articles/#наши-статьи-на-других-ресурсах","1":"/ru/arty-crafty/analysis/architecture-and-design.html#архитектура-и-дизаин","2":"/ru/arty-crafty/analysis/architecture-and-design.html#упрощение-сложного","3":"/ru/arty-crafty/analysis/architecture-and-design.html#абстракция-и-инкапсуляция","4":"/ru/arty-crafty/analysis/architecture-and-design.html#разбиение-проекта-на-подсистемы","5":"/ru/arty-crafty/analysis/architecture-and-design.html#package-diagram","6":"/ru/arty-crafty/analysis/architecture-and-design.html#клиент-серверная-архитектура","7":"/ru/arty-crafty/analysis/architecture-and-design.html#routing","8":"/ru/arty-crafty/analysis/business-analysis.html#бизнес-анализ","9":"/ru/arty-crafty/analysis/business-analysis.html#границы-проекта","10":"/ru/arty-crafty/analysis/business-analysis.html#существующие-решения","11":"/ru/arty-crafty/analysis/business-analysis.html#витрина","12":"/ru/arty-crafty/analysis/business-analysis.html#магазин","13":"/ru/arty-crafty/analysis/business-analysis.html#маркетплеис","14":"/ru/arty-crafty/analysis/business-analysis.html#use-case-диаграмма","15":"/ru/arty-crafty/analysis/data-model.html#модель-данных","16":"/ru/arty-crafty/analysis/data-model.html#категория-и-товар","17":"/ru/arty-crafty/analysis/data-model.html#типы-баз-данных","18":"/ru/arty-crafty/analysis/data-model.html#_1-json","19":"/ru/arty-crafty/analysis/data-model.html#_1-json-1","20":"/ru/arty-crafty/analysis/research.html#анализ-рынка","21":"/ru/arty-crafty/analysis/research.html#изучение-конкурентов","22":"/ru/arty-crafty/analysis/research.html#саиты-аналоги","23":"/ru/arty-crafty/analysis/tech-stack.html#техническии-стек-проекта","24":"/ru/arty-crafty/analysis/ui-design.html#ui-дизаин","25":"/ru/arty-crafty/analysis/ui-design.html#дизаин-саита","26":"/ru/arty-crafty/analysis/ui-design.html#творческие-способности","27":"/ru/arty-crafty/analysis/ui-layout.html#ui-макет","28":"/ru/arty-crafty/analysis/ui-layout.html#основные-компоненты-страницы","29":"/ru/arty-crafty/analysis/ui-layout.html#header","30":"/ru/arty-crafty/analysis/ui-layout.html#sidebar","31":"/ru/arty-crafty/analysis/ui-layout.html#main-panel","32":"/ru/arty-crafty/analysis/ui-layout.html#footer","33":"/ru/arty-crafty/analysis/ui-layout.html#мобильная-версия","34":"/ru/arty-crafty/analysis/ui-layout.html#слабая-связанность","35":"/ru/arty-crafty/analysis/ui-layout.html#адаптивность","36":"/ru/arty-crafty/analysis/ui-layout.html#вывод","37":"/ru/arty-crafty/backend/baas-choosing.html#выбор-baas-или-cms","38":"/ru/arty-crafty/backend/baas-choosing.html#json-фаилы-товаров","39":"/ru/arty-crafty/backend/baas-choosing.html#выбор-cms","40":"/ru/arty-crafty/backend/baas-choosing.html#сервисы-supabase","41":"/ru/arty-crafty/backend/baas-choosing.html#адаптеры","42":"/ru/arty-crafty/backend/db-data-model.html#модель-данных-в-базе-данных","43":"/ru/arty-crafty/backend/db-data-model.html#сущности","44":"/ru/arty-crafty/backend/db-data-model.html#данные","45":"/ru/arty-crafty/backend/db-data-model.html#categories-table","46":"/ru/arty-crafty/backend/db-data-model.html#products-table","47":"/ru/arty-crafty/backend/db-data-model.html#category-product-join-table","48":"/ru/arty-crafty/backend/db-data-model.html#поиск-по-json-полям","49":"/ru/arty-crafty/backend/hoppscotch.html#hoppscotch","50":"/ru/arty-crafty/backend/hoppscotch.html#работа-с-api","51":"/ru/arty-crafty/backend/hoppscotch.html#endpoints","52":"/ru/arty-crafty/backend/supabase-api.html#supabase-rest-api","53":"/ru/arty-crafty/backend/supabase-api.html#supabase-sdk","54":"/ru/arty-crafty/backend/supabase-api.html#установка","55":"/ru/arty-crafty/backend/supabase-api.html#использование","56":"/ru/arty-crafty/backend/supabase-api.html#supabase-rest-api-1","57":"/ru/arty-crafty/backend/supabase.html#supabase","58":"/ru/arty-crafty/backend/supabase.html#создание-проекта","59":"/ru/arty-crafty/backend/supabase.html#безопасность-и-доступ","60":"/ru/arty-crafty/introduction/development-stages.html#план-работы","61":"/ru/arty-crafty/introduction/development-stages.html#стадии-разработки-по","62":"/ru/arty-crafty/introduction/development-stages.html#бизнес-анализ","63":"/ru/arty-crafty/introduction/development-stages.html#архитектура-и-дизаин","64":"/ru/arty-crafty/introduction/development-stages.html#разработка","65":"/ru/arty-crafty/introduction/development-stages.html#развертывание","66":"/ru/arty-crafty/introduction/development-stages.html#тестирование-и-qa","67":"/ru/arty-crafty/introduction/development-stages.html#документирование","68":"/ru/arty-crafty/introduction/development-stages.html#поддержка","69":"/ru/arty-crafty/#онлаин-маркетплеис","70":"/ru/arty-crafty/#проект-arty-crafty","71":"/ru/arty-crafty/#причины","72":"/ru/arty-crafty/#цель","73":"/ru/arty-crafty/#что-здесь-будет","74":"/ru/arty-crafty/#для-чего","75":"/ru/arty-crafty/introduction/goals.html#цели-и-задачи-проекта","76":"/ru/arty-crafty/introduction/goals.html#цели-данного-проекта","77":"/ru/arty-crafty/introduction/goals.html#нефункциональные-требования-software-quality-attributes","78":"/ru/arty-crafty/introduction/goals.html#общие-функциональные-требования","79":"/ru/arty-crafty/introduction/goals.html#этапы-развития-приложения-приблизительно","80":"/ru/arty-crafty/introduction/repository.html#репозитории-и-саит-проекта","81":"/ru/arty-crafty/showcase-data/api-service-adapter.html#работа-с-api-на-фронтенде","82":"/ru/arty-crafty/showcase-data/api-service-adapter.html#supabase-адаптер","83":"/ru/arty-crafty/showcase-data/api-service-adapter.html#api-products-ts","84":"/ru/arty-crafty/showcase-data/mobile-menu.html#мобильное-меню-css","85":"/ru/arty-crafty/showcase-data/mobile-menu.html#iconbutton","86":"/ru/arty-crafty/showcase-data/mobile-menu.html#scss-css","87":"/ru/arty-crafty/showcase-data/mobile-menu.html#tag-и-cmv","88":"/ru/arty-crafty/showcase/codeium.html#codeium","89":"/ru/arty-crafty/showcase/codeium.html#автокомплит","90":"/ru/arty-crafty/showcase/codeium.html#чат-бот","91":"/ru/arty-crafty/showcase/codeium.html#explain-refactor-jsdoc","92":"/ru/arty-crafty/showcase/codeium.html#explain-problem","93":"/ru/arty-crafty/showcase/codeium.html#вывод","94":"/ru/arty-crafty/showcase/customization.html#кастомизация","95":"/ru/arty-crafty/showcase/customization.html#персонализация","96":"/ru/arty-crafty/showcase/customization.html#views","97":"/ru/arty-crafty/showcase/customization.html#routes","98":"/ru/arty-crafty/showcase/customization.html#header","99":"/ru/arty-crafty/showcase/customization.html#sidebar","100":"/ru/arty-crafty/showcase/customization.html#небольшои-рефакторинг","101":"/ru/arty-crafty/showcase/favourites.html#избранное","102":"/ru/arty-crafty/showcase/favourites.html#иконка-на-карточке-товара","103":"/ru/arty-crafty/showcase/favourites.html#композабл-usefavourites","104":"/ru/arty-crafty/showcase/favourites.html#сохранение-между-сессиями","105":"/ru/arty-crafty/showcase/favourites.html#бэджик","106":"/ru/arty-crafty/showcase/favourites.html#tag-и-cmv","107":"/ru/arty-crafty/showcase/product-category.html#категория-товаров","108":"/ru/arty-crafty/showcase/product-category.html#layout","109":"/ru/arty-crafty/showcase/product-category.html#данные-и-api","110":"/ru/arty-crafty/showcase/project-setup.html#создание-проекта","111":"/ru/arty-crafty/showcase/project-setup.html#репозитории-на-github","112":"/ru/arty-crafty/showcase/project-setup.html#vue-webapp","113":"/ru/backend/api.html#абстракция-канала-связи-с-бэкендом","114":"/ru/backend/api.html#api-сервис","115":"/ru/backend/backend.html#варианты-задеиствовать-свои-бэкенд-для-фронтендера","116":"/ru/backend/auth.html#аутентификация-и-авторизация","117":"/ru/backend/cors.html#cors","118":"/ru/backend/protocols.html#протоколы-to-rest-или-не-rest","119":"/ru/book/Appendix__Migrating_from_Vue_2.html#приложение-миграция-с-vue-2","120":"/ru/book/Appendix__Migrating_from_Vue_2.html#другои-способ-загрузки-и-запуска-приложения","121":"/ru/book/Appendix__Migrating_from_Vue_2.html#регистрация-глобальных-компонентов-плагинов-и-так-далее","122":"/ru/book/Appendix__Migrating_from_Vue_2.html#своиство-data-теперь-всегда-является-функциеи","123":"/ru/book/Appendix__Migrating_from_Vue_2.html#больше-реактивных-возможностеи","124":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-v-model-props-и-events","125":"/ru/book/Appendix__Migrating_from_Vue_2.html#удалена-совместимость-со-старыми-браузерами","126":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-организации-каталогов-и-фаилов","127":"/ru/book/Appendix__Migrating_from_Vue_2.html#изменения-в-роутере-и-state-manager","128":"/ru/book/Appendix__Migrating_from_Vue_2.html#новые-компоненты-и-другие-изменения","129":"/ru/book/Appendix__Migrating_from_Vue_2.html#другие-изменения","130":"/ru/book/Appendix__Migrating_from_Vue_2.html#итог","131":"/ru/book/Chapter_10__Deploying_Your_Application.html#развертывание-приложения","132":"/ru/book/Chapter_10__Deploying_Your_Application.html#технические-требования","133":"/ru/book/Chapter_10__Deploying_Your_Application.html#что-включает-в-себя-публикация-веб-приложения","134":"/ru/book/Chapter_10__Deploying_Your_Application.html#домены-серверы-доменных-имен-dns-и-записи-dns","135":"/ru/book/Chapter_10__Deploying_Your_Application.html#размышления-о-создании-приложения-для-развертывания","136":"/ru/book/Chapter_10__Deploying_Your_Application.html#chapter-5-to-do-spa-src-router-index-js","137":"/ru/book/Chapter_10__Deploying_Your_Application.html#опции-и-конфигурации-веб-сервера","138":"/ru/book/Chapter_10__Deploying_Your_Application.html#конфигурация-http-сервера-apache","139":"/ru/book/Chapter_10__Deploying_Your_Application.html#htaccess","140":"/ru/book/Chapter_10__Deploying_Your_Application.html#настроика-сервера-nginx","141":"/ru/book/Chapter_10__Deploying_Your_Application.html#etc-nginx-sites-available-default","142":"/ru/book/Chapter_10__Deploying_Your_Application.html#другие-серверы","143":"/ru/book/Chapter_10__Deploying_Your_Application.html#перенос-фаилов-на-сервер","144":"/ru/book/Chapter_10__Deploying_Your_Application.html#защита-веб-приложения-с-помощью-let-s-encrypt","145":"/ru/book/Chapter_10__Deploying_Your_Application.html#подведение-итогов","146":"/ru/book/Chapter_10__Deploying_Your_Application.html#вопросы-для-проверки","147":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#бонусная-глава-шаблоны-ux","148":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#технические-требования","149":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#ui-дизаин-против-ux-дизаина","150":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#принципы-проектирования-пользовательского-интерфеиса","151":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#достаточныи-контраст-или-различие-между-элементами","152":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#стимулировать-повторение-и-быть-последовательным","153":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#внимательно-следите-за-выравниванием-и-направлением","154":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#используите-близость-и-расстояние-чтобы-показать-естественные-группы","155":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#законы-проектирования-пользовательского-интерфеиса","156":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#закон-фитта","157":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#закон-хика","158":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#восемь-правил-бена-шнаидермана","159":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#принципы-проектирования-ux","160":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-работы-с-данными","161":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#элементы-ввода-html","162":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#чекбоксы-радиокнопки-и-тумблеры","163":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#чипы-таблетки-или-теги","164":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#подсказки-tooltips","165":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#уведомляющие-точки-пузырьки-метки-или-значки","166":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#тостовые-уведомления","167":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#карусель-или-слаидеры-изображении","168":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#панели-прогресса-progress-bars-и-спиннеры","169":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#components-spinner-vue","170":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#пагинация-пеиджер-и-бесконечныи-скроллер","171":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#src-components-infinitescroller-vue","172":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-взаимодеиствия-и-навигации","173":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#размещение-меню","174":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#хлебные-крошки-breadcrumbs","175":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#модальные-диалоги","176":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#иконки-меню","177":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#аккордеонные-меню","178":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#мегаменю","179":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#выпадающие-меню","180":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#общие-шаблоны-для-организации-контента","181":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#отзывчивые-responsive-приложения","182":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#домашняя-ссылка","183":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#главная-hero-секция-призыв-к-деиствию-call-to-action-и-иконки-социальных-сетеи","184":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#другие-шаблоны","185":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#темные-шаблоны","186":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#вопросы-с-подвохом","187":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#проникновение-в-корзину","188":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#приманка-для-тараканов-roach-motels","189":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#privacy-zuckering","190":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#предотвращение-сравнения-цен","191":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#ненаправленность","192":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#скрытые-расходы","193":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#приманка-и-подмена","194":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#подтверждение-позора-confirm-shaming","195":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#замаскированная-реклама","196":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#дружественныи-спам","197":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#подведение-итогов","198":"/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html#вопросы-для-проверки","199":"/ru/book/Chapter_1__The_Vue_3_Framework.html#фреимворк-vue-3","200":"/ru/book/Chapter_1__The_Vue_3_Framework.html#прогрессивныи-фреимворк","201":"/ru/book/Chapter_1__The_Vue_3_Framework.html#использование-vue-в-веб-приложении","202":"/ru/book/Chapter_1__The_Vue_3_Framework.html#путь-сборщика-лучшии-путь","203":"/ru/book/Chapter_1__The_Vue_3_Framework.html#понимание-однофаиловых-компонентов","204":"/ru/book/Chapter_1__The_Vue_3_Framework.html#разные-варианты-options-composition-и-script-setup-api","205":"/ru/book/Chapter_1__The_Vue_3_Framework.html#изучение-встроенных-директив-в-vue-3","206":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-bind-сокращение","207":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-show","208":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-if-v-else-и-v-else-if","209":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-for-и-key","210":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-model","211":"/ru/book/Chapter_1__The_Vue_3_Framework.html#v-on-и-сокращение","212":"/ru/book/Chapter_1__The_Vue_3_Framework.html#встроенные-компоненты","213":"/ru/book/Chapter_1__The_Vue_3_Framework.html#кодовые-соглашения-code-conventions-в-книге","214":"/ru/book/Chapter_1__The_Vue_3_Framework.html#переменные-и-пропсы","215":"/ru/book/Chapter_1__The_Vue_3_Framework.html#константы","216":"/ru/book/Chapter_1__The_Vue_3_Framework.html#имена-классов-и-компонентов","217":"/ru/book/Chapter_1__The_Vue_3_Framework.html#функции-методы-события-и-имена-фаилов","218":"/ru/book/Chapter_1__The_Vue_3_Framework.html#экземпляры","219":"/ru/book/Chapter_1__The_Vue_3_Framework.html#подведение-итогов","220":"/ru/book/Chapter_1__The_Vue_3_Framework.html#вопросы-для-проверки","221":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#установка-рабочего-проекта","222":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#технические-требования","223":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#настроика-проекта-и-инструменты","224":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#структура-папок-и-ее-модификации","225":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#интеграция-с-css-фреимворками","226":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#фреимворк-w3-css","227":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#fontawesome-это-просто-замечательно","228":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#опции-конфигурации-vite","229":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#приложение-to-do","230":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#app-vue","231":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#todos-vue","232":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#краткая-критика-нашего-приложения-to-do","233":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#подведение-итогов","234":"/ru/book/Chapter_3__Setting_Up_a_Working_Project.html#вопросы-для-проверки","235":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#композиция-пользовательского-интерфеиса-с-помощью-компонентов","236":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#технические-требования","237":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#составление-страницы-с-помощью-компонентов","238":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#этап-1-определение-макетов-и-элементов-пользовательского-интерфеиса","239":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-2-определение-связеи-потока-данных-взаимодеиствии-и-событии","240":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-3-определение-элементов-пользовательскои-интерактивности-входов-диалогов-уведомлении-и-т-д","241":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#шаг-4-выявление-шаблонов-проектирования-и-компромиссов","242":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#компоненты-в-деталях","243":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#локальные-и-глобальные-компоненты","244":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#статическии-асинхронныи-и-динамическии-импорт","245":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#пропсы-события-и-директива-v-model","246":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#настраиваемые-контроллеры-ввода","247":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#инъекция-зависимости-с-помощью-provide-и-inject","248":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#специальные-компоненты","249":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#слоты-слоты-и-еще-раз-слоты","250":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#композабл-функции-composables-и-миксины","251":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#динамические-компоненты-с-помощью-component-is","252":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реальныи-пример-плагин-модалов","253":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#настроика-нашего-проекта","254":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#конструкция","255":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реализация","256":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#реализация-нашего-нового-приложения-to-do","257":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#небольшая-критика-нашего-нового-приложения-to-do","258":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#подведение-итогов","259":"/ru/book/Chapter_4__User_Interface_Composition_with_Components.html#вопросы-для-проверки","260":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#принципы-и-шаблоны-проектирования-программного-обеспечения","261":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#каковы-принципы-проектирования-программного-обеспечения","262":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#неполныи-список-принципов-проектирования","263":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#separation-of-concerns-разделение-ответственности","264":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#composition-over-inheritance-композиция-над-наследованием","265":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#single-responsibility-principle-принцип-единои-ответственности","266":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#encapsulation-инкапсуляция","267":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#kic-keep-it-clean","268":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#dry-–-don-t-repeat-yourself-не-повторяися","269":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#kiss-keep-it-simple-and-short-держи-это-простым-и-коротким","270":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#code-for-the-next-пиши-код-для-следующего","271":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#что-такое-шаблон-проектирования-программного-обеспечения","272":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#краткии-справочныи-список-шаблонов","273":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#порождающие-шаблоны","274":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#поведенческие-шаблоны","275":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#структурные-шаблоны","276":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#асинхронные-шаблоны","277":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-singleton","278":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#когда-его-использовать","279":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#реализация","280":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#метод-1","281":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#метод-2","282":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-dependency-injection-инъекция-зависимостеи","283":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-1-js","284":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-2-js","285":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-3-js","286":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-4-js","287":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-5-js","288":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-6-js","289":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-dependency-injection-7-js","290":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-factory-фабрика","291":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-observer-наблюдатель","292":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-observer-1-js","293":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-command-команда","294":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-command-1-js","295":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-proxy","296":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-proxy-1-js","297":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-decorator-декоратор","298":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-decorator-1-vue","299":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-decorator-2-vue","300":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-facade-фасад","301":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-callback-обратныи-вызов","302":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#chapter-2-callback-1-js-синхронныи-фибоначчи","303":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#шаблон-promise-обещаниe","304":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#подведение-итогов","305":"/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html#вопросы-для-проверки","306":"/ru/book/Chapter_5__Single-Page_Applications.html#одностраничные-приложения","307":"/ru/book/Chapter_5__Single-Page_Applications.html#технические-требования","308":"/ru/book/Chapter_5__Single-Page_Applications.html#что-такое-spa","309":"/ru/book/Chapter_5__Single-Page_Applications.html#vue-3-роутер","310":"/ru/book/Chapter_5__Single-Page_Applications.html#установка","311":"/ru/book/Chapter_5__Single-Page_Applications.html#новое-приложение-to-do","312":"/ru/book/Chapter_5__Single-Page_Applications.html#определение-маршрутов-и-объект-router","313":"/ru/book/Chapter_5__Single-Page_Applications.html#src-router-index-js","314":"/ru/book/Chapter_5__Single-Page_Applications.html#src-main-js","315":"/ru/book/Chapter_5__Single-Page_Applications.html#шаблонные-компоненты-маршрутизатора","316":"/ru/book/Chapter_5__Single-Page_Applications.html#app-vue","317":"/ru/book/Chapter_5__Single-Page_Applications.html#вложенные-маршруты-именованные-представления-и-программная-навигация","318":"/ru/book/Chapter_5__Single-Page_Applications.html#определение-вложенных-маршрутов","319":"/ru/book/Chapter_5__Single-Page_Applications.html#src-views-directory-vue-component-lines-13-18","320":"/ru/book/Chapter_5__Single-Page_Applications.html#push","321":"/ru/book/Chapter_5__Single-Page_Applications.html#replace","322":"/ru/book/Chapter_5__Single-Page_Applications.html#go","323":"/ru/book/Chapter_5__Single-Page_Applications.html#исследование-шаблонов-аутентификации","324":"/ru/book/Chapter_5__Single-Page_Applications.html#простая-аутентификация-по-имени-пользователя-и-паролю","325":"/ru/book/Chapter_5__Single-Page_Applications.html#openid-и-сторонняя-аутентификация","326":"/ru/book/Chapter_5__Single-Page_Applications.html#_1","327":"/ru/book/Chapter_5__Single-Page_Applications.html#_2","328":"/ru/book/Chapter_5__Single-Page_Applications.html#_3","329":"/ru/book/Chapter_5__Single-Page_Applications.html#беспарольная-аутентификация-или-аутентификация-по-одноразовому-паролю-otp","330":"/ru/book/Chapter_5__Single-Page_Applications.html#_2fa-двухфакторная-аутентификация","331":"/ru/book/Chapter_5__Single-Page_Applications.html#web3-аутентификация","332":"/ru/book/Chapter_5__Single-Page_Applications.html#подведение-итогов","333":"/ru/book/Chapter_5__Single-Page_Applications.html#вопросы-для-проверки","334":"/ru/book/Chapter_6__Progressive_Web_Applications.html#прогрессивные-веб-приложения","335":"/ru/book/Chapter_6__Progressive_Web_Applications.html#технические-требования","336":"/ru/book/Chapter_6__Progressive_Web_Applications.html#pwa-или-устанавливаемые-spa","337":"/ru/book/Chapter_6__Progressive_Web_Applications.html#увеличение-spa-до-уровня-pwa","338":"/ru/book/Chapter_6__Progressive_Web_Applications.html#фаил-манифеста","339":"/ru/book/Chapter_6__Progressive_Web_Applications.html#необходимо","340":"/ru/book/Chapter_6__Progressive_Web_Applications.html#рекомендуется","341":"/ru/book/Chapter_6__Progressive_Web_Applications.html#описательные","342":"/ru/book/Chapter_6__Progressive_Web_Applications.html#тестирование-манифеста","343":"/ru/book/Chapter_6__Progressive_Web_Applications.html#подсказка-к-установке-install-prompt","344":"/ru/book/Chapter_6__Progressive_Web_Applications.html#service-workers","345":"/ru/book/Chapter_6__Progressive_Web_Applications.html#плагин-vite-pwa","346":"/ru/book/Chapter_6__Progressive_Web_Applications.html#тестирование-показателеи-pwa-с-помощью-google-lighthouse","347":"/ru/book/Chapter_6__Progressive_Web_Applications.html#подведение-итогов","348":"/ru/book/Chapter_6__Progressive_Web_Applications.html#вопросы-для-проверки","349":"/ru/book/Chapter_7__Data_Flow_Management.html#управление-потоками-данных","350":"/ru/book/Chapter_7__Data_Flow_Management.html#технические-требования","351":"/ru/book/Chapter_7__Data_Flow_Management.html#основное-взаимодеиствие-компонентов","352":"/ru/book/Chapter_7__Data_Flow_Management.html#basic-parentbasic-vue","353":"/ru/book/Chapter_7__Data_Flow_Management.html#basic-child-vue","354":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-шины-событии-с-помощью-шаблонов-singleton-и-observer","355":"/ru/book/Chapter_7__Data_Flow_Management.html#services-messagebus-js","356":"/ru/book/Chapter_7__Data_Flow_Management.html#bus-child-vue","357":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-базового-реактивного-состояния","358":"/ru/book/Chapter_7__Data_Flow_Management.html#service-simplestate-js","359":"/ru/book/Chapter_7__Data_Flow_Management.html#реализация-мощного-реактивного-стора-с-помощью-pinia","360":"/ru/book/Chapter_7__Data_Flow_Management.html#options-api-basic-store","361":"/ru/book/Chapter_7__Data_Flow_Management.html#stores-counter-js","362":"/ru/book/Chapter_7__Data_Flow_Management.html#main-js","363":"/ru/book/Chapter_7__Data_Flow_Management.html#pinia-childpinia-vue","364":"/ru/book/Chapter_7__Data_Flow_Management.html#хранилища-данных-браузера-сессионные-локальные-и-indexeddb","365":"/ru/book/Chapter_7__Data_Flow_Management.html#экспериментируем-с-шаблонами-reactivity-и-proxies","366":"/ru/book/Chapter_7__Data_Flow_Management.html#services-sessionstorage-js","367":"/ru/book/Chapter_7__Data_Flow_Management.html#session-storage-childsession-vue","368":"/ru/book/Chapter_7__Data_Flow_Management.html#подведение-итогов","369":"/ru/book/Chapter_7__Data_Flow_Management.html#вопросы-для-проверки","370":"/ru/book/Chapter_9__Testing_and_Source_Control.html#тестирование-и-системы-контроля-версии","371":"/ru/book/Chapter_9__Testing_and_Source_Control.html#технические-требования","372":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-такое-тестирование-и-tdd","373":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-тестировать","374":"/ru/book/Chapter_9__Testing_and_Source_Control.html#наш-базовыи-пример-приложения","375":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-и-использование-vitest","376":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonacci-test-js","377":"/ru/book/Chapter_9__Testing_and_Source_Control.html#специальныи-случаи-утверждения-намеренная-ошибка","378":"/ru/book/Chapter_9__Testing_and_Source_Control.html#специальныи-случаи-утверждения-асинхронныи-код","379":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-vue-test-utils","380":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonaccioutput-test-js","381":"/ru/book/Chapter_9__Testing_and_Source_Control.html#src-tests-fibonacciinput-test-js","382":"/ru/book/Chapter_9__Testing_and_Source_Control.html#in-source-тестирование","383":"/ru/book/Chapter_9__Testing_and_Source_Control.html#покрытие","384":"/ru/book/Chapter_9__Testing_and_Source_Control.html#интерфеис-vitest","385":"/ru/book/Chapter_9__Testing_and_Source_Control.html#что-такое-source-control-и-зачем-он-нужен","386":"/ru/book/Chapter_9__Testing_and_Source_Control.html#управление-исходными-текстами-с-помощью-git","387":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-windows","388":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-linux","389":"/ru/book/Chapter_9__Testing_and_Source_Control.html#установка-в-системах-macos","390":"/ru/book/Chapter_9__Testing_and_Source_Control.html#использование-git","391":"/ru/book/Chapter_9__Testing_and_Source_Control.html#chapter-10-gitignore","392":"/ru/book/Chapter_9__Testing_and_Source_Control.html#управление-ветвями-и-слияниями","393":"/ru/book/Chapter_9__Testing_and_Source_Control.html#конфликты-при-слиянии","394":"/ru/book/Chapter_9__Testing_and_Source_Control.html#работа-с-удаленными-репозиториями","395":"/ru/book/Chapter_9__Testing_and_Source_Control.html#непрерывная-интеграция-и-доставка","396":"/ru/book/Chapter_9__Testing_and_Source_Control.html#подведение-итогов","397":"/ru/book/Chapter_9__Testing_and_Source_Control.html#вопросы-для-проверки","398":"/ru/book/#vue-js-3-шаблоны-проектирования-и-лучшие-практики","399":"/ru/book/#здесь-представлен-перевод-книги-vue-js-3-design-patterns-and-best-practices-на-русскии-язык","400":"/ru/book/#предисловие","401":"/ru/book/#для-кого-эта-книга","402":"/ru/book/#чтобы-получить-максимальную-пользу-от-этои-книги","403":"/ru/book/#купить-книгу","404":"/ru/book/#скачать-фаилы-кода-примеров","405":"/ru/book/#код-в-деиствии","406":"/ru/book/summary.html#что-включает-в-себя-эта-книга","407":"/ru/book/summary.html#глава-1-фреимворк-vue-3","408":"/ru/book/summary.html#глава-2-принципы-и-шаблоны-проектирования-программного-обеспечения","409":"/ru/book/summary.html#глава-3-создание-рабочего-проекта","410":"/ru/book/summary.html#глава-4-композиция-пользовательского-интерфеиса-с-помощью-компонентов","411":"/ru/book/summary.html#глава-5-одностраничные-приложения","412":"/ru/book/summary.html#глава-6-прогрессивные-веб-приложения","413":"/ru/book/summary.html#глава-7-управление-потоками-данных","414":"/ru/book/summary.html#глава-8-многопоточность-с-помощью-web-workers","415":"/ru/book/summary.html#глава-9-тестирование-и-контроль-исходных-текстов","416":"/ru/book/summary.html#глава-10-развертывание-приложения","417":"/ru/book/summary.html#глава-11-ux-patterns","418":"/ru/book/summary.html#приложение-миграция-с-vue-2-на-vue-3","419":"/ru/deployment/ci-cd.html#ci-cd","420":"/ru/deployment/docker.html#docker","421":"/ru/deployment/github-actions.html#github-actions","422":"/ru/deployment/hosting.html#хостинг","423":"/ru/development/architectural-patterns.html#архитектурные-решения","424":"/ru/development/architectural-patterns.html#use-cases","425":"/ru/development/architectural-patterns.html#лучшие-практики-и-соображения","426":"/ru/development/architectural-patterns.html#apploader-vue","427":"/ru/development/architectural-patterns.html#useapploader-ts","428":"/ru/development/architectural-patterns.html#some-component","429":"/ru/development/assets.html#ресурсы-приложения","430":"/ru/development/assets.html#baseicon","431":"/ru/development/assets.html#icons-js","432":"/ru/development/building.html#создание-и-сборка-приложения","433":"/ru/development/ide.html#настроика-ide","434":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#многопоточность-с-web-workers","435":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#технические-требования","436":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#введение-в-web-workers","437":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#реализация-web-worker","438":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#my-worker-js","439":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#main-js","440":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#шаблон-business-delegate","441":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#шаблон-dispatcher","442":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#установка-конвеиера-взаимодеиствия-с-веб-рабочим","443":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#services-webworker-js","444":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-index-js","445":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-services-test-js","446":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#получение-доступа-к-indexeddb-с-помощью-dexiejs-в-web-worker","447":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-components-dbnotes-vue","448":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-webworker-services-dbservice-js","449":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-webworker-index-js","450":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-services-network-js","451":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#webworker-index-js-1","452":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#src-components-networkcommunication-vue","453":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#простои-nodejs-сервер-для-тестирования","454":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#server-index-js","455":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#подведение-итогов","456":"/ru/book/Chapter_8__Multithreading_with_Web_Workers.html#вопросы-для-проверки","457":"/ru/development/libraries.html#подскажите-удобную-библиотеку","458":"/ru/development/misc.html#полезные-советы","459":"/ru/development/misc.html#карусель-или-слаидер","460":"/ru/development/misc.html#дата-и-время","461":"/ru/development/testing.html#тестирование","462":"/ru/development/stores.html#state-management-во-vue-3","463":"/ru/frontend/about-frameworks.html#о-фронтенд-фреимворках","464":"/ru/frontend/architecture.html#архитектура-фронтэнд-приложении","465":"/ru/frontend/architecture.html#избегаите-зависимостеи","466":"/ru/frontend/architecture.html#используите-обертки-над-компонентами-ui-библиотек-и-сторонних-утилит","467":"/ru/frontend/architecture.html#регулярныи-рефакторинг","468":"/ru/frontend/architecture.html#используите-css3","469":"/ru/frontend/architecture.html#используите-современные-стандарты-и-возможности-языков","470":"/ru/frontend/architecture.html#документируите-проект","471":"/ru/frontend/css-ui-libs.html#css-и-ui-библиотеки","472":"/ru/frontend/spa-pwa-ssr-ssg.html#spa-pwa-ssg-ssr-и-seo","473":"/ru/frontend/learning.html#изучение-vue","474":"/ru/misc/CHANGELOG.html#история-изменении","475":"/ru/misc/CHANGELOG.html#v1-4-24-11-2023","476":"/ru/misc/CHANGELOG.html#новое","477":"/ru/misc/CHANGELOG.html#изменено","478":"/ru/misc/CHANGELOG.html#v1-3-10-10-2023","479":"/ru/misc/CHANGELOG.html#изменено-1","480":"/ru/misc/CHANGELOG.html#v1-2-27-09-2023","481":"/ru/misc/CHANGELOG.html#новое-1","482":"/ru/misc/CHANGELOG.html#изменено-2","483":"/ru/misc/CHANGELOG.html#v1-1-15-09-2023","484":"/ru/misc/CHANGELOG.html#новое-2","485":"/ru/misc/CHANGELOG.html#изменено-3","486":"/ru/misc/CHANGELOG.html#v1-0-11-09-2023","487":"/ru/misc/CHANGELOG.html#новое-3","488":"/ru/misc/cheat-sheets.html#шпаргалки-cheat-sheet","489":"/ru/misc/cheat-sheets.html#vue","490":"/ru/misc/cheat-sheets.html#javascript","491":"/ru/misc/cheat-sheets.html#html","492":"/ru/misc/cheat-sheets.html#css","493":"/ru/misc/cheat-sheets.html#typescript","494":"/ru/misc/cheat-sheets.html#markdown","495":"/ru/misc/contribute.html#внесите-лепту-в-развитие-данного-ресурса","496":"/ru/misc/glossary.html#глоссарии-и-сокращения","497":"/ru/misc/introduction.html#предисловие","498":"/ru/misc/introduction.html#у-нас-есть-телеграм-канал","499":"/ru/vue-webapp/contribution.html#участие-в-проекте","500":"/ru/vue-webapp/getting-started.html#установка","501":"/ru/vue-webapp/getting-started.html#установка-через-create-vue-webapp","502":"/ru/vue-webapp/getting-started.html#инициализация-и-запуск-веб-приложения","503":"/ru/vue-webapp/getting-started.html#установка-из-репозитория","504":"/ru/vue-webapp/guidelines.html#принципы","505":"/ru/vue-webapp/#vue-3-webapp-билдер","506":"/ru/vue-webapp/#краткое-описание","507":"/ru/vue-webapp/#обоснование","508":"/ru/vue-webapp/objectives.html#цели","509":"/ru/vue-webapp/options/adaptability.html#адаптивность","510":"/ru/vue-webapp/options/api.html#api-модуль","511":"/ru/vue-webapp/options/api.html#api-rest","512":"/ru/vue-webapp/options/api.html#json-rpc","513":"/ru/vue-webapp/options/baseIcon.html#baseicon","514":"/ru/vue-webapp/options/drawer.html#navigation-drawers","515":"/ru/vue-webapp/options/drawer.html#simpledrawer","516":"/ru/vue-webapp/options/drawer.html#touchslideoutdrawer","517":"/ru/vue-webapp/options/description.html#детали-реализации","518":"/ru/vue-webapp/options/description.html#инъекции-кода-в-index-html","519":"/ru/vue-webapp/options/description.html#css-tricks","520":"/ru/vue-webapp/options/footer.html#footers","521":"/ru/vue-webapp/options/footer.html#simplefooter","522":"/ru/vue-webapp/options/footer.html#richfooter","523":"/ru/vue-webapp/options/footer.html#mantinesimplefooter","524":"/ru/vue-webapp/options/footer.html#mantinerichfooter","525":"/ru/vue-webapp/options/footer.html#distributedfooter","526":"/ru/vue-webapp/options/ga-gp.html#github-actions-сценарии-для-развертывания-на-github-pages","527":"/ru/vue-webapp/options/ga-gp.html#deployment","528":"/ru/vue-webapp/options/ga-gp.html#настроика-base-в-vite-конфиге","529":"/ru/vue-webapp/options/google-analytics.html#google-analytics","530":"/ru/vue-webapp/options/header.html#headers","531":"/ru/vue-webapp/options/header.html#simpleheader","532":"/ru/vue-webapp/options/header.html#mantinesimpleheader","533":"/ru/vue-webapp/options/header.html#mantinelayeredheader","534":"/ru/vue-webapp/options/header.html#slidingheader","535":"/ru/vue-webapp/options/i18n.html#i18n","536":"/ru/vue-webapp/options/i18n.html#i18next","537":"/ru/vue-webapp/options/i18n.html#usei18nlight","538":"/ru/vue-webapp/options/i18n.html#использование","539":"/ru/vue-webapp/options/i18n.html#i18next-расширения","540":"/ru/vue-webapp/options/i18n.html#в-итоге","541":"/ru/vue-webapp/options/#опции-при-создании-приложения","542":"/ru/vue-webapp/options/#доступные-опции","543":"/ru/vue-webapp/options/#доступно-по-умолчанию","544":"/ru/vue-webapp/options/#в-разработке","545":"/ru/vue-webapp/options/#в-планах","546":"/ru/vue-webapp/options/layout-main.html#mainlayout","547":"/ru/vue-webapp/options/layout-main.html#routing","548":"/ru/vue-webapp/options/layout-one-column.html#onecolumnlayout","549":"/ru/vue-webapp/options/navbar.html#navbar","550":"/ru/vue-webapp/options/navbar.html#simplenavbar","551":"/ru/vue-webapp/options/navbar.html#mantinesimplenavbar","552":"/ru/vue-webapp/options/open-graph.html#google-analytics","553":"/ru/vue-webapp/options/pwa.html#pwa","554":"/ru/vue-webapp/options/pwa.html#manifest-json","555":"/ru/vue-webapp/options/pwa.html#service-worker","556":"/ru/vue-webapp/options/splash-screen.html#splash-screen","557":"/ru/vue-webapp/options/themes.html#темы"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,6],"1":[3,1,1],"2":[2,3,97],"3":[3,3,119],"4":[4,3,99],"5":[2,3,13],"6":[3,3,40],"7":[1,3,34],"8":[2,1,1],"9":[2,2,62],"10":[2,2,41],"11":[1,2,95],"12":[1,2,119],"13":[1,2,36],"14":[3,2,36],"15":[2,1,1],"16":[3,2,78],"17":[3,2,132],"18":[2,5,33],"19":[2,5,10],"20":[2,1,1],"21":[2,2,13],"22":[2,2,136],"23":[3,1,119],"24":[2,1,1],"25":[2,2,36],"26":[2,2,81],"27":[2,1,21],"28":[3,2,16],"29":[1,5,47],"30":[1,5,25],"31":[2,5,13],"32":[1,5,16],"33":[2,2,34],"34":[2,2,44],"35":[1,2,31],"36":[1,2,43],"37":[4,1,1],"38":[3,4,33],"39":[2,4,107],"40":[2,4,79],"41":[1,4,149],"42":[4,1,1],"43":[1,4,49],"44":[1,4,46],"45":[2,6,1],"46":[2,6,1],"47":[4,6,92],"48":[4,4,81],"49":[1,1,1],"50":[3,1,58],"51":[1,1,70],"52":[3,1,1],"53":[2,3,16],"54":[2,5,6],"55":[2,5,37],"56":[3,3,99],"57":[1,1,1],"58":[2,1,32],"59":[3,1,116],"60":[2,1,1],"61":[3,2,46],"62":[2,2,116],"63":[3,2,130],"64":[1,2,9],"65":[1,2,18],"66":[3,2,10],"67":[1,2,10],"68":[1,2,23],"69":[2,1,1],"70":[3,2,32],"71":[1,2,81],"72":[1,2,47],"73":[4,2,44],"74":[3,2,53],"75":[4,1,1],"76":[4,4,68],"77":[6,4,14],"78":[3,4,15],"79":[5,4,86],"80":[4,1,13],"81":[5,1,1],"82":[2,5,29],"83":[3,8,91],"84":[3,1,1],"85":[1,3,59],"86":[4,3,114],"87":[3,3,12],"88":[1,1,1],"89":[1,1,89],"90":[2,1,10],"91":[3,1,95],"92":[2,1,30],"93":[1,1,13],"94":[1,1,1],"95":[1,1,94],"96":[1,1,38],"97":[1,1,73],"98":[1,1,66],"99":[1,1,16],"100":[2,1,18],"101":[1,1,1],"102":[4,1,96],"103":[2,1,106],"104":[3,1,75],"105":[1,1,126],"106":[3,1,12],"107":[2,1,1],"108":[1,2,58],"109":[3,2,62],"110":[2,1,1],"111":[3,2,16],"112":[2,2,174],"113":[5,1,1],"114":[2,5,122],"115":[6,1,258],"116":[3,1,399],"117":[1,1,228],"118":[6,1,153],"119":[5,1,148],"120":[6,5,82],"121":[7,5,81],"122":[6,5,97],"123":[3,5,187],"124":[7,5,121],"125":[5,5,175],"126":[6,5,58],"127":[6,5,86],"128":[6,5,50],"129":[2,5,21],"130":[1,5,73],"131":[2,1,85],"132":[2,2,23],"133":[8,2,73],"134":[7,9,463],"135":[6,2,151],"136":[10,15,143],"137":[5,2,276],"138":[4,7,51],"139":[2,11,69],"140":[3,7,92],"141":[6,10,98],"142":[2,7,44],"143":[4,2,167],"144":[8,2,253],"145":[2,2,112],"146":[3,2,55],"147":[4,1,168],"148":[2,4,59],"149":[5,4,223],"150":[4,4,172],"151":[6,8,150],"152":[6,8,180],"153":[6,8,116],"154":[8,8,145],"155":[4,8,35],"156":[2,8,139],"157":[2,8,120],"158":[4,8,211],"159":[3,8,118],"160":[6,4,45],"161":[3,10,101],"162":[4,13,145],"163":[4,13,122],"164":[3,13,141],"165":[6,13,96],"166":[2,13,117],"167":[4,13,159],"168":[6,13,211],"169":[4,19,79],"170":[5,13,243],"171":[5,18,240],"172":[6,4,29],"173":[2,13,118],"174":[4,13,103],"175":[2,13,81],"176":[2,13,152],"177":[2,13,76],"178":[1,13,194],"179":[2,13,77],"180":[5,4,12],"181":[3,9,236],"182":[2,9,136],"183":[13,9,205],"184":[2,9,56],"185":[2,4,78],"186":[3,6,88],"187":[3,6,106],"188":[6,6,74],"189":[2,6,82],"190":[3,6,50],"191":[1,6,57],"192":[2,6,39],"193":[3,6,53],"194":[5,6,82],"195":[2,6,108],"196":[2,6,72],"197":[2,4,97],"198":[3,4,42],"199":[3,1,278],"200":[2,3,474],"201":[5,3,269],"202":[5,7,231],"203":[3,3,292],"204":[8,3,542],"205":[6,3,48],"206":[5,7,58],"207":[2,7,67],"208":[4,7,97],"209":[4,7,95],"210":[2,7,91],"211":[5,7,134],"212":[2,3,267],"213":[6,3,46],"214":[3,9,18],"215":[1,9,44],"216":[4,9,17],"217":[6,9,9],"218":[1,9,119],"219":[2,3,49],"220":[3,3,68],"221":[3,1,164],"222":[2,3,292],"223":[4,3,363],"224":[5,3,470],"225":[4,3,278],"226":[3,7,153],"227":[4,3,323],"228":[3,3,255],"229":[3,3,165],"230":[2,9,187],"231":[2,9,583],"232":[6,9,207],"233":[2,3,75],"234":[3,3,59],"235":[6,1,160],"236":[2,6,30],"237":[5,6,114],"238":[8,8,172],"239":[9,8,233],"240":[13,8,131],"241":[7,8,168],"242":[3,6,31],"243":[4,9,159],"244":[5,9,305],"245":[6,9,170],"246":[3,9,239],"247":[7,9,274],"248":[2,6,48],"249":[6,8,367],"250":[5,6,283],"251":[8,11,203],"252":[4,6,99],"253":[3,10,36],"254":[1,10,80],"255":[1,10,456],"256":[6,6,422],"257":[7,6,88],"258":[2,6,95],"259":[3,6,61],"260":[6,1,198],"261":[6,6,64],"262":[4,6,25],"263":[6,9,195],"264":[7,9,123],"265":[7,9,210],"266":[3,9,104],"267":[4,9,274],"268":[8,9,182],"269":[12,9,128],"270":[9,9,167],"271":[7,6,185],"272":[4,6,39],"273":[2,19,16],"274":[2,19,14],"275":[2,19,18],"276":[2,19,70],"277":[2,10,50],"278":[3,12,52],"279":[1,12,37],"280":[2,13,78],"281":[2,13,151],"282":[6,10,78],"283":[7,16,39],"284":[6,16,93],"285":[7,16,38],"286":[7,16,101],"287":[7,16,193],"288":[7,16,115],"289":[7,16,137],"290":[4,10,83],"291":[4,10,175],"292":[6,14,231],"293":[4,10,129],"294":[6,14,133],"295":[2,10,267],"296":[6,12,257],"297":[4,10,303],"298":[6,14,112],"299":[5,14,90],"300":[4,10,274],"301":[5,10,210],"302":[8,15,238],"303":[4,10,419],"304":[2,6,92],"305":[3,6,42],"306":[2,1,108],"307":[2,2,33],"308":[4,2,397],"309":[3,2,124],"310":[1,5,150],"311":[4,5,158],"312":[5,5,24],"313":[5,10,345],"314":[4,10,46],"315":[3,5,81],"316":[2,5,439],"317":[7,5,170],"318":[3,12,101],"319":[9,12,354],"320":[2,5,57],"321":[2,5,15],"322":[2,5,258],"323":[3,2,222],"324":[7,5,315],"325":[4,5,469],"326":[2,5,106],"327":[2,5,118],"328":[2,5,207],"329":[8,5,321],"330":[3,5,288],"331":[2,5,459],"332":[2,2,109],"333":[3,2,64],"334":[3,1,167],"335":[2,3,52],"336":[4,3,459],"337":[5,3,39],"338":[2,8,172],"339":[2,10,112],"340":[2,10,56],"341":[2,10,140],"342":[2,8,69],"343":[6,8,391],"344":[2,3,360],"345":[3,3,230],"346":[7,3,138],"347":[2,3,79],"348":[3,3,55],"349":[3,1,150],"350":[2,3,79],"351":[3,3,235],"352":[4,7,94],"353":[4,7,188],"354":[9,3,153],"355":[4,13,46],"356":[4,13,259],"357":[4,3,127],"358":[4,8,253],"359":[7,3,178],"360":[4,11,174],"361":[4,11,162],"362":[3,11,45],"363":[4,11,260],"364":[7,3,476],"365":[6,3,110],"366":[4,10,215],"367":[5,10,127],"368":[2,3,71],"369":[3,3,52],"370":[5,1,191],"371":[2,5,46],"372":[5,5,296],"373":[2,5,232],"374":[4,5,183],"375":[4,5,266],"376":[6,9,392],"377":[5,5,107],"378":[5,5,149],"379":[4,5,150],"380":[6,10,182],"381":[6,10,331],"382":[3,5,154],"383":[1,5,194],"384":[2,5,127],"385":[9,5,203],"386":[6,5,163],"387":[4,5,75],"388":[4,5,86],"389":[4,5,39],"390":[2,5,191],"391":[4,8,215],"392":[4,5,65],"393":[3,5,231],"394":[4,5,267],"395":[4,5,141],"396":[2,5,87],"397":[3,5,63],"398":[8,1,4],"399":[16,9,1],"400":[1,8,124],"401":[4,8,50],"402":[7,8,144],"403":[2,8,14],"404":[4,8,24],"405":[3,8,41],"406":[6,1,1],"407":[5,7,20],"408":[8,7,26],"409":[5,7,32],"410":[8,7,22],"411":[4,7,15],"412":[5,7,19],"413":[5,7,26],"414":[7,7,28],"415":[7,7,32],"416":[4,7,27],"417":[4,7,29],"418":[7,7,16],"419":[2,1,64],"420":[1,1,1],"421":[2,1,450],"422":[1,1,137],"423":[2,1,163],"424":[2,3,78],"425":[4,3,184],"426":[2,7,22],"427":[2,7,32],"428":[2,7,24],"429":[2,1,201],"430":[1,3,71],"431":[2,3,118],"432":[4,1,216],"433":[2,1,863],"434":[4,1,149],"435":[2,4,57],"436":[4,4,516],"437":[3,7,162],"438":[4,11,133],"439":[3,11,121],"440":[3,4,216],"441":[2,4,113],"442":[6,4,142],"443":[4,13,234],"444":[4,13,174],"445":[5,13,153],"446":[11,4,197],"447":[5,15,251],"448":[6,15,216],"449":[5,15,241],"450":[5,15,178],"451":[4,15,69],"452":[5,15,158],"453":[5,4,75],"454":[4,13,280],"455":[2,4,115],"456":[3,4,50],"457":[3,1,42],"458":[2,1,8],"459":[3,3,15],"460":[3,3,347],"461":[1,1,162],"462":[5,1,587],"463":[3,1,414],"464":[3,1,197],"465":[2,4,78],"466":[9,4,41],"467":[2,4,29],"468":[2,4,47],"469":[6,4,18],"470":[2,4,30],"471":[4,1,223],"472":[6,1,538],"473":[2,1,501],"474":[2,1,1],"475":[6,2,1],"476":[1,8,13],"477":[1,8,5],"478":[5,2,1],"479":[1,7,12],"480":[6,2,1],"481":[1,8,6],"482":[1,8,24],"483":[6,2,1],"484":[1,8,3],"485":[1,8,4],"486":[6,2,1],"487":[1,8,3],"488":[4,1,1],"489":[1,4,5],"490":[1,4,4],"491":[1,4,4],"492":[1,4,6],"493":[1,4,8],"494":[1,4,2],"495":[6,1,36],"496":[3,1,66],"497":[1,1,80],"498":[5,2,23],"499":[3,1,17],"500":[1,1,1],"501":[5,1,128],"502":[5,5,13],"503":[3,1,38],"504":[1,1,144],"505":[4,1,1],"506":[2,4,70],"507":[1,4,175],"508":[1,1,171],"509":[1,1,81],"510":[2,1,1],"511":[3,2,103],"512":[2,2,89],"513":[1,1,67],"514":[2,1,11],"515":[1,2,21],"516":[1,2,22],"517":[2,1,1],"518":[5,2,41],"519":[2,2,27],"520":[1,1,9],"521":[1,1,1],"522":[1,1,1],"523":[1,1,1],"524":[1,1,1],"525":[1,1,1],"526":[7,1,1],"527":[1,7,78],"528":[5,7,38],"529":[2,1,41],"530":[1,1,4],"531":[1,1,4],"532":[1,1,8],"533":[1,1,9],"534":[1,1,32],"535":[1,1,1],"536":[1,1,97],"537":[1,1,16],"538":[1,1,54],"539":[2,1,52],"540":[2,1,16],"541":[4,1,1],"542":[2,4,77],"543":[3,4,21],"544":[2,4,11],"545":[2,4,80],"546":[1,1,27],"547":[1,1,10],"548":[1,1,43],"549":[1,1,13],"550":[1,1,1],"551":[1,1,1],"552":[2,1,34],"553":[1,1,13],"554":[2,1,54],"555":[2,1,60],"556":[2,1,44],"557":[1,1,80]},"averageFieldLength":[3.4354838709677424,5.2168458781362,112.50537634408599],"storedFields":{"0":{"title":"Наши статьи на других ресурсах","titles":[]},"1":{"title":"Архитектура и дизайн","titles":[]},"2":{"title":"Упрощение сложного","titles":["Архитектура и дизайн"]},"3":{"title":"Абстракция и инкапсуляция","titles":["Архитектура и дизайн"]},"4":{"title":"Разбиение проекта на подсистемы","titles":["Архитектура и дизайн"]},"5":{"title":"Package Diagram","titles":["Архитектура и дизайн"]},"6":{"title":"Клиент-серверная архитектура","titles":["Архитектура и дизайн"]},"7":{"title":"Routing","titles":["Архитектура и дизайн"]},"8":{"title":"Бизнес-анализ","titles":[]},"9":{"title":"Границы проекта","titles":["Бизнес-анализ"]},"10":{"title":"Существующие решения","titles":["Бизнес-анализ"]},"11":{"title":"Витрина","titles":["Бизнес-анализ"]},"12":{"title":"Магазин","titles":["Бизнес-анализ"]},"13":{"title":"Маркетплейс","titles":["Бизнес-анализ"]},"14":{"title":"Use case диаграмма","titles":["Бизнес-анализ"]},"15":{"title":"Модель данных","titles":[]},"16":{"title":"Категория и товар","titles":["Модель данных"]},"17":{"title":"Типы баз данных","titles":["Модель данных"]},"18":{"title":"1.json","titles":["Модель данных","Типы баз данных",null,null,null]},"19":{"title":"1.json","titles":["Модель данных","Типы баз данных",null,null,null]},"20":{"title":"Анализ рынка","titles":[]},"21":{"title":"Изучение конкурентов","titles":["Анализ рынка"]},"22":{"title":"Сайты-аналоги","titles":["Анализ рынка"]},"23":{"title":"Технический стек проекта","titles":[]},"24":{"title":"UI дизайн","titles":[]},"25":{"title":"Дизайн сайта","titles":["UI дизайн"]},"26":{"title":"Творческие способности","titles":["UI дизайн"]},"27":{"title":"UI макет","titles":[]},"28":{"title":"Основные компоненты страницы","titles":["UI макет"]},"29":{"title":"Header","titles":["UI макет","Основные компоненты страницы"]},"30":{"title":"Sidebar","titles":["UI макет","Основные компоненты страницы"]},"31":{"title":"Main panel","titles":["UI макет","Основные компоненты страницы"]},"32":{"title":"Footer","titles":["UI макет","Основные компоненты страницы"]},"33":{"title":"Мобильная версия","titles":["UI макет"]},"34":{"title":"Слабая связанность","titles":["UI макет"]},"35":{"title":"Адаптивность","titles":["UI макет"]},"36":{"title":"Вывод","titles":["UI макет"]},"37":{"title":"Выбор BaaS или CMS","titles":[]},"38":{"title":"JSON файлы товаров","titles":["Выбор BaaS или CMS"]},"39":{"title":"Выбор CMS","titles":["Выбор BaaS или CMS"]},"40":{"title":"Сервисы Supabase","titles":["Выбор BaaS или CMS"]},"41":{"title":"Адаптеры","titles":["Выбор BaaS или CMS"]},"42":{"title":"Модель данных в базе данных","titles":[]},"43":{"title":"Сущности","titles":["Модель данных в базе данных"]},"44":{"title":"Данные","titles":["Модель данных в базе данных"]},"45":{"title":"Categories table","titles":["Модель данных в базе данных","Данные",null]},"46":{"title":"Products table","titles":["Модель данных в базе данных","Данные",null]},"47":{"title":"Category-product join table","titles":["Модель данных в базе данных","Данные",null]},"48":{"title":"Поиск по json полям","titles":["Модель данных в базе данных"]},"49":{"title":"Hoppscotch","titles":[]},"50":{"title":"Работа с API","titles":["Hoppscotch"]},"51":{"title":"Endpoints","titles":["Hoppscotch"]},"52":{"title":"Supabase REST API","titles":[]},"53":{"title":"Supabase SDK","titles":["Supabase REST API"]},"54":{"title":"Установка:","titles":["Supabase REST API","Supabase SDK",null]},"55":{"title":"Использование:","titles":["Supabase REST API","Supabase SDK",null]},"56":{"title":"Supabase REST API","titles":["Supabase REST API"]},"57":{"title":"Supabase","titles":[]},"58":{"title":"Создание проекта","titles":["Supabase"]},"59":{"title":"Безопасность и доступ","titles":["Supabase"]},"60":{"title":"План работы","titles":[]},"61":{"title":"Стадии разработки ПО","titles":["План работы"]},"62":{"title":"Бизнес-анализ","titles":["План работы"]},"63":{"title":"Архитектура и дизайн","titles":["План работы"]},"64":{"title":"Разработка","titles":["План работы"]},"65":{"title":"Развертывание","titles":["План работы"]},"66":{"title":"Тестирование и QA","titles":["План работы"]},"67":{"title":"Документирование","titles":["План работы"]},"68":{"title":"Поддержка","titles":["План работы"]},"69":{"title":"Онлайн маркетплейс","titles":[]},"70":{"title":"Проект Arty-Crafty","titles":["Онлайн маркетплейс"]},"71":{"title":"Причины","titles":["Онлайн маркетплейс"]},"72":{"title":"Цель","titles":["Онлайн маркетплейс"]},"73":{"title":"Что здесь будет?","titles":["Онлайн маркетплейс"]},"74":{"title":"Для чего?","titles":["Онлайн маркетплейс"]},"75":{"title":"Цели и задачи проекта","titles":[]},"76":{"title":"Цели данного проекта:","titles":["Цели и задачи проекта"]},"77":{"title":"Нефункциональные требования (software quality attributes)","titles":["Цели и задачи проекта"]},"78":{"title":"Общие функциональные требования","titles":["Цели и задачи проекта"]},"79":{"title":"Этапы развития приложения (приблизительно)","titles":["Цели и задачи проекта"]},"80":{"title":"Репозиторий и сайт проекта","titles":[]},"81":{"title":"Работа с API на фронтенде","titles":[]},"82":{"title":"Supabase адаптер","titles":["Работа с API на фронтенде"]},"83":{"title":"api/products.ts","titles":["Работа с API на фронтенде","Supabase адаптер",null,null,null]},"84":{"title":"Мобильное меню, CSS","titles":[]},"85":{"title":"IconButton","titles":["Мобильное меню, CSS"]},"86":{"title":"SCSS => CSS","titles":["Мобильное меню, CSS"]},"87":{"title":"Tag и CMV","titles":["Мобильное меню, CSS"]},"88":{"title":"Codeium","titles":[]},"89":{"title":"Автокомплит","titles":["Codeium"]},"90":{"title":"Чат-бот","titles":["Codeium"]},"91":{"title":"Explain, Refactor, JSDoc","titles":["Codeium"]},"92":{"title":"Explain problem","titles":["Codeium"]},"93":{"title":"Вывод","titles":["Codeium"]},"94":{"title":"Кастомизация","titles":[]},"95":{"title":"Персонализация","titles":["Кастомизация"]},"96":{"title":"Views","titles":["Кастомизация"]},"97":{"title":"Routes","titles":["Кастомизация"]},"98":{"title":"Header","titles":["Кастомизация"]},"99":{"title":"Sidebar","titles":["Кастомизация"]},"100":{"title":"Небольшой рефакторинг","titles":["Кастомизация"]},"101":{"title":"Избранное","titles":[]},"102":{"title":"Иконка на карточке товара","titles":["Избранное"]},"103":{"title":"Композабл useFavourites","titles":["Избранное"]},"104":{"title":"Сохранение между сессиями","titles":["Избранное"]},"105":{"title":"Бэджик","titles":["Избранное"]},"106":{"title":"Tag и CMV","titles":["Избранное"]},"107":{"title":"Категория товаров","titles":[]},"108":{"title":"Layout","titles":["Категория товаров"]},"109":{"title":"Данные и API","titles":["Категория товаров"]},"110":{"title":"Создание проекта","titles":[]},"111":{"title":"Репозиторий на GitHub","titles":["Создание проекта"]},"112":{"title":"vue-webapp","titles":["Создание проекта"]},"113":{"title":"Абстракция канала связи с бэкендом","titles":[]},"114":{"title":"API сервис","titles":["Абстракция канала связи с бэкендом"]},"115":{"title":"Варианты задействовать свой бэкенд для фронтендера","titles":[]},"116":{"title":"Аутентификация и авторизация","titles":[]},"117":{"title":"CORS","titles":[]},"118":{"title":"Протоколы. To REST или не REST?","titles":[]},"119":{"title":"Приложение: Миграция с Vue 2","titles":[]},"120":{"title":"Другой способ загрузки и запуска приложения","titles":["Приложение: Миграция с Vue 2"]},"121":{"title":"Регистрация глобальных компонентов, плагинов и так далее","titles":["Приложение: Миграция с Vue 2"]},"122":{"title":"Свойство data теперь всегда является функцией","titles":["Приложение: Миграция с Vue 2"]},"123":{"title":"Больше реактивных возможностей","titles":["Приложение: Миграция с Vue 2"]},"124":{"title":"Изменения в v-model, props и events","titles":["Приложение: Миграция с Vue 2"]},"125":{"title":"Удалена совместимость со старыми браузерами","titles":["Приложение: Миграция с Vue 2"]},"126":{"title":"Изменения в организации каталогов и файлов","titles":["Приложение: Миграция с Vue 2"]},"127":{"title":"Изменения в роутере и state manager","titles":["Приложение: Миграция с Vue 2"]},"128":{"title":"Новые компоненты и другие изменения.","titles":["Приложение: Миграция с Vue 2"]},"129":{"title":"Другие изменения","titles":["Приложение: Миграция с Vue 2"]},"130":{"title":"Итог","titles":["Приложение: Миграция с Vue 2"]},"131":{"title":"Развертывание приложения","titles":[]},"132":{"title":"Технические требования","titles":["Развертывание приложения"]},"133":{"title":"Что включает в себя публикация веб-приложения?","titles":["Развертывание приложения"]},"134":{"title":"Домены, серверы доменных имен (DNS) и записи DNS","titles":["Развертывание приложения","Что включает в себя публикация веб-приложения?"]},"135":{"title":"Размышления о создании приложения для развертывания","titles":["Развертывание приложения"]},"136":{"title":"/chapter 5/to-do SPA/src/router/index.js","titles":["Развертывание приложения","Размышления о создании приложения для развертывания","Домены, серверы доменных имен (DNS) и записи DNS",null]},"137":{"title":"Опции и конфигурации веб-сервера","titles":["Развертывание приложения"]},"138":{"title":"Конфигурация HTTP-сервера Apache","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"139":{"title":"/.htaccess","titles":["Развертывание приложения","Опции и конфигурации веб-сервера","Конфигурация HTTP-сервера Apache",null]},"140":{"title":"Настройка сервера Nginx","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"141":{"title":"/etc/nginx/sites-available/default","titles":["Развертывание приложения","Опции и конфигурации веб-сервера","Настройка сервера Nginx",null]},"142":{"title":"Другие серверы","titles":["Развертывание приложения","Опции и конфигурации веб-сервера"]},"143":{"title":"Перенос файлов на сервер","titles":["Развертывание приложения"]},"144":{"title":"Защита веб-приложения с помощью Let\'s Encrypt","titles":["Развертывание приложения"]},"145":{"title":"Подведение итогов","titles":["Развертывание приложения"]},"146":{"title":"Вопросы для проверки","titles":["Развертывание приложения"]},"147":{"title":"Бонусная глава - Шаблоны UX","titles":[]},"148":{"title":"Технические требования","titles":["Бонусная глава - Шаблоны UX"]},"149":{"title":"UI-дизайн против UX-дизайна","titles":["Бонусная глава - Шаблоны UX"]},"150":{"title":"Принципы проектирования пользовательского интерфейса","titles":["Бонусная глава - Шаблоны UX"]},"151":{"title":"Достаточный контраст или различие между элементами","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"152":{"title":"Стимулировать повторение и быть последовательным.","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"153":{"title":"Внимательно следите за выравниванием и направлением","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"154":{"title":"Используйте близость и расстояние, чтобы показать естественные группы","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"155":{"title":"Законы проектирования пользовательского интерфейса","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"156":{"title":"Закон Фитта","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"157":{"title":"Закон Хика","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"158":{"title":"Восемь правил Бена Шнайдермана","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"159":{"title":"Принципы проектирования UX","titles":["Бонусная глава - Шаблоны UX","Принципы проектирования пользовательского интерфейса"]},"160":{"title":"Общие шаблоны для работы с данными","titles":["Бонусная глава - Шаблоны UX"]},"161":{"title":"Элементы ввода HTML","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными"]},"162":{"title":"Чекбоксы, радиокнопки и тумблеры","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"163":{"title":"Чипы, таблетки или теги","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"164":{"title":"Подсказки (tooltips)","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"165":{"title":"Уведомляющие точки, пузырьки, метки или значки","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"166":{"title":"Тостовые уведомления","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"167":{"title":"Карусель или слайдеры изображений","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"168":{"title":"Панели прогресса (progress bars) и спиннеры","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"169":{"title":"./components/Spinner.vue","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML","Панели прогресса (progress bars) и спиннеры"]},"170":{"title":"Пагинация (пейджер) и бесконечный скроллер","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML"]},"171":{"title":"./src/components/InfiniteScroller.vue","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для работы с данными","Элементы ввода HTML","Пагинация (пейджер) и бесконечный скроллер"]},"172":{"title":"Общие шаблоны для взаимодействия и навигации","titles":["Бонусная глава - Шаблоны UX"]},"173":{"title":"Размещение меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"174":{"title":"Хлебные крошки (breadcrumbs)","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"175":{"title":"Модальные диалоги","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"176":{"title":"Иконки меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"177":{"title":"Аккордеонные меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"178":{"title":"Мегаменю","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"179":{"title":"Выпадающие меню","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для взаимодействия и навигации","Элементы ввода HTML"]},"180":{"title":"Общие шаблоны для организации контента","titles":["Бонусная глава - Шаблоны UX"]},"181":{"title":"Отзывчивые (responsive) приложения","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"182":{"title":"Домашняя ссылка","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"183":{"title":"Главная (hero) секция, призыв к действию (call to action) и иконки социальных сетей","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"184":{"title":"Другие шаблоны","titles":["Бонусная глава - Шаблоны UX","Общие шаблоны для организации контента"]},"185":{"title":"Темные шаблоны","titles":["Бонусная глава - Шаблоны UX"]},"186":{"title":"Вопросы с подвохом","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"187":{"title":"Проникновение в корзину","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"188":{"title":"Приманка для тараканов (Roach motels)","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"189":{"title":"Privacy Zuckering","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"190":{"title":"Предотвращение сравнения цен","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"191":{"title":"Ненаправленность","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"192":{"title":"Скрытые расходы","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"193":{"title":"Приманка и подмена","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"194":{"title":"Подтверждение позора (Confirm shaming)","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"195":{"title":"Замаскированная реклама","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"196":{"title":"Дружественный спам","titles":["Бонусная глава - Шаблоны UX","Темные шаблоны"]},"197":{"title":"Подведение итогов","titles":["Бонусная глава - Шаблоны UX"]},"198":{"title":"Вопросы для проверки","titles":["Бонусная глава - Шаблоны UX"]},"199":{"title":"Фреймворк Vue 3","titles":[]},"200":{"title":"Прогрессивный фреймворк","titles":["Фреймворк Vue 3"]},"201":{"title":"Использование Vue в веб-приложении","titles":["Фреймворк Vue 3"]},"202":{"title":"Путь сборщика, лучший путь...","titles":["Фреймворк Vue 3","Использование Vue в веб-приложении"]},"203":{"title":"Понимание однофайловых компонентов","titles":["Фреймворк Vue 3"]},"204":{"title":"Разные варианты - options, composition, и script setup API","titles":["Фреймворк Vue 3"]},"205":{"title":"Изучение встроенных директив в Vue 3","titles":["Фреймворк Vue 3"]},"206":{"title":"v-bind: (сокращение ":")","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"207":{"title":"v-show","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"208":{"title":"v-if, v-else и v-else-if","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"209":{"title":"v-for и :key","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"210":{"title":"v-model","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"211":{"title":"v-on: (и сокращение @)","titles":["Фреймворк Vue 3","Изучение встроенных директив в Vue 3"]},"212":{"title":"Встроенные компоненты","titles":["Фреймворк Vue 3"]},"213":{"title":"Кодовые соглашения (code conventions) в книге","titles":["Фреймворк Vue 3"]},"214":{"title":"Переменные и пропсы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"215":{"title":"Константы","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"216":{"title":"Имена классов и компонентов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"217":{"title":"Функции, методы, события и имена файлов","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"218":{"title":"Экземпляры","titles":["Фреймворк Vue 3","Кодовые соглашения (code conventions) в книге"]},"219":{"title":"Подведение итогов","titles":["Фреймворк Vue 3"]},"220":{"title":"Вопросы для проверки","titles":["Фреймворк Vue 3"]},"221":{"title":"Установка рабочего проекта","titles":[]},"222":{"title":"Технические требования","titles":["Установка рабочего проекта"]},"223":{"title":"Настройка проекта и инструменты","titles":["Установка рабочего проекта"]},"224":{"title":"Структура папок и её модификации","titles":["Установка рабочего проекта"]},"225":{"title":"Интеграция с CSS-фреймворками","titles":["Установка рабочего проекта"]},"226":{"title":"Фреймворк w3.css","titles":["Установка рабочего проекта","Интеграция с CSS-фреймворками"]},"227":{"title":"FontAwesome - это просто замечательно","titles":["Установка рабочего проекта"]},"228":{"title":"Опции конфигурации Vite","titles":["Установка рабочего проекта"]},"229":{"title":"Приложение To-Do","titles":["Установка рабочего проекта"]},"230":{"title":"App.vue","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"231":{"title":"ToDos.vue","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"232":{"title":"Краткая критика нашего приложения To-Do","titles":["Установка рабочего проекта","Приложение To-Do","Фреймворк w3.css"]},"233":{"title":"Подведение итогов","titles":["Установка рабочего проекта"]},"234":{"title":"Вопросы для проверки","titles":["Установка рабочего проекта"]},"235":{"title":"Композиция пользовательского интерфейса с помощью компонентов","titles":[]},"236":{"title":"Технические требования","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"237":{"title":"Составление страницы с помощью компонентов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"238":{"title":"Этап 1 - определение макетов и элементов пользовательского интерфейса","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"239":{"title":"Шаг 2 - определение связей, потока данных, взаимодействий и событий","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"240":{"title":"Шаг 3 - определение элементов пользовательской интерактивности (входов, диалогов, уведомлений и т.д.)","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"241":{"title":"Шаг 4 - выявление шаблонов проектирования и компромиссов","titles":["Композиция пользовательского интерфейса с помощью компонентов","Составление страницы с помощью компонентов"]},"242":{"title":"Компоненты в деталях","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"243":{"title":"Локальные и глобальные компоненты","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"244":{"title":"Статический, асинхронный и динамический импорт","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"245":{"title":"Пропсы, события и директива v-model","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"246":{"title":"Настраиваемые контроллеры ввода","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"247":{"title":"Инъекция зависимости с помощью Provide и Inject","titles":["Композиция пользовательского интерфейса с помощью компонентов","Компоненты в деталях"]},"248":{"title":"Специальные компоненты","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"249":{"title":"Слоты, слоты и еще раз слоты...","titles":["Композиция пользовательского интерфейса с помощью компонентов","Специальные компоненты"]},"250":{"title":"Композабл функции (composables) и миксины","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"251":{"title":"Динамические компоненты с помощью "component :is"","titles":["Композиция пользовательского интерфейса с помощью компонентов","Композабл функции (composables) и миксины"]},"252":{"title":"Реальный пример - плагин модалов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"253":{"title":"Настройка нашего проекта","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"254":{"title":"Конструкция","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"255":{"title":"Реализация","titles":["Композиция пользовательского интерфейса с помощью компонентов","Реальный пример - плагин модалов"]},"256":{"title":"Реализация нашего нового приложения To-Do","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"257":{"title":"Небольшая критика нашего нового приложения To-Do","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"258":{"title":"Подведение итогов","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"259":{"title":"Вопросы для проверки","titles":["Композиция пользовательского интерфейса с помощью компонентов"]},"260":{"title":"Принципы и шаблоны проектирования программного обеспечения","titles":[]},"261":{"title":"Каковы принципы проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"262":{"title":"Неполный список принципов проектирования","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"263":{"title":"Separation of concerns (Разделение ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"264":{"title":"Composition over inheritance (Композиция над наследованием)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"265":{"title":"Single responsibility principle (Принцип единой ответственности)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"266":{"title":"Encapsulation (Инкапсуляция)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"267":{"title":"KIC - keep it clean","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"268":{"title":"DRY – don’t repeat yourself (не повторяйся)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"269":{"title":"KISS - keep it simple and short (держи это простым и коротким)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"270":{"title":"Code for the next (Пиши код для следующего)","titles":["Принципы и шаблоны проектирования программного обеспечения","Неполный список принципов проектирования"]},"271":{"title":"Что такое шаблон проектирования программного обеспечения?","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"272":{"title":"Краткий справочный список шаблонов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"273":{"title":"Порождающие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"274":{"title":"Поведенческие шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"275":{"title":"Структурные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"276":{"title":"Асинхронные шаблоны","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Code for the next (Пиши код для следующего)"]},"277":{"title":"Шаблон Singleton","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"278":{"title":"Когда его использовать","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"279":{"title":"Реализация","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton"]},"280":{"title":"Метод 1","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"281":{"title":"Метод 2","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Singleton","Реализация"]},"282":{"title":"Шаблон Dependency injection (инъекция зависимостей)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"283":{"title":"./chapter 2/dependency-injection-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"284":{"title":"./chapter 2/dependency-injection-2.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"285":{"title":"./chapter 2/dependency-injection-3.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"286":{"title":"./chapter 2/dependency-injection-4.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"287":{"title":"./chapter 2/dependency-injection-5.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"288":{"title":"./chapter 2/dependency-injection-6.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"289":{"title":"./chapter 2/dependency-injection-7.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Dependency injection (инъекция зависимостей)"]},"290":{"title":"Шаблон factory (фабрика)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"291":{"title":"Шаблон Observer (наблюдатель)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"292":{"title":"./chapter 2/Observer-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Observer (наблюдатель)"]},"293":{"title":"Шаблон Command (команда)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"294":{"title":"./chapter 2/Command-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Command (команда)"]},"295":{"title":"Шаблон Proxy","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"296":{"title":"./chapter 2/proxy-1.js","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Proxy"]},"297":{"title":"Шаблон Decorator (декоратор)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"298":{"title":"./chapter 2/decorator-1.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"299":{"title":"./chapter 2/decorator-2.vue","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Decorator (декоратор)"]},"300":{"title":"Шаблон Façade (фасад)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"301":{"title":"Шаблон Callback (обратный вызов)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"302":{"title":"./chapter 2/callback-1.js - Синхронный Фибоначчи","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов","Шаблон Callback (обратный вызов)"]},"303":{"title":"Шаблон Promise (обещаниe)","titles":["Принципы и шаблоны проектирования программного обеспечения","Краткий справочный список шаблонов"]},"304":{"title":"Подведение итогов","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"305":{"title":"Вопросы для проверки","titles":["Принципы и шаблоны проектирования программного обеспечения"]},"306":{"title":"Одностраничные приложения","titles":[]},"307":{"title":"Технические требования","titles":["Одностраничные приложения"]},"308":{"title":"Что такое SPA?","titles":["Одностраничные приложения"]},"309":{"title":"Vue 3 роутер","titles":["Одностраничные приложения"]},"310":{"title":"Установка","titles":["Одностраничные приложения","Vue 3 роутер"]},"311":{"title":"Новое приложение To-Do","titles":["Одностраничные приложения","Vue 3 роутер"]},"312":{"title":"Определение маршрутов и объект Router","titles":["Одностраничные приложения","Vue 3 роутер"]},"313":{"title":"/src/router/index.js","titles":["Одностраничные приложения","Vue 3 роутер","Определение маршрутов и объект Router"]},"314":{"title":"/src/main.js","titles":["Одностраничные приложения","Vue 3 роутер","Определение маршрутов и объект Router"]},"315":{"title":"Шаблонные компоненты маршрутизатора","titles":["Одностраничные приложения","Vue 3 роутер"]},"316":{"title":"App.vue","titles":["Одностраничные приложения","Vue 3 роутер"]},"317":{"title":"Вложенные маршруты, именованные представления и программная навигация","titles":["Одностраничные приложения","Vue 3 роутер"]},"318":{"title":"Определение вложенных маршрутов","titles":["Одностраничные приложения","Vue 3 роутер","Вложенные маршруты, именованные представления и программная навигация"]},"319":{"title":"/src/views/Directory.vue component, lines 13-18","titles":["Одностраничные приложения","Vue 3 роутер","Вложенные маршруты, именованные представления и программная навигация"]},"320":{"title":".push()","titles":["Одностраничные приложения","Vue 3 роутер"]},"321":{"title":".replace()","titles":["Одностраничные приложения","Vue 3 роутер"]},"322":{"title":".go()","titles":["Одностраничные приложения","Vue 3 роутер"]},"323":{"title":"Исследование шаблонов аутентификации","titles":["Одностраничные приложения"]},"324":{"title":"Простая аутентификация по имени пользователя и паролю","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"325":{"title":"OpenID и сторонняя аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"326":{"title":"1.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"327":{"title":"2.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"328":{"title":"3.","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"329":{"title":"Беспарольная аутентификация или аутентификация по одноразовому паролю (OTP)","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"330":{"title":"2FA - двухфакторная аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"331":{"title":"Web3-аутентификация","titles":["Одностраничные приложения","Исследование шаблонов аутентификации"]},"332":{"title":"Подведение итогов","titles":["Одностраничные приложения"]},"333":{"title":"Вопросы для проверки","titles":["Одностраничные приложения"]},"334":{"title":"Прогрессивные веб-приложения","titles":[]},"335":{"title":"Технические требования","titles":["Прогрессивные веб-приложения"]},"336":{"title":"PWA или устанавливаемые SPA","titles":["Прогрессивные веб-приложения"]},"337":{"title":"Увеличение SPA до уровня PWA","titles":["Прогрессивные веб-приложения"]},"338":{"title":"Файл манифеста","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"339":{"title":"Необходимо:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"340":{"title":"Рекомендуется:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"341":{"title":"Описательные:","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA","Файл манифеста"]},"342":{"title":"Тестирование манифеста","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"343":{"title":"Подсказка к установке (Install prompt)","titles":["Прогрессивные веб-приложения","Увеличение SPA до уровня PWA"]},"344":{"title":"Service workers","titles":["Прогрессивные веб-приложения"]},"345":{"title":"Плагин Vite-PWA","titles":["Прогрессивные веб-приложения"]},"346":{"title":"Тестирование показателей PWA с помощью Google Lighthouse","titles":["Прогрессивные веб-приложения"]},"347":{"title":"Подведение итогов","titles":["Прогрессивные веб-приложения"]},"348":{"title":"Вопросы для проверки","titles":["Прогрессивные веб-приложения"]},"349":{"title":"Управление потоками данных","titles":[]},"350":{"title":"Технические требования","titles":["Управление потоками данных"]},"351":{"title":"Основное взаимодействие компонентов","titles":["Управление потоками данных"]},"352":{"title":"/basic/ParentBasic.vue","titles":["Управление потоками данных","Основное взаимодействие компонентов",null,null,null]},"353":{"title":"/basic/Child.vue","titles":["Управление потоками данных","Основное взаимодействие компонентов",null,null,null]},"354":{"title":"Реализация шины событий с помощью шаблонов Singleton и Observer","titles":["Управление потоками данных"]},"355":{"title":"/services/MessageBus.js","titles":["Управление потоками данных","Реализация шины событий с помощью шаблонов Singleton и Observer",null,null]},"356":{"title":"/bus/Child.vue","titles":["Управление потоками данных","Реализация шины событий с помощью шаблонов Singleton и Observer",null,null]},"357":{"title":"Реализация базового реактивного состояния","titles":["Управление потоками данных"]},"358":{"title":"/service/SimpleState.js","titles":["Управление потоками данных","Реализация базового реактивного состояния",null,null]},"359":{"title":"Реализация мощного реактивного стора с помощью Pinia","titles":["Управление потоками данных"]},"360":{"title":"Options API basic store","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"361":{"title":"/stores/counter.js","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"362":{"title":"./main.js","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"363":{"title":"/pinia/ChildPinia.vue","titles":["Управление потоками данных","Реализация мощного реактивного стора с помощью Pinia",null,null]},"364":{"title":"Хранилища данных браузера - сессионные, локальные и IndexedDB","titles":["Управление потоками данных"]},"365":{"title":"Экспериментируем с шаблонами reactivity и Proxies","titles":["Управление потоками данных"]},"366":{"title":"/services/sessionStorage.js","titles":["Управление потоками данных","Экспериментируем с шаблонами reactivity и Proxies",null,null]},"367":{"title":"/session_storage/ChildSession.vue","titles":["Управление потоками данных","Экспериментируем с шаблонами reactivity и Proxies",null,null]},"368":{"title":"Подведение итогов","titles":["Управление потоками данных"]},"369":{"title":"Вопросы для проверки","titles":["Управление потоками данных"]},"370":{"title":"Тестирование и системы контроля версий","titles":[]},"371":{"title":"Технические требования","titles":["Тестирование и системы контроля версий"]},"372":{"title":"Что такое тестирование и TDD","titles":["Тестирование и системы контроля версий"]},"373":{"title":"Что тестировать","titles":["Тестирование и системы контроля версий"]},"374":{"title":"Наш базовый пример приложения","titles":["Тестирование и системы контроля версий"]},"375":{"title":"Установка и использование Vitest","titles":["Тестирование и системы контроля версий"]},"376":{"title":"/src/tests/Fibonacci.test.js","titles":["Тестирование и системы контроля версий","Установка и использование Vitest",null,null]},"377":{"title":"Специальный случай утверждения - намеренная ошибка","titles":["Тестирование и системы контроля версий"]},"378":{"title":"Специальный случай утверждения - асинхронный код","titles":["Тестирование и системы контроля версий"]},"379":{"title":"Установка Vue Test Utils","titles":["Тестирование и системы контроля версий"]},"380":{"title":"/src/tests/FibonacciOutput.test.js","titles":["Тестирование и системы контроля версий","Установка Vue Test Utils",null,null]},"381":{"title":"/src/tests/FibonacciInput.test.js","titles":["Тестирование и системы контроля версий","Установка Vue Test Utils",null,null]},"382":{"title":"In-source тестирование","titles":["Тестирование и системы контроля версий"]},"383":{"title":"Покрытие","titles":["Тестирование и системы контроля версий"]},"384":{"title":"Интерфейс Vitest","titles":["Тестирование и системы контроля версий"]},"385":{"title":"Что такое source control и зачем он нужен?","titles":["Тестирование и системы контроля версий"]},"386":{"title":"Управление исходными текстами с помощью Git","titles":["Тестирование и системы контроля версий"]},"387":{"title":"Установка в системах Windows","titles":["Тестирование и системы контроля версий"]},"388":{"title":"Установка в системах Linux","titles":["Тестирование и системы контроля версий"]},"389":{"title":"Установка в системах macOS","titles":["Тестирование и системы контроля версий"]},"390":{"title":"Использование Git","titles":["Тестирование и системы контроля версий"]},"391":{"title":"/chapter 10/.gitignore","titles":["Тестирование и системы контроля версий","Использование Git",null,null]},"392":{"title":"Управление ветвями и слияниями","titles":["Тестирование и системы контроля версий"]},"393":{"title":"Конфликты при слиянии","titles":["Тестирование и системы контроля версий"]},"394":{"title":"Работа с удаленными репозиториями","titles":["Тестирование и системы контроля версий"]},"395":{"title":"Непрерывная интеграция и доставка","titles":["Тестирование и системы контроля версий"]},"396":{"title":"Подведение итогов","titles":["Тестирование и системы контроля версий"]},"397":{"title":"Вопросы для проверки","titles":["Тестирование и системы контроля версий"]},"398":{"title":"Vue.js 3 - Шаблоны проектирования и лучшие практики","titles":[]},"399":{"title":"Здесь представлен перевод книги "Vue.js 3 - Design Patterns and Best Practices" на русский язык","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики",null,null]},"400":{"title":"Предисловие","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"401":{"title":"Для кого эта книга","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"402":{"title":"Чтобы получить максимальную пользу от этой книги","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"403":{"title":"Купить книгу","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"404":{"title":"Скачать файлы кода примеров","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"405":{"title":"Код в действии","titles":["Vue.js 3 - Шаблоны проектирования и лучшие практики"]},"406":{"title":"Что включает в себя эта книга","titles":[]},"407":{"title":"Глава 1, Фреймворк Vue 3","titles":["Что включает в себя эта книга",null]},"408":{"title":"Глава 2, Принципы и шаблоны проектирования программного обеспечения","titles":["Что включает в себя эта книга",null]},"409":{"title":"Глава 3, Создание рабочего проекта","titles":["Что включает в себя эта книга",null]},"410":{"title":"Глава 4, Композиция пользовательского интерфейса с помощью компонентов","titles":["Что включает в себя эта книга",null]},"411":{"title":"Глава 5, Одностраничные приложения","titles":["Что включает в себя эта книга",null]},"412":{"title":"Глава 6, Прогрессивные веб-приложения","titles":["Что включает в себя эта книга",null]},"413":{"title":"Глава 7, Управление потоками данных","titles":["Что включает в себя эта книга",null]},"414":{"title":"Глава 8, Многопоточность с помощью web-workers","titles":["Что включает в себя эта книга",null]},"415":{"title":"Глава 9, Тестирование и контроль исходных текстов","titles":["Что включает в себя эта книга",null]},"416":{"title":"Глава 10, Развертывание приложения","titles":["Что включает в себя эта книга",null]},"417":{"title":"Глава 11, UX Patterns","titles":["Что включает в себя эта книга",null]},"418":{"title":"Приложение: Миграция с Vue 2 на Vue 3","titles":["Что включает в себя эта книга",null]},"419":{"title":"CI/CD","titles":[]},"420":{"title":"Docker","titles":[]},"421":{"title":"Github Actions","titles":[]},"422":{"title":"Хостинг","titles":[]},"423":{"title":"Архитектурные решения","titles":[]},"424":{"title":"Use cases","titles":["Архитектурные решения",null]},"425":{"title":"Лучшие практики и соображения","titles":["Архитектурные решения",null]},"426":{"title":"AppLoader.vue","titles":["Архитектурные решения",null,"Лучшие практики и соображения",null]},"427":{"title":"useAppLoader.ts","titles":["Архитектурные решения",null,"Лучшие практики и соображения",null]},"428":{"title":"Some component","titles":["Архитектурные решения",null,"Лучшие практики и соображения",null]},"429":{"title":"Ресурсы приложения","titles":[]},"430":{"title":"BaseIcon","titles":["Ресурсы приложения",null,null]},"431":{"title":"icons.js","titles":["Ресурсы приложения",null,null]},"432":{"title":"Создание и сборка приложения","titles":[]},"433":{"title":"Настройка IDE","titles":[]},"434":{"title":"Многопоточность с Web Workers","titles":[]},"435":{"title":"Технические требования","titles":["Многопоточность с Web Workers"]},"436":{"title":"Введение в Web workers","titles":["Многопоточность с Web Workers"]},"437":{"title":"Реализация web worker","titles":["Многопоточность с Web Workers","Введение в Web workers"]},"438":{"title":"./my_worker.js","titles":["Многопоточность с Web Workers","Введение в Web workers","Реализация web worker",null]},"439":{"title":"./main.js","titles":["Многопоточность с Web Workers","Введение в Web workers","Реализация web worker",null]},"440":{"title":"Шаблон Business delegate","titles":["Многопоточность с Web Workers"]},"441":{"title":"Шаблон Dispatcher","titles":["Многопоточность с Web Workers"]},"442":{"title":"Установка конвейера взаимодействия с веб-рабочим","titles":["Многопоточность с Web Workers"]},"443":{"title":"./services/WebWorker.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"444":{"title":"./webworker/index.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"445":{"title":"./webworker/services/test.js","titles":["Многопоточность с Web Workers","Установка конвейера взаимодействия с веб-рабочим","Реализация web worker",null]},"446":{"title":"Получение доступа к IndexedDB с помощью DexieJS в web worker.","titles":["Многопоточность с Web Workers"]},"447":{"title":"/src/components/DbNotes.vue","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"448":{"title":"./src/webworker/services/dbService.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"449":{"title":"./src/webworker/index.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"450":{"title":"./webworker/services/network.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"451":{"title":"./webworker/index.js","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"452":{"title":"./src/components/NetworkCommunication.vue","titles":["Многопоточность с Web Workers","Получение доступа к IndexedDB с помощью DexieJS в web worker.","Реализация web worker",null]},"453":{"title":"Простой NodeJS-сервер для тестирования","titles":["Многопоточность с Web Workers"]},"454":{"title":"./server/index.js","titles":["Многопоточность с Web Workers","Простой NodeJS-сервер для тестирования","Реализация web worker",null]},"455":{"title":"Подведение итогов","titles":["Многопоточность с Web Workers"]},"456":{"title":"Вопросы для проверки","titles":["Многопоточность с Web Workers"]},"457":{"title":"Подскажите удобную библиотеку","titles":[]},"458":{"title":"Полезные советы","titles":[]},"459":{"title":"Карусель или слайдер","titles":["Полезные советы",null]},"460":{"title":"Дата и время","titles":["Полезные советы",null]},"461":{"title":"Тестирование","titles":[]},"462":{"title":"State management во Vue 3","titles":[]},"463":{"title":"О фронтенд фреймворках","titles":[]},"464":{"title":"Архитектура фронтэнд приложений","titles":[]},"465":{"title":"Избегайте зависимостей","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"466":{"title":"Используйте обертки над компонентами UI библиотек и сторонних утилит","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"467":{"title":"Регулярный рефакторинг","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"468":{"title":"Используйте CSS3","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"469":{"title":"Используйте современные стандарты и возможности языков","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"470":{"title":"Документируйте проект","titles":["Архитектура фронтэнд приложений",null,null,null,null]},"471":{"title":"CSS и UI библиотеки","titles":[]},"472":{"title":"SPA, PWA, SSG, SSR и SEO","titles":[]},"473":{"title":"Изучение Vue","titles":[]},"474":{"title":"История изменений","titles":[]},"475":{"title":"v1.4 (24-11-2023)","titles":["История изменений"]},"476":{"title":"Новое","titles":["История изменений","v1.4 (24-11-2023)",null]},"477":{"title":"Изменено","titles":["История изменений","v1.4 (24-11-2023)",null]},"478":{"title":"v1.3 (10-10-2023)","titles":["История изменений"]},"479":{"title":"Изменено","titles":["История изменений","v1.3 (10-10-2023)",null]},"480":{"title":"v1.2 (27-09-2023)","titles":["История изменений"]},"481":{"title":"Новое","titles":["История изменений","v1.2 (27-09-2023)",null]},"482":{"title":"Изменено","titles":["История изменений","v1.2 (27-09-2023)",null]},"483":{"title":"v1.1 (15-09-2023)","titles":["История изменений"]},"484":{"title":"Новое","titles":["История изменений","v1.1 (15-09-2023)"]},"485":{"title":"Изменено","titles":["История изменений","v1.1 (15-09-2023)"]},"486":{"title":"v1.0 (11-09-2023)","titles":["История изменений"]},"487":{"title":"Новое","titles":["История изменений","v1.0 (11-09-2023)"]},"488":{"title":"Шпаргалки (Cheat Sheet)","titles":[]},"489":{"title":"Vue","titles":["Шпаргалки (Cheat Sheet)",null]},"490":{"title":"JavaScript","titles":["Шпаргалки (Cheat Sheet)",null]},"491":{"title":"HTML","titles":["Шпаргалки (Cheat Sheet)",null]},"492":{"title":"CSS","titles":["Шпаргалки (Cheat Sheet)",null]},"493":{"title":"Typescript","titles":["Шпаргалки (Cheat Sheet)",null]},"494":{"title":"Markdown","titles":["Шпаргалки (Cheat Sheet)",null]},"495":{"title":"Внесите лепту в развитие данного ресурса","titles":[]},"496":{"title":"Глоссарий и сокращения","titles":[]},"497":{"title":"Предисловие","titles":[]},"498":{"title":"У нас есть Телеграм канал","titles":["Предисловие",null]},"499":{"title":"Участие в проекте","titles":[]},"500":{"title":"Установка","titles":[]},"501":{"title":"Установка через create vue-webapp","titles":["Установка"]},"502":{"title":"Инициализация и запуск веб приложения","titles":["Установка","Установка через create vue-webapp"]},"503":{"title":"Установка из репозитория","titles":["Установка"]},"504":{"title":"Принципы","titles":[]},"505":{"title":"Vue 3 webapp билдер","titles":[]},"506":{"title":"Краткое описание","titles":["Vue 3 webapp билдер"]},"507":{"title":"Обоснование","titles":["Vue 3 webapp билдер"]},"508":{"title":"Цели","titles":[]},"509":{"title":"Адаптивность","titles":[]},"510":{"title":"API модуль","titles":[]},"511":{"title":"API (REST)","titles":["API модуль"]},"512":{"title":"JSON-RPC","titles":["API модуль"]},"513":{"title":"BaseIcon","titles":[]},"514":{"title":"Navigation drawers","titles":[]},"515":{"title":"SimpleDrawer","titles":["Navigation drawers"]},"516":{"title":"TouchSlideoutDrawer","titles":["Navigation drawers"]},"517":{"title":"Детали реализации","titles":[]},"518":{"title":"Инъекции кода в index.html","titles":["Детали реализации"]},"519":{"title":"CSS tricks","titles":["Детали реализации"]},"520":{"title":"Footers","titles":[]},"521":{"title":"SimpleFooter","titles":["Footers"]},"522":{"title":"RichFooter","titles":["Footers"]},"523":{"title":"MantineSimpleFooter","titles":["Footers"]},"524":{"title":"MantineRichFooter","titles":["Footers"]},"525":{"title":"DistributedFooter","titles":["Footers"]},"526":{"title":"Github Actions сценарий для развертывания на Github Pages","titles":[]},"527":{"title":"Deployment","titles":["Github Actions сценарий для развертывания на Github Pages"]},"528":{"title":"Настройка base в Vite конфиге","titles":["Github Actions сценарий для развертывания на Github Pages"]},"529":{"title":"Google analytics","titles":[]},"530":{"title":"Headers","titles":[]},"531":{"title":"SimpleHeader","titles":["Headers"]},"532":{"title":"MantineSimpleHeader","titles":["Headers"]},"533":{"title":"MantineLayeredHeader","titles":["Headers"]},"534":{"title":"SlidingHeader","titles":["Headers"]},"535":{"title":"i18n","titles":[]},"536":{"title":"i18next","titles":["i18n"]},"537":{"title":"useI18nLight","titles":["i18n"]},"538":{"title":"Использование","titles":["i18n"]},"539":{"title":"i18next расширения","titles":["i18n"]},"540":{"title":"В итоге","titles":["i18n"]},"541":{"title":"Опции при создании приложения","titles":[]},"542":{"title":"Доступные опции","titles":["Опции при создании приложения"]},"543":{"title":"Доступно по умолчанию","titles":["Опции при создании приложения"]},"544":{"title":"В разработке","titles":["Опции при создании приложения"]},"545":{"title":"В планах","titles":["Опции при создании приложения"]},"546":{"title":"MainLayout","titles":[]},"547":{"title":"Routing","titles":["MainLayout"]},"548":{"title":"OneColumnLayout","titles":[]},"549":{"title":"Navbar","titles":[]},"550":{"title":"SimpleNavbar","titles":["Navbar"]},"551":{"title":"MantineSimpleNavbar","titles":["Navbar"]},"552":{"title":"Google analytics","titles":[]},"553":{"title":"PWA","titles":[]},"554":{"title":"manifest.json","titles":["PWA"]},"555":{"title":"Service worker","titles":["PWA"]},"556":{"title":"Splash screen","titles":[]},"557":{"title":"Темы","titles":[]}},"dirtCount":0,"index":[["^",{"2":{"433":1}}],["^20",{"2":{"432":1}}],["^index",{"2":{"139":1}}],["||",{"2":{"529":1}}],["|",{"2":{"421":4,"433":1}}],["🚀",{"2":{"421":1}}],["🛎️",{"2":{"421":1}}],["ютюбе",{"2":{"473":1}}],["ютюба",{"2":{"473":1}}],["ю",{"2":{"463":1}}],["юнит",{"2":{"378":1,"380":1}}],["юридическую",{"2":{"324":1}}],["юзер",{"2":{"116":1}}],["щелкает",{"2":{"341":1}}],["щелкать",{"2":{"229":1}}],["щелкнуть",{"2":{"229":1}}],["щелчку",{"2":{"329":1}}],["щелчке",{"2":{"256":1,"311":1}}],["щелчком",{"2":{"178":1,"179":1,"256":1}}],["щелчок",{"2":{"164":1,"256":1,"447":1}}],["щепоткой",{"2":{"200":1}}],["└────",{"2":{"174":1}}],["└──",{"2":{"174":3}}],["86",{"2":{"557":1}}],["8",{"0":{"414":1},"2":{"164":1,"222":1,"268":1,"271":1,"294":1,"296":3,"300":2,"302":2,"323":1,"330":1,"334":1,"346":1,"364":2,"390":1,"421":2,"435":1,"436":3,"440":1,"442":1,"443":2,"445":1,"446":1,"451":2,"454":2}}],["800",{"2":{"158":1}}],["80",{"2":{"89":1,"141":1}}],["№",{"2":{"163":1}}],["zero",{"2":{"433":1}}],["zip",{"2":{"227":2}}],["zuckering",{"0":{"189":1}}],["z",{"2":{"158":1,"182":1}}],["56",{"2":{"557":1}}],["58",{"2":{"433":1}}],["55",{"2":{"376":3,"378":1,"380":2}}],["512x512",{"2":{"345":2}}],["5rem",{"2":{"230":1}}],["50кб",{"2":{"460":1}}],["50",{"2":{"169":1,"356":1,"364":1,"376":1,"540":1}}],["5",{"0":{"136":1,"287":1,"411":1},"2":{"127":1,"135":2,"158":1,"162":1,"171":2,"175":1,"209":2,"227":1,"231":4,"244":1,"249":1,"250":2,"251":2,"255":2,"288":1,"292":1,"293":1,"296":1,"303":1,"308":1,"311":3,"313":2,"317":1,"319":1,"322":1,"324":4,"325":1,"328":1,"329":2,"330":1,"343":1,"356":2,"359":1,"360":2,"361":2,"364":1,"366":2,"377":2,"381":2,"383":1,"394":1,"417":1,"421":3,"442":1,"443":2,"444":2,"447":1,"448":2,"450":1,"454":2}}],["67",{"2":{"436":1,"557":3}}],["64",{"2":{"222":1,"387":1}}],["60000",{"2":{"244":1}}],["600",{"2":{"181":1}}],["600px",{"2":{"181":1}}],["60",{"2":{"151":2,"269":1,"329":1,"330":1,"436":1,"557":6}}],["6",{"0":{"288":1,"412":1},"2":{"125":1,"134":1,"162":1,"229":1,"231":4,"250":2,"254":1,"288":1,"289":2,"295":1,"296":1,"308":1,"325":1,"341":2,"342":1,"343":4,"344":2,"345":4,"346":3,"356":2,"361":2,"366":2,"367":1,"381":2,"384":1,"443":2,"444":2,"445":1,"447":2,"448":2,"454":2,"557":1}}],["78",{"2":{"557":1}}],["78919d98ece0",{"2":{"336":1}}],["767",{"2":{"509":1}}],["70",{"2":{"473":2,"537":1}}],["77",{"2":{"296":1}}],["7",{"0":{"289":1,"413":1},"2":{"125":2,"127":1,"163":1,"204":1,"239":1,"249":1,"256":1,"282":1,"288":1,"289":1,"296":2,"297":1,"316":1,"329":1,"334":1,"343":1,"346":1,"351":2,"354":1,"356":1,"357":1,"359":1,"367":3,"387":1,"443":2,"444":2,"446":1,"454":2}}],["7542",{"2":{"97":1}}],["9",{"0":{"415":1},"2":{"143":1,"164":1,"176":1,"222":1,"224":1,"296":1,"302":2,"303":1,"374":2,"383":3,"384":1,"387":1,"390":1,"391":3,"393":1,"443":2,"454":2}}],["99",{"2":{"118":1,"462":3}}],["95",{"2":{"116":1,"457":1,"460":1}}],["90",{"2":{"86":1,"346":1}}],["ждать",{"2":{"329":2,"330":1,"376":1}}],["жив",{"2":{"445":2}}],["живом",{"2":{"416":1}}],["живой",{"2":{"224":1,"382":1}}],["живого",{"2":{"223":1,"380":1,"384":1}}],["живущий",{"2":{"116":1}}],["жизненно",{"2":{"270":1}}],["жизненного",{"2":{"204":1,"250":1,"267":2,"287":1,"316":1,"356":1}}],["жизненный",{"2":{"267":1,"344":1}}],["жизнь",{"2":{"224":1,"421":1,"463":1}}],["жизни",{"2":{"116":4,"364":1}}],["жить",{"2":{"200":1}}],["жирным",{"2":{"186":1}}],["жирный",{"2":{"153":1}}],["железу",{"2":{"472":1}}],["железо",{"2":{"472":1}}],["желающих",{"2":{"499":1}}],["желаю",{"2":{"405":1}}],["желаемым",{"2":{"370":1}}],["желаемых",{"2":{"231":1}}],["желательно",{"2":{"104":1,"222":1,"356":1,"473":1}}],["желании",{"2":{"40":1,"504":1,"508":1,"511":1}}],["желание",{"2":{"25":1}}],["жесткие",{"2":{"432":1}}],["жестким",{"2":{"144":1}}],["жестко",{"2":{"289":1,"463":1}}],["жесткое",{"2":{"284":1,"364":1}}],["же",{"2":{"3":1,"11":1,"12":1,"16":1,"23":1,"26":2,"33":1,"35":1,"41":1,"44":1,"48":1,"56":1,"71":1,"82":1,"97":1,"102":2,"103":1,"116":2,"123":1,"124":1,"125":2,"131":1,"134":3,"135":1,"136":1,"137":1,"147":2,"149":1,"152":2,"153":1,"154":1,"156":2,"158":1,"160":1,"163":1,"167":1,"176":1,"179":1,"181":1,"186":1,"200":4,"202":1,"204":3,"208":1,"210":1,"224":1,"227":1,"230":1,"231":3,"236":1,"247":1,"249":1,"252":1,"261":1,"263":2,"265":1,"268":2,"270":2,"280":1,"281":1,"283":1,"284":1,"286":1,"287":2,"290":1,"292":3,"295":5,"296":2,"297":4,"298":1,"299":1,"300":1,"302":1,"303":1,"308":1,"309":1,"313":1,"321":1,"323":1,"324":1,"325":1,"331":3,"334":1,"336":2,"338":1,"343":1,"351":1,"353":1,"354":2,"356":2,"357":1,"358":2,"360":1,"361":3,"364":5,"366":1,"367":1,"372":1,"373":1,"375":2,"376":1,"378":1,"379":1,"381":3,"383":1,"385":2,"386":1,"394":2,"421":1,"422":1,"423":2,"433":1,"434":1,"436":2,"439":1,"454":2,"460":1,"461":2,"462":3,"463":1,"464":1,"466":1,"472":1,"473":1,"507":1,"511":1,"512":1,"518":1,"527":1,"536":1}}],["yandex",{"2":{"472":1}}],["yamllint",{"2":{"433":2}}],["yaml",{"2":{"421":7,"433":7}}],["yarnrc",{"2":{"433":2}}],["yarn",{"2":{"391":2,"432":1,"433":4}}],["yellow",{"2":{"316":1}}],["yes",{"2":{"112":6,"501":8,"506":4}}],["y=ref",{"2":{"250":1}}],["y",{"2":{"223":1,"250":4,"421":1}}],["yougithubusername",{"2":{"527":1}}],["youtube",{"2":{"73":1,"308":1,"436":2}}],["yourname",{"2":{"528":1}}],["yourself",{"0":{"268":1},"2":{"250":1,"260":1,"433":1}}],["your",{"2":{"55":1,"231":1,"421":13,"462":2}}],["√",{"2":{"112":15,"501":13,"506":5}}],[">save",{"2":{"447":1}}],[">send",{"2":{"356":1,"452":1}}],[">search",{"2":{"316":1}}],[">decrement",{"2":{"358":1,"363":1}}],[">increment",{"2":{"358":1}}],[">install",{"2":{"343":1}}],[">home",{"2":{"316":1}}],[">cancel",{"2":{"255":1}}],[">completed",{"2":{"231":1}}],[">accept",{"2":{"255":1}}],[">no",{"2":{"231":1}}],[">pending",{"2":{"231":1}}],[">print",{"2":{"211":2}}],[">edit",{"2":{"212":1}}],[">",{"2":{"103":2,"105":3,"169":1,"171":2,"174":4,"201":2,"206":1,"207":1,"209":1,"210":1,"212":1,"226":1,"227":4,"230":2,"231":20,"246":2,"249":12,"251":2,"255":3,"292":1,"299":2,"316":3,"319":4,"338":1,"343":2,"352":4,"353":2,"363":2,"421":1,"425":8,"426":2,"427":1,"429":4,"430":2,"433":1,"447":5,"452":3,"471":2,"495":2,"509":5,"513":3,"529":2,"534":3,"538":2,"552":15}}],[">>",{"2":{"103":1,"104":1,"421":5}}],["⌥",{"2":{"89":2}}],["++id",{"2":{"448":1}}],["+page",{"2":{"433":6}}],["+layout",{"2":{"433":7}}],["+$backups",{"2":{"421":1}}],["+f",{"2":{"301":1}}],["+=",{"2":{"171":1}}],["+",{"2":{"89":4,"158":1,"200":1,"223":1,"296":1,"302":2,"303":7,"325":2,"326":2,"328":1,"346":1,"402":1,"421":1,"431":2,"454":1}}],["400",{"2":{"534":1}}],["401",{"2":{"116":2}}],["480",{"2":{"509":1}}],["4",{"0":{"241":1,"286":1,"410":1,"475":1},"1":{"476":1,"477":1},"2":{"87":1,"124":1,"134":1,"141":2,"154":2,"156":1,"158":1,"171":2,"203":2,"209":1,"210":1,"226":1,"229":1,"231":6,"238":2,"239":1,"240":1,"247":2,"249":1,"250":2,"254":1,"255":6,"256":3,"264":1,"267":1,"288":1,"289":1,"291":1,"292":1,"296":1,"297":1,"298":1,"303":3,"309":1,"310":1,"313":2,"319":1,"328":1,"343":1,"352":2,"353":3,"356":2,"357":1,"360":2,"361":2,"363":2,"366":2,"380":2,"381":2,"383":1,"394":1,"401":1,"402":1,"431":2,"433":1,"440":1,"443":2,"444":2,"447":1,"448":2,"454":2,"473":1}}],["09",{"0":{"480":1,"483":1,"486":1},"1":{"481":1,"482":1,"484":1,"485":1,"487":1}}],["04",{"2":{"222":1,"433":1}}],["0deg",{"2":{"169":1}}],["06c9c9",{"2":{"169":1}}],["000",{"2":{"341":1}}],["0001",{"2":{"134":1}}],["000000",{"2":{"345":1}}],["0000",{"2":{"134":7}}],["0",{"0":{"486":1},"1":{"487":1},"2":{"83":2,"118":1,"134":12,"169":1,"222":1,"231":4,"251":1,"291":1,"292":1,"296":1,"301":2,"302":2,"303":1,"308":3,"313":1,"325":2,"329":1,"331":1,"352":1,"358":1,"360":2,"361":2,"376":2,"381":6,"421":5,"427":1,"472":2,"512":2,"557":5}}],["$dirs",{"2":{"421":1}}],["$backup",{"2":{"421":6}}],["$env",{"2":{"421":1}}],["$emit=defineemits",{"2":{"353":1}}],["$emit",{"2":{"124":1,"245":1,"246":2,"353":1}}],["$project",{"2":{"421":3}}],["$props=defineprops",{"2":{"353":1,"356":1}}],["$props",{"2":{"124":1,"169":2,"245":3,"246":2,"255":3,"298":2,"299":2,"316":1,"353":2,"356":2}}],["$github",{"2":{"421":5}}],["$target",{"2":{"421":8}}],["$sessionstorage",{"2":{"367":3}}],["$service",{"2":{"247":2}}],["$store",{"2":{"363":5}}],["$store=usecounterstore",{"2":{"363":1}}],["$store=usestore",{"2":{"215":1}}],["$state",{"2":{"358":4}}],["$root",{"2":{"421":3}}],["$route",{"2":{"319":2,"322":3,"327":3}}],["$router",{"2":{"215":1,"319":3,"320":4,"322":4}}],["$received",{"2":{"247":1}}],["$notifications",{"2":{"215":1}}],["$modals",{"2":{"215":1,"255":11,"256":1}}],["$uri",{"2":{"141":2}}],["$",{"2":{"83":3,"112":2,"215":1,"354":1,"356":1,"359":1,"388":2,"389":2,"392":6,"393":5,"421":15,"429":1,"433":96,"502":2,"503":3}}],["$apikey$",{"2":{"51":6}}],["`~",{"2":{"433":1}}],["`sent",{"2":{"356":1}}],["`$",{"2":{"83":3,"430":4}}],["`",{"2":{"83":3,"356":1,"421":3,"429":1}}],["qbutton",{"2":{"471":1}}],["qa",{"0":{"66":1},"2":{"61":1}}],["quasar",{"2":{"433":2,"457":1}}],["quality",{"0":{"77":1}}],["quiet",{"2":{"433":1}}],["quicktime",{"2":{"199":1}}],["questions",{"2":{"497":1}}],["queue",{"2":{"443":9}}],["queuebuilder",{"2":{"216":1}}],["queryselector",{"2":{"381":1}}],["query",{"2":{"23":1,"320":2,"322":2,"326":4,"327":2,"454":2,"469":1}}],["quot",{"0":{"206":2,"251":2,"399":2},"2":{"2":4,"4":2,"9":2,"11":2,"22":2,"41":6,"59":2,"73":2,"74":4,"86":4,"92":2,"95":2,"102":10,"103":2,"104":4,"105":4,"112":2,"115":4,"116":2,"124":6,"125":2,"134":6,"135":4,"137":4,"147":2,"150":2,"151":6,"152":8,"154":6,"155":2,"156":2,"157":2,"158":4,"159":4,"162":6,"163":4,"164":2,"166":2,"167":2,"168":12,"170":2,"171":2,"173":4,"174":2,"178":2,"179":2,"181":4,"182":4,"183":4,"187":6,"188":2,"196":2,"197":2,"200":6,"201":6,"202":2,"203":4,"204":8,"212":4,"220":2,"222":2,"224":2,"227":8,"229":4,"231":2,"232":6,"241":2,"244":2,"247":8,"249":2,"250":2,"255":4,"256":2,"260":2,"266":2,"270":2,"271":2,"283":2,"291":4,"293":4,"295":2,"296":2,"297":2,"300":2,"302":6,"303":2,"308":4,"313":8,"316":2,"317":6,"319":4,"322":2,"325":30,"329":4,"330":4,"331":8,"336":8,"344":2,"345":4,"346":2,"351":4,"372":4,"373":4,"376":4,"377":4,"380":2,"382":2,"385":4,"390":2,"393":2,"400":2,"434":2,"436":14,"441":2,"443":4,"446":2,"454":2,"460":6,"462":8,"463":4,"464":4,"468":2,"472":6,"473":5,"501":8,"504":2,"507":2,"515":2,"527":14,"536":8,"546":2,"548":2}}],["xshell",{"2":{"433":1}}],["xss",{"2":{"116":1}}],["xo",{"2":{"433":4}}],["xaml",{"2":{"433":2}}],["xdv",{"2":{"433":1}}],["xcode",{"2":{"389":1}}],["xyz",{"2":{"244":1}}],["xmlhttprequest",{"2":{"323":1,"472":1}}],["xml",{"2":{"139":1,"300":1,"323":1,"433":4}}],["xhr",{"2":{"114":1,"511":1}}],["x3c",{"2":{"91":2,"103":8,"104":2,"105":4,"123":9,"139":4,"169":10,"171":8,"201":12,"203":8,"204":8,"206":1,"207":2,"209":2,"210":1,"211":4,"212":8,"226":1,"227":5,"230":9,"231":46,"246":4,"249":54,"251":6,"255":22,"267":2,"292":1,"298":8,"299":7,"302":4,"303":3,"316":20,"319":12,"329":1,"338":1,"343":6,"352":20,"353":10,"356":12,"358":15,"363":14,"367":6,"425":20,"426":7,"427":1,"429":4,"430":8,"433":1,"447":33,"450":2,"452":29,"471":4,"509":10,"513":7,"529":5,"534":8,"538":8,"552":15}}],["x",{"2":{"56":2,"130":1,"150":1,"156":1,"163":1,"193":1,"447":1,"460":2,"519":1}}],["x26",{"2":{"51":2,"83":2,"231":2,"329":2,"343":2,"421":4,"433":1,"447":2,"450":4,"509":2}}],["=+",{"2":{"433":1}}],["==",{"2":{"231":3,"255":1,"421":3}}],["=>return",{"2":{"361":1}}],["=>",{"2":{"171":1,"231":4,"244":5,"250":2,"255":6,"267":2,"292":1,"302":1,"303":16,"313":1,"316":3,"317":3,"319":3,"328":1,"329":1,"331":2,"343":1,"344":2,"356":2,"360":3,"361":2,"366":1,"376":2,"377":2,"378":1,"380":2,"381":2,"421":2,"427":1,"430":2,"437":2,"438":2,"439":1,"443":2,"444":4,"445":4,"447":5,"448":3,"450":4,"452":1,"454":3,"538":1}}],["=",{"0":{"86":1},"2":{"55":4,"70":2,"83":3,"97":1,"103":2,"104":2,"114":5,"120":2,"121":2,"123":6,"124":2,"136":1,"169":1,"171":3,"200":1,"201":1,"204":3,"212":2,"231":5,"244":4,"245":4,"246":4,"247":4,"250":1,"251":1,"255":18,"280":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":3,"288":2,"289":1,"290":2,"292":6,"296":7,"298":1,"299":1,"301":3,"302":12,"303":14,"313":2,"316":1,"319":2,"324":2,"326":2,"327":1,"328":1,"343":7,"344":4,"352":1,"355":1,"358":2,"360":1,"361":3,"362":1,"366":5,"367":1,"376":2,"380":1,"382":1,"421":1,"425":3,"426":1,"427":3,"428":2,"430":3,"431":6,"437":4,"438":1,"439":2,"443":7,"444":2,"445":1,"448":2,"449":1,"450":1,"451":1,"452":3,"454":6,"460":6,"462":1,"463":1,"509":1,"511":3,"512":2,"513":2,"529":1,"538":3}}],["ы",{"2":{"51":1}}],["jl65gwrnqq",{"2":{"529":2}}],["j",{"2":{"432":1}}],["jpg",{"2":{"431":1}}],["jpeg",{"2":{"422":1}}],["jenkins",{"2":{"419":1,"433":2}}],["jest",{"2":{"376":1,"433":10,"461":1}}],["jetbrains",{"2":{"222":1}}],["justify",{"2":{"230":1}}],["jasmine",{"2":{"433":10}}],["jamesives",{"2":{"421":3,"527":1}}],["javascirpt",{"2":{"401":1}}],["javascript",{"0":{"490":1},"2":{"44":1,"115":1,"123":1,"125":1,"170":1,"171":1,"181":1,"199":3,"200":2,"201":3,"202":4,"203":5,"204":4,"206":1,"208":1,"209":1,"210":2,"211":2,"218":1,"221":1,"222":1,"223":2,"224":2,"225":4,"228":2,"231":1,"244":3,"249":1,"264":3,"265":1,"266":1,"267":2,"268":1,"277":1,"279":3,"280":2,"288":1,"291":1,"295":1,"297":1,"300":1,"301":2,"303":1,"304":1,"308":2,"310":1,"319":1,"323":1,"325":1,"331":2,"333":1,"344":1,"357":1,"358":1,"364":1,"366":3,"368":1,"375":1,"376":2,"377":1,"378":2,"379":1,"382":2,"402":1,"408":1,"415":1,"429":1,"432":2,"433":2,"434":1,"436":9,"437":1,"443":1,"448":1,"449":1,"456":1,"457":1,"460":4,"462":2,"463":1,"464":1,"471":3,"472":4,"473":7,"490":1,"504":1,"509":1,"540":1}}],["java",{"2":{"199":1,"204":1,"279":1,"433":1}}],["jane",{"2":{"123":1}}],["jobs",{"2":{"421":2}}],["jo",{"2":{"325":1}}],["john",{"2":{"123":1,"245":1,"536":1}}],["join",{"0":{"47":1},"2":{"48":1,"51":2}}],["jwts",{"2":{"325":1}}],["jwt",{"2":{"116":4,"325":8,"496":2,"545":1}}],["jsself",{"2":{"438":1}}],["jsscripts",{"2":{"384":1}}],["jstest",{"2":{"377":1,"378":1,"383":1}}],["jsif",{"2":{"344":1,"382":1,"437":1}}],["jsimport",{"2":{"55":1,"114":3,"120":2,"121":3,"136":1,"228":2,"231":1,"243":2,"244":1,"247":4,"250":2,"255":3,"281":1,"283":1,"286":1,"287":1,"289":2,"292":2,"313":1,"314":1,"316":1,"319":1,"323":1,"324":1,"327":1,"328":1,"343":1,"345":1,"355":1,"358":1,"360":1,"362":1,"366":1,"376":1,"380":1,"381":1,"428":1,"429":1,"432":1,"439":1,"443":1,"444":1,"445":1,"448":1,"449":1,"450":1,"451":1,"511":1,"538":1}}],["jslint",{"2":{"433":2}}],["jslocalstorage",{"2":{"364":1}}],["jslocation",{"2":{"326":1}}],["jslet",{"2":{"296":1,"303":3,"364":1,"437":1}}],["jsethereum",{"2":{"331":1}}],["jseventbus",{"2":{"316":1}}],["jsexport",{"2":{"122":1,"228":1,"379":1,"382":2,"425":1,"528":1}}],["jsmyfunction",{"2":{"303":1}}],["jsfibonaccisync",{"2":{"302":1}}],["jsf",{"2":{"301":1}}],["jsfunction",{"2":{"290":1,"302":2,"303":1}}],["jsdom",{"2":{"379":3}}],["jsdoc",{"0":{"91":1},"2":{"91":2}}],["jsdescribe",{"2":{"376":1}}],["jsdispatcher",{"2":{"292":1}}],["js$",{"2":{"323":1}}],["js$props",{"2":{"316":1}}],["js$modals",{"2":{"255":1}}],["js$emit",{"2":{"245":1}}],["jsx",{"2":{"249":1,"433":3}}],["jspending",{"2":{"231":1}}],["jsconfig",{"2":{"433":11}}],["jsconsole",{"2":{"297":1,"302":2,"303":1}}],["jsconst",{"2":{"83":1,"97":1,"104":1,"124":1,"244":3,"245":4,"246":2,"247":1,"255":1,"280":1,"284":1,"285":1,"288":1,"326":1,"329":1,"421":1,"431":1,"445":1,"454":1,"460":2}}],["jsclass",{"2":{"281":1,"287":1,"292":1,"294":1}}],["jscreateapp",{"2":{"122":1}}],["jsasync",{"2":{"83":2,"303":1}}],["js",{"0":{"136":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"292":1,"294":1,"296":1,"302":1,"313":1,"314":1,"355":1,"358":1,"361":1,"362":1,"366":1,"376":1,"380":1,"381":1,"398":1,"399":1,"431":1,"438":1,"439":1,"443":1,"444":1,"445":1,"448":1,"449":1,"450":1,"451":1,"454":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1},"2":{"12":1,"54":1,"55":1,"76":1,"91":1,"98":1,"103":1,"112":3,"114":4,"115":3,"116":1,"120":1,"122":1,"148":1,"202":2,"204":1,"222":5,"223":1,"224":4,"225":2,"228":5,"231":2,"235":1,"243":3,"250":3,"255":8,"256":6,"282":1,"284":1,"286":2,"287":5,"292":2,"307":1,"312":1,"313":2,"317":1,"319":1,"320":1,"322":1,"335":1,"344":3,"345":2,"350":1,"361":2,"364":1,"371":1,"374":2,"375":5,"376":2,"378":2,"379":1,"382":2,"383":1,"400":1,"402":1,"404":1,"422":1,"424":1,"429":4,"431":1,"432":3,"433":21,"434":2,"435":1,"437":4,"438":1,"439":1,"443":2,"445":1,"447":1,"452":2,"453":4,"457":2,"459":1,"460":3,"462":1,"463":3,"464":1,"472":1,"473":4,"476":1,"497":1,"498":1,"508":1,"509":1,"511":1,"512":2,"529":3,"555":3}}],["jsonrpc",{"2":{"501":1,"512":6}}],["jsonp",{"2":{"454":3}}],["jsonplaceholder",{"2":{"115":1,"511":1}}],["json5",{"2":{"433":1}}],["jsonc",{"2":{"433":1}}],["jsonmounted",{"2":{"316":1}}],["json`",{"2":{"83":1}}],["json",{"0":{"18":1,"19":1,"38":1,"48":1,"512":1,"554":1},"2":{"6":1,"11":1,"17":5,"18":2,"19":1,"38":1,"47":2,"48":2,"56":1,"76":1,"95":1,"104":2,"109":2,"112":2,"114":1,"115":1,"118":9,"224":3,"280":1,"281":1,"286":1,"324":1,"325":2,"338":4,"341":2,"364":2,"375":3,"383":4,"384":1,"391":1,"421":4,"429":1,"431":4,"432":4,"433":50,"444":1,"447":4,"448":1,"449":1,"450":1,"453":1,"454":5,"472":2,"473":1,"501":5,"504":1,"511":1,"512":6,"538":1,"539":1,"542":1,"554":2}}],["rgba",{"2":{"557":6}}],["richfooter",{"0":{"522":1}}],["right",{"2":{"519":1}}],["rip",{"2":{"462":1}}],["rxdb",{"2":{"446":1}}],["rspack",{"2":{"433":12}}],["rc",{"2":{"433":1}}],["r",{"2":{"421":2,"462":1,"497":2}}],["rf",{"2":{"421":4}}],["rm",{"2":{"421":3}}],["raw",{"2":{"429":2,"431":1,"432":1}}],["ram",{"2":{"402":1}}],["range=ref",{"2":{"361":1}}],["range",{"2":{"360":1,"363":3,"377":1}}],["randomuuid",{"2":{"443":1}}],["random",{"2":{"251":1}}],["radius",{"2":{"169":1}}],["radio",{"2":{"162":1,"452":2}}],["rush",{"2":{"433":1}}],["rust",{"2":{"433":1}}],["rustfmt",{"2":{"433":2}}],["ruby",{"2":{"433":1}}],["ru",{"2":{"433":3,"473":1,"497":2}}],["rules",{"2":{"433":2}}],["rule",{"2":{"151":1}}],["runs",{"2":{"421":2}}],["runcommand",{"2":{"294":1}}],["runlog",{"2":{"247":2}}],["run",{"2":{"136":1,"223":1,"224":4,"226":1,"231":1,"374":1,"375":3,"376":4,"383":1,"384":1,"421":9}}],["roboto",{"2":{"557":1}}],["robots",{"2":{"224":1}}],["rollupjs",{"2":{"228":1}}],["rollup",{"2":{"228":1,"432":2,"433":2}}],["role",{"2":{"116":1}}],["roach",{"0":{"188":1}}],["row",{"2":{"181":1,"509":1}}],["rotate",{"2":{"169":4}}],["root",{"2":{"141":1,"421":1,"431":1,"557":1}}],["route",{"2":{"320":6}}],["routeview",{"2":{"318":3,"319":1}}],["routes",{"0":{"97":1},"2":{"97":2,"136":1,"310":1,"313":3,"423":1,"425":1}}],["routerlink>",{"2":{"316":3,"319":1}}],["routerlink",{"2":{"315":1,"316":4,"318":1,"319":2,"320":1}}],["routerview>",{"2":{"319":4}}],["routerview",{"2":{"315":1,"319":3}}],["routerecordraw",{"2":{"97":1}}],["router",{"0":{"136":1,"312":1,"313":1},"1":{"313":1,"314":1},"2":{"3":1,"23":1,"34":1,"119":1,"135":2,"136":2,"137":1,"139":1,"142":1,"145":1,"146":1,"244":3,"251":1,"306":2,"309":1,"310":2,"312":1,"313":7,"314":3,"316":4,"319":2,"322":2,"327":1,"401":1,"402":1,"411":1,"425":4,"440":1,"504":1,"547":1}}],["routing",{"0":{"7":1,"547":1},"2":{"11":1}}],["rbac",{"2":{"116":1}}],["rtl",{"2":{"460":1,"536":1}}],["rt",{"2":{"116":4,"496":1}}],["rpc",{"0":{"512":1},"2":{"112":1,"114":1,"118":9,"473":1,"501":1,"511":1,"512":5,"542":1}}],["rehydration",{"2":{"472":1}}],["req",{"2":{"454":5}}],["require",{"2":{"454":2}}],["requiresauth",{"2":{"425":1}}],["required",{"2":{"327":1,"421":1}}],["requirements",{"2":{"63":1}}],["requestaccounts",{"2":{"331":1}}],["requestotp",{"2":{"329":1}}],["request",{"2":{"51":3,"114":1,"139":2,"327":1,"331":1,"344":3,"443":2,"445":2,"447":3,"452":1,"454":2}}],["remix",{"2":{"433":2}}],["remote",{"2":{"394":1,"421":7,"433":5}}],["removed",{"2":{"421":1}}],["removed=`ls",{"2":{"421":1}}],["remove",{"2":{"421":2}}],["removeitem",{"2":{"364":1}}],["removeroute",{"2":{"322":1}}],["removeeventlistener",{"2":{"250":1,"267":1}}],["renovate",{"2":{"433":2}}],["rendering",{"2":{"472":1}}],["renderer",{"2":{"436":1}}],["renderwhitespace",{"2":{"433":1}}],["render",{"2":{"422":1}}],["received",{"2":{"452":5}}],["receiver",{"2":{"366":1}}],["recentchange",{"2":{"433":1}}],["recursive",{"2":{"421":1}}],["reilly",{"2":{"403":1}}],["reddit",{"2":{"462":1,"497":1}}],["redis",{"2":{"462":1}}],["redirect",{"2":{"326":1}}],["red",{"2":{"363":3}}],["registertype",{"2":{"345":1}}],["register",{"2":{"344":1,"462":1}}],["re",{"2":{"261":1}}],["reply=>",{"2":{"452":1}}],["replit",{"2":{"433":1}}],["replace",{"0":{"321":1}}],["replacement",{"2":{"223":1}}],["representation",{"2":{"429":1}}],["representational",{"2":{"323":1,"449":1}}],["repo",{"2":{"433":1}}],["repository",{"2":{"388":1}}],["reporter",{"2":{"383":1}}],["repeat",{"0":{"268":1},"2":{"260":1,"294":1}}],["rejects",{"2":{"378":1}}],["reject",{"2":{"241":1,"244":1,"255":6,"303":7,"443":6,"445":1,"448":6,"450":6}}],["readme",{"2":{"433":2}}],["ready",{"2":{"343":4}}],["read",{"2":{"240":1,"462":1}}],["reactivity",{"0":{"365":1},"1":{"366":1,"367":1},"2":{"462":1,"463":2}}],["reactive",{"2":{"123":7,"255":6,"295":1,"349":1,"357":1,"358":3,"366":3,"427":2,"460":6,"462":6,"463":2}}],["react",{"2":{"200":1,"308":1,"463":6,"473":2}}],["release",{"2":{"433":4}}],["releaserc",{"2":{"433":2}}],["related",{"2":{"345":1}}],["relative",{"2":{"105":1}}],["rel",{"2":{"338":1}}],["rel=",{"2":{"226":1,"227":3,"338":1}}],["reload",{"2":{"224":1,"421":1}}],["rewritecond",{"2":{"139":2}}],["rewriterule",{"2":{"139":2}}],["rewritebase",{"2":{"139":2}}],["rewriteengine",{"2":{"139":1}}],["rewrite",{"2":{"139":1}}],["res",{"2":{"454":6}}],["resx",{"2":{"433":2}}],["respondwith",{"2":{"344":1}}],["response",{"2":{"324":2,"326":1,"344":3,"421":2}}],["response=>",{"2":{"324":1}}],["responsibility",{"0":{"265":1},"2":{"260":1}}],["responsive",{"0":{"181":1},"2":{"336":1}}],["result=await",{"2":{"448":1}}],["result=>",{"2":{"328":1,"329":2,"450":2}}],["results",{"2":{"376":2}}],["result",{"2":{"303":8,"328":1,"329":2,"331":2,"376":2,"444":2,"448":3,"450":6}}],["resize",{"2":{"267":3}}],["resolver",{"2":{"432":1,"433":1}}],["resolves",{"2":{"378":3}}],["resolve",{"2":{"228":2,"241":1,"244":3,"255":6,"303":9,"378":1,"432":2,"443":6,"445":2,"448":6,"450":4}}],["resource",{"2":{"117":1,"429":2}}],["restful",{"2":{"323":1,"449":2}}],["rest",{"0":{"52":1,"56":1,"118":2,"511":1},"1":{"53":1,"54":1,"55":1,"56":1},"2":{"40":1,"50":1,"51":3,"56":4,"58":1,"59":2,"109":1,"112":1,"114":1,"118":2,"323":1,"501":1,"511":1,"512":2}}],["ref=",{"2":{"171":1}}],["refresh",{"2":{"116":1,"496":1}}],["ref",{"2":{"103":2,"104":1,"123":6,"171":3,"204":7,"212":2,"231":5,"250":1,"295":1,"324":3,"343":4,"352":2,"356":1,"361":2,"427":1,"447":1,"452":4,"460":7,"462":5,"463":2,"511":1}}],["refactor",{"0":{"91":1},"2":{"91":1}}],["returns",{"2":{"91":4}}],["return",{"2":{"83":4,"91":2,"103":3,"114":1,"122":2,"201":1,"204":2,"231":2,"244":1,"250":1,"251":1,"255":3,"256":3,"281":2,"283":1,"284":1,"285":1,"288":2,"290":2,"292":1,"296":3,"302":1,"303":7,"313":1,"344":2,"358":1,"360":3,"361":4,"366":5,"427":1,"430":2,"431":2,"443":1,"445":1,"448":3,"450":2,"511":1,"512":1}}],["return=minimal",{"2":{"56":1}}],["rdbms",{"2":{"39":1}}],["fcp",{"2":{"472":1}}],["ferferga",{"2":{"462":1}}],["fetish",{"2":{"461":1}}],["fetch",{"2":{"41":1,"114":1,"323":1,"344":2,"421":1,"507":1,"511":1}}],["fps",{"2":{"436":2}}],["fdb",{"2":{"433":1}}],["ftcms",{"2":{"405":1}}],["ftp",{"2":{"143":2}}],["f12",{"2":{"346":2}}],["fnc",{"2":{"457":1,"460":1}}],["fn",{"2":{"292":4,"346":1}}],["flow",{"2":{"493":1}}],["flowconfig",{"2":{"433":2}}],["flake",{"2":{"433":2}}],["flash",{"2":{"199":1}}],["fls",{"2":{"433":1}}],["flipcoin",{"2":{"251":3}}],["flex",{"2":{"108":1,"181":4,"230":2,"231":3,"509":3}}],["flexbox",{"2":{"35":1,"108":1,"181":1,"469":1,"492":2}}],["frequently",{"2":{"497":1}}],["freezed",{"2":{"433":1}}],["free",{"2":{"151":1}}],["framework",{"2":{"295":1,"402":1}}],["frontier",{"2":{"144":1}}],["from",{"2":{"55":4,"91":2,"103":3,"114":9,"120":2,"121":6,"123":1,"136":1,"171":1,"204":2,"212":3,"228":2,"230":1,"231":1,"243":4,"244":4,"247":4,"250":2,"251":2,"255":8,"267":1,"281":2,"283":1,"286":2,"287":4,"289":5,"292":2,"299":1,"313":3,"314":5,"316":2,"319":1,"323":1,"324":2,"327":1,"328":1,"343":1,"345":3,"352":2,"355":1,"356":2,"358":2,"360":1,"361":2,"362":3,"363":1,"366":1,"367":1,"376":3,"380":3,"381":3,"426":1,"427":2,"428":1,"429":3,"430":2,"431":2,"432":2,"439":2,"443":1,"444":1,"445":1,"447":2,"448":1,"449":1,"450":1,"451":1,"452":2,"509":1,"511":2,"512":5,"513":2,"527":1,"538":2}}],["f",{"2":{"139":1,"301":3}}],["family",{"2":{"557":1}}],["fallback",{"2":{"431":1}}],["false",{"2":{"114":1,"162":2,"231":2,"255":2,"329":1,"343":2,"345":1,"360":1,"421":2,"433":27,"444":1,"462":1,"501":4}}],["fail",{"2":{"377":1}}],["fahrenheit",{"2":{"296":7}}],["factory",{"0":{"290":1},"2":{"273":1}}],["facebook",{"2":{"200":1,"328":1,"552":1}}],["façade",{"0":{"300":1},"2":{"260":1,"275":1,"300":1,"303":1,"364":1}}],["fa",{"2":{"227":2,"231":6}}],["favicon",{"2":{"224":1}}],["favourites",{"2":{"91":2,"97":3,"103":7,"104":3,"105":1}}],["favorite",{"2":{"91":3}}],["faq",{"2":{"177":1,"421":1,"497":1}}],["fix",{"2":{"433":1}}],["fixall",{"2":{"433":2}}],["field",{"2":{"431":2}}],["finance",{"2":{"536":1}}],["finally",{"2":{"303":2,"447":2}}],["find",{"2":{"381":4,"433":1,"538":1}}],["fingerprint",{"2":{"116":1}}],["fibonaccioutput",{"0":{"380":1},"2":{"374":2,"379":1,"380":3}}],["fibonacciinput",{"0":{"381":1},"2":{"374":2,"381":3}}],["fibonacci",{"0":{"376":1},"2":{"374":2,"375":3,"376":12,"377":2}}],["fibonaccipromise",{"2":{"303":2,"376":2,"378":2}}],["fibonacciasync",{"2":{"302":2}}],["fibonaccisync",{"2":{"302":3}}],["fill",{"2":{"430":1}}],["filter",{"2":{"231":2,"256":1}}],["filenesting",{"2":{"433":3}}],["filename2",{"2":{"390":1}}],["filename1",{"2":{"390":1}}],["filename",{"2":{"139":2,"244":1,"431":10,"437":1}}],["filelistlayout",{"2":{"433":1}}],["file=",{"2":{"421":1}}],["filehippo",{"2":{"195":2}}],["filezilla",{"2":{"143":1}}],["file",{"2":{"143":1,"152":1,"390":1,"421":2,"433":2}}],["files",{"2":{"112":1,"141":1,"224":1,"421":1,"433":3}}],["fi",{"2":{"178":1,"421":2}}],["fitts",{"2":{"156":1}}],["fira",{"2":{"433":1}}],["first",{"2":{"181":1,"215":1,"433":1,"534":1,"555":1}}],["firstname",{"2":{"47":1}}],["firesbase",{"2":{"545":1}}],["firestore",{"2":{"473":1}}],["firefox",{"2":{"125":1,"222":1,"402":1,"436":1}}],["firebase",{"2":{"39":2,"41":1,"115":2,"422":2,"433":4,"545":1}}],["font",{"2":{"557":1}}],["fontweight",{"2":{"433":1}}],["fontligatures",{"2":{"433":1}}],["fontfamily",{"2":{"433":1}}],["fontaliasing",{"2":{"433":1}}],["fontawesome",{"0":{"227":1},"2":{"227":6}}],["fonts",{"2":{"345":1,"555":1}}],["found",{"2":{"344":3}}],["foundation",{"2":{"144":1}}],["foot",{"2":{"336":1}}],["footers",{"0":{"520":1},"1":{"521":1,"522":1,"523":1,"524":1,"525":1}}],["footer>",{"2":{"255":2}}],["footer",{"0":{"32":1},"2":{"28":1,"112":1,"501":2,"508":2,"542":1,"545":1}}],["folder",{"2":{"421":1}}],["fold",{"2":{"183":1}}],["fork",{"2":{"495":1}}],["foreign",{"2":{"462":1}}],["foreach",{"2":{"444":1}}],["formulate",{"2":{"433":10}}],["formkit",{"2":{"433":10}}],["formatters",{"2":{"460":2}}],["formatter",{"2":{"433":1}}],["formatting",{"2":{"433":1,"460":1}}],["formatonsave",{"2":{"433":1}}],["format",{"2":{"421":3,"433":2}}],["forward",{"2":{"322":1}}],["for=",{"2":{"171":1,"209":1,"231":2,"316":1,"319":1,"447":1}}],["for",{"0":{"209":1,"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"55":1,"112":1,"134":1,"151":1,"158":1,"171":1,"181":2,"209":1,"212":1,"231":2,"260":1,"292":1,"302":2,"303":1,"421":1,"431":2,"433":1,"472":1,"501":1}}],["fullscreen",{"2":{"339":2}}],["fullpath",{"2":{"322":1}}],["function",{"2":{"91":4,"103":4,"171":1,"231":2,"247":1,"250":2,"251":1,"255":1,"256":1,"267":1,"296":2,"303":1,"324":1,"328":1,"329":3,"343":3,"352":1,"353":1,"356":2,"358":1,"361":2,"366":2,"376":2,"427":3,"431":3,"444":1,"447":4,"452":1,"529":1,"538":1}}],["functions",{"2":{"40":1,"115":2,"462":1}}],["fu",{"2":{"23":1,"433":1,"504":1}}],["l",{"2":{"139":2,"182":1,"292":2,"538":2}}],["learn",{"2":{"473":1}}],["learning",{"2":{"151":1}}],["leex",{"2":{"433":1}}],["less",{"2":{"433":1}}],["lerna",{"2":{"391":1,"433":2}}],["level",{"2":{"174":6}}],["let",{"0":{"144":1},"2":{"131":1,"144":3,"145":1,"290":1,"292":2,"302":4,"303":3,"329":1,"337":1,"366":2,"376":1,"381":2,"416":1,"431":1,"437":1,"443":2,"448":2}}],["length==0",{"2":{"231":1}}],["length",{"2":{"103":1,"105":1,"231":6,"292":1,"431":2}}],["left",{"2":{"51":1,"231":2}}],["lts",{"2":{"222":1,"402":1}}],["lt",{"2":{"91":1,"122":1,"224":1,"230":1,"251":1,"316":3,"361":1,"393":4,"433":1}}],["license",{"2":{"433":1}}],["limit",{"2":{"433":3}}],["lib",{"2":{"433":1}}],["live",{"2":{"382":1}}],["life",{"2":{"204":1}}],["lifecycle",{"2":{"61":1}}],["lintstagedrc",{"2":{"433":2}}],["lint",{"2":{"433":4}}],["lineno",{"2":{"437":1}}],["linenumbers",{"2":{"433":1}}],["line",{"2":{"433":1}}],["lines",{"0":{"319":1}}],["linear",{"2":{"169":1}}],["link",{"2":{"226":2,"227":3,"338":1,"405":1}}],["linux",{"0":{"388":1},"2":{"137":2,"140":3,"143":1,"164":1,"222":2,"336":1,"346":1,"386":2,"388":1,"402":5,"433":1,"436":1}}],["lighthouserc",{"2":{"433":20}}],["lighthouse",{"0":{"346":1},"2":{"334":1,"346":3,"347":1}}],["light",{"2":{"112":1,"231":1,"249":1}}],["like",{"2":{"91":1,"462":2}}],["listening",{"2":{"454":1}}],["listen",{"2":{"141":1,"454":1}}],["list",{"2":{"91":3,"229":1,"231":8,"432":1,"433":1}}],["listfavourites",{"2":{"91":3,"103":5,"104":1,"105":1}}],["latexmk",{"2":{"433":1}}],["latest",{"2":{"223":1,"421":2}}],["landing",{"2":{"313":5,"316":1}}],["lang",{"2":{"340":1}}],["language",{"2":{"215":1,"239":1,"433":1}}],["lang=",{"2":{"86":1,"103":1,"203":1,"430":1,"509":1,"513":1,"538":1}}],["lastindexof",{"2":{"431":2}}],["last",{"2":{"245":2,"433":1}}],["lastname",{"2":{"47":1}}],["label+",{"2":{"299":1}}],["label",{"2":{"231":3,"298":4,"299":1}}],["label>",{"2":{"231":4,"452":4}}],["law",{"2":{"156":1}}],["lamda",{"2":{"115":1}}],["lambda",{"2":{"115":1}}],["layer",{"2":{"112":1,"324":1,"501":1}}],["layouts",{"2":{"423":1}}],["layout",{"0":{"108":1},"2":{"27":1,"36":1,"112":1,"249":1,"319":1,"501":2,"542":1,"545":1,"548":1,"557":1}}],["lot",{"2":{"433":1}}],["lof",{"2":{"433":1}}],["loadnotes",{"2":{"447":4}}],["loadicons",{"2":{"431":2}}],["loadingerror",{"2":{"244":2}}],["loadingcomponent",{"2":{"244":3}}],["loading",{"2":{"114":2,"207":3,"426":2,"427":2}}],["loadproject",{"2":{"316":2}}],["loaderset",{"2":{"427":4}}],["loaderbar",{"2":{"426":1}}],["loader",{"2":{"244":2,"426":1}}],["lock",{"2":{"224":1,"433":13}}],["location",{"2":{"141":2,"326":1,"421":1}}],["locale",{"2":{"538":3}}],["locales",{"2":{"538":3}}],["local",{"2":{"391":1}}],["localstore",{"2":{"364":1}}],["localstoragename",{"2":{"421":3}}],["localstorage",{"2":{"104":4,"116":2,"311":1,"316":1,"343":1,"364":4,"369":2,"421":3,"557":1}}],["localhost",{"2":{"134":1,"223":1,"344":1,"450":1,"454":2}}],["lookup",{"2":{"440":1}}],["loopback",{"2":{"134":3}}],["loosely",{"2":{"2":1}}],["logic",{"2":{"462":2}}],["login",{"2":{"97":1,"462":1}}],["logs",{"2":{"421":1,"433":1}}],["log",{"2":{"247":1,"281":1,"296":1,"297":1,"302":7,"303":8,"324":2,"331":2,"391":6,"421":1,"433":1,"437":1,"438":1,"454":1,"460":1}}],["logmessage",{"2":{"247":2}}],["logout",{"2":{"114":1,"462":1}}],["low",{"2":{"39":1}}],["шпаргалки",{"0":{"488":1},"1":{"489":1,"490":1,"491":1,"492":1,"493":1,"494":1}}],["шкалы",{"2":{"436":1}}],["шкале",{"2":{"297":1}}],["шлюз",{"2":{"278":1}}],["шлюза",{"2":{"277":1}}],["шнайдермане",{"2":{"158":1}}],["шнайдерман",{"2":{"158":1}}],["шнайдермана",{"0":{"158":1}}],["шестнадцатеричных",{"2":{"134":1}}],["шифрующая",{"2":{"325":1}}],["шифрованного",{"2":{"324":1}}],["шифрования",{"2":{"144":2,"325":1}}],["шину",{"2":{"353":1,"354":1}}],["шины",{"0":{"354":1},"1":{"355":1,"356":1},"2":{"349":1,"354":1,"355":1,"357":1}}],["шиной",{"2":{"316":1,"354":1}}],["шина",{"2":{"118":1,"354":1,"369":1}}],["широкие",{"2":{"323":1}}],["широкий",{"2":{"149":2,"282":1}}],["широком",{"2":{"294":1,"440":1}}],["широкое",{"2":{"147":1,"227":1}}],["широко",{"2":{"137":1,"138":1,"177":1,"182":1,"193":1,"276":1,"303":1,"324":1}}],["широкого",{"2":{"41":1,"176":1,"507":1}}],["ширина",{"2":{"548":1}}],["ширине",{"2":{"181":1}}],["ширину",{"2":{"108":1,"173":1,"231":1}}],["ширины",{"2":{"108":1}}],["шторки",{"2":{"542":1}}],["шторка",{"2":{"542":1}}],["шторок",{"2":{"514":1}}],["штраф",{"2":{"449":1}}],["штатном",{"2":{"433":1}}],["штатную",{"2":{"95":1}}],["штата",{"2":{"317":1}}],["штатов",{"2":{"317":1}}],["штат",{"2":{"317":1}}],["штабелируемыми",{"2":{"297":1}}],["штука",{"2":{"118":1}}],["штукатурки",{"2":{"26":1}}],["шаге",{"2":{"240":1,"297":1,"325":1,"327":1,"328":1}}],["шагу",{"2":{"238":1}}],["шагом",{"2":{"223":1,"226":1,"230":1,"237":1,"240":1,"326":1,"329":1,"334":1,"390":1,"409":1,"443":1,"446":1}}],["шагов",{"2":{"61":1,"131":1,"144":1,"168":1,"222":1,"324":1,"328":1,"331":1,"394":1}}],["шаги",{"2":{"221":1,"222":2,"223":1,"226":1,"234":1,"255":1,"325":1,"393":1,"394":2}}],["шаг",{"0":{"239":1,"240":1,"241":1},"2":{"134":1,"147":1,"182":1,"223":1,"232":1,"237":1,"238":1,"239":1,"240":1,"241":1,"256":1,"297":1,"328":1,"330":2,"362":1,"393":1,"409":1,"436":1,"472":1}}],["шагах",{"2":{"158":1}}],["шагами",{"2":{"144":1}}],["шага",{"2":{"61":1}}],["шаблонная",{"2":{"375":1}}],["шаблонные",{"0":{"315":1}}],["шаблонным",{"2":{"183":1}}],["шаблону",{"2":{"182":1,"254":1,"256":1,"300":1,"343":1,"441":1,"442":1,"462":1}}],["шаблоном",{"2":{"167":1,"255":1,"291":1,"295":1,"305":1,"319":1,"368":1}}],["шаблонов",{"0":{"241":1,"272":1,"323":1,"354":1},"1":{"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"355":1,"356":1},"2":{"147":3,"150":1,"163":2,"172":1,"178":2,"183":1,"184":1,"196":1,"197":1,"198":2,"221":1,"235":1,"238":1,"240":1,"241":1,"247":1,"248":1,"260":3,"270":1,"271":2,"272":2,"276":2,"281":1,"289":1,"308":1,"330":1,"334":1,"343":1,"349":1,"364":1,"365":1,"400":1,"440":1}}],["шаблона",{"2":{"164":1,"165":1,"168":1,"170":3,"171":1,"182":2,"204":1,"221":1,"225":1,"231":1,"247":2,"249":5,"251":2,"255":1,"271":1,"279":2,"291":1,"293":2,"294":1,"295":2,"297":2,"299":1,"300":2,"302":2,"316":1,"329":1,"352":1,"354":1,"356":1,"357":1,"364":1,"365":1,"391":1,"434":1,"439":1,"440":2,"441":1,"456":1,"506":1,"508":1,"545":1}}],["шаблонам",{"2":{"150":1,"160":1,"347":1,"351":1,"472":1}}],["шаблонами",{"0":{"365":1},"1":{"366":1,"367":1},"2":{"147":1,"159":1,"185":1,"194":1,"276":1,"278":1,"290":1,"296":1,"303":1,"349":1,"434":1,"455":1}}],["шаблонах",{"2":{"150":1,"226":1,"230":1,"235":1,"300":1,"400":1}}],["шаблоны",{"0":{"147":1,"160":1,"172":1,"180":1,"184":1,"185":1,"260":1,"273":1,"274":1,"275":1,"276":1,"398":1,"408":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":2,"162":2,"163":2,"164":2,"165":2,"166":2,"167":2,"168":2,"169":2,"170":2,"171":2,"172":1,"173":2,"174":2,"175":2,"176":2,"177":2,"178":2,"179":2,"180":1,"181":2,"182":2,"183":2,"184":2,"185":1,"186":2,"187":2,"188":2,"189":2,"190":2,"191":2,"192":2,"193":2,"194":2,"195":2,"196":2,"197":1,"198":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1},"2":{"128":1,"147":1,"150":1,"154":1,"159":2,"163":2,"168":1,"172":1,"180":1,"184":4,"185":1,"198":2,"199":1,"212":1,"235":1,"237":1,"241":4,"243":1,"249":1,"250":1,"256":1,"258":2,"259":1,"260":1,"271":2,"272":1,"275":1,"296":1,"304":4,"305":2,"310":1,"322":1,"323":1,"333":1,"349":1,"350":1,"354":1,"363":1,"365":1,"400":1,"408":1,"417":1,"439":1,"440":1,"441":1,"442":1,"443":1}}],["шаблоне",{"2":{"86":1,"171":1,"196":1,"204":5,"232":1,"250":1,"255":1,"256":1,"297":3,"300":1,"315":1,"322":1,"343":1,"353":1,"356":1,"358":1,"429":1,"441":1,"442":1,"452":1,"504":1}}],["шаблон",{"0":{"271":1,"277":1,"282":1,"290":1,"291":1,"293":1,"295":1,"297":1,"300":1,"301":1,"303":1,"440":1,"441":1},"1":{"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"292":1,"294":1,"296":1,"298":1,"299":1,"302":1},"2":{"41":1,"103":1,"161":1,"163":1,"164":3,"165":1,"166":1,"167":2,"173":1,"177":2,"178":5,"181":1,"182":4,"186":1,"187":1,"188":1,"191":2,"194":1,"204":1,"221":1,"227":1,"230":1,"231":2,"241":2,"246":3,"248":1,"252":1,"271":2,"273":3,"274":2,"275":3,"276":2,"277":1,"278":1,"281":2,"282":1,"287":1,"289":1,"290":1,"291":2,"292":1,"293":1,"294":2,"295":3,"296":2,"297":3,"299":2,"300":4,"301":3,"302":1,"303":2,"305":1,"329":3,"353":2,"354":2,"356":2,"357":1,"359":1,"367":1,"380":1,"423":1,"434":1,"440":7,"441":1,"452":1,"462":1,"463":2,"471":1}}],["шрифта",{"2":{"226":1}}],["шрифтами",{"2":{"153":1,"227":1}}],["шрифты",{"2":{"224":1,"227":5,"233":1}}],["шрифтом",{"2":{"186":1,"231":1}}],["шрифтовых",{"2":{"227":1}}],["шрифтов",{"2":{"153":1,"225":3,"227":3,"229":1}}],["шрифт",{"2":{"26":1,"153":1}}],["цукерберг",{"2":{"463":1}}],["цитата",{"2":{"471":1}}],["цикле",{"2":{"436":1}}],["цикл",{"2":{"209":1,"267":1,"344":1}}],["циклу",{"2":{"209":1}}],["цикла",{"2":{"204":1,"209":1,"250":1,"267":2,"287":1,"316":1,"319":1,"356":1}}],["цифровыми",{"2":{"331":1}}],["цифрой",{"2":{"165":1,"170":1}}],["цифра",{"2":{"165":1}}],["цифры",{"2":{"134":1}}],["цветом",{"2":{"346":1,"376":1}}],["цветовой",{"2":{"151":1}}],["цветов",{"2":{"149":1,"151":1,"161":1,"336":1}}],["цветовые",{"2":{"26":1,"545":1}}],["цвет",{"2":{"151":2,"162":1,"169":1,"227":1,"230":1,"340":2}}],["цветами",{"2":{"227":1,"343":1}}],["цветах",{"2":{"162":1}}],["цвета",{"2":{"151":2,"152":1,"161":1,"336":1,"376":1}}],["царька",{"2":{"102":1}}],["цепляемыми",{"2":{"297":1}}],["цепочечный",{"2":{"376":1}}],["цепочечными",{"2":{"121":1,"376":1}}],["цепочку",{"2":{"288":1,"302":1,"303":2}}],["цепочке",{"2":{"201":1,"303":1}}],["ценность",{"2":{"396":1,"397":1}}],["цене",{"2":{"331":1}}],["ценовые",{"2":{"191":1}}],["цена",{"2":{"190":1}}],["цен",{"0":{"190":1}}],["центов",{"2":{"134":1}}],["централизованным",{"2":{"358":1}}],["централизованное",{"2":{"369":1}}],["централизованного",{"2":{"349":1,"358":2}}],["централизованному",{"2":{"249":1,"316":1}}],["центральный",{"2":{"359":1,"365":1,"395":1}}],["центральном",{"2":{"395":1}}],["центрального",{"2":{"363":1,"368":1}}],["центральное",{"2":{"235":1,"359":2,"363":1}}],["центральной",{"2":{"31":1,"547":1}}],["центральную",{"2":{"151":1}}],["центральная",{"2":{"28":1}}],["центрирования",{"2":{"230":1}}],["центре",{"2":{"223":1}}],["центру",{"2":{"166":1,"230":1}}],["центр",{"2":{"116":1}}],["цены",{"2":{"134":1,"190":1,"191":1}}],["целях",{"2":{"449":1}}],["целями",{"2":{"63":1,"156":1}}],["целям",{"2":{"62":1,"223":1}}],["целый",{"2":{"336":1,"394":1,"395":1}}],["целые",{"2":{"271":1,"372":1}}],["целая",{"2":{"276":1}}],["целостного",{"2":{"385":1}}],["целое",{"2":{"202":1,"266":1,"322":1,"372":1,"374":1}}],["целого",{"2":{"171":1}}],["целом",{"2":{"62":1,"144":1,"232":1,"238":1,"255":1,"270":1,"300":1,"330":1,"336":1,"433":1,"440":1,"471":1,"472":2,"473":1}}],["целесообразным",{"2":{"453":1}}],["целесообразность",{"2":{"461":1}}],["целесообразно",{"2":{"423":1,"456":1}}],["целевую",{"2":{"316":1}}],["целевые",{"2":{"341":1}}],["целевым",{"2":{"295":1}}],["целевых",{"2":{"181":1,"336":1}}],["целевая",{"2":{"295":1,"311":2}}],["целевого",{"2":{"297":1,"298":2,"299":1}}],["целевому",{"2":{"164":1,"295":1,"297":1,"299":1,"331":1}}],["целевом",{"2":{"164":1}}],["целевое",{"2":{"136":1}}],["целевой",{"2":{"134":1,"295":4,"296":2,"297":1,"331":1,"393":1}}],["целей",{"2":{"149":2,"150":1,"199":1,"227":2,"271":1,"323":1,"331":1,"363":1,"364":1,"439":1,"440":1}}],["цели",{"0":{"75":1,"76":1,"508":1},"1":{"76":1,"77":1,"78":1,"79":1},"2":{"156":5,"159":1,"263":1,"421":1,"462":1}}],["целиком",{"2":{"26":1}}],["цельсия",{"2":{"295":1}}],["целью",{"2":{"68":1,"185":1,"187":1,"191":1,"195":1,"196":1,"296":1,"319":1,"356":1,"372":1,"374":1}}],["цель",{"0":{"72":1},"2":{"62":1,"74":1,"131":1,"149":2,"159":1,"168":1,"178":1,"201":1,"229":1,"295":2,"297":3,"316":1,"381":1}}],["bzl",{"2":{"433":1}}],["bbl",{"2":{"433":1}}],["bit",{"2":{"462":1}}],["bitkeeper",{"2":{"385":1,"386":1}}],["binance",{"2":{"331":1}}],["bind",{"0":{"206":1},"2":{"206":1}}],["by",{"2":{"356":1,"376":2,"421":1}}],["blg",{"2":{"433":1}}],["blame",{"2":{"433":3}}],["black",{"2":{"231":1}}],["blue",{"2":{"230":1,"231":4}}],["bloc",{"2":{"433":1}}],["blockchain",{"2":{"331":1}}],["block",{"2":{"169":1}}],["blog",{"2":{"125":1}}],["b",{"2":{"200":3,"303":7,"392":1,"393":1,"460":2}}],["built",{"2":{"211":1,"212":2,"251":1}}],["builddata",{"2":{"421":4}}],["build",{"2":{"125":1,"136":1,"224":1,"375":2,"421":10,"432":1,"433":4,"527":2}}],["bundleconfig",{"2":{"433":2}}],["bundle",{"2":{"202":1,"432":3}}],["bundler",{"2":{"202":1}}],["button>вариант",{"2":{"249":2}}],["button>option",{"2":{"249":2}}],["button>",{"2":{"211":2,"212":1,"231":2,"249":4,"255":2,"343":1,"352":1,"353":1,"356":1,"358":2,"363":2,"447":1,"452":1,"538":1}}],["button",{"2":{"162":1,"211":2,"212":1,"231":4,"255":2,"343":1,"352":1,"353":1,"356":1,"358":2,"363":2,"381":2,"447":1,"452":1,"471":1,"538":2}}],["business",{"0":{"440":1},"2":{"434":1,"439":1,"440":5,"442":1,"456":1,"462":2}}],["bus",{"0":{"356":1},"2":{"118":1,"353":2}}],["brew",{"2":{"389":1}}],["break",{"2":{"294":3,"296":2}}],["breaking",{"2":{"129":1}}],["breadcrumbs",{"0":{"174":1},"2":{"108":1}}],["bracketpairs",{"2":{"433":1}}],["branches",{"2":{"421":2}}],["branching",{"2":{"391":1}}],["branch",{"2":{"386":1,"391":1,"392":8,"393":1,"421":1,"527":2}}],["brands",{"2":{"227":3}}],["brave",{"2":{"222":1}}],["br>",{"2":{"123":1,"358":1}}],["browserslist",{"2":{"433":2}}],["browser",{"2":{"116":1,"339":1,"402":1,"433":1}}],["box",{"2":{"509":4}}],["boilerplate",{"2":{"508":1}}],["bound",{"2":{"462":2}}],["boundary",{"2":{"433":1}}],["bower",{"2":{"433":3}}],["bottombar",{"2":{"231":1}}],["bootstrap",{"2":{"225":1}}],["boolean",{"2":{"103":1,"231":1,"443":1}}],["border",{"2":{"169":3,"231":2,"249":1,"509":1,"557":1}}],["body>",{"2":{"201":2}}],["body",{"2":{"23":1,"201":2,"224":1,"225":1,"454":1,"509":1,"556":1}}],["be",{"2":{"421":2,"433":1,"509":1}}],["beforeinstallprompt",{"2":{"343":3}}],["before",{"2":{"302":4,"303":2}}],["below",{"2":{"183":1}}],["bento",{"2":{"176":1}}],["bearer",{"2":{"51":3,"56":3,"328":2}}],["best",{"0":{"399":1},"2":{"22":1,"148":1,"235":1,"255":1,"256":1,"307":1,"335":1,"350":1,"371":1,"404":1,"435":1,"473":2,"476":1,"497":1}}],["babel",{"2":{"433":10}}],["babelrc",{"2":{"433":10}}],["bazelproject",{"2":{"433":1}}],["bazelignore",{"2":{"433":1}}],["bazelrc",{"2":{"433":1}}],["bazel",{"2":{"433":3}}],["banner",{"2":{"429":1}}],["band",{"2":{"154":1}}],["bash$",{"2":{"501":1}}],["bashpnpm",{"2":{"501":1}}],["basic",{"0":{"352":1,"353":1,"360":1}}],["basetoggle",{"2":{"543":1}}],["baseurl",{"2":{"512":1}}],["baseurl=",{"2":{"450":1}}],["baseinput",{"2":{"466":1}}],["baseicon",{"0":{"430":1,"513":1},"2":{"98":1,"105":3,"429":2,"432":2,"513":5,"543":1}}],["baseiconbutton",{"2":{"85":2}}],["basebutton",{"2":{"423":1,"466":1,"471":2}}],["base64urlencode",{"2":{"325":2}}],["base64",{"2":{"325":3,"429":1}}],["based",{"2":{"116":3,"446":1}}],["base",{"0":{"528":1},"2":{"112":1,"430":1,"528":2,"557":1}}],["bar",{"2":{"249":1}}],["bars",{"0":{"168":1},"1":{"169":1},"2":{"173":2}}],["backers",{"2":{"433":1}}],["backend",{"2":{"39":1,"115":1,"325":1}}],["backroute",{"2":{"425":1}}],["backups",{"2":{"421":1}}],["backup",{"2":{"421":8}}],["background",{"2":{"340":1,"341":1,"345":1}}],["back",{"2":{"174":1,"322":1}}],["badge",{"2":{"85":1,"103":1,"165":1,"353":1}}],["baas",{"0":{"37":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"39":1,"115":5}}],["two",{"2":{"472":1}}],["twitter",{"2":{"328":1,"552":8}}],["turbo",{"2":{"433":2}}],["tmp",{"2":{"433":1}}],["tdd",{"0":{"372":1},"2":{"370":1,"372":2,"374":1}}],["ttf",{"2":{"345":1}}],["t",{"0":{"268":1},"2":{"182":1,"260":1,"432":3,"462":2,"498":1,"504":1,"536":2,"538":2}}],["trevis",{"2":{"419":1}}],["tree",{"2":{"148":1,"307":1,"335":1,"350":1,"371":1,"431":1,"433":3,"435":1,"462":2,"465":1}}],["tr",{"2":{"338":1}}],["travis",{"2":{"433":2}}],["traffic",{"2":{"336":1}}],["transactions",{"2":{"536":1}}],["transport",{"2":{"511":1}}],["translate",{"2":{"473":1}}],["transitiongroup",{"2":{"212":1}}],["transition",{"2":{"212":1}}],["transformer",{"2":{"433":1}}],["transform",{"2":{"169":2,"463":1}}],["transfer",{"2":{"143":1,"144":1,"323":1,"421":1,"449":1}}],["tricks",{"0":{"519":1}}],["triggerexpansionontab",{"2":{"433":1}}],["triggerevent",{"2":{"171":4}}],["trigger",{"2":{"381":1}}],["trivago",{"2":{"336":1}}],["try",{"2":{"141":1,"151":1,"287":1,"303":2,"377":1,"448":3}}],["true",{"2":{"114":1,"162":1,"207":2,"231":1,"244":1,"255":1,"313":2,"317":2,"343":2,"345":1,"361":1,"366":1,"421":1,"425":1,"431":2,"433":61,"444":1,"501":4}}],["txtlogs",{"2":{"391":1}}],["txthome",{"2":{"174":2}}],["txtserver",{"2":{"141":1}}],["txt",{"2":{"134":1,"224":1,"433":1}}],["typ",{"2":{"325":1}}],["typicode",{"2":{"115":1,"511":1}}],["types",{"2":{"432":1,"493":1}}],["typescript",{"0":{"493":1},"2":{"23":2,"92":1,"118":1,"203":1,"223":1,"363":1,"432":3,"433":6,"462":2,"493":4,"504":1}}],["type=",{"2":{"210":1,"231":3,"447":1,"452":3,"538":1}}],["typedoc",{"2":{"433":2}}],["typed",{"2":{"91":1}}],["type",{"2":{"56":1,"91":1,"161":1,"231":1,"245":2,"255":2,"290":2,"326":1,"341":1,"345":3,"421":1,"430":7,"512":1,"552":1}}],["terserrc",{"2":{"433":10}}],["terminal",{"2":{"222":1,"433":5}}],["tex",{"2":{"433":1}}],["textlint",{"2":{"433":2}}],["text=abc",{"2":{"316":1}}],["text",{"2":{"210":1,"222":1,"231":12,"249":2,"316":1,"380":1,"383":2,"447":5,"452":1,"557":6}}],["textarea>",{"2":{"447":1}}],["textarea",{"2":{"161":1,"210":1,"447":1}}],["testnet",{"2":{"512":1}}],["testjsonrpc",{"2":{"512":1}}],["testrest",{"2":{"511":2}}],["testservice",{"2":{"444":4,"449":1,"451":1}}],["tests",{"0":{"376":1,"380":1,"381":1},"2":{"375":4}}],["testing",{"2":{"370":1,"372":2,"374":1,"402":1}}],["test",{"0":{"376":1,"379":1,"380":1,"381":1,"445":1},"1":{"380":1,"381":1},"2":{"370":1,"373":1,"375":7,"376":10,"378":2,"379":5,"380":5,"381":3,"382":2,"383":1,"384":2,"433":1,"444":1,"445":2,"452":1,"454":2,"461":1,"538":1}}],["temperature",{"2":{"296":5}}],["template",{"2":{"105":1,"203":1,"249":8,"534":3}}],["template>",{"2":{"103":2,"123":2,"169":2,"171":2,"203":2,"212":2,"230":2,"249":9,"251":2,"255":2,"298":2,"299":2,"316":2,"352":2,"353":2,"356":2,"358":2,"363":2,"367":2,"425":6,"426":2,"430":2,"447":2,"452":2,"471":2,"513":2,"534":2,"538":2}}],["team",{"2":{"154":1}}],["teleport",{"2":{"128":1,"212":1}}],["telegram",{"2":{"73":1,"308":1}}],["threshold",{"2":{"534":2}}],["throw",{"2":{"287":1,"376":1,"377":1,"421":1}}],["that",{"2":{"91":2,"462":4}}],["there",{"2":{"439":1,"462":1}}],["themetoggle",{"2":{"557":1}}],["themes",{"2":{"508":1,"545":1}}],["theme",{"2":{"340":1,"341":1,"345":1,"543":1}}],["thenable",{"2":{"303":1}}],["then",{"2":{"255":1,"303":13,"324":1,"328":1,"329":2,"331":1,"421":4,"444":1,"445":1,"447":2,"450":2,"452":1}}],["the",{"0":{"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"91":5,"158":1,"183":1,"260":1,"295":1,"376":4,"421":2,"429":2,"431":1,"433":1,"472":1}}],["this",{"2":{"91":2,"203":1,"204":6,"281":2,"285":1,"287":1,"288":3,"292":9,"322":2,"360":4,"366":3,"433":3}}],["tazerc",{"2":{"433":2}}],["tauri",{"2":{"313":1}}],["target",{"2":{"296":6,"366":7,"421":15,"432":1}}],["tail",{"2":{"421":1}}],["tails",{"2":{"251":4}}],["tailwind",{"2":{"225":2,"433":10,"471":2}}],["tasks",{"2":{"231":2,"433":2}}],["task",{"2":{"216":1,"231":1}}],["tabs",{"2":{"433":1}}],["tabsize",{"2":{"433":1}}],["tab",{"2":{"89":1}}],["table",{"0":{"45":1,"46":1,"47":1}}],["tablet",{"2":{"23":1,"95":1,"509":4,"546":2,"548":1}}],["tags",{"2":{"112":1,"501":1,"506":1,"552":2}}],["tag",{"0":{"87":1,"106":1},"2":{"529":2}}],["tsup",{"2":{"433":2}}],["tslint",{"2":{"433":2}}],["tsdoc",{"2":{"433":11}}],["tsdk",{"2":{"433":1}}],["tsx",{"2":{"433":3}}],["tsconfig",{"2":{"432":2,"433":11}}],["tsc",{"2":{"432":1}}],["tsimport",{"2":{"427":1}}],["ts",{"0":{"83":1,"427":1},"2":{"103":2,"104":1,"112":1,"203":1,"382":1,"433":33,"462":1,"509":1,"511":1,"512":2,"513":3,"518":1,"528":1,"538":2}}],["tip",{"2":{"460":1,"463":1}}],["tidy",{"2":{"433":1}}],["tinder",{"2":{"336":2}}],["time",{"2":{"325":1,"329":1}}],["timeout",{"2":{"244":3}}],["times",{"2":{"231":1}}],["timestamp",{"2":{"47":1}}],["titlebarstyle",{"2":{"433":1}}],["title=",{"2":{"246":1,"255":1,"299":1,"352":3}}],["title",{"2":{"0":1,"17":1,"18":1,"19":1,"51":3,"83":4,"246":2,"255":4,"353":2,"356":3,"447":5,"448":2,"552":4}}],["toarray",{"2":{"448":2}}],["toml",{"2":{"433":10}}],["toc",{"2":{"433":1}}],["tocontain",{"2":{"380":1}}],["tool",{"2":{"433":3}}],["toolchain",{"2":{"433":1}}],["tools",{"2":{"402":1}}],["tooltips",{"0":{"164":1}}],["tothrow",{"2":{"377":1}}],["total",{"2":{"214":1,"215":1}}],["toequal",{"2":{"376":1,"381":1}}],["tobegreaterthan",{"2":{"376":1}}],["tobe",{"2":{"376":8,"378":1,"381":2}}],["tostring",{"2":{"326":1}}],["to=",{"2":{"316":3,"319":1}}],["todolist",{"2":{"239":1,"240":1}}],["todofilter",{"2":{"239":1}}],["todoproject",{"2":{"238":1,"239":2,"240":2,"256":3,"311":1,"313":1,"316":3}}],["todo",{"2":{"231":26,"256":3}}],["todoservice",{"2":{"256":1}}],["todosummary",{"2":{"239":1,"256":1}}],["todos",{"0":{"231":1},"2":{"230":7,"511":1}}],["top",{"2":{"169":1,"313":1}}],["togglestatus",{"2":{"256":2}}],["toggle",{"2":{"162":2,"513":1}}],["togglefavourite",{"2":{"103":3}}],["tokens",{"2":{"325":1,"450":1}}],["token",{"2":{"114":1,"116":5,"327":2,"328":3,"496":2}}],["touchslideoutdrawer",{"0":{"516":1},"2":{"112":1,"516":1}}],["to",{"0":{"118":1,"136":1,"183":1,"229":1,"232":1,"256":1,"257":1,"311":1},"1":{"230":1,"231":1,"232":1},"2":{"43":1,"91":1,"112":1,"114":1,"183":1,"221":1,"223":1,"228":1,"229":2,"230":1,"231":2,"232":1,"233":1,"238":1,"251":1,"255":1,"256":3,"257":1,"259":1,"306":2,"311":1,"313":1,"316":2,"320":4,"372":1,"373":1,"376":1,"421":2,"429":1,"433":2,"452":3,"461":1,"462":3}}],["agnostic",{"2":{"511":1}}],["age",{"2":{"245":1}}],["a>",{"2":{"447":2}}],["azure",{"2":{"433":2}}],["ava",{"2":{"433":10}}],["available",{"0":{"141":1},"2":{"140":1}}],["aux",{"2":{"433":1}}],["automation",{"2":{"527":1}}],["autocompleterefs",{"2":{"433":1}}],["autodetection",{"2":{"433":1}}],["autodetectcolorscheme",{"2":{"433":1}}],["autofetch",{"2":{"433":1}}],["autofocus",{"2":{"231":1}}],["auto",{"2":{"345":1,"430":1,"433":1,"554":1}}],["autoupdate",{"2":{"345":1,"433":1}}],["authors",{"2":{"433":3}}],["authorization",{"2":{"51":3,"56":3,"116":2,"328":2}}],["authenticator",{"2":{"330":1}}],["auth0",{"2":{"328":1}}],["authinterceptor",{"2":{"114":2}}],["auth",{"2":{"114":3,"326":1,"506":1,"508":1,"545":2}}],["abc",{"2":{"316":1}}],["ajax",{"2":{"300":1,"308":1,"323":2}}],["after",{"2":{"250":1,"302":5,"303":2,"421":1}}],["aaaa",{"2":{"134":2}}],["at",{"2":{"116":6,"325":1,"433":1,"496":1}}],["attributes",{"0":{"77":1}}],["awesome",{"2":{"228":1}}],["aws",{"2":{"115":1}}],["await",{"2":{"55":3,"83":2,"114":2,"303":8,"344":3,"378":3,"428":1,"448":1,"511":1}}],["amd",{"2":{"402":1}}],["amazon",{"2":{"115":2,"167":5,"336":1,"422":2}}],["amplify",{"2":{"39":1}}],["ad",{"2":{"171":1}}],["admin",{"2":{"134":1,"247":1}}],["adapter",{"2":{"112":1,"501":1}}],["addnote",{"2":{"447":1,"448":2}}],["addextraspaceontop",{"2":{"433":1}}],["added",{"2":{"393":1}}],["addeventlistener",{"2":{"250":1,"267":1,"343":2,"344":1}}],["addyosmani",{"2":{"336":1}}],["addroute",{"2":{"322":1}}],["addresponseinterceptor",{"2":{"114":2,"512":1}}],["addcommand",{"2":{"294":1}}],["addtodo",{"2":{"231":6}}],["adds",{"2":{"112":1,"501":1,"506":1}}],["add",{"2":{"54":1,"103":1,"112":7,"388":1,"390":2,"393":1,"394":1,"427":1,"448":1,"501":6,"506":3}}],["acme",{"2":{"554":3}}],["acr",{"2":{"433":1}}],["acn",{"2":{"433":1}}],["activitybar",{"2":{"433":1}}],["active",{"2":{"255":3,"316":1,"319":1,"426":1,"433":1}}],["actions",{"0":{"421":1,"526":1},"1":{"527":1,"528":1},"2":{"112":1,"359":1,"360":4,"361":1,"419":1,"421":12,"433":1,"473":1,"481":1,"508":1,"527":1,"542":1,"545":1}}],["action",{"0":{"183":1},"2":{"112":1,"183":1,"212":4,"294":2,"381":1,"421":9,"433":1,"501":1,"527":2}}],["accordian",{"2":{"424":1}}],["accordianpanel",{"2":{"424":1}}],["according",{"2":{"376":1}}],["accountroutes",{"2":{"425":2}}],["account",{"2":{"114":1,"425":2,"429":1,"431":1}}],["accept",{"2":{"255":5}}],["accessibility",{"2":{"471":1}}],["accessibilitysupport",{"2":{"433":1}}],["access",{"2":{"116":5,"117":4,"496":1}}],["ac",{"2":{"104":2}}],["arguments",{"2":{"529":1}}],["args",{"2":{"366":2}}],["article",{"2":{"469":1}}],["artisan",{"2":{"433":1}}],["arty",{"0":{"70":1},"2":{"80":2,"83":1,"95":1,"111":1,"112":5}}],["array",{"2":{"91":8,"103":1,"245":1}}],["always",{"2":{"462":1}}],["alg",{"2":{"325":1,"433":1}}],["ally",{"2":{"433":3,"539":2}}],["all",{"2":{"303":1,"433":1}}],["allowcompoundwords",{"2":{"433":1}}],["allows",{"2":{"433":1}}],["allow",{"2":{"117":4}}],["alert",{"2":{"302":1}}],["alexa",{"2":{"149":1}}],["alias",{"2":{"228":1,"432":1}}],["align",{"2":{"169":1}}],["alibris",{"2":{"22":1}}],["alt",{"2":{"89":2}}],["air",{"2":{"433":1}}],["ai",{"2":{"89":1}}],["analysis",{"2":{"433":1,"493":1}}],["analytics",{"0":{"529":1,"552":1},"2":{"112":1,"501":1,"506":1,"518":1,"542":1}}],["antfu",{"2":{"433":3}}],["antialiased",{"2":{"433":1}}],["antony",{"2":{"23":1,"433":1,"504":1}}],["any",{"2":{"402":1,"554":1}}],["angular",{"2":{"308":1,"463":2}}],["anothercomponent",{"2":{"244":3}}],["anon",{"2":{"55":1,"56":6}}],["animation",{"2":{"169":1}}],["android",{"2":{"336":2,"343":1}}],["and",{"0":{"269":1,"399":1},"2":{"112":2,"134":1,"148":1,"181":1,"235":1,"255":1,"256":1,"307":1,"323":1,"335":1,"350":1,"371":1,"377":1,"380":2,"381":2,"404":1,"421":4,"435":1,"462":4,"473":2,"476":1,"497":1,"501":1,"506":1,"527":3}}],["an",{"2":{"91":1,"320":1,"377":1,"462":2}}],["annotations",{"2":{"433":1}}],["annotation",{"2":{"91":1}}],["axios",{"2":{"41":1,"114":1,"300":1,"323":4,"324":4,"328":5,"329":3,"449":4,"450":5,"454":2,"507":1,"511":1}}],["apollo",{"2":{"433":2}}],["apt",{"2":{"388":4}}],["apache",{"0":{"138":1},"1":{"139":1},"2":{"137":1,"138":1,"140":1,"402":1,"422":1,"446":1}}],["appveyor",{"2":{"433":2}}],["appsettings",{"2":{"433":2}}],["appsearchbar",{"2":{"98":1}}],["appsidebar",{"2":{"425":1,"546":1}}],["appfooter",{"2":{"425":2}}],["appinstalled",{"2":{"343":2}}],["appmanifest",{"2":{"338":1}}],["apploader",{"0":{"426":1}}],["appleboy",{"2":{"421":3}}],["apple",{"2":{"336":2}}],["applications",{"2":{"345":1}}],["application",{"2":{"56":1,"112":1,"338":1,"342":1,"400":1,"472":2,"501":1,"512":1}}],["approach",{"2":{"181":1}}],["app",{"0":{"230":1,"316":1},"2":{"95":2,"98":1,"105":1,"120":5,"121":5,"134":1,"135":1,"136":3,"141":2,"201":6,"202":1,"203":2,"224":2,"229":1,"230":3,"238":2,"243":6,"247":2,"255":8,"256":1,"314":4,"315":1,"316":2,"336":2,"338":1,"343":5,"346":1,"362":7,"374":2,"423":1,"425":1,"426":1,"427":1,"428":1,"430":2,"445":1,"454":6,"472":1,"509":1,"556":1}}],["appheader>",{"2":{"534":1}}],["appheadersecond",{"2":{"534":1}}],["appheaderfirst",{"2":{"534":1}}],["appheader",{"2":{"85":1,"100":1,"102":1,"105":1,"425":2,"534":1}}],["appwrite",{"2":{"39":1}}],["apidata",{"2":{"511":2}}],["apikey",{"2":{"51":3,"56":3}}],["api",{"0":{"50":1,"52":1,"56":1,"81":1,"83":1,"109":1,"114":1,"204":1,"360":1,"510":1,"511":1},"1":{"53":1,"54":1,"55":1,"56":1,"82":1,"83":1,"511":1,"512":1},"2":{"23":1,"40":2,"41":9,"50":1,"56":1,"58":2,"59":1,"83":1,"102":1,"109":2,"112":1,"114":10,"115":5,"118":2,"119":3,"121":2,"122":1,"123":1,"125":4,"130":1,"204":16,"211":1,"212":2,"247":1,"250":2,"251":1,"254":1,"255":9,"256":1,"266":2,"268":2,"278":1,"282":2,"284":1,"295":8,"296":1,"297":5,"298":2,"300":7,"303":1,"322":4,"323":2,"324":4,"326":1,"334":1,"336":2,"344":1,"357":1,"359":3,"360":2,"361":3,"363":3,"364":2,"365":1,"366":1,"380":1,"422":2,"423":2,"428":1,"433":14,"434":3,"436":2,"437":1,"438":1,"446":2,"449":5,"452":1,"454":2,"460":4,"462":3,"463":1,"472":1,"473":3,"482":1,"501":2,"504":1,"506":1,"508":2,"511":4,"512":7,"542":3}}],["a",{"2":{"39":1,"55":1,"91":5,"112":1,"115":1,"134":2,"200":2,"292":2,"303":10,"316":2,"320":4,"336":1,"376":1,"393":1,"431":1,"433":1,"447":2,"460":2,"462":3,"464":1,"472":1,"473":1,"501":1,"506":1,"527":1}}],["asked",{"2":{"497":1}}],["aside",{"2":{"469":1}}],["astro",{"2":{"433":1,"507":1}}],["ashx",{"2":{"433":1}}],["ascx",{"2":{"433":1}}],["asax",{"2":{"433":1}}],["aspx",{"2":{"433":1}}],["asp",{"2":{"226":1}}],["assign",{"2":{"326":1}}],["assigned",{"2":{"134":1}}],["assets",{"2":{"224":2,"314":1,"423":1,"429":5,"431":2,"513":1,"555":1}}],["asynchronous",{"2":{"323":1}}],["async",{"2":{"83":1,"114":1,"241":1,"254":1,"303":3,"344":1,"378":3,"448":3,"511":1,"512":1,"529":1}}],["as",{"2":{"39":1,"115":1,"376":1,"431":3}}],["38",{"2":{"557":1}}],["39",{"2":{"390":1}}],["333333",{"2":{"345":1}}],["365",{"2":{"308":1}}],["360deg",{"2":{"169":1}}],["34",{"2":{"302":3,"303":1}}],["32",{"2":{"296":3,"387":1}}],["3x3",{"2":{"176":1}}],["3000",{"2":{"438":1,"445":1,"450":1,"454":3}}],["300",{"2":{"329":1,"433":1,"450":2}}],["30rem",{"2":{"231":1}}],["30",{"2":{"151":2,"171":1,"195":1,"433":1}}],["3",{"0":{"199":1,"205":1,"240":1,"285":1,"309":1,"328":1,"398":1,"399":1,"407":1,"409":1,"418":1,"462":1,"478":1,"505":1},"1":{"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":2,"207":2,"208":2,"209":2,"210":2,"211":2,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"479":1,"506":1,"507":1},"2":{"23":1,"98":1,"102":1,"103":1,"106":1,"109":1,"117":1,"118":1,"119":3,"120":4,"121":2,"122":1,"124":2,"125":2,"126":2,"127":1,"128":2,"130":5,"133":1,"137":3,"141":2,"144":2,"145":1,"148":2,"153":1,"171":2,"174":2,"175":1,"198":1,"199":3,"200":1,"201":2,"202":3,"203":2,"204":4,"209":1,"211":1,"212":2,"213":1,"219":1,"221":2,"222":2,"223":4,"224":5,"226":1,"227":1,"228":1,"229":1,"231":4,"234":2,"235":2,"236":1,"237":1,"240":1,"242":1,"243":1,"244":3,"246":1,"249":1,"250":3,"251":1,"252":1,"253":1,"255":8,"256":1,"260":1,"264":1,"265":1,"266":1,"267":2,"271":2,"288":1,"289":2,"291":1,"292":2,"294":2,"295":2,"296":2,"297":1,"299":3,"300":1,"303":4,"304":1,"306":2,"307":1,"308":2,"309":1,"313":3,"317":1,"324":1,"325":3,"328":1,"331":1,"335":1,"343":2,"349":1,"350":2,"352":3,"353":2,"356":3,"357":1,"358":4,"360":2,"361":2,"363":3,"366":3,"368":1,"371":1,"376":1,"380":3,"381":4,"383":1,"393":1,"394":1,"400":2,"402":2,"404":1,"407":1,"408":1,"413":1,"415":1,"416":1,"423":2,"432":1,"433":2,"435":1,"436":2,"438":1,"443":2,"444":2,"445":2,"447":2,"448":1,"454":2,"460":3,"462":9,"463":3,"471":1,"473":6,"476":1,"489":1,"497":2,"504":2,"506":1,"508":1,"512":1,"557":2}}],["huskyrc",{"2":{"433":2}}],["human",{"2":{"158":1}}],["hxx",{"2":{"433":3}}],["hpp",{"2":{"433":3}}],["h4>данные",{"2":{"452":1}}],["h4>текст",{"2":{"452":1}}],["h4>child",{"2":{"363":1}}],["h4>",{"2":{"356":2,"363":1,"452":2}}],["h3>selected",{"2":{"447":1}}],["h3>notes",{"2":{"447":1}}],["h3>new",{"2":{"447":1}}],["h3>",{"2":{"353":2,"447":3}}],["hmacsha256",{"2":{"325":1}}],["hmr",{"2":{"223":1,"432":1}}],["hs256",{"2":{"325":3}}],["href",{"2":{"316":1}}],["href=",{"2":{"226":1,"227":3,"338":1}}],["hamburger",{"2":{"513":1}}],["handleappinstalled",{"2":{"343":2}}],["handler",{"2":{"296":3,"366":3}}],["hasroute",{"2":{"322":1}}],["hash",{"2":{"141":1,"313":2,"322":1}}],["has",{"2":{"91":1,"103":2}}],["haskell",{"2":{"56":1}}],["hide=",{"2":{"534":1}}],["hidden",{"2":{"519":1}}],["histoire",{"2":{"433":10}}],["history",{"2":{"135":1,"136":1,"313":7,"433":5}}],["highlightmodifiedtabs",{"2":{"433":1}}],["hi",{"2":{"247":1,"439":1}}],["h1",{"2":{"203":1,"297":1,"298":1}}],["h1>",{"2":{"203":1,"231":2,"298":2}}],["h1>hello",{"2":{"203":1}}],["hyvinkaa",{"2":{"178":1}}],["hypertext",{"2":{"144":1}}],["holding",{"2":{"462":2}}],["houdini",{"2":{"433":1}}],["hover",{"2":{"433":1}}],["hot",{"2":{"223":1,"224":1}}],["hooks",{"2":{"204":1,"433":4}}],["homebrew",{"2":{"389":1}}],["home",{"2":{"141":1,"154":1,"311":1,"501":1}}],["homeview",{"2":{"96":1}}],["hosts",{"2":{"462":1}}],["host",{"2":{"117":1,"421":7}}],["how",{"2":{"112":1}}],["hopscotch",{"2":{"50":1}}],["hoppscotch",{"0":{"49":1},"1":{"50":1,"51":1},"2":{"51":1,"82":1,"433":1}}],["h",{"2":{"56":8,"421":1,"433":4}}],["htaccess",{"0":{"139":1},"2":{"140":1}}],["httponly",{"2":{"116":3}}],["http",{"0":{"138":1},"1":{"139":1},"2":{"56":2,"83":4,"114":11,"115":1,"117":3,"137":1,"138":1,"144":1,"323":2,"429":1,"434":1,"449":2,"450":3,"451":1,"454":2,"511":5,"512":4}}],["https",{"2":{"51":3,"55":1,"56":3,"80":2,"111":1,"112":1,"117":6,"125":3,"129":1,"144":3,"145":1,"148":1,"156":1,"177":1,"201":1,"211":1,"212":2,"222":2,"226":2,"227":1,"228":5,"235":1,"249":1,"250":1,"251":1,"255":1,"256":1,"269":1,"292":1,"307":1,"322":1,"324":1,"325":3,"326":2,"329":2,"335":1,"336":2,"338":1,"350":1,"354":1,"363":1,"364":1,"371":1,"404":1,"405":1,"422":1,"433":2,"435":1,"472":1,"498":1,"503":1,"511":1,"512":1,"527":1,"529":1}}],["htmlnanorc",{"2":{"433":20}}],["html=",{"2":{"430":1}}],["html>",{"2":{"201":2}}],["html5",{"2":{"145":1,"199":1,"313":1,"469":1,"491":1,"504":1}}],["html$",{"2":{"139":1}}],["html",{"0":{"161":1,"491":1,"518":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1},"2":{"22":1,"112":1,"117":1,"120":1,"125":2,"126":1,"135":2,"136":2,"137":1,"139":2,"141":3,"150":1,"160":1,"161":1,"162":2,"163":2,"168":1,"171":1,"179":1,"199":5,"200":1,"201":3,"202":2,"203":6,"204":1,"205":2,"206":4,"210":2,"211":4,"212":4,"224":3,"225":3,"226":2,"227":3,"230":3,"231":5,"243":2,"246":1,"249":5,"251":1,"258":1,"266":1,"296":1,"322":1,"325":1,"338":2,"342":1,"345":1,"373":2,"378":1,"380":3,"383":3,"393":5,"402":1,"417":1,"421":2,"422":1,"429":2,"433":6,"463":3,"472":10,"473":1,"509":1,"518":2,"529":2,"552":2,"556":1}}],["heidisql",{"2":{"433":1}}],["height",{"2":{"18":1,"169":1,"230":1,"430":7}}],["heex",{"2":{"433":1}}],["hexcolorlength",{"2":{"433":1}}],["helps",{"2":{"431":1}}],["helloworld",{"2":{"224":1}}],["hello=",{"2":{"204":1}}],["hello",{"2":{"201":1,"204":10,"221":1,"232":1,"536":1}}],["heavycomponent",{"2":{"244":2}}],["heads",{"2":{"251":4}}],["head",{"2":{"201":1,"225":1,"338":1}}],["head>",{"2":{"201":2}}],["headers",{"0":{"530":1},"1":{"531":1,"532":1,"533":1,"534":1},"2":{"328":1,"512":1}}],["headerh1",{"2":{"299":2}}],["header=",{"2":{"249":1}}],["header>",{"2":{"249":3,"255":2,"513":1,"534":2}}],["header",{"0":{"29":1,"98":1},"2":{"28":1,"51":6,"112":1,"249":3,"255":1,"319":2,"325":4,"469":1,"501":2,"508":2,"513":2,"531":1,"532":1,"533":1,"534":1,"542":1,"545":1}}],["headless",{"2":{"6":1,"12":2,"71":1,"76":1,"79":1,"461":1,"471":1,"508":1}}],["here",{"2":{"203":1,"231":1}}],["heroku",{"2":{"422":1,"545":1}}],["hero",{"0":{"183":1},"2":{"183":2}}],["white",{"2":{"231":1}}],["w3css",{"2":{"226":3}}],["w3schools",{"2":{"226":3}}],["w3",{"0":{"226":1},"1":{"230":1,"231":1,"232":1},"2":{"226":4,"230":2,"231":28,"249":4,"308":1,"316":2,"338":1}}],["write",{"2":{"203":1,"421":1,"462":1}}],["wrap",{"2":{"108":1}}],["wrapper=mount",{"2":{"381":1}}],["wrapper",{"2":{"105":1,"249":1,"255":2,"380":2,"381":2}}],["way",{"2":{"495":1}}],["wait",{"2":{"329":5}}],["watchman",{"2":{"433":2}}],["watch",{"2":{"316":4,"463":1}}],["watcher",{"2":{"171":6}}],["walmart",{"2":{"22":1}}],["will",{"2":{"460":1}}],["wild",{"2":{"144":1}}],["windi",{"2":{"433":10}}],["window",{"2":{"225":1,"250":1,"267":2,"331":1,"343":2,"364":3,"366":2,"421":1,"433":4,"436":1,"437":3,"460":3,"529":2}}],["windows",{"0":{"387":1},"2":{"137":1,"140":1,"143":1,"164":1,"222":3,"331":1,"336":1,"339":1,"346":1,"378":1,"387":2,"402":5}}],["width",{"2":{"169":1,"181":1,"230":1,"231":2,"430":7,"548":1,"557":1}}],["wide",{"2":{"134":1,"199":1,"308":1}}],["wiki",{"2":{"156":1,"269":1,"364":1}}],["wikipedia",{"2":{"156":1,"269":1,"364":1}}],["without",{"2":{"460":1}}],["with",{"2":{"55":1,"320":2,"421":8,"431":1,"433":1,"454":1}}],["words",{"2":{"462":1}}],["wordseparators",{"2":{"433":1}}],["world",{"2":{"134":1,"199":1,"201":1,"203":1,"204":4,"221":1,"232":1,"308":1}}],["workspace",{"2":{"433":3}}],["workingissueformatscm",{"2":{"433":1}}],["workbench",{"2":{"433":11}}],["workbox",{"2":{"344":1,"345":4,"472":2,"555":1}}],["work",{"2":{"421":1,"433":2}}],["workflows",{"2":{"421":3}}],["workflow",{"2":{"112":2,"421":2,"501":1,"542":1}}],["workerу",{"2":{"443":1}}],["workers",{"0":{"344":1,"414":1,"434":1,"436":1},"1":{"435":1,"436":1,"437":2,"438":2,"439":2,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"447":1,"448":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1},"2":{"268":1,"271":1,"278":1,"294":1,"300":2,"323":1,"334":3,"343":1,"344":1,"364":2,"368":1,"401":1,"414":1,"434":2,"435":1,"436":10,"438":2,"439":3,"440":1,"441":1,"442":1,"443":1,"455":4,"456":4}}],["worker",{"0":{"437":1,"438":1,"446":1,"555":1},"1":{"438":1,"439":1,"443":1,"444":1,"445":1,"447":2,"448":2,"449":2,"450":2,"451":2,"452":2,"454":1},"2":{"112":2,"336":1,"344":4,"345":1,"348":1,"434":1,"436":2,"437":21,"438":4,"439":5,"440":2,"442":2,"443":11,"444":1,"445":4,"446":1,"447":5,"448":2,"449":3,"450":1,"451":1,"472":3,"496":1,"501":1,"506":1,"518":1,"542":1,"553":1,"555":2}}],["www",{"2":{"117":1,"125":1,"134":1,"141":2,"167":1,"177":1,"178":1,"226":2,"228":1,"292":1,"308":1,"338":1,"405":1,"421":6,"529":1}}],["we",{"2":{"203":1}}],["webdriverio",{"2":{"461":1}}],["webworker",{"0":{"443":1,"444":1,"445":1,"448":1,"449":1,"450":1,"451":1},"2":{"443":4,"445":3,"447":5,"452":4}}],["webp",{"2":{"431":1}}],["webpack",{"2":{"119":1,"126":1,"127":1,"432":4,"433":13}}],["webhooks",{"2":{"394":1}}],["webmanifest",{"2":{"338":2}}],["web3js",{"2":{"331":1}}],["web3",{"0":{"331":1},"2":{"330":1,"331":2,"332":1}}],["webfonts",{"2":{"227":2}}],["website",{"2":{"421":1,"422":5,"552":1}}],["webstorm",{"2":{"222":1,"433":2}}],["websocket",{"2":{"118":1}}],["websockets",{"2":{"114":1,"118":3,"473":1,"511":1}}],["web",{"0":{"414":1,"434":1,"436":1,"437":1,"446":1},"1":{"435":1,"436":1,"437":2,"438":3,"439":3,"440":1,"441":1,"442":1,"443":2,"444":2,"445":2,"446":1,"447":3,"448":3,"449":3,"450":3,"451":3,"452":3,"453":1,"454":2,"455":1,"456":1},"2":{"118":1,"134":1,"135":1,"141":1,"199":1,"227":1,"268":1,"271":1,"278":1,"294":1,"300":2,"308":5,"313":4,"323":1,"325":1,"326":1,"334":2,"336":1,"346":1,"364":2,"367":1,"368":1,"382":1,"400":1,"401":1,"402":1,"414":1,"434":3,"435":1,"436":12,"437":8,"438":6,"439":5,"440":3,"441":1,"442":3,"443":8,"444":1,"445":4,"446":1,"447":5,"448":2,"449":3,"450":2,"451":1,"455":4,"456":4,"472":4,"512":1,"554":1}}],["webapp",{"0":{"112":1,"501":1,"505":1},"1":{"502":1,"506":1,"507":1},"2":{"112":5,"476":1,"499":2,"501":7,"503":2,"506":1,"527":2,"528":1,"554":1}}],["webapi",{"2":{"109":1}}],["weight",{"2":{"18":1}}],["msg",{"2":{"538":1}}],["mjs",{"2":{"433":4}}],["mdsvex",{"2":{"433":1}}],["md",{"2":{"421":1,"433":3}}],["mdn",{"2":{"366":1}}],["mkdir",{"2":{"421":2}}],["mvc",{"2":{"462":1,"463":1}}],["mvp",{"2":{"461":1}}],["mv",{"2":{"421":1}}],["m",{"2":{"391":1,"393":1,"421":2}}],["mpr551xpscgmizp8ezuscoy7t7iqnpp",{"2":{"325":1}}],["mpa",{"2":{"308":5,"309":2,"333":1,"336":1}}],["myworker",{"2":{"439":5}}],["myprocessfunction",{"2":{"303":3}}],["myfuncc",{"2":{"303":3}}],["myfuncb",{"2":{"303":3}}],["myfunca",{"2":{"303":5}}],["myfunction",{"2":{"267":3,"281":3,"292":2}}],["myfile2",{"2":{"289":1}}],["myfile1",{"2":{"289":1}}],["mydata",{"2":{"364":2}}],["mydependency2",{"2":{"289":2}}],["mydependency1",{"2":{"289":2}}],["mydomain",{"2":{"134":1,"135":2,"136":2,"141":3}}],["mycache",{"2":{"344":1}}],["myclass",{"2":{"281":5}}],["mycomponent>",{"2":{"246":1}}],["mycomponent",{"2":{"121":12,"228":2,"243":7,"244":4,"246":3}}],["mymodal",{"2":{"255":2}}],["mymenubar>",{"2":{"249":2}}],["mymenubar",{"2":{"249":3}}],["mymethod",{"2":{"204":1}}],["mylayout>",{"2":{"249":2}}],["mylayout",{"2":{"249":2}}],["my",{"0":{"438":1},"2":{"206":3,"280":2,"281":4,"320":2,"324":1,"437":9,"439":1,"501":3,"502":1,"506":1,"527":2,"528":1}}],["mysql",{"2":{"40":1,"48":1,"433":1,"473":1}}],["moment",{"2":{"457":1,"460":1}}],["mocha",{"2":{"433":10}}],["monospace",{"2":{"433":1}}],["mono",{"2":{"433":1}}],["motels",{"0":{"188":1}}],["modern",{"2":{"433":1}}],["mode",{"2":{"313":1,"433":1}}],["modeling",{"2":{"239":1}}],["model=",{"2":{"210":1,"231":3,"246":2,"447":2,"452":3}}],["modelperson",{"2":{"124":4}}],["modelvalue",{"2":{"124":4,"246":9}}],["model",{"0":{"124":1,"210":1,"245":1},"2":{"119":1,"124":3,"207":1,"218":1,"231":2,"246":6,"251":1,"267":1,"462":1,"463":1}}],["modal>",{"2":{"255":1}}],["modal",{"2":{"255":14}}],["modals",{"2":{"253":1,"255":6,"256":3,"314":3}}],["module",{"2":{"223":1,"433":1}}],["modules",{"2":{"223":1,"224":2,"310":1,"391":1,"431":6,"432":1,"433":2}}],["mod",{"2":{"139":2,"433":1}}],["mozilla",{"2":{"125":1,"222":1,"326":1,"344":1,"364":1,"402":1,"439":1}}],["mount",{"2":{"120":1,"121":2,"201":2,"243":1,"255":1,"314":1,"362":1,"380":4,"381":1}}],["mobile",{"2":{"23":1,"181":2,"346":1,"509":4,"546":2,"548":1}}],["mit",{"2":{"499":1}}],["mitt",{"2":{"118":1,"292":2,"300":1,"354":4,"355":3}}],["mix",{"2":{"433":3}}],["mixin",{"2":{"250":1}}],["might",{"2":{"433":1}}],["migration",{"2":{"125":2,"129":1}}],["mime",{"2":{"338":1,"341":1}}],["missing",{"2":{"287":1}}],["minheight",{"2":{"430":1}}],["minwidth",{"2":{"430":1}}],["minimal",{"2":{"339":1}}],["min",{"2":{"227":3,"230":1,"231":1}}],["middleware",{"2":{"297":1}}],["middle",{"2":{"169":1}}],["mil",{"2":{"134":1}}],["microsoft",{"2":{"115":1,"154":1,"222":3,"328":1,"336":1,"402":1,"422":1,"433":1}}],["must",{"2":{"377":1}}],["music",{"2":{"73":1,"87":1,"106":1}}],["multicursormodifier",{"2":{"433":1}}],["multipurpose",{"2":{"338":1}}],["multiviews",{"2":{"139":1}}],["muzhskaya",{"2":{"97":1}}],["map",{"2":{"431":2,"433":7}}],["mastery",{"2":{"473":1}}],["master",{"2":{"391":3,"393":4,"394":5,"421":3,"433":1}}],["match",{"2":{"344":1}}],["math",{"2":{"251":1}}],["material",{"2":{"18":1,"176":1,"225":3,"226":1}}],["macports",{"2":{"389":1}}],["mac",{"2":{"346":1}}],["macromedia",{"2":{"199":1}}],["macos",{"0":{"389":1},"2":{"143":1,"222":3,"336":1,"389":1,"402":4,"433":1}}],["max",{"2":{"171":3,"181":1,"231":1,"548":1,"557":1}}],["mailmap",{"2":{"433":1}}],["mail",{"2":{"134":1,"338":1}}],["maintainers",{"2":{"433":1}}],["maintainability",{"2":{"261":1}}],["maintenanceview",{"2":{"425":1}}],["maintenance",{"2":{"425":2}}],["mainheader",{"2":{"256":1}}],["main>",{"2":{"249":2,"255":2,"316":2}}],["mainlayout",{"0":{"546":1},"1":{"547":1},"2":{"36":1,"112":1,"425":2,"501":2,"548":1}}],["main",{"0":{"31":1,"314":1,"362":1,"439":1},"2":{"120":1,"122":1,"148":1,"202":1,"224":3,"225":2,"243":3,"255":2,"256":1,"307":1,"313":1,"319":1,"335":1,"344":1,"350":1,"361":1,"371":1,"421":6,"435":1,"438":1,"538":1}}],["markdownlint",{"2":{"433":2}}],["markdown",{"0":{"494":1},"2":{"433":1,"494":1}}],["marketplace",{"2":{"22":1}}],["margin",{"2":{"231":3,"519":1}}],["mary",{"2":{"123":1}}],["mantinelayeredheader",{"0":{"533":1}}],["mantine",{"2":{"532":1,"533":1}}],["mantinerichfooter",{"0":{"524":1},"2":{"501":2}}],["mantinesimplefooter",{"0":{"523":1},"2":{"112":1}}],["mantinesimplenavbar",{"0":{"551":1},"2":{"112":1,"501":2}}],["mantinesimpleheader",{"0":{"532":1},"2":{"100":1,"112":1,"501":2}}],["manually",{"2":{"433":1}}],["management",{"0":{"462":1},"2":{"385":1,"462":2}}],["manager",{"0":{"127":1},"2":{"102":1,"119":1,"222":1,"365":1}}],["man",{"2":{"154":1}}],["manifest+json",{"2":{"338":1}}],["manifest",{"0":{"554":1},"2":{"112":2,"224":1,"338":5,"341":1,"345":1,"501":1,"506":1,"553":1,"554":1}}],["many",{"2":{"43":2}}],["make",{"2":{"91":1,"112":1,"501":1,"506":1}}],["magento",{"2":{"41":1,"47":1,"109":1}}],["me",{"2":{"498":1}}],["merge",{"2":{"386":1,"392":1,"393":2}}],["mercurial",{"2":{"385":1}}],["merchants",{"2":{"12":1}}],["memory",{"2":{"313":2}}],["message=ref",{"2":{"356":1}}],["messagebus",{"0":{"355":1},"2":{"355":2,"356":6}}],["message",{"2":{"201":4,"353":1,"356":8,"437":2,"443":3,"536":1}}],["meatball",{"2":{"176":1}}],["menus",{"2":{"433":1}}],["menu",{"2":{"173":1}}],["metadata",{"2":{"433":1}}],["metamask",{"2":{"331":5}}],["meta",{"2":{"112":1,"114":1,"382":3,"425":1,"430":1,"431":2,"501":1,"506":1,"512":1,"513":1,"552":13}}],["method2",{"2":{"281":2}}],["method1",{"2":{"281":2}}],["methods",{"2":{"204":1}}],["method",{"2":{"91":1,"331":1,"452":9,"512":1}}],["medium",{"2":{"336":1}}],["media",{"2":{"23":1,"181":1,"195":1}}],["medusajs",{"2":{"71":1}}],["medusa",{"2":{"12":1}}],["gql",{"2":{"433":2}}],["gz",{"2":{"433":1}}],["gls",{"2":{"433":1}}],["glo",{"2":{"433":1}}],["global",{"2":{"462":1}}],["glob",{"2":{"430":1,"431":2,"513":1}}],["globpatterns",{"2":{"345":1}}],["glg",{"2":{"433":1}}],["g",{"2":{"433":1,"529":1}}],["gb",{"2":{"402":2}}],["gutter",{"2":{"557":1}}],["gui",{"2":{"463":1}}],["guides",{"2":{"433":1}}],["guide",{"2":{"63":1,"249":1,"473":2}}],["gulp",{"2":{"433":2}}],["guards",{"2":{"313":3,"324":1}}],["go",{"0":{"322":1},"2":{"322":4,"433":6}}],["governance",{"2":{"433":1}}],["gov",{"2":{"134":1}}],["googletagmanager",{"2":{"529":1}}],["googleanalytics",{"2":{"501":1}}],["google",{"0":{"346":1,"529":1,"552":1},"2":{"17":1,"112":1,"115":2,"116":8,"176":1,"182":4,"222":1,"225":1,"226":1,"308":1,"328":1,"330":1,"334":1,"342":2,"344":1,"422":1,"460":1,"472":4,"473":1,"501":1,"506":1,"518":1,"529":2,"542":1}}],["gmail",{"2":{"116":1,"323":1}}],["gatsby",{"2":{"433":5}}],["gateway",{"2":{"115":1}}],["garaguso",{"2":{"325":1,"398":1}}],["garfield",{"2":{"18":2}}],["ghz",{"2":{"402":1}}],["gh",{"2":{"112":1,"421":2,"527":3}}],["grpc",{"2":{"511":1}}],["grunt",{"2":{"433":2}}],["great",{"2":{"433":1}}],["grey",{"2":{"249":1}}],["gray",{"2":{"230":1,"231":2,"509":1}}],["graphql",{"2":{"511":1}}],["graphgl",{"2":{"118":1}}],["graph",{"2":{"112":1,"501":1,"506":1,"518":1,"542":1,"552":1}}],["grid",{"2":{"108":1,"469":1,"492":2}}],["gitpod",{"2":{"433":2}}],["gitmessage",{"2":{"433":1}}],["gitmodules",{"2":{"433":1}}],["gitattributes",{"2":{"433":1}}],["gitlens",{"2":{"433":4}}],["gitlab",{"2":{"143":1,"370":1,"391":1,"394":2,"395":1,"397":1,"419":1,"433":2}}],["gitignore",{"0":{"391":1},"2":{"224":1,"390":1,"421":1,"433":1}}],["git",{"0":{"386":1,"390":1},"1":{"391":1},"2":{"111":2,"143":2,"222":3,"224":2,"370":1,"384":1,"385":3,"386":4,"387":3,"388":6,"389":4,"390":9,"391":7,"392":7,"393":9,"394":12,"395":1,"396":1,"397":2,"415":1,"419":1,"421":3,"423":1,"433":10,"503":2}}],["githubactionsgithubpagesworkflow",{"2":{"501":1}}],["githubpullrequests",{"2":{"433":1}}],["githubissues",{"2":{"433":1}}],["github",{"0":{"111":1,"421":1,"526":2},"1":{"527":2,"528":2},"2":{"80":2,"95":1,"111":2,"112":6,"125":1,"143":1,"148":1,"222":1,"228":2,"235":2,"236":1,"255":2,"256":2,"307":2,"316":1,"322":1,"328":1,"335":1,"343":1,"350":1,"354":1,"367":1,"370":1,"371":1,"391":1,"394":6,"395":1,"397":1,"404":2,"419":2,"421":23,"422":3,"433":7,"435":2,"442":1,"473":2,"481":1,"495":1,"501":2,"503":1,"506":1,"508":1,"527":5,"542":3,"545":1}}],["gemfile",{"2":{"433":2}}],["generation",{"2":{"472":1}}],["generate",{"2":{"91":1}}],["generalroutes",{"2":{"425":2}}],["getbestblockhash",{"2":{"512":1}}],["getnotes",{"2":{"447":1,"448":2}}],["getsvgicon",{"2":{"430":3,"431":2}}],["gets",{"2":{"429":2}}],["getroutes",{"2":{"322":1}}],["gettimestamp",{"2":{"297":2}}],["getters",{"2":{"359":1,"360":4}}],["getter",{"2":{"296":1}}],["gettoken",{"2":{"114":1}}],["getall",{"2":{"283":1,"284":1,"285":1}}],["getallprojects",{"2":{"283":1,"284":1,"285":1,"286":1}}],["getimageurl",{"2":{"430":2,"431":2}}],["getinstance",{"2":{"279":1}}],["getitem",{"2":{"104":1,"364":2,"366":1,"421":1}}],["getelementbyid",{"2":{"171":1}}],["getuserdata",{"2":{"114":2}}],["get",{"2":{"51":3,"83":4,"114":1,"117":1,"296":2,"323":2,"366":2,"431":2,"449":3,"450":2,"451":1,"452":3,"454":3,"511":1}}],["gtag",{"2":{"529":5}}],["gt",{"0":{"86":1},"2":{"70":2,"91":2,"122":1,"174":1,"178":2,"224":1,"230":1,"251":1,"316":3,"361":1,"393":4,"421":1,"433":1,"472":2}}],["1px",{"2":{"509":1}}],["192x192",{"2":{"345":2}}],["19",{"2":{"176":1}}],["1986",{"2":{"158":1}}],["18",{"0":{"319":1},"2":{"175":1}}],["17",{"2":{"170":1,"171":1}}],["16гб",{"2":{"433":1}}],["16",{"2":{"170":1,"222":2,"364":2,"436":1}}],["1516239022",{"2":{"325":1}}],["15",{"0":{"483":1},"1":{"484":1,"485":1},"2":{"170":1,"465":1}}],["1s",{"2":{"169":1}}],["1rem",{"2":{"169":2}}],["1443",{"2":{"512":1}}],["14",{"2":{"168":1}}],["13",{"0":{"319":1},"2":{"168":1}}],["1280px",{"2":{"557":1}}],["1234567890",{"2":{"325":1}}],["12",{"2":{"167":1,"473":1}}],["127",{"2":{"134":2}}],["1199",{"2":{"509":1}}],["11",{"0":{"417":1,"475":1,"486":1},"1":{"476":1,"477":1,"487":1},"2":{"151":1,"152":1,"153":1,"154":1,"156":1,"162":2,"163":1,"164":2,"166":1,"167":3,"168":2,"170":3,"171":1,"175":1,"176":1,"177":1,"178":2,"181":1,"182":4,"183":1,"186":1,"187":1,"194":1,"195":1,"393":3}}],["10000",{"2":{"509":1}}],["1000",{"2":{"329":1,"356":1,"462":1}}],["100vh",{"2":{"230":1}}],["100vw",{"2":{"230":1,"519":1}}],["100",{"2":{"169":1,"231":1,"356":1,"373":1,"383":1,"430":2,"472":1,"519":1}}],["10",{"0":{"391":1,"416":1,"478":2},"1":{"479":2},"2":{"134":2,"137":1,"144":1,"151":2,"166":1,"228":1,"313":1,"337":1,"376":3,"378":1,"380":2,"381":6,"391":1,"402":1,"433":1,"443":2,"454":2,"460":1,"471":1,"473":2}}],["1",{"0":{"18":1,"19":1,"238":1,"280":1,"283":1,"292":1,"294":1,"296":1,"298":1,"302":1,"326":1,"407":1,"483":1},"1":{"484":1,"485":1},"2":{"18":2,"19":1,"95":1,"117":6,"118":1,"123":1,"134":6,"139":2,"141":2,"151":1,"171":2,"174":2,"202":2,"209":1,"223":1,"224":1,"231":4,"238":1,"240":1,"242":1,"244":1,"249":2,"250":2,"255":6,"256":1,"263":1,"281":1,"288":1,"291":1,"292":3,"294":1,"295":1,"296":3,"298":2,"299":3,"301":3,"302":10,"303":9,"308":2,"311":2,"313":2,"322":2,"324":1,"325":2,"338":2,"341":1,"342":1,"351":2,"352":3,"353":2,"356":2,"358":4,"360":2,"361":2,"363":2,"366":2,"374":1,"376":3,"380":2,"381":2,"394":1,"402":1,"431":2,"432":1,"436":4,"443":2,"444":2,"447":2,"448":3,"452":2,"454":2,"460":2,"462":1,"472":1,"473":2,"511":1,"512":1,"519":1,"557":2}}],["хватает",{"2":{"339":1,"385":1,"457":1}}],["хвастовство",{"2":{"223":1}}],["х",{"2":{"269":1}}],["хак",{"2":{"519":1}}],["хау",{"2":{"385":1}}],["ханту",{"2":{"268":1}}],["характеристик",{"2":{"190":1}}],["характеристики",{"2":{"190":1,"306":1}}],["характер",{"2":{"132":1,"148":1,"194":1,"197":1,"396":1}}],["хювинкяя",{"2":{"178":1}}],["хювинкяа",{"2":{"178":1}}],["художественных",{"2":{"174":1}}],["хуже",{"2":{"158":1}}],["хлебным",{"2":{"174":1}}],["хлебные",{"0":{"174":1},"2":{"174":2}}],["хика",{"0":{"157":1},"2":{"158":1}}],["хеша",{"2":{"136":1}}],["хеш",{"2":{"136":1}}],["хеши",{"2":{"136":1}}],["хеширования",{"2":{"136":2}}],["хедеры",{"2":{"530":1}}],["хедере",{"2":{"85":1,"95":1,"103":1}}],["хедером",{"2":{"35":1,"423":1,"546":1}}],["хедера",{"2":{"29":2}}],["хедер",{"2":{"29":2,"98":1,"548":1}}],["хэш",{"2":{"136":1,"313":1,"429":1}}],["хэша",{"2":{"127":1,"136":1,"322":1}}],["хранящиеся",{"2":{"364":1}}],["хранящей",{"2":{"357":1}}],["хранящуюся",{"2":{"324":1}}],["хранят",{"2":{"331":1}}],["хранятся",{"2":{"17":1,"324":1,"364":3,"473":1}}],["хранению",{"2":{"364":2}}],["хранения",{"2":{"287":1,"288":1,"308":1,"349":1,"364":4,"391":1,"443":1,"446":1,"447":1,"452":1}}],["хранением",{"2":{"368":1}}],["хранение",{"2":{"48":1,"390":1}}],["храним",{"2":{"366":1}}],["хранилищу",{"2":{"367":1,"446":1}}],["хранилищ",{"2":{"364":3}}],["хранилищами",{"2":{"368":1}}],["хранилищах",{"2":{"364":1}}],["хранилища",{"0":{"364":1},"2":{"137":1,"141":1,"331":1,"343":1,"349":2,"363":3,"364":6,"367":1}}],["хранилищем",{"2":{"358":1,"366":1}}],["хранилище",{"2":{"135":1,"140":1,"334":1,"364":1,"365":1,"367":2,"390":1}}],["храните",{"2":{"424":1}}],["хранится",{"2":{"255":1,"369":1}}],["хранить",{"2":{"116":1,"231":1,"239":1,"336":1,"421":1,"462":1}}],["храниться",{"2":{"47":1,"351":1,"443":1}}],["хранит",{"2":{"43":1,"356":1,"364":1,"460":1}}],["хочу",{"2":{"464":2,"473":1}}],["хочется",{"2":{"270":1}}],["хочет",{"2":{"62":1,"115":2,"168":1,"186":1}}],["холсте",{"2":{"290":1}}],["ходе",{"2":{"168":2,"385":1}}],["ходу",{"2":{"17":1}}],["хостите",{"2":{"422":1}}],["хостингом",{"2":{"144":1}}],["хостинговым",{"2":{"137":1}}],["хостинг",{"0":{"422":1},"2":{"137":1,"138":2,"144":2,"187":1,"422":1}}],["хостинги",{"2":{"134":1,"508":1}}],["хостинга",{"2":{"131":2,"133":1,"137":3,"143":1,"145":1}}],["хостинге",{"2":{"112":1,"137":1,"146":1}}],["хост",{"2":{"421":2}}],["хостеры",{"2":{"422":1}}],["хосте",{"2":{"134":1,"421":1}}],["хотим",{"2":{"232":1,"241":2,"249":1,"297":1,"310":1,"317":3,"325":1,"326":1,"327":1,"343":1,"356":1,"362":1,"365":1,"376":1,"383":1,"390":1,"440":1,"442":1,"445":1,"454":1}}],["хотите",{"2":{"143":2,"186":1,"200":1,"203":2,"223":2,"376":1,"390":1,"424":1,"439":1,"460":1}}],["хотел",{"2":{"194":1}}],["хотя",{"2":{"119":1,"131":1,"134":1,"144":1,"145":1,"153":1,"168":1,"181":1,"194":1,"197":1,"222":2,"223":1,"228":1,"231":1,"235":1,"251":1,"264":1,"281":1,"301":1,"308":1,"322":1,"323":1,"324":1,"338":1,"343":2,"376":1,"396":1,"425":1,"436":2,"473":1}}],["хоть",{"2":{"105":1,"463":2}}],["хорош",{"2":{"465":1}}],["хороша",{"2":{"336":1}}],["хорошая",{"2":{"63":1,"203":1,"228":1,"461":1,"464":2}}],["хорошего",{"2":{"267":1,"373":1,"436":1}}],["хорошей",{"2":{"213":1,"234":1,"235":1,"247":1,"316":1,"318":1,"351":1,"382":1,"408":1,"462":1}}],["хорошее",{"2":{"159":1,"296":1,"363":1}}],["хорошему",{"2":{"150":1,"159":1}}],["хороших",{"2":{"227":1,"257":1}}],["хорошими",{"2":{"308":1}}],["хорошим",{"2":{"167":1,"182":2,"329":1,"473":2}}],["хорошие",{"2":{"142":1,"159":1,"458":1,"463":1,"471":2,"473":1}}],["хороший",{"2":{"25":1,"197":1,"200":1,"255":1,"264":1,"267":1,"356":1,"360":1,"392":1,"433":1}}],["хорошую",{"2":{"26":1,"222":1,"227":1}}],["хорошо",{"2":{"3":1,"39":2,"44":1,"72":1,"74":1,"137":1,"153":1,"159":1,"160":1,"170":1,"177":1,"178":1,"181":1,"199":1,"204":1,"256":1,"300":2,"325":1,"328":1,"331":1,"356":1,"433":1,"440":1,"443":1,"446":2,"455":1,"459":1,"471":1}}],["nls",{"2":{"433":2}}],["nx",{"2":{"433":2}}],["nvmrc",{"2":{"433":2}}],["nix",{"2":{"433":3}}],["npx",{"2":{"432":2}}],["npmjs",{"2":{"292":1}}],["npm",{"2":{"136":1,"222":1,"223":4,"224":6,"225":1,"226":1,"231":1,"310":1,"323":1,"345":1,"354":1,"359":1,"374":2,"375":3,"376":3,"379":2,"383":1,"384":3,"391":1,"423":1,"432":1,"433":4,"446":2,"449":1,"453":2,"460":1,"465":1,"508":1,"536":1}}],["njsproj",{"2":{"391":1}}],["ntvs",{"2":{"391":1}}],["nw",{"2":{"313":1,"364":1}}],["n>=2",{"2":{"301":1}}],["n",{"2":{"291":1,"301":3,"302":9,"303":5,"421":1,"433":1,"447":5}}],["nginx",{"0":{"140":1,"141":1},"1":{"141":1},"2":{"115":1,"137":1,"140":2,"141":1,"144":1,"402":1,"422":1}}],["nativetabs",{"2":{"433":1}}],["naruto",{"2":{"125":1}}],["navigator",{"2":{"344":2}}],["navigate",{"2":{"320":4}}],["navigationdrawer",{"2":{"501":1,"549":1}}],["navigation",{"0":{"514":1},"1":{"515":1,"516":1},"2":{"112":1,"173":1,"313":2,"501":1,"508":1}}],["navbar",{"0":{"549":1},"1":{"550":1,"551":1},"2":{"112":1,"501":2,"542":1,"549":1}}],["named",{"2":{"431":1}}],["names",{"2":{"134":1}}],["name=",{"2":{"105":1,"249":3,"255":1,"319":2,"429":1,"452":2,"513":1,"552":4}}],["name",{"2":{"97":3,"112":1,"123":6,"141":1,"204":3,"210":2,"245":5,"246":1,"247":5,"249":1,"255":10,"288":4,"292":13,"313":3,"316":4,"317":3,"319":4,"320":4,"322":2,"325":1,"339":2,"341":2,"344":2,"345":2,"364":5,"392":5,"421":12,"425":2,"429":2,"430":4,"431":8,"501":1,"506":1,"554":2}}],["nest",{"2":{"433":2}}],["nesting",{"2":{"86":5,"433":2}}],["never",{"2":{"433":1}}],["next",{"0":{"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"260":1,"433":2}}],["negotiation",{"2":{"139":1}}],["netservice",{"2":{"451":2}}],["netlify",{"2":{"422":1,"433":2}}],["netflix",{"2":{"308":1}}],["netbeans",{"2":{"222":1}}],["net",{"2":{"134":1,"325":1}}],["networks",{"2":{"512":1}}],["networkcommunication",{"0":{"452":1}}],["network",{"0":{"450":1},"2":{"115":1,"344":1,"364":1,"439":1,"451":1}}],["newitem",{"2":{"463":3}}],["new",{"2":{"103":1,"104":1,"120":1,"121":1,"171":1,"231":1,"244":1,"255":1,"281":1,"287":1,"290":2,"296":1,"303":6,"326":1,"366":1,"421":2,"427":1,"431":2,"437":2,"439":1,"443":2,"445":1,"448":4,"450":2,"509":1,"529":1}}],["num=",{"2":{"105":1}}],["numbers",{"2":{"91":1,"134":1}}],["number>",{"2":{"91":2}}],["number",{"2":{"83":1,"91":1,"103":3,"104":1,"245":1,"380":2}}],["null",{"2":{"83":1,"171":3,"255":2,"287":1,"288":2,"343":2,"364":1,"433":1}}],["nuxt",{"2":{"10":1,"200":1,"433":2,"507":1}}],["nodе",{"2":{"433":1}}],["nodemon",{"2":{"433":4}}],["nodes",{"2":{"331":1}}],["nodejs",{"0":{"453":1},"1":{"454":1},"2":{"222":1}}],["node",{"2":{"115":2,"222":6,"223":2,"224":2,"228":2,"310":1,"378":2,"391":1,"402":1,"421":2,"432":3,"433":6,"434":2,"452":2,"453":2,"472":1,"473":1}}],["now",{"2":{"151":1}}],["note=",{"2":{"448":1}}],["note=ref",{"2":{"447":1}}],["notes",{"2":{"447":4,"448":8}}],["notes=ref",{"2":{"447":1}}],["note",{"2":{"447":13,"448":1}}],["notebook",{"2":{"23":1,"509":3,"515":1,"546":2,"548":1}}],["notation",{"2":{"280":1}}],["notificationinterceptor",{"2":{"114":2,"512":2}}],["not",{"2":{"112":1,"256":2,"376":1,"433":1,"460":1}}],["no",{"2":{"112":2,"231":1,"501":8,"506":4}}],["nosql",{"2":{"17":2,"39":1,"115":1,"446":1,"462":1}}],["uuid",{"2":{"427":6,"428":1}}],["u",{"2":{"425":1}}],["uri",{"2":{"316":1,"326":1,"327":1,"450":1,"512":1}}],["urlsearchparams",{"2":{"326":3}}],["urls",{"2":{"313":1}}],["url",{"2":{"0":1,"51":3,"114":1,"161":1,"183":1,"224":1,"309":1,"311":1,"313":5,"316":3,"317":2,"318":1,"319":1,"320":4,"321":1,"322":4,"324":1,"325":1,"326":1,"328":1,"329":2,"339":2,"341":3,"343":1,"344":1,"345":1,"394":2,"429":2,"431":1,"450":2,"452":1,"454":2,"512":1,"552":2,"554":1}}],["usage",{"2":{"354":1}}],["usability",{"2":{"261":1}}],["usb",{"2":{"330":1,"336":1}}],["us",{"2":{"326":1,"433":1}}],["using",{"2":{"320":1}}],["usetouchswipe",{"2":{"516":1}}],["usenewswidget",{"2":{"463":1}}],["usei18nlight",{"0":{"537":1},"2":{"538":2}}],["usei18n",{"2":{"423":1,"463":1,"538":4}}],["usecounterstore=definestore",{"2":{"361":1}}],["usecounterstore",{"2":{"360":2,"363":1}}],["usedocumentscroll",{"2":{"250":5}}],["usewindowsevents",{"2":{"250":1}}],["useappconfig",{"2":{"513":3}}],["useapploader",{"0":{"427":1},"2":{"426":3,"427":1,"428":3}}],["useadmin",{"2":{"250":1}}],["useauthservice",{"2":{"462":1}}],["useauthstore",{"2":{"462":1}}],["useauth",{"2":{"114":4,"462":1}}],["userloggedin",{"2":{"462":1}}],["useraccountview",{"2":{"425":1}}],["username",{"2":{"324":3,"421":2,"462":1}}],["userouter",{"2":{"319":3,"322":1}}],["useroute",{"2":{"319":3,"322":1,"327":2}}],["user",{"2":{"114":2,"141":1,"149":2,"158":1,"239":1,"247":1,"329":2,"421":6,"433":3,"496":2}}],["userid",{"2":{"114":1}}],["users",{"2":{"114":7,"247":1}}],["userdata",{"2":{"114":1}}],["usescreenwidth",{"2":{"509":6}}],["usescreensize",{"2":{"463":1}}],["useshoppingcart",{"2":{"463":1}}],["usesessionstorage",{"2":{"366":3,"367":2}}],["usestate",{"2":{"358":6}}],["usestore",{"2":{"250":1}}],["uses",{"2":{"91":1,"421":10}}],["usefavourites",{"0":{"103":1},"2":{"89":1,"103":6,"104":1}}],["use",{"0":{"14":1,"424":1},"2":{"14":4,"121":1,"215":1,"239":1,"250":1,"255":2,"256":1,"314":2,"362":1,"433":1,"454":2,"470":1}}],["up",{"2":{"421":1,"433":1}}],["updating",{"2":{"421":1}}],["updateprojects",{"2":{"316":5}}],["update",{"2":{"124":5,"240":1,"246":6,"250":4,"388":1,"421":1,"433":1}}],["upstream",{"2":{"394":1}}],["upwardprop",{"2":{"249":5}}],["unlighthouse",{"2":{"433":2}}],["unocss",{"2":{"433":10}}],["uno",{"2":{"433":10}}],["untrackedchanges",{"2":{"433":1}}],["undefined",{"2":{"382":1}}],["unique",{"2":{"462":1}}],["unicodehighlight",{"2":{"433":1}}],["unit",{"2":{"370":1,"372":1,"461":6}}],["universal",{"2":{"239":1}}],["unpkg",{"2":{"201":1}}],["utf",{"2":{"222":1,"364":2}}],["utils",{"0":{"379":1},"1":{"380":1,"381":1},"2":{"114":3,"370":1,"373":1,"374":1,"378":1,"379":3,"380":2,"381":1,"423":1,"427":1,"430":2,"511":3,"512":5,"513":2,"518":1,"538":1}}],["ubuntu",{"2":{"144":1,"222":1,"367":1,"388":1,"421":3,"501":1}}],["ux",{"0":{"147":1,"149":1,"159":1,"417":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1},"2":{"77":1,"79":1,"97":1,"147":6,"149":2,"150":2,"159":2,"171":1,"198":2,"472":2,"496":1,"504":1,"516":1,"542":1,"556":1}}],["ui",{"0":{"24":1,"27":1,"149":1,"466":1,"471":1},"1":{"25":1,"26":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1},"2":{"23":2,"26":1,"62":1,"79":1,"85":1,"105":1,"147":3,"149":2,"198":1,"261":1,"266":1,"339":1,"382":1,"384":4,"432":1,"436":1,"457":2,"461":1,"463":3,"464":2,"466":1,"468":1,"471":10,"496":1,"504":1,"508":1,"513":1,"532":1,"533":1}}],["uml",{"2":{"14":1,"239":2}}],["og",{"2":{"552":6}}],["old",{"2":{"460":2}}],["ok",{"2":{"460":2}}],["okta",{"2":{"328":1}}],["o",{"2":{"403":1}}],["otp",{"0":{"329":1},"2":{"329":5,"330":2,"332":1}}],["othervalue",{"2":{"55":1,"56":1}}],["other",{"2":{"55":1,"56":1,"462":1}}],["output",{"2":{"380":1,"433":1}}],["out",{"2":{"377":1,"433":2,"460":1}}],["outlook",{"2":{"323":1}}],["our",{"2":{"203":1}}],["overflow",{"2":{"519":1}}],["overwrite",{"2":{"501":2}}],["overrides",{"2":{"433":1}}],["over",{"0":{"264":1},"2":{"260":1}}],["obj",{"2":{"460":1}}],["object",{"2":{"91":1,"207":1,"245":1,"267":1,"280":1,"320":1,"431":1}}],["observe",{"2":{"171":1}}],["observerclass",{"2":{"292":3}}],["observerpattern",{"2":{"292":1}}],["observer",{"0":{"291":1,"292":1,"354":1},"1":{"292":1,"355":1,"356":1},"2":{"170":1,"171":2,"260":1,"274":1,"296":2,"300":1,"349":1,"354":1,"356":1,"460":1}}],["opera",{"2":{"222":1}}],["open=",{"2":{"534":1}}],["opengraph",{"2":{"501":1}}],["opennote",{"2":{"447":2}}],["openclose",{"2":{"433":1}}],["opencart",{"2":{"16":2,"71":1}}],["openid",{"0":{"325":1},"2":{"325":6,"326":2,"330":1}}],["open",{"2":{"12":1,"39":1,"71":1,"112":1,"300":1,"344":1,"499":1,"501":1,"506":1,"518":1,"542":1,"552":1}}],["option",{"2":{"215":1}}],["options",{"0":{"204":1,"360":1},"2":{"119":1,"121":1,"122":1,"139":1,"204":6,"255":1,"313":1,"322":1,"323":1,"359":2,"360":1,"363":1,"421":1,"433":1,"460":1}}],["onmesssage",{"2":{"438":1}}],["onmessage=",{"2":{"444":1}}],["onmessage",{"2":{"437":2,"438":2,"439":1,"441":1,"443":1,"444":1}}],["onmounted",{"2":{"171":2,"250":2,"267":3,"343":2,"356":3,"556":1}}],["ontaskerrors",{"2":{"433":1}}],["once",{"2":{"375":1,"376":1}}],["onbeforeunmount",{"2":{"267":3,"316":1,"343":1,"356":3}}],["onboarding",{"2":{"184":1}}],["onunmounted",{"2":{"250":2}}],["onlyenabledextensions",{"2":{"433":1}}],["only",{"2":{"181":1,"433":2}}],["online",{"2":{"14":1,"308":1}}],["onecolumnlayout",{"0":{"548":1}}],["onecomponent",{"2":{"244":3}}],["onerror",{"2":{"437":2}}],["one",{"2":{"154":1,"322":2,"472":1}}],["on",{"0":{"211":1},"2":{"112":1,"116":1,"139":1,"211":2,"292":3,"316":1,"356":1,"381":1,"421":5,"433":2,"454":1,"501":1}}],["oreilly",{"2":{"473":1}}],["orientation",{"2":{"340":1,"341":1,"345":1,"554":1}}],["origins",{"2":{"454":1}}],["origin",{"2":{"117":7,"364":2,"394":5,"454":2}}],["or",{"2":{"247":1,"402":5,"501":1,"509":1}}],["oracle",{"2":{"115":1,"422":1}}],["organizeimports",{"2":{"433":1}}],["org",{"2":{"98":1,"125":2,"129":1,"134":1,"156":1,"211":1,"212":2,"222":1,"228":1,"249":1,"250":1,"251":1,"269":1,"322":1,"326":1,"338":1,"363":1,"364":1,"512":1}}],["orders",{"2":{"12":1}}],["odezhda",{"2":{"97":1}}],["official",{"2":{"402":1}}],["office",{"2":{"154":1,"308":1}}],["off",{"2":{"292":4,"316":1,"356":1,"433":1,"462":1}}],["of",{"0":{"263":1},"2":{"91":5,"112":1,"246":1,"260":1,"376":1,"377":1,"429":1,"433":1,"472":1}}],["oauth",{"2":{"40":1,"116":2,"325":1,"332":1}}],["ozon",{"2":{"22":1}}],["eex",{"2":{"433":1}}],["eol",{"2":{"433":1}}],["e88a22df",{"2":{"429":1}}],["echo",{"2":{"421":8}}],["ecosystem",{"2":{"402":1}}],["ecommerce",{"2":{"41":1}}],["eager",{"2":{"431":2}}],["easingthemes",{"2":{"421":2}}],["eat",{"2":{"294":1}}],["eyjzdwiioiixmjm0nty3odkwiiwibmftzsi6ilbhymxviequiedhcmfndxnviiwiawf0ijoxnte2mjm5mdiyfq",{"2":{"325":1}}],["eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9",{"2":{"325":1}}],["err=>",{"2":{"324":1,"329":2,"447":1}}],["err",{"2":{"303":1,"331":2,"437":1,"444":2,"445":1,"448":1}}],["errorcomponent",{"2":{"244":3}}],["error",{"2":{"55":3,"303":1,"327":2,"376":1,"377":1,"391":1,"421":1,"452":1}}],["esbenp",{"2":{"433":4}}],["esbuild",{"2":{"228":2,"432":1}}],["esnext",{"2":{"432":1}}],["es6",{"2":{"280":1,"460":1,"463":1}}],["eslint",{"2":{"23":1,"92":1,"432":3,"433":17,"473":1,"504":2}}],["education",{"2":{"554":1}}],["editorconfig",{"2":{"433":2}}],["editortab",{"2":{"433":1}}],["editorgroup",{"2":{"433":1}}],["editor",{"2":{"433":29}}],["edit",{"2":{"212":1,"240":1,"495":1}}],["edititem",{"2":{"212":4}}],["edge",{"2":{"40":1,"115":2,"222":1,"402":1}}],["effective",{"2":{"158":1}}],["eff",{"2":{"144":2}}],["eth",{"2":{"331":1}}],["ethjs",{"2":{"331":1}}],["ethereum",{"2":{"331":4}}],["etc",{"0":{"141":1},"2":{"140":1,"557":1}}],["etsy",{"2":{"22":1}}],["eventbus",{"2":{"316":3}}],["event",{"2":{"292":13,"343":3,"344":5,"353":1,"381":2,"433":1,"437":4,"438":2,"439":1,"443":2,"444":2}}],["eventname",{"2":{"245":2}}],["events",{"0":{"124":1},"2":{"245":1,"292":9,"373":2}}],["everybody",{"2":{"462":1}}],["every",{"2":{"114":1}}],["electron",{"2":{"313":1}}],["electronic",{"2":{"144":1}}],["elements",{"2":{"212":1,"251":1}}],["element",{"2":{"171":1}}],["elem",{"2":{"171":3}}],["el",{"2":{"120":1}}],["else",{"0":{"208":2},"2":{"103":1,"244":1,"287":1,"302":2,"303":2,"327":1,"329":2,"344":1,"360":1,"361":1,"366":1,"430":1,"443":1,"450":2}}],["embla",{"2":{"459":1}}],["emmet",{"2":{"433":2}}],["emma",{"2":{"123":1}}],["email",{"2":{"329":3}}],["email=ref",{"2":{"329":1}}],["emitted",{"2":{"381":1}}],["emit",{"2":{"124":1,"292":3,"316":1,"356":1,"381":1}}],["emits",{"2":{"119":1,"124":1,"204":1,"246":1,"351":2}}],["empty",{"2":{"112":1}}],["engine",{"2":{"460":1}}],["enablesmartcommit",{"2":{"433":1}}],["enable",{"2":{"433":3,"460":1}}],["enabled",{"2":{"345":1,"433":9}}],["end",{"2":{"372":2,"373":2,"461":2}}],["endpoint",{"2":{"324":1,"326":1}}],["endpoints",{"0":{"51":1},"2":{"325":1}}],["entity",{"2":{"462":2}}],["entire",{"2":{"431":1}}],["entry",{"2":{"322":2}}],["enter=",{"2":{"231":2}}],["enter",{"2":{"223":2,"229":1,"231":1,"381":1}}],["encapsulation",{"0":{"266":1},"2":{"260":1}}],["encryption",{"2":{"325":1}}],["encrypt",{"0":{"144":1},"2":{"131":1,"144":3,"145":1,"337":1,"416":1}}],["en",{"2":{"156":1,"269":1,"326":1,"364":1,"433":3}}],["envrc",{"2":{"433":12}}],["envs",{"2":{"421":2}}],["environments",{"2":{"422":1}}],["environment",{"2":{"379":1,"421":1}}],["env",{"2":{"114":1,"421":26,"433":38,"512":1}}],["e2e2e3",{"2":{"557":2}}],["e2e",{"2":{"66":1,"372":1,"461":5}}],["eq",{"2":{"55":1}}],["exs",{"2":{"433":5}}],["ex",{"2":{"433":1}}],["exclude",{"2":{"421":1,"433":1}}],["exiting",{"2":{"421":1}}],["extractor",{"2":{"433":11}}],["extractdomain",{"2":{"0":1}}],["extension",{"2":{"433":1}}],["extensions",{"2":{"338":1,"391":1,"433":3}}],["express",{"2":{"453":2,"454":7,"472":1}}],["expand",{"2":{"433":1}}],["expandmode",{"2":{"433":1}}],["expected",{"2":{"376":1}}],["expect",{"2":{"376":12,"377":1,"378":3,"380":2,"381":4,"382":1}}],["experience",{"2":{"149":1,"373":1,"496":2}}],["explorer",{"2":{"224":1,"390":1,"433":6}}],["explain",{"0":{"91":1,"92":1},"2":{"91":1,"92":1}}],["exports",{"2":{"431":1}}],["export",{"2":{"103":1,"114":2,"204":2,"250":1,"255":2,"280":1,"281":1,"283":1,"284":1,"285":1,"288":1,"313":1,"345":1,"355":1,"358":1,"360":1,"366":1,"425":1,"427":1,"431":1,"432":1,"443":1,"445":1,"448":1,"450":1,"462":1,"512":2}}],["examplecomponent",{"2":{"244":1}}],["example",{"2":{"14":1,"431":2}}],["e",{"2":{"12":2,"16":1,"71":1,"72":1,"76":1,"79":1}}],["2fa",{"0":{"330":1},"2":{"329":1,"330":4}}],["2979ff",{"2":{"341":1}}],["299",{"2":{"324":1}}],["29",{"2":{"194":1,"433":1}}],["28",{"2":{"187":1}}],["27",{"0":{"480":1},"1":{"481":1,"482":1},"2":{"186":1}}],["26",{"2":{"183":1,"429":1}}],["25",{"2":{"182":1,"296":2}}],["255",{"2":{"134":1,"557":2}}],["245",{"2":{"557":3}}],["24",{"0":{"475":1},"1":{"476":1,"477":1},"2":{"182":1,"430":2}}],["235",{"2":{"557":4}}],["23",{"2":{"181":1}}],["22+",{"2":{"433":1}}],["22",{"2":{"178":1,"182":1,"222":1}}],["21",{"2":{"178":1,"182":1,"302":2}}],["2px",{"2":{"169":1}}],["2022",{"2":{"497":1}}],["2023",{"0":{"475":1,"478":1,"480":1,"483":1,"486":1},"1":{"476":1,"477":1,"479":1,"481":1,"482":1,"484":1,"485":1,"487":1},"2":{"433":1,"473":1,"497":1}}],["2016",{"2":{"473":1}}],["20~30",{"2":{"432":1}}],["20",{"2":{"105":1,"144":1,"171":1,"177":1,"421":1,"462":1,"473":1}}],["200",{"2":{"47":1,"244":1,"324":1,"422":1,"433":1,"472":1,"534":1}}],["2",{"0":{"119":1,"239":1,"281":1,"283":1,"284":2,"285":1,"286":1,"287":1,"288":1,"289":1,"292":1,"294":1,"296":1,"298":1,"299":2,"302":1,"327":1,"408":1,"418":1,"480":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"481":1,"482":1},"2":{"10":1,"51":2,"98":1,"100":1,"117":1,"118":1,"119":2,"120":2,"121":1,"122":1,"124":2,"125":6,"126":1,"128":1,"130":2,"137":1,"141":2,"144":1,"152":1,"171":1,"174":2,"199":1,"204":4,"209":1,"223":1,"225":1,"229":1,"231":4,"235":1,"238":1,"239":1,"243":1,"249":2,"250":4,"255":6,"256":1,"263":1,"265":2,"288":1,"291":2,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":2,"299":2,"300":1,"301":1,"302":10,"303":10,"308":1,"311":1,"313":3,"325":2,"338":1,"343":1,"352":3,"353":2,"354":2,"356":1,"358":4,"360":3,"361":3,"363":3,"364":1,"365":1,"366":2,"374":2,"376":4,"380":2,"381":4,"390":2,"418":1,"433":3,"436":2,"440":1,"441":1,"443":2,"444":2,"447":2,"448":2,"454":2,"460":5,"462":2,"463":1,"471":1,"472":1,"473":3,"492":2,"512":1,"557":2}}],["c2c2c4",{"2":{"557":1}}],["czrc",{"2":{"433":2}}],["cz",{"2":{"433":2}}],["cxx",{"2":{"433":1}}],["cjs",{"2":{"433":4}}],["cc",{"2":{"433":1}}],["csproj",{"2":{"433":1}}],["cspell",{"2":{"433":2}}],["cshtml",{"2":{"433":2}}],["cs",{"2":{"433":12}}],["csshtml",{"2":{"519":1}}],["cssnano",{"2":{"433":10}}],["cssnanorc",{"2":{"433":10}}],["css",{"0":{"84":1,"86":1,"225":1,"226":1,"471":1,"492":1,"519":1},"1":{"85":1,"86":1,"87":1,"226":1,"230":1,"231":1,"232":1},"2":{"23":2,"35":3,"86":6,"161":1,"162":1,"163":1,"168":1,"181":3,"199":4,"201":1,"202":1,"203":4,"207":1,"212":1,"221":1,"224":4,"225":5,"226":9,"227":9,"230":2,"231":4,"233":1,"234":1,"249":1,"266":1,"314":1,"336":1,"340":1,"345":3,"402":1,"422":1,"433":5,"447":1,"457":1,"463":1,"468":1,"471":9,"472":1,"473":1,"504":1,"508":1,"545":1,"548":1,"555":1,"556":1,"557":4}}],["css3",{"0":{"468":1},"2":{"23":1,"468":1,"469":1,"471":1,"504":1}}],["cpp",{"2":{"433":1}}],["cp",{"2":{"421":1}}],["cpu",{"2":{"402":1}}],["cypress",{"2":{"381":1,"433":10,"461":1}}],["cycle",{"2":{"204":1}}],["c++",{"2":{"267":1}}],["certification",{"2":{"473":1}}],["certbot",{"2":{"144":6,"146":1,"422":1}}],["central",{"2":{"365":1}}],["center",{"2":{"230":1}}],["celsius",{"2":{"296":9}}],["ctrlcmd",{"2":{"433":1}}],["ctrl",{"2":{"158":1}}],["c>",{"2":{"139":2}}],["cname",{"2":{"134":1}}],["cheat",{"0":{"488":1},"1":{"489":1,"490":1,"491":1,"492":1,"493":1,"494":1},"2":{"489":1,"490":1,"491":1,"492":4}}],["checkout",{"2":{"392":2,"393":2,"421":4}}],["checkotp",{"2":{"329":3}}],["check",{"2":{"380":1,"381":1,"433":1}}],["checkbox",{"2":{"231":2}}],["checked",{"2":{"231":6}}],["chgrp",{"2":{"421":2}}],["choice",{"2":{"421":1}}],["choose",{"2":{"112":1}}],["chia",{"2":{"376":1}}],["childsession",{"0":{"367":1}}],["childsimple",{"2":{"358":1}}],["childpinia",{"0":{"363":1}}],["children",{"2":{"317":2,"318":1,"425":2}}],["child",{"0":{"353":1,"356":1},"2":{"246":1,"352":4}}],["childcomponent>",{"2":{"246":1,"352":3}}],["childcomponent",{"2":{"246":1,"352":4}}],["chrome",{"2":{"222":1,"342":2,"346":1,"364":1,"367":1,"402":2,"460":2,"472":1}}],["chromium",{"2":{"125":1,"222":1,"402":1,"460":1}}],["changelocale",{"2":{"538":2}}],["changelog",{"2":{"433":1}}],["changes",{"2":{"129":1}}],["chain",{"2":{"331":1}}],["chainable",{"2":{"297":1}}],["chapter08",{"2":{"435":1}}],["chapter09",{"2":{"371":1}}],["chapter07",{"2":{"350":1}}],["chapter06",{"2":{"335":1}}],["chapter05",{"2":{"307":1}}],["chapter11",{"2":{"148":1}}],["chapter",{"0":{"136":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"292":1,"294":1,"296":1,"298":1,"299":1,"302":1,"391":1},"2":{"223":1,"345":3}}],["clangd",{"2":{"433":1}}],["clang",{"2":{"433":2}}],["classes",{"2":{"493":1}}],["classpath",{"2":{"433":1}}],["class",{"2":{"281":1,"433":1}}],["class=",{"2":{"103":1,"105":2,"169":1,"227":1,"230":1,"231":17,"249":3,"255":2,"316":3,"319":1,"353":1,"363":1,"426":3,"430":1,"509":4,"513":2}}],["clearcase",{"2":{"385":1}}],["clear",{"2":{"364":1}}],["clearinterval",{"2":{"329":1}}],["cleartodo",{"2":{"231":3}}],["clean",{"0":{"267":1},"2":{"250":1,"260":1,"267":1,"292":1,"421":1}}],["clippy",{"2":{"433":2}}],["clipboard",{"2":{"231":1,"433":4}}],["click=",{"2":{"211":2,"212":1,"231":3,"255":2,"343":1,"352":1,"353":1,"356":1,"358":2,"363":2,"447":3,"452":1,"513":1,"538":1}}],["click",{"2":{"211":2,"255":1,"352":1,"381":3}}],["cli",{"2":{"126":1,"432":1,"433":2}}],["client",{"2":{"51":3,"55":2,"56":9,"117":6,"325":1,"326":1,"511":1}}],["closeonfiledelete",{"2":{"433":1}}],["closemodal",{"2":{"255":3}}],["cloud",{"2":{"115":2,"473":1}}],["clone",{"2":{"111":1,"344":1,"503":1}}],["custom",{"2":{"433":2,"460":3,"557":1}}],["customer",{"2":{"79":1}}],["cursorstyle",{"2":{"433":1}}],["cursorsmoothcaretanimation",{"2":{"433":1}}],["cursorblinking",{"2":{"433":1}}],["cursor",{"2":{"231":1}}],["currentcolor",{"2":{"430":2}}],["current",{"2":{"112":1,"174":2,"255":11}}],["curl",{"2":{"51":2,"56":2}}],["cmakepresets",{"2":{"433":1}}],["cmake",{"2":{"433":3}}],["cmakelists",{"2":{"433":1}}],["cmv",{"0":{"87":1,"106":1},"2":{"73":1}}],["cms",{"0":{"37":1,"39":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"6":1,"12":2,"39":1,"72":1}}],["cdn",{"2":{"201":1}}],["cd",{"0":{"419":1},"2":{"65":1,"112":1,"395":2,"396":1,"397":1,"419":5,"421":4,"461":1,"473":1,"482":1,"502":1,"503":1,"545":1}}],["citation",{"2":{"433":1}}],["city",{"2":{"317":1,"319":1}}],["cities",{"2":{"317":1}}],["circleci",{"2":{"433":2}}],["circle",{"2":{"290":4}}],["ci",{"0":{"419":1},"2":{"65":1,"395":3,"396":1,"397":1,"419":5,"421":1,"461":1,"473":1,"482":1,"545":1}}],["crm",{"2":{"508":1}}],["crypto",{"2":{"443":1}}],["crowdin",{"2":{"433":2}}],["cross",{"2":{"117":1,"433":1,"454":1}}],["credits",{"2":{"433":1}}],["credo",{"2":{"433":1}}],["creator",{"2":{"135":1}}],["created",{"2":{"393":1}}],["createpinia",{"2":{"362":2}}],["createshape",{"2":{"290":3}}],["createrouter",{"2":{"136":1,"313":3}}],["creatememoryhistory",{"2":{"127":1}}],["createwebhistory",{"2":{"127":1,"136":3}}],["createwebhashhistory",{"2":{"127":1,"136":1,"313":3}}],["createapp",{"2":{"120":2,"121":4,"201":4,"243":2,"247":1,"255":2,"314":2,"362":2}}],["create",{"0":{"501":1},"1":{"502":1},"2":{"55":1,"112":1,"223":1,"240":1,"432":1,"495":1,"499":1,"501":4,"506":1,"507":1}}],["createclient",{"2":{"55":2}}],["crafty",{"0":{"70":1},"2":{"80":2,"83":1,"95":1,"111":1,"112":5}}],["crud",{"2":{"59":1,"115":1,"240":2,"267":1,"282":1,"446":2,"447":1,"449":2}}],["c",{"2":{"17":1,"200":3,"204":1,"267":1,"303":7,"319":4,"433":1,"501":1,"508":1,"557":9}}],["caches",{"2":{"344":2}}],["cache",{"2":{"344":4,"433":1,"555":1}}],["capture",{"2":{"433":95}}],["caption",{"2":{"169":2}}],["capacitor",{"2":{"313":1}}],["calc",{"2":{"519":1}}],["calculation",{"2":{"376":1}}],["calculatecelsius",{"2":{"296":2}}],["calculatefahrenheit",{"2":{"296":2}}],["callback",{"0":{"301":1,"302":1},"1":{"302":1},"2":{"301":1,"302":7,"303":1,"437":2}}],["callbacks",{"2":{"260":1,"276":1}}],["call",{"0":{"183":1},"2":{"183":1}}],["called",{"2":{"91":1}}],["catch",{"2":{"287":1,"303":5,"324":1,"328":1,"329":2,"377":1,"448":3,"450":2}}],["categories",{"0":{"45":1},"2":{"43":1,"51":3,"83":3,"554":1}}],["categoryproducts",{"2":{"83":1}}],["category",{"0":{"47":1},"2":{"18":1,"83":1,"97":4,"109":1}}],["categoryid",{"2":{"18":1,"83":3,"97":2}}],["can",{"2":{"462":1,"509":1}}],["cancel",{"2":{"255":3}}],["caniuse",{"2":{"125":1}}],["carousel",{"2":{"459":1}}],["cargo",{"2":{"433":2}}],["card",{"2":{"231":1,"552":1}}],["cart",{"2":{"12":1,"97":1}}],["camelcase",{"2":{"217":1,"250":1}}],["cases",{"0":{"424":1}}],["case",{"0":{"14":1},"2":{"14":4,"44":1,"215":1,"239":1,"256":3,"290":2,"294":3,"296":2,"336":1,"470":1}}],["coolcosmos",{"2":{"462":1}}],["cookies",{"2":{"364":2}}],["cookie",{"2":{"116":3,"343":1}}],["copying",{"2":{"433":1}}],["copilot",{"2":{"89":1}}],["coverage",{"2":{"375":2,"383":4}}],["coinflip",{"2":{"251":1}}],["couchdb",{"2":{"446":2}}],["count`",{"2":{"421":1}}],["count=5",{"2":{"421":1}}],["count++",{"2":{"360":1}}],["count>=0",{"2":{"360":2}}],["counter++",{"2":{"358":1}}],["counter=",{"2":{"352":3}}],["counter",{"0":{"361":1},"2":{"352":8,"353":3,"358":2,"360":1,"361":1,"363":1,"367":2}}],["countries",{"2":{"319":1}}],["country",{"2":{"317":1,"319":3}}],["count",{"2":{"214":1,"360":3,"361":7}}],["coupled",{"2":{"2":1}}],["colortheme",{"2":{"433":1}}],["color",{"2":{"151":1,"169":1,"203":1,"299":2,"340":2,"341":2,"345":2,"363":1,"430":3}}],["column=eq",{"2":{"56":1}}],["column",{"2":{"55":3,"56":2,"181":1,"509":1}}],["core",{"2":{"325":1,"388":1}}],["cordova",{"2":{"313":1}}],["corporation",{"2":{"134":1,"554":1}}],["cors",{"0":{"117":1},"2":{"117":10,"453":1,"454":5,"479":1}}],["coding",{"2":{"73":1,"87":1,"106":1}}],["codesandbox",{"2":{"433":1}}],["codeowners",{"2":{"433":1}}],["codecov",{"2":{"433":10}}],["codelens",{"2":{"433":4}}],["codeaction",{"2":{"433":1}}],["codeactions",{"2":{"433":1}}],["codeactionsonsave",{"2":{"433":2}}],["code>",{"2":{"363":1}}],["code=ref",{"2":{"329":2}}],["codeium",{"0":{"88":1},"1":{"89":1,"90":1,"91":1,"92":1,"93":1},"2":{"89":3,"90":1,"91":1,"92":1,"93":1,"433":1}}],["code",{"0":{"213":1,"270":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1,"273":1,"274":1,"275":1,"276":1},"2":{"39":1,"86":1,"89":1,"91":2,"112":1,"204":1,"215":1,"222":2,"224":1,"260":1,"294":1,"319":2,"327":3,"328":2,"329":3,"363":1,"387":1,"394":1,"402":1,"423":1,"433":9,"463":1,"501":1,"506":1,"527":1,"538":4,"539":1}}],["conduct",{"2":{"433":1}}],["conf",{"2":{"433":1}}],["confirmsync",{"2":{"433":1}}],["confirmdraganddrop",{"2":{"433":1}}],["confirmdelete",{"2":{"433":1}}],["confirm",{"0":{"194":1}}],["configs",{"2":{"433":1}}],["config",{"2":{"112":1,"224":1,"228":3,"345":1,"379":1,"382":1,"383":1,"432":2,"433":225,"501":4,"504":1,"518":1,"528":1,"529":1}}],["connection",{"2":{"433":1}}],["connect",{"2":{"325":1}}],["concerns",{"0":{"263":1},"2":{"260":1}}],["console",{"2":{"247":1,"281":1,"296":1,"302":5,"303":7,"324":2,"331":2,"421":1,"437":1,"438":1,"454":1,"460":2}}],["constructor",{"2":{"281":1,"287":1,"292":1}}],["constant",{"2":{"204":2}}],["const",{"2":{"55":4,"83":2,"103":2,"104":1,"114":3,"120":2,"121":2,"123":1,"169":1,"171":1,"201":1,"204":2,"212":1,"215":1,"218":1,"231":1,"244":1,"247":3,"250":2,"255":3,"283":1,"287":1,"289":1,"298":1,"299":1,"313":1,"319":1,"324":1,"327":1,"343":1,"344":4,"352":1,"353":1,"355":1,"356":1,"358":2,"360":1,"361":2,"362":1,"363":1,"366":1,"367":1,"380":1,"382":1,"425":2,"426":1,"427":3,"428":1,"430":3,"431":5,"439":1,"443":2,"444":2,"447":1,"448":2,"449":1,"450":1,"451":1,"452":1,"454":5,"460":1,"462":1,"509":1,"511":2,"512":2,"513":1,"538":2}}],["conventions",{"0":{"213":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1}}],["convention",{"2":{"204":1}}],["convert",{"2":{"91":1}}],["contributors",{"2":{"433":1}}],["contributing",{"2":{"433":1}}],["controller",{"2":{"433":1,"462":3,"463":2}}],["control",{"0":{"385":1},"2":{"116":1,"117":4,"385":3,"397":1,"493":1}}],["continuous",{"2":{"395":3,"419":2}}],["continue",{"2":{"112":1}}],["container",{"2":{"231":6,"469":1,"509":2}}],["content=",{"2":{"552":11}}],["contentlayer",{"2":{"433":10}}],["contents",{"2":{"421":1}}],["content>",{"2":{"249":1}}],["content",{"2":{"56":1,"230":1,"249":2,"512":1}}],["co",{"2":{"51":3,"55":1,"56":3}}],["commitlint",{"2":{"433":4}}],["commit",{"2":{"390":1,"391":3,"393":1,"419":1}}],["common",{"2":{"328":1}}],["commands",{"2":{"433":1}}],["commandinvoker",{"2":{"294":1}}],["command",{"0":{"293":1,"294":1},"1":{"294":1},"2":{"222":1,"260":1,"274":1,"294":4,"440":1,"441":1,"443":4,"444":2,"445":1}}],["commerce",{"2":{"12":2,"16":1,"71":1,"72":1,"76":1,"79":1}}],["compile",{"2":{"433":1}}],["compileroptions",{"2":{"432":1}}],["compare",{"2":{"433":6}}],["completed",{"2":{"256":2}}],["completion",{"2":{"222":1,"433":1}}],["computed",{"2":{"204":1,"231":7,"255":4,"358":1,"361":3,"427":2,"430":3}}],["computer",{"2":{"158":1}}],["component>",{"2":{"212":1,"251":1}}],["components",{"0":{"169":1,"171":1,"447":1,"452":1},"2":{"105":1,"204":1,"212":1,"224":1,"228":5,"230":3,"249":1,"316":2,"319":2,"375":1,"380":1,"381":1,"423":1,"432":1,"433":1,"513":1}}],["component",{"0":{"251":1,"319":1,"428":1},"2":{"97":3,"121":4,"212":2,"243":3,"251":3,"255":1,"313":3,"317":3,"319":1,"352":3,"363":1,"367":1,"380":1,"381":1,"425":4,"433":7,"462":3}}],["compose",{"2":{"433":1}}],["composer",{"2":{"433":2}}],["composables",{"0":{"250":1},"1":{"251":1},"2":{"103":2,"114":1,"204":1,"250":1,"423":1,"426":1,"428":1,"462":1,"509":1,"513":1,"538":2}}],["composable",{"2":{"34":1,"425":1,"462":9,"463":2,"504":1,"509":1,"516":1,"536":1}}],["composition",{"0":{"204":1,"264":1},"2":{"23":1,"102":1,"119":2,"121":1,"123":1,"125":2,"130":1,"204":10,"250":2,"260":1,"322":2,"357":1,"359":1,"360":1,"361":2,"363":1,"460":3,"462":2,"473":1,"482":1,"504":1}}],["com",{"2":{"22":3,"80":1,"111":1,"115":1,"117":9,"125":2,"134":1,"135":2,"136":2,"141":3,"148":1,"177":1,"195":2,"201":1,"222":1,"226":3,"227":1,"228":1,"235":1,"255":1,"256":1,"292":1,"307":1,"325":1,"335":1,"336":1,"350":1,"354":1,"371":1,"404":1,"405":1,"421":10,"422":5,"433":2,"435":1,"503":1,"511":1,"528":1,"529":1}}],["db",{"2":{"448":5}}],["dbservice",{"0":{"448":1},"2":{"447":1,"449":3,"451":1}}],["dbnotes",{"0":{"447":1}}],["dbmanager",{"2":{"282":1,"283":3,"284":3,"285":2,"286":4,"287":10,"289":6}}],["dprint",{"2":{"433":4}}],["dlint",{"2":{"433":4}}],["dynamic",{"2":{"429":1}}],["dt",{"2":{"421":1}}],["ds",{"2":{"391":1}}],["dx",{"2":{"373":1,"381":1,"471":1,"496":1}}],["dash",{"2":{"512":1}}],["day",{"2":{"457":2,"460":2}}],["dangerfile",{"2":{"433":2}}],["dart",{"2":{"433":6}}],["dark",{"2":{"433":1,"543":1,"557":1}}],["dapp",{"2":{"331":2}}],["dapps",{"2":{"331":1,"332":1}}],["datalayer",{"2":{"529":3}}],["data>",{"2":{"249":1}}],["data=json",{"2":{"364":1}}],["data=localstorage",{"2":{"364":1}}],["data=",{"2":{"249":1}}],["data`",{"2":{"83":1}}],["database",{"2":{"55":1}}],["data",{"0":{"122":1},"2":{"17":1,"18":2,"19":1,"47":3,"48":1,"51":1,"55":2,"83":5,"119":1,"122":6,"123":5,"201":2,"204":6,"247":6,"249":3,"292":3,"294":4,"324":1,"326":2,"328":1,"329":1,"359":1,"364":4,"421":2,"432":1,"437":2,"438":1,"443":6,"444":7,"445":1,"447":1,"450":6,"452":9,"454":4,"460":1}}],["date=`date",{"2":{"421":1}}],["date",{"2":{"0":1,"231":1,"421":7,"433":1,"529":1}}],["döner",{"2":{"176":1}}],["dns",{"0":{"134":2},"1":{"136":2},"2":{"134":6,"145":1,"146":2}}],["doublecount",{"2":{"360":1,"361":2}}],["don",{"0":{"268":1},"2":{"260":1}}],["done",{"2":{"231":5,"232":1}}],["dosignin",{"2":{"324":1}}],["dos",{"2":{"230":1}}],["dosubscribe",{"2":{"217":1}}],["download",{"2":{"227":1}}],["downloads",{"2":{"226":1}}],["docs",{"2":{"308":1,"326":1,"421":1,"422":1}}],["documentscroll",{"2":{"250":2}}],["document",{"2":{"171":1,"207":1,"250":2,"267":1,"446":1,"473":1}}],["dockerignore",{"2":{"433":1}}],["dockerfile",{"2":{"433":2}}],["docker",{"0":{"420":1},"2":{"40":1,"433":2}}],["do",{"0":{"136":1,"229":1,"232":1,"256":1,"257":1,"311":1},"1":{"230":1,"231":1,"232":1},"2":{"221":1,"223":1,"228":1,"229":2,"231":2,"232":1,"233":1,"238":1,"251":1,"255":1,"256":3,"257":1,"259":1,"306":2,"311":1,"316":2}}],["domain",{"2":{"552":1}}],["dom",{"2":{"128":1,"171":2,"207":1,"208":2,"210":1,"267":1,"378":2,"436":1}}],["doe",{"2":{"123":2,"245":1}}],["dropdown",{"2":{"471":1}}],["draw",{"2":{"290":3}}],["drawers",{"0":{"514":1},"1":{"515":1,"516":1}}],["drawer",{"2":{"112":1,"501":1,"508":1,"513":1,"542":1}}],["drilling",{"2":{"247":1,"425":2}}],["drive",{"2":{"116":3}}],["dry",{"0":{"268":1},"2":{"243":1,"250":1,"260":1}}],["diffeditor",{"2":{"433":1}}],["diffdecorationsgutterwidth",{"2":{"433":1}}],["di",{"2":{"353":1}}],["dialyzer",{"2":{"433":1}}],["dialogstyle",{"2":{"433":1}}],["dialog",{"2":{"255":1}}],["diagram",{"0":{"5":1}}],["dirs",{"2":{"421":1}}],["dir=`echo",{"2":{"421":2}}],["dir=your",{"2":{"421":1}}],["dir=dev",{"2":{"421":1}}],["dir=",{"2":{"421":2}}],["dir",{"2":{"421":24,"554":1}}],["dirname",{"2":{"228":1,"432":1}}],["direction",{"2":{"181":2,"509":2}}],["directives",{"2":{"211":1}}],["directive",{"2":{"121":1}}],["directory",{"0":{"319":1},"2":{"112":1,"317":3,"318":1}}],["disabled=",{"2":{"363":1}}],["discord",{"2":{"308":1}}],["dispatch",{"2":{"421":2}}],["dispatcher",{"0":{"441":1},"2":{"292":4,"439":1,"440":1,"441":1,"442":1}}],["displaylanguage",{"2":{"433":1}}],["display",{"2":{"169":1,"181":2,"207":1,"230":1,"231":1,"339":1,"341":1,"345":1,"509":1,"554":1}}],["distributedfooter",{"0":{"525":1}}],["dist",{"2":{"136":1,"143":1,"391":2,"421":2,"429":1,"433":1}}],["divider",{"2":{"557":1}}],["div>",{"2":{"105":1,"169":2,"171":2,"201":1,"204":2,"207":1,"230":1,"231":10,"249":5,"255":2,"299":1,"316":2,"319":3,"352":2,"356":2,"358":2,"425":6,"426":1,"447":3,"452":4,"509":4,"538":2}}],["div",{"2":{"105":2,"170":1,"171":4,"201":3,"207":2,"230":3,"231":12,"249":4,"255":2,"299":1,"316":2,"319":1,"393":5,"426":2,"430":1,"447":1,"509":4}}],["d",{"2":{"56":1,"139":1,"325":1,"375":1,"379":2,"384":1,"392":1,"421":1,"433":16}}],["details",{"2":{"469":1}}],["dexie",{"2":{"446":2,"448":5}}],["dexiejs",{"0":{"446":1},"1":{"447":1,"448":1,"449":1,"450":1,"451":1,"452":1},"2":{"446":2}}],["dexiedb",{"2":{"300":1}}],["deno",{"2":{"433":2}}],["deep",{"2":{"430":1}}],["deposit",{"2":{"536":1}}],["deprecated",{"2":{"462":1}}],["deploy",{"2":{"421":16,"527":2,"542":1}}],["deployment",{"0":{"527":1},"2":{"395":1,"527":2}}],["dependencies",{"2":{"288":3,"421":2,"539":1}}],["dependency2",{"2":{"289":1}}],["dependency1",{"2":{"289":1}}],["dependencyservice",{"2":{"288":2,"289":6}}],["dependency",{"0":{"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"2":{"260":1,"273":1,"287":1,"288":2,"289":2}}],["debounce",{"2":{"465":1}}],["debuganyway",{"2":{"433":1}}],["debug",{"2":{"391":4,"433":1}}],["debian",{"2":{"388":1}}],["decrement",{"2":{"360":1,"361":2,"363":1}}],["decoder",{"2":{"325":1}}],["decorator=",{"2":{"366":1}}],["decorator",{"0":{"297":1,"298":1,"299":1},"1":{"298":1,"299":1},"2":{"260":1,"275":1,"299":1,"303":1,"365":1,"366":2,"368":1,"440":1}}],["degrees",{"2":{"296":6}}],["delegate",{"0":{"440":1},"2":{"434":1,"439":1,"440":3,"442":1,"456":1}}],["deletenote",{"2":{"447":3,"448":2}}],["delete",{"2":{"55":1,"56":1,"103":1,"240":1,"323":1,"427":1,"443":1,"448":1,"449":1,"460":1}}],["delivery",{"2":{"395":1,"419":1}}],["delay",{"2":{"244":2}}],["de",{"2":{"167":1}}],["definition",{"2":{"376":1}}],["define",{"2":{"382":1}}],["defined",{"2":{"376":2}}],["defineasynccomponent",{"2":{"244":7}}],["defineconfig",{"2":{"228":1,"345":2,"379":1,"382":2,"432":1,"528":1}}],["defineemits",{"2":{"124":1,"245":3,"246":2}}],["defineprops",{"2":{"124":1,"169":1,"245":4,"246":2,"255":1,"298":1,"299":1,"316":1,"430":1}}],["definestore",{"2":{"360":3,"361":2}}],["defines",{"2":{"91":1}}],["defaultformatter",{"2":{"433":4}}],["defaults",{"2":{"328":1,"450":1}}],["default",{"0":{"141":1},"2":{"114":1,"122":1,"204":2,"228":1,"245":3,"249":1,"255":4,"280":1,"281":1,"283":1,"284":1,"285":1,"288":1,"313":1,"319":2,"345":1,"355":1,"358":1,"379":1,"382":2,"421":2,"430":6,"432":1,"433":2,"443":1,"445":1,"448":1,"450":1,"512":1,"528":1}}],["devdependencies",{"2":{"432":1,"433":1}}],["devoptions",{"2":{"345":1}}],["developit",{"2":{"354":1}}],["developer",{"2":{"326":1,"344":1,"364":1,"373":1,"439":1,"496":1}}],["development",{"2":{"61":1,"554":1}}],["dev",{"2":{"80":1,"112":1,"117":1,"223":1,"224":1,"226":1,"228":2,"231":1,"345":1,"393":5,"421":10,"422":2,"432":1,"472":1,"502":1,"503":1,"554":1}}],["devtoolsformatters",{"2":{"460":3}}],["devtools",{"2":{"22":1,"115":1,"460":2,"462":4,"539":1}}],["designer",{"2":{"433":2}}],["designing",{"2":{"158":1}}],["design",{"0":{"399":1},"2":{"148":1,"176":1,"225":2,"226":1,"235":1,"255":1,"256":1,"307":1,"335":1,"350":1,"371":1,"400":1,"404":1,"431":1,"435":1,"473":2,"476":1,"497":1}}],["describe",{"2":{"376":3,"380":2,"381":2,"382":1}}],["description",{"2":{"18":1,"19":1,"136":3,"341":1,"421":1,"552":3,"554":1}}],["desc",{"2":{"47":2,"51":2,"83":1}}],["desktop",{"2":{"23":1,"95":1,"156":1,"181":2,"346":1,"509":3,"515":1,"546":2,"548":1}}],["python",{"2":{"472":1,"473":1}}],["pyproject",{"2":{"433":2}}],["pyrightconfig",{"2":{"433":2}}],["psalm",{"2":{"433":1}}],["pm2",{"2":{"433":4}}],["pm",{"2":{"433":1}}],["px`",{"2":{"430":4}}],["pdm",{"2":{"433":2}}],["pdf",{"2":{"429":1,"433":1}}],["pdgaraguso",{"2":{"405":1}}],["pwd",{"2":{"421":1}}],["pwas",{"2":{"332":1}}],["pwa",{"0":{"336":1,"337":1,"345":1,"346":1,"472":1,"553":1},"1":{"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"554":1,"555":1},"2":{"50":1,"78":1,"112":1,"131":2,"144":1,"199":1,"334":5,"336":15,"338":1,"341":2,"343":8,"344":5,"345":5,"346":3,"347":3,"348":4,"400":1,"412":1,"472":12,"496":1,"501":2,"506":2,"508":1,"542":1}}],["ppa",{"2":{"388":3}}],["pnp",{"2":{"433":2}}],["pnpm",{"2":{"54":1,"112":3,"391":1,"421":12,"432":2,"433":6,"501":3,"502":2,"503":2,"506":1}}],["png`",{"2":{"429":1}}],["png",{"2":{"345":8,"429":3,"431":3,"513":1}}],["p>",{"2":{"343":2,"447":2}}],["p",{"2":{"316":4,"343":2,"393":2,"421":1}}],["pending",{"2":{"231":10,"232":1}}],["persistentsessionreviveprocess",{"2":{"433":1}}],["person=",{"2":{"124":1}}],["person",{"2":{"123":5,"124":1,"214":1,"216":1}}],["pereditorgroup",{"2":{"433":1}}],["performance",{"2":{"336":1}}],["permissions",{"2":{"421":1}}],["permission",{"2":{"116":1}}],["pipelines",{"2":{"433":2}}],["picture",{"2":{"206":3}}],["pinia",{"0":{"359":1,"363":1},"1":{"360":1,"361":1,"362":1,"363":1},"2":{"23":1,"104":1,"119":1,"127":2,"349":1,"358":1,"359":6,"360":3,"361":2,"362":2,"363":12,"367":1,"401":1,"402":1,"413":1,"462":14,"482":1}}],["pug",{"2":{"460":1}}],["pugtools",{"2":{"433":1}}],["puppeteer",{"2":{"433":10}}],["put",{"2":{"323":2,"344":1,"449":1}}],["pubspec",{"2":{"433":3}}],["pubxml",{"2":{"433":2}}],["pub",{"2":{"291":1,"295":1,"316":2}}],["publishing",{"2":{"112":1,"152":1,"501":1}}],["public",{"2":{"55":1,"58":2,"109":1,"115":1,"126":1,"224":1,"225":1,"226":1,"227":1,"429":4}}],["push",{"0":{"320":1},"2":{"231":1,"292":1,"320":4,"321":1,"336":3,"386":1,"394":2,"395":1,"419":1,"421":3,"463":1,"529":1}}],["purple",{"2":{"203":1,"299":1}}],["pure",{"2":{"203":1}}],["pullapprove",{"2":{"433":2}}],["pull",{"2":{"143":1,"386":1,"394":1}}],["pba",{"2":{"116":1}}],["phantom",{"2":{"331":1}}],["photoshop",{"2":{"308":1}}],["photo",{"2":{"116":1}}],["phpcs",{"2":{"433":2}}],["phpunit",{"2":{"433":1}}],["php",{"2":{"71":1,"115":1,"433":2,"472":2,"473":1}}],["plugin",{"2":{"255":4,"345":3,"432":2,"433":1,"472":2,"518":1}}],["plugins",{"2":{"228":3,"253":2,"255":5,"256":1,"314":1,"345":1,"379":1,"432":1}}],["plus",{"2":{"231":1}}],["playground",{"2":{"433":1}}],["playwright",{"2":{"433":10}}],["player",{"2":{"195":1}}],["placeholder=",{"2":{"231":1,"447":2}}],["placeholder",{"2":{"115":1}}],["please",{"2":{"112":1,"433":1}}],["pouchdb",{"2":{"446":1}}],["port",{"2":{"389":1,"454":4}}],["portrait",{"2":{"341":1}}],["polygon",{"2":{"331":1}}],["policy",{"2":{"116":1}}],["policies",{"2":{"59":1}}],["pointer",{"2":{"231":1}}],["position",{"2":{"105":1}}],["postmessage",{"2":{"437":2,"438":1,"439":1,"443":1,"444":1}}],["postman",{"2":{"50":2,"117":1,"433":1}}],["posts",{"2":{"125":1}}],["postcssrc",{"2":{"433":10}}],["postcss",{"2":{"86":2,"433":10}}],["postwoman",{"2":{"50":1}}],["postgresql",{"2":{"115":1}}],["postgrest",{"2":{"56":2}}],["postgres",{"2":{"40":2,"48":1,"56":1}}],["post",{"2":{"0":3,"56":1,"323":2,"324":1,"328":1,"329":2,"449":3,"450":2,"451":1,"452":2,"454":3}}],["pablo",{"2":{"325":1,"398":1}}],["payload=",{"2":{"444":1,"450":2}}],["payload",{"2":{"325":4,"443":7,"444":3,"450":4}}],["pascal",{"2":{"433":1}}],["pascalcase",{"2":{"216":1,"230":2}}],["password",{"2":{"324":3}}],["passingpropsupward>",{"2":{"249":1}}],["passingpropsupward",{"2":{"249":2}}],["padding",{"2":{"230":1,"231":7,"316":1,"454":1}}],["patterns",{"0":{"399":1,"417":1},"2":{"148":1,"235":1,"255":1,"256":1,"307":1,"335":1,"350":1,"371":1,"400":1,"404":1,"433":1,"435":1,"473":2,"476":1,"497":1}}],["paths",{"2":{"432":1}}],["path",{"2":{"97":3,"228":4,"313":3,"317":3,"319":1,"320":1,"425":4,"430":1,"432":3}}],["packtpub",{"2":{"177":1}}],["packtpublishing",{"2":{"148":1,"235":1,"255":1,"256":1,"307":1,"335":1,"350":1,"371":1,"404":1,"435":1}}],["packt",{"2":{"151":2,"152":1,"153":1,"177":1,"178":2,"405":1}}],["packages",{"2":{"433":1}}],["package",{"0":{"5":1},"2":{"95":1,"222":1,"224":2,"292":1,"375":2,"383":1,"384":1,"432":1,"433":7,"453":1,"504":1,"539":1}}],["parameters",{"2":{"320":1}}],["params",{"2":{"114":2,"316":4,"319":1,"320":1,"322":2,"450":1,"512":1}}],["parentbasic",{"0":{"352":1}}],["parent",{"2":{"246":1,"436":1}}],["parse",{"2":{"104":1,"364":1,"447":1,"448":1}}],["pagespeed",{"2":{"472":2}}],["pages",{"0":{"526":1},"1":{"527":1,"528":1},"2":{"112":3,"419":1,"421":11,"422":3,"473":1,"501":1,"527":6,"542":2}}],["page",{"2":{"96":2,"117":1,"174":2,"472":1}}],["panel",{"0":{"31":1}}],["pr",{"2":{"495":1}}],["practices",{"0":{"399":1},"2":{"148":1,"235":1,"255":1,"256":1,"307":1,"335":1,"350":1,"371":1,"404":1,"435":1,"473":2,"476":1,"497":1}}],["primevue",{"2":{"457":1}}],["print",{"2":{"460":1}}],["printwidth",{"2":{"433":1}}],["printf",{"2":{"421":1}}],["printpage",{"2":{"211":3}}],["principle",{"0":{"265":1},"2":{"269":1}}],["privacy",{"0":{"189":1}}],["private",{"2":{"137":1,"421":5,"423":1,"462":1}}],["price",{"2":{"18":1,"83":1,"472":1}}],["procfile",{"2":{"433":2}}],["processmessage",{"2":{"443":4}}],["process",{"2":{"436":1}}],["processqueue",{"2":{"217":1}}],["proceed",{"2":{"112":1}}],["proj",{"2":{"433":2}}],["projectname",{"2":{"501":1}}],["projects",{"2":{"282":2,"283":3,"284":4,"285":3,"286":4,"287":9,"316":1}}],["projectservice",{"2":{"218":1}}],["projectservice=new",{"2":{"218":1}}],["project",{"2":{"112":2,"313":4,"316":1,"421":5,"433":1,"501":5,"502":1,"506":2}}],["prod",{"2":{"421":5}}],["producs",{"2":{"103":1}}],["production",{"2":{"432":1}}],["productid",{"2":{"97":1,"103":6,"428":1}}],["productview",{"2":{"96":2,"97":1}}],["productcategoryview",{"2":{"96":2,"97":2}}],["productcard",{"2":{"83":1,"108":1}}],["products",{"0":{"46":1,"83":1},"2":{"41":2,"43":1,"47":1,"48":1,"51":2,"55":3,"56":3,"83":5,"91":1,"95":1,"96":1,"103":1,"109":1,"114":3,"428":1}}],["product",{"0":{"47":1},"2":{"16":1,"17":1,"51":1,"55":1,"59":1,"83":4,"91":2,"97":3,"135":1,"428":2}}],["proxies",{"0":{"365":1},"1":{"366":1,"367":1}}],["proxy",{"0":{"295":1,"296":1},"1":{"296":1},"2":{"117":1,"123":1,"125":1,"260":1,"275":1,"295":1,"296":3,"297":2,"365":1,"366":3,"440":1,"460":2,"463":1}}],["provision",{"2":{"247":5}}],["provider",{"2":{"325":1}}],["provide",{"0":{"247":1},"2":{"246":1,"247":8,"255":1,"288":3,"289":4,"353":2,"423":1,"425":3,"462":2}}],["promised",{"2":{"305":1}}],["promises",{"2":{"260":1,"276":1,"302":1}}],["promise",{"0":{"303":1},"2":{"241":1,"244":1,"255":1,"303":9,"378":2,"443":3,"444":2,"445":2,"448":3,"450":2,"511":1}}],["prompt",{"0":{"343":1},"2":{"222":1,"342":1,"343":6}}],["profile",{"2":{"206":3,"247":1}}],["progressive",{"2":{"336":1,"346":1,"400":1,"472":1}}],["progress",{"0":{"168":1},"1":{"169":1},"2":{"168":1,"256":2}}],["protocol",{"2":{"134":1,"143":2,"144":1}}],["prop",{"2":{"124":2,"246":1,"255":1,"316":2,"352":1,"366":12,"425":2}}],["props",{"0":{"124":1},"2":{"119":1,"124":3,"204":1,"245":1,"246":2,"247":2,"249":1,"255":1,"313":2,"316":1,"317":2,"319":1,"351":2,"366":6,"373":2,"374":1,"380":3,"428":1,"430":11}}],["property=",{"2":{"552":7}}],["properties",{"2":{"322":1}}],["proper",{"2":{"91":1}}],["problem",{"0":{"92":1},"2":{"92":1,"472":1}}],["prerenderer",{"2":{"472":1}}],["prettier",{"2":{"433":14}}],["pretty",{"2":{"313":1}}],["pre>",{"2":{"358":2}}],["preventdefault",{"2":{"343":1}}],["preview",{"2":{"224":1,"375":2,"433":1}}],["pre",{"2":{"302":14,"303":7}}],["press",{"2":{"183":2}}],["prestashop",{"2":{"41":1}}],["preferredtagnamecase",{"2":{"433":1}}],["prefer",{"2":{"56":1,"345":1}}],["ящики",{"2":{"266":1}}],["ячеек",{"2":{"263":1}}],["ярким",{"2":{"323":1,"364":1}}],["яркий",{"2":{"266":1}}],["ярких",{"2":{"162":1}}],["ярлыков",{"2":{"178":1}}],["ярлыка",{"2":{"164":1,"341":1}}],["ядра",{"2":{"125":1,"386":2}}],["языком",{"2":{"264":1,"436":1}}],["языков",{"0":{"469":1},"2":{"200":1,"225":1,"279":1,"281":1,"460":1,"464":1,"536":1}}],["языке",{"2":{"115":2,"149":1,"156":1,"163":1,"204":1,"226":1,"260":1,"403":1,"473":1}}],["языках",{"2":{"265":2,"424":1,"463":1,"464":1}}],["языками",{"2":{"203":1,"267":1}}],["языка",{"2":{"62":1,"117":1,"149":1,"225":1,"264":1,"272":1,"376":1,"460":1,"473":1,"536":1}}],["язык",{"0":{"399":1},"2":{"62":2,"118":1,"147":1,"199":2,"218":1,"264":1,"340":1,"417":1,"462":1,"473":2}}],["явная",{"2":{"268":1}}],["явным",{"2":{"114":1}}],["явные",{"2":{"56":1}}],["явного",{"2":{"286":1}}],["явное",{"2":{"257":1}}],["явном",{"2":{"203":1}}],["явно",{"2":{"105":1,"188":1,"204":1,"212":1,"224":1,"504":1}}],["явен",{"2":{"105":1}}],["являющееся",{"2":{"165":2}}],["являются",{"2":{"14":1,"115":1,"121":1,"124":1,"152":1,"156":2,"158":1,"170":1,"182":1,"187":1,"213":1,"218":1,"222":1,"225":1,"243":1,"262":1,"267":1,"270":1,"278":1,"280":1,"296":1,"302":1,"308":2,"322":1,"323":1,"324":3,"328":1,"331":3,"336":1,"344":1,"351":1,"360":2,"364":2,"370":1,"376":1,"408":1,"425":1,"436":1,"460":1,"499":1}}],["является",{"0":{"122":1},"2":{"41":1,"50":1,"115":1,"119":1,"122":1,"123":1,"125":1,"134":1,"137":1,"143":1,"144":2,"150":1,"156":1,"157":1,"164":1,"167":1,"170":2,"171":1,"174":1,"178":1,"181":1,"182":3,"186":1,"194":2,"197":1,"200":1,"201":1,"203":3,"204":4,"206":1,"220":1,"221":1,"223":1,"224":3,"227":2,"228":2,"232":1,"234":2,"235":1,"238":1,"240":1,"241":1,"244":1,"245":1,"246":3,"247":3,"256":3,"260":1,"264":1,"265":1,"266":1,"268":1,"269":1,"276":1,"280":1,"284":1,"291":1,"292":1,"295":2,"296":2,"300":3,"301":2,"302":1,"303":1,"308":1,"311":1,"313":1,"316":1,"318":1,"319":1,"323":2,"324":1,"325":3,"329":4,"331":3,"334":1,"338":1,"341":1,"343":1,"344":2,"346":1,"351":2,"357":2,"358":2,"359":1,"363":2,"364":4,"366":4,"370":1,"373":2,"374":1,"376":3,"378":1,"379":1,"385":2,"386":2,"387":1,"390":2,"391":2,"425":1,"436":3,"441":1,"443":1,"445":1,"447":1,"449":2,"450":1,"462":2,"463":2,"464":1,"472":1,"512":1}}],["являться",{"2":{"6":1,"450":1}}],["я",{"2":{"4":1,"71":2,"119":1,"184":1,"201":1,"204":2,"212":1,"222":4,"239":1,"249":1,"255":1,"265":1,"267":1,"292":2,"295":1,"296":1,"302":1,"303":2,"316":1,"341":1,"353":1,"363":1,"366":1,"405":1,"450":1,"462":2,"464":2,"473":2}}],["едят",{"2":{"539":1}}],["единицы",{"2":{"372":1}}],["единиц",{"2":{"300":1}}],["единицей",{"2":{"238":1}}],["единую",{"2":{"281":1,"293":1,"440":1}}],["единый",{"2":{"268":1,"358":1,"359":1,"471":1}}],["единая",{"2":{"260":1,"263":1,"291":1,"336":1}}],["единой",{"0":{"265":1},"2":{"265":1,"357":1,"440":1,"442":1}}],["единое",{"2":{"202":1,"266":1,"372":1}}],["единовременно",{"2":{"144":1}}],["единственным",{"2":{"284":1,"454":1}}],["единственный",{"2":{"204":2,"316":1,"363":1}}],["единственные",{"2":{"154":1,"363":1,"364":1}}],["единственному",{"2":{"376":1}}],["единственной",{"2":{"185":1}}],["единственное",{"2":{"71":1,"303":1,"376":1}}],["единственная",{"2":{"170":1,"504":1}}],["ежедневно",{"2":{"368":1}}],["ею",{"2":{"351":2}}],["е",{"2":{"133":1,"183":1}}],["еvent",{"2":{"118":1}}],["ему",{"2":{"116":1,"152":1,"164":1,"239":1,"240":1,"292":1,"303":1,"316":1,"329":1,"419":1,"445":1,"462":1,"472":1}}],["ей",{"2":{"71":1,"271":1,"471":1}}],["ее",{"2":{"23":1,"63":1,"140":1,"149":1,"159":1,"163":2,"171":1,"193":1,"200":1,"201":1,"203":2,"204":2,"222":2,"225":2,"229":1,"231":1,"232":1,"240":1,"244":1,"246":1,"250":3,"251":2,"257":1,"263":1,"267":2,"269":1,"284":1,"286":1,"287":2,"292":1,"301":1,"308":1,"317":1,"327":1,"331":1,"343":1,"351":1,"352":1,"354":1,"358":1,"360":1,"364":3,"377":1,"380":1,"381":1,"383":1,"385":1,"393":1,"436":2,"437":1,"444":1,"446":1,"448":2,"455":1,"464":1}}],["её",{"0":{"224":1},"2":{"23":1,"41":1,"56":1,"89":1,"97":1,"98":2,"108":1,"116":2,"206":1,"423":1,"429":1,"460":1,"463":2,"465":2}}],["еще",{"0":{"249":1},"2":{"10":1,"27":1,"41":1,"134":1,"143":1,"147":1,"149":1,"152":1,"154":1,"167":1,"191":1,"200":1,"202":1,"211":1,"212":1,"219":1,"222":1,"223":2,"224":1,"227":2,"228":1,"239":1,"243":1,"246":1,"247":1,"249":1,"255":1,"256":3,"257":1,"258":1,"263":2,"269":1,"270":1,"289":1,"299":1,"308":2,"328":1,"330":3,"342":1,"372":1,"375":2,"376":2,"378":1,"382":1,"383":1,"384":1,"391":1,"393":1,"394":1,"433":4,"436":1,"439":2,"440":1,"444":1,"454":1,"455":1,"460":1,"463":1,"472":3,"473":1,"536":1}}],["ещё",{"2":{"4":1,"308":1}}],["естественный",{"2":{"309":1}}],["естественным",{"2":{"154":1,"246":1}}],["естественные",{"0":{"154":1}}],["естественных",{"2":{"153":1,"376":1}}],["естественной",{"2":{"153":1}}],["естественном",{"2":{"149":1}}],["естественно",{"2":{"48":1,"112":1,"130":1,"265":1,"421":1,"462":1}}],["есть",{"0":{"498":1},"2":{"9":1,"10":1,"12":1,"13":1,"16":3,"17":2,"22":2,"43":1,"47":1,"48":1,"59":1,"76":1,"85":2,"86":2,"89":1,"90":1,"97":1,"102":3,"105":1,"112":1,"115":4,"116":3,"119":1,"122":1,"123":1,"125":1,"134":2,"136":1,"142":1,"144":1,"158":1,"165":1,"167":1,"168":3,"171":1,"173":1,"182":1,"184":2,"187":1,"199":1,"200":4,"203":2,"204":3,"212":1,"220":1,"223":2,"227":1,"231":4,"232":3,"238":1,"243":1,"244":1,"246":1,"248":1,"249":1,"251":1,"255":1,"256":1,"258":1,"259":1,"264":2,"267":1,"269":1,"292":1,"293":1,"295":2,"297":3,"299":1,"302":1,"303":4,"308":1,"310":1,"313":1,"314":1,"316":2,"317":1,"319":3,"325":3,"329":1,"331":1,"336":2,"342":1,"343":2,"344":3,"345":1,"351":3,"353":2,"355":1,"356":1,"358":3,"359":1,"361":1,"363":1,"364":1,"375":3,"376":1,"379":2,"381":1,"382":1,"383":1,"385":1,"391":1,"394":1,"421":3,"423":2,"431":1,"433":1,"436":4,"438":1,"442":1,"457":2,"458":1,"462":4,"463":3,"464":1,"465":1,"471":1,"472":3,"473":6,"507":1,"539":2,"540":1}}],["если",{"2":{"3":1,"9":1,"12":2,"23":1,"26":1,"34":1,"36":1,"40":1,"41":1,"59":2,"62":1,"91":1,"93":2,"105":2,"109":1,"115":2,"116":5,"117":5,"121":1,"125":4,"131":1,"134":1,"135":4,"136":2,"137":1,"139":1,"141":2,"143":1,"144":4,"145":1,"147":1,"150":1,"152":3,"154":2,"156":1,"157":1,"158":1,"159":1,"165":1,"168":1,"170":1,"173":1,"178":1,"184":1,"186":2,"191":1,"195":1,"196":1,"199":1,"200":1,"202":1,"203":4,"204":2,"206":2,"208":2,"209":1,"212":1,"218":1,"220":2,"222":1,"223":8,"224":2,"225":3,"226":1,"227":2,"231":2,"232":1,"238":1,"239":1,"243":2,"244":2,"246":1,"247":1,"249":6,"250":1,"255":1,"263":2,"265":1,"267":3,"268":2,"270":2,"277":1,"280":2,"281":1,"284":1,"286":2,"287":2,"288":1,"292":2,"293":1,"294":1,"295":1,"296":1,"297":1,"301":1,"306":1,"308":1,"310":1,"313":1,"316":3,"318":1,"319":1,"322":2,"324":1,"325":1,"330":3,"331":1,"336":3,"338":1,"343":2,"344":3,"345":1,"346":1,"347":1,"350":1,"353":2,"356":5,"358":3,"359":1,"360":1,"362":1,"363":1,"364":2,"366":2,"367":2,"375":1,"376":3,"378":2,"379":1,"382":1,"383":2,"385":1,"387":1,"388":1,"389":3,"390":4,"394":1,"402":1,"421":1,"422":1,"423":1,"425":1,"429":2,"431":1,"432":3,"433":1,"436":8,"437":2,"439":1,"441":1,"445":1,"447":1,"448":1,"449":1,"460":1,"462":5,"465":2,"466":1,"468":1,"471":1,"472":2,"473":4,"504":1,"527":1,"528":2,"539":1,"548":1}}],["его",{"0":{"278":1},"2":{"3":1,"4":1,"16":1,"22":2,"23":1,"25":1,"41":1,"48":1,"59":1,"62":1,"63":1,"73":1,"74":1,"85":1,"89":2,"104":1,"105":2,"108":1,"112":1,"115":2,"116":10,"117":1,"121":3,"123":2,"125":1,"134":1,"135":1,"137":1,"140":1,"141":1,"144":2,"147":1,"149":3,"152":2,"157":1,"162":2,"165":1,"166":1,"168":4,"170":1,"171":1,"173":1,"175":1,"177":1,"178":1,"181":1,"183":1,"185":2,"186":1,"187":1,"191":1,"194":1,"196":2,"200":2,"201":2,"203":1,"204":5,"207":2,"211":1,"212":1,"213":1,"221":1,"222":2,"223":2,"224":6,"226":1,"227":1,"229":2,"230":2,"231":3,"232":3,"233":1,"243":2,"244":2,"245":1,"246":1,"247":1,"255":4,"256":2,"258":1,"259":1,"265":1,"267":1,"268":4,"270":1,"281":1,"285":1,"288":1,"289":2,"292":2,"293":1,"295":4,"296":1,"297":4,"298":1,"300":3,"302":2,"303":1,"309":1,"310":1,"311":1,"313":1,"315":1,"316":3,"317":1,"319":1,"323":1,"324":2,"325":4,"326":1,"329":2,"330":1,"331":6,"334":1,"336":2,"340":1,"342":1,"343":2,"344":6,"345":1,"347":1,"348":1,"351":2,"353":1,"354":1,"357":2,"359":4,"360":3,"361":1,"363":2,"364":2,"365":3,"366":5,"367":2,"369":1,"370":1,"372":1,"373":2,"374":1,"375":1,"379":1,"381":2,"384":1,"385":1,"386":2,"390":3,"393":3,"394":1,"395":1,"416":1,"421":1,"423":1,"425":1,"432":1,"433":2,"437":1,"439":1,"440":2,"441":1,"443":1,"444":2,"445":1,"446":2,"447":1,"448":1,"450":2,"454":1,"455":1,"462":1,"463":1,"464":3,"470":1,"471":1,"472":7,"473":1,"496":2,"508":2,"539":1,"554":1}}],["ie6",{"2":{"471":1}}],["iex",{"2":{"433":1}}],["ie11",{"2":{"431":1}}],["ie",{"2":{"431":1}}],["igzir14e",{"2":{"325":1}}],["ignoredlocales",{"2":{"433":1}}],["ignoretrimwhitespace",{"2":{"433":1}}],["ignorerecommendations",{"2":{"433":1}}],["ignore",{"2":{"112":1,"433":2,"501":1}}],["iat",{"2":{"325":2}}],["i++",{"2":{"292":1,"302":2,"303":1}}],["i>",{"2":{"227":1,"231":3}}],["ico",{"2":{"224":1,"345":1}}],["iconify",{"2":{"431":1,"433":2}}],["icons",{"0":{"431":1},"2":{"339":1,"345":1,"430":2,"431":1,"554":1}}],["iconwithbadge",{"2":{"105":3}}],["iconbadge",{"2":{"105":3}}],["iconbuddy",{"2":{"98":1}}],["iconbutton",{"0":{"85":1}}],["icones",{"2":{"98":1}}],["icon",{"2":{"19":1,"105":2,"226":1,"345":3,"430":1}}],["icann",{"2":{"134":2}}],["ipc",{"2":{"303":1,"437":1}}],["ipv6",{"2":{"134":4}}],["ipv4",{"2":{"134":3}}],["ip",{"2":{"116":1,"134":7}}],["iphone",{"2":{"116":1,"162":1}}],["ipo",{"2":{"72":1}}],["i",{"2":{"112":1,"209":4,"227":2,"231":3,"292":6,"302":4,"303":2,"433":1,"502":1,"503":1}}],["isdraweropen",{"2":{"513":3}}],["isn",{"2":{"462":2}}],["isauthenticated",{"2":{"462":1}}],["ist",{"2":{"433":1}}],["issuenumberlabel",{"2":{"433":1}}],["issued",{"2":{"325":1}}],["is=",{"2":{"212":1}}],["is",{"0":{"251":1},"2":{"112":1,"203":1,"212":1,"244":1,"251":2,"433":1,"460":2,"462":2}}],["isinfavourites",{"2":{"103":3}}],["if=",{"2":{"255":1,"430":1}}],["ifmodule>",{"2":{"139":2}}],["ifmodule",{"2":{"139":2}}],["if",{"0":{"208":2},"2":{"103":1,"208":1,"212":1,"231":1,"244":1,"251":1,"281":1,"287":1,"292":3,"302":2,"303":2,"327":1,"329":2,"343":1,"344":1,"360":1,"361":1,"364":1,"366":3,"376":1,"421":3,"443":1,"444":1,"447":1,"450":2}}],["imageresources",{"2":{"431":3}}],["imageraw",{"2":{"429":1}}],["imagenameinvariable",{"2":{"429":1}}],["imageurl",{"2":{"429":1}}],["image",{"2":{"345":3,"429":4,"552":4}}],["images",{"2":{"18":1,"345":4,"421":1,"429":3,"431":2,"513":1,"552":1,"555":1}}],["imgurl",{"2":{"429":2}}],["img",{"2":{"206":1,"429":6,"430":1}}],["importscript",{"2":{"438":2,"439":1}}],["important",{"2":{"299":1}}],["import",{"2":{"103":2,"114":7,"121":3,"123":1,"171":1,"204":2,"212":3,"230":1,"243":2,"244":7,"251":2,"255":5,"267":1,"281":1,"286":1,"287":3,"289":3,"299":1,"313":2,"314":4,"316":1,"317":3,"319":3,"324":1,"345":2,"352":2,"356":2,"358":1,"361":2,"362":2,"363":1,"367":1,"376":1,"380":2,"381":2,"382":3,"426":1,"427":1,"429":3,"430":3,"431":6,"432":3,"433":2,"438":1,"439":1,"447":2,"452":2,"509":1,"511":1,"512":6,"513":3,"538":1}}],["ios",{"2":{"336":1}}],["io",{"2":{"80":1,"112":1,"228":1,"325":1,"527":1}}],["i18next",{"0":{"536":1,"539":1},"2":{"460":1,"536":1,"539":3,"540":1}}],["i18n",{"0":{"535":1},"1":{"536":1,"537":1,"538":1,"539":1,"540":1},"2":{"78":1,"96":1,"112":1,"424":1,"433":3,"460":3,"504":1,"506":1,"508":1,"536":2,"538":1,"539":1,"544":2}}],["inplace",{"2":{"433":1}}],["inputs",{"2":{"421":5}}],["inputevents",{"2":{"381":4}}],["inputevents=wrapper",{"2":{"381":1}}],["input",{"2":{"98":1,"161":2,"210":2,"215":1,"231":6,"244":1,"329":2,"380":2,"381":6,"433":1,"447":1,"452":3,"463":1}}],["inrange",{"2":{"360":1,"361":2}}],["inc",{"2":{"554":1}}],["includesource",{"2":{"382":1}}],["includeassets",{"2":{"345":1}}],["increment=",{"2":{"352":3}}],["increment",{"2":{"352":1,"353":4,"360":1,"361":2,"363":3}}],["incrementcounter",{"2":{"352":7,"353":2}}],["invisiblecharacters",{"2":{"433":1}}],["invalid",{"2":{"327":1}}],["invoker",{"2":{"293":1,"294":2}}],["inheritance",{"0":{"264":1},"2":{"260":1}}],["injectregister",{"2":{"345":1}}],["injections",{"2":{"518":1}}],["injection",{"0":{"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"2":{"260":1,"273":1,"289":2,"518":2}}],["inject",{"0":{"247":1},"2":{"246":1,"247":7,"255":4,"288":2,"289":2,"353":2,"423":1,"425":3,"462":2}}],["instanceof",{"2":{"366":1}}],["instance",{"2":{"281":5}}],["installpwa",{"2":{"343":3}}],["installed",{"2":{"343":5}}],["install",{"0":{"343":1},"2":{"223":1,"252":1,"255":2,"310":1,"323":1,"342":1,"343":10,"344":1,"345":1,"354":1,"359":1,"374":1,"375":1,"379":2,"384":1,"388":2,"389":2,"421":10,"446":1,"449":1,"453":1}}],["insertfinalnewline",{"2":{"433":1}}],["insert",{"2":{"55":1}}],["infinitum",{"2":{"171":1}}],["infinitescroller",{"0":{"171":1}}],["infinite",{"2":{"169":1,"170":1}}],["info",{"2":{"117":3}}],["inlinesuggest",{"2":{"433":1}}],["inline",{"2":{"169":1}}],["ind",{"2":{"433":1}}],["indent",{"2":{"433":1}}],["indexedb",{"2":{"343":1}}],["indexeddb",{"0":{"364":1,"446":1},"1":{"447":1,"448":1,"449":1,"450":1,"451":1,"452":1},"2":{"282":2,"300":2,"364":5,"434":2,"436":1,"440":1,"446":2,"455":1}}],["indexof",{"2":{"292":1}}],["index",{"0":{"136":1,"313":1,"444":1,"449":1,"451":1,"454":1,"518":1},"2":{"120":1,"126":1,"135":1,"136":1,"137":1,"139":2,"141":4,"202":1,"224":3,"225":2,"226":1,"227":1,"255":5,"312":1,"338":1,"342":1,"393":5,"421":2,"443":2,"453":1,"472":2,"512":1,"518":1,"529":1,"552":1,"556":1}}],["individual",{"2":{"247":1}}],["indicating",{"2":{"91":1}}],["initi18n",{"2":{"538":2}}],["initialset",{"2":{"104":2}}],["init",{"2":{"114":1,"390":1,"421":2,"453":1,"512":1}}],["in",{"0":{"382":1},"2":{"112":1,"171":1,"209":1,"211":1,"212":2,"231":2,"251":1,"256":2,"316":1,"319":1,"360":1,"361":1,"363":3,"375":1,"393":2,"431":2,"433":1,"447":1,"462":1,"501":1}}],["intl",{"2":{"457":1,"460":1}}],["integrated",{"2":{"433":5}}],["integration",{"2":{"395":1,"419":1}}],["intel",{"2":{"402":1}}],["intellisense",{"2":{"222":1}}],["inteface",{"2":{"149":1}}],["interval",{"2":{"329":2,"433":1}}],["intersectionobserver",{"2":{"171":3}}],["intersection",{"2":{"170":1,"460":1}}],["interaction",{"2":{"158":1,"327":1}}],["interacting",{"2":{"55":1}}],["interfaces",{"2":{"322":1,"493":1}}],["interface",{"2":{"158":1,"496":1}}],["internet",{"2":{"134":2,"338":1}}],["interceptors",{"2":{"114":1,"511":1,"512":1}}],["into",{"2":{"91":1,"114":1}}],["idb",{"2":{"446":1}}],["idx",{"2":{"433":1}}],["id=g",{"2":{"529":1}}],["id=await",{"2":{"448":1}}],["id=setinterval",{"2":{"329":1}}],["id=",{"2":{"201":3}}],["id=eq",{"2":{"51":2,"83":2}}],["ids",{"2":{"91":2}}],["idea",{"2":{"391":1}}],["identity",{"2":{"327":1,"328":2}}],["ide",{"0":{"433":1},"2":{"89":1,"221":1,"222":6,"224":2,"233":1,"267":1,"363":1,"394":1,"433":1,"496":1}}],["id",{"2":{"3":2,"18":1,"19":1,"51":4,"55":1,"56":3,"83":3,"97":1,"201":1,"209":1,"214":1,"231":4,"313":2,"316":5,"325":1,"326":1,"329":1,"421":2,"428":1,"443":9,"444":5,"447":5,"448":6,"529":1}}],["items",{"2":{"256":1}}],["item",{"2":{"231":5,"256":1,"364":7}}],["it",{"0":{"267":1,"269":1},"2":{"2":1,"62":1,"91":1,"112":2,"260":2,"267":1,"292":1,"462":2,"501":2,"506":1,"554":1}}],["лёгкое",{"2":{"504":1}}],["лэндинг",{"2":{"311":2,"316":1}}],["лэйаута",{"2":{"508":1,"548":1}}],["лэйаутами",{"2":{"425":1}}],["лэйауте",{"2":{"425":1}}],["лэйаутов",{"2":{"425":1}}],["лэйаут",{"2":{"26":1,"28":1,"230":1,"425":1,"471":1}}],["лайфхак",{"2":{"462":1}}],["ландшафтная",{"2":{"340":1}}],["ландшафте",{"2":{"199":1}}],["лаконичен",{"2":{"244":1,"376":1}}],["лазить",{"2":{"116":1}}],["лепту",{"0":{"495":1}}],["лечь",{"2":{"472":1}}],["лень",{"2":{"472":1}}],["ленивой",{"2":{"345":1}}],["ленивую",{"2":{"244":1}}],["ленточная",{"2":{"154":1}}],["лет",{"2":{"167":1,"227":1,"460":1}}],["лету",{"2":{"149":1,"308":1}}],["левой",{"2":{"152":1,"182":1}}],["левом",{"2":{"150":1,"156":1,"182":1}}],["легкий",{"2":{"473":1}}],["легким",{"2":{"373":1}}],["легкая",{"2":{"200":1,"446":1}}],["легкой",{"2":{"204":1,"463":1}}],["легкого",{"2":{"194":1}}],["легко",{"2":{"35":1,"72":1,"114":1,"158":2,"162":1,"170":1,"173":1,"188":1,"200":1,"225":1,"227":1,"268":1,"269":1,"302":1,"303":1,"316":1,"325":1,"375":1,"376":2,"379":1,"381":1,"425":1,"449":1,"450":1,"473":1,"504":1,"511":1}}],["легче",{"2":{"125":1,"346":1,"473":1}}],["лежащего",{"2":{"419":1}}],["лежащую",{"2":{"308":1}}],["лежат",{"2":{"376":1}}],["лежать",{"2":{"109":1}}],["лежит",{"2":{"115":1,"150":1,"154":1}}],["лучшем",{"2":{"373":1,"436":1}}],["лучшего",{"2":{"201":1,"350":1}}],["лучшее",{"2":{"149":1,"336":1,"433":1}}],["лучшей",{"2":{"59":1,"265":1,"267":1,"310":1,"507":1}}],["лучше",{"2":{"23":1,"35":1,"59":1,"85":1,"125":1,"126":1,"181":1,"204":1,"212":1,"223":1,"232":1,"233":1,"238":1,"244":1,"263":1,"265":1,"267":2,"269":1,"286":1,"287":1,"304":1,"308":1,"315":1,"323":1,"325":1,"333":1,"344":1,"349":1,"356":1,"374":1,"402":1,"425":1,"431":1,"433":1,"463":1,"468":1,"472":1,"473":2,"539":1}}],["лучшими",{"2":{"473":1}}],["лучшим",{"2":{"323":1,"425":1}}],["лучших",{"2":{"77":1,"221":1,"227":1,"265":1,"270":1,"287":1,"425":1,"473":1,"496":1,"507":2,"508":1}}],["лучший",{"0":{"202":1},"2":{"17":1,"353":1}}],["лучшие",{"0":{"398":1,"425":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"426":1,"427":1,"428":1},"2":{"9":1,"76":1,"116":1,"199":1,"232":1,"271":1,"381":1,"473":1,"508":1}}],["литерал",{"2":{"280":1,"288":1}}],["литературах",{"2":{"276":1}}],["листов",{"2":{"227":1}}],["лицензией",{"2":{"499":1}}],["лицензии",{"2":{"226":1}}],["лица",{"2":{"330":1}}],["лицом",{"2":{"134":1}}],["линтинга",{"2":{"504":1}}],["линтингом",{"2":{"461":1}}],["линтер",{"2":{"218":1,"433":1}}],["линус",{"2":{"386":1}}],["линусом",{"2":{"386":1}}],["линии",{"2":{"176":2}}],["лишен",{"2":{"330":1}}],["лишающие",{"2":{"197":1}}],["лишь",{"2":{"116":1,"158":1,"182":1,"199":1,"202":1,"227":1,"247":1,"255":1,"336":1,"372":1,"380":1,"436":1}}],["лишние",{"2":{"116":1,"393":1}}],["лимиты",{"2":{"40":1}}],["личное",{"2":{"316":1}}],["личность",{"2":{"188":1,"331":1}}],["личного",{"2":{"36":1,"423":1}}],["личным",{"2":{"59":1}}],["личный",{"2":{"29":1,"33":1,"79":1,"116":1}}],["ли",{"2":{"10":1,"26":1,"115":1,"116":3,"134":1,"135":1,"137":1,"146":1,"164":1,"198":1,"234":3,"238":2,"249":1,"259":1,"281":1,"301":1,"305":3,"342":1,"344":1,"353":1,"356":1,"366":2,"370":1,"383":1,"397":3,"425":1,"461":1,"462":1,"472":1,"473":4}}],["либо",{"2":{"3":1,"31":1,"40":1,"47":3,"53":1,"56":1,"59":1,"89":1,"115":1,"152":2,"163":2,"164":1,"166":2,"168":2,"182":2,"190":2,"192":2,"196":1,"222":1,"224":4,"228":1,"244":1,"251":4,"256":1,"293":1,"302":1,"320":2,"330":1,"331":2,"343":4,"358":1,"375":2,"383":1,"429":3,"432":1,"436":1,"440":2,"443":2,"450":2,"465":1,"471":2,"472":1,"473":1,"504":1,"507":1,"537":1}}],["ложное",{"2":{"376":1}}],["ложится",{"2":{"39":1}}],["ломают",{"2":{"373":1}}],["ловушки",{"2":{"366":1}}],["ловушку",{"2":{"188":1}}],["лотком",{"2":{"166":1}}],["локали",{"2":{"460":1}}],["локализации",{"2":{"460":3,"536":3}}],["локалей",{"2":{"460":1,"504":1,"536":1,"538":1}}],["локальную",{"2":{"386":1}}],["локальных",{"2":{"433":1,"462":1}}],["локальные",{"0":{"243":1,"364":1},"2":{"386":2}}],["локальными",{"2":{"336":2}}],["локальным",{"2":{"224":1,"336":1,"394":1,"440":1,"464":1}}],["локальный",{"2":{"223":1,"390":2,"394":3,"462":1}}],["локальное",{"2":{"249":1,"308":1}}],["локального",{"2":{"141":1,"144":1,"243":1,"308":1,"364":1}}],["локальной",{"2":{"135":1,"162":1,"166":1,"300":1,"336":3,"364":1,"394":1,"445":1,"455":1}}],["локальному",{"2":{"367":1,"446":1}}],["локальном",{"2":{"135":1,"140":1,"143":1}}],["локально",{"2":{"111":1,"199":1,"224":2,"243":1,"364":1,"394":2,"472":1}}],["локация",{"2":{"4":1}}],["логарифмической",{"2":{"157":1}}],["лого",{"2":{"98":1}}],["логотипа",{"2":{"95":1,"182":1}}],["логотип",{"2":{"29":1,"182":2}}],["логирования",{"2":{"297":1}}],["логично",{"2":{"462":1}}],["логичный",{"2":{"309":1,"460":1}}],["логичней",{"2":{"105":1}}],["логическому",{"2":{"472":1}}],["логическом",{"2":{"440":1}}],["логической",{"2":{"267":1}}],["логические",{"2":{"373":1,"423":1}}],["логически",{"2":{"331":1,"467":1}}],["логический",{"2":{"270":1}}],["логических",{"2":{"62":1}}],["логикe",{"2":{"250":1}}],["логикой",{"2":{"212":1,"256":2,"265":1,"267":1,"293":1,"294":1,"329":1}}],["логике",{"2":{"89":1,"231":1,"268":1,"303":1,"343":1}}],["логику",{"2":{"40":1,"115":2,"204":1,"231":2,"244":1,"255":1,"256":2,"268":2,"270":1,"294":1,"295":1,"296":1,"297":1,"302":1,"344":1,"359":1,"376":2,"381":1,"462":2,"463":3,"471":2}}],["логика",{"2":{"34":1,"115":1,"232":1,"249":1,"331":1,"462":4,"463":1}}],["логики",{"2":{"6":1,"83":1,"250":4,"255":1,"256":3,"268":1,"324":3,"373":1,"376":1,"462":3,"511":1}}],["логине",{"2":{"116":1}}],["логинится",{"2":{"116":1}}],["логина",{"2":{"98":1,"116":1,"461":1,"545":1}}],["логин",{"2":{"33":1,"116":4}}],["люксовый",{"2":{"472":1}}],["людей",{"2":{"196":1}}],["люди",{"2":{"2":1,"152":1,"394":1}}],["любезно",{"2":{"375":1}}],["любую",{"2":{"225":1,"244":1,"263":1,"325":1,"358":1}}],["любимую",{"2":{"114":1}}],["любая",{"2":{"102":1,"340":1,"381":1,"428":1,"462":1,"471":1}}],["любые",{"2":{"326":1,"327":1,"440":1,"448":1}}],["любым",{"2":{"134":1,"170":1,"358":1,"364":2,"366":1,"421":1,"436":1,"439":1}}],["любыми",{"2":{"72":1}}],["любых",{"2":{"2":1,"184":1,"287":1}}],["любого",{"2":{"23":1,"117":1,"133":1,"241":1,"245":1,"255":2,"296":1,"310":1,"318":1,"330":1,"331":1,"390":1,"442":1,"454":2,"495":1}}],["любом",{"2":{"12":1,"116":1,"156":1,"164":1,"225":1,"227":1,"297":2,"303":1,"316":1,"334":1,"338":1,"353":1,"462":1,"468":1,"472":1}}],["любому",{"2":{"2":1,"123":1,"134":1,"167":1,"353":1,"364":1}}],["любой",{"2":{"2":1,"117":1,"124":1,"137":1,"168":2,"200":1,"202":1,"229":1,"247":2,"252":1,"285":1,"308":1,"318":1,"323":1,"331":1,"354":1,"357":1,"394":1,"424":1,"429":1,"437":1,"441":1,"462":1,"471":1}}],["любое",{"2":{"2":1,"116":1,"182":1,"223":1,"357":1,"363":1,"377":1}}],["vwa",{"2":{"548":1,"557":11}}],["vetur",{"2":{"433":2}}],["vercel",{"2":{"422":1,"433":2,"545":1}}],["vertical",{"2":{"169":1}}],["versionrc",{"2":{"433":2}}],["versions",{"2":{"433":3}}],["version",{"2":{"112":1,"390":1,"402":1,"421":5,"433":3,"448":1,"555":1}}],["vbproj",{"2":{"433":1}}],["vb",{"2":{"433":6}}],["v4значительно",{"2":{"421":1}}],["v4",{"2":{"421":4}}],["v2",{"2":{"421":3}}],["volar",{"2":{"222":1,"433":4}}],["validate",{"2":{"433":1}}],["validateotp",{"2":{"329":1}}],["values",{"2":{"376":1}}],["value>=0",{"2":{"361":2}}],["value>0",{"2":{"329":1}}],["value++",{"2":{"352":1,"361":1}}],["value=reply",{"2":{"452":1}}],["value=result",{"2":{"329":1}}],["value=data",{"2":{"447":1}}],["value=note",{"2":{"447":1}}],["value=",{"2":{"447":2,"452":3}}],["value=value",{"2":{"356":1}}],["value=true",{"2":{"329":1}}],["value=window",{"2":{"250":1}}],["valueof",{"2":{"231":1}}],["value",{"2":{"91":2,"103":5,"114":2,"123":3,"171":5,"204":2,"231":9,"244":1,"245":2,"247":1,"296":4,"302":8,"303":6,"320":2,"324":2,"325":1,"329":3,"343":6,"356":1,"361":2,"366":8,"376":2,"381":1,"428":1,"433":1,"447":5,"452":2,"460":1,"462":1,"463":2,"511":1,"538":1}}],["vars",{"2":{"557":1}}],["var",{"2":{"421":4}}],["varb",{"2":{"246":1}}],["vara",{"2":{"246":1}}],["variable",{"2":{"204":1,"246":1}}],["variablename",{"2":{"204":1}}],["vlc",{"2":{"195":1}}],["vps",{"2":{"137":4,"140":2,"143":1,"146":1}}],["v3",{"2":{"125":1,"129":1,"421":4}}],["v",{"0":{"124":1,"206":1,"207":1,"208":3,"209":1,"210":1,"211":1,"245":1},"2":{"119":1,"124":5,"162":1,"171":2,"205":1,"206":1,"207":2,"208":4,"209":1,"210":1,"211":2,"212":3,"231":11,"246":9,"249":8,"251":3,"255":1,"316":1,"319":1,"343":2,"430":3,"447":3,"452":3}}],["v0",{"2":{"87":1,"95":1,"100":1,"106":1}}],["vscode",{"2":{"224":1,"391":2,"421":1,"433":9}}],["vs",{"2":{"86":1,"89":1,"423":1,"433":7,"463":1,"539":1}}],["v16",{"2":{"402":1}}],["v1",{"0":{"475":1,"478":1,"480":1,"483":1,"486":1},"1":{"476":1,"477":1,"479":1,"481":1,"482":1,"484":1,"485":1,"487":1},"2":{"51":3,"56":3}}],["visible",{"2":{"433":1}}],["visuals",{"2":{"433":1}}],["visualizer",{"2":{"432":4}}],["visual",{"2":{"222":1,"224":1,"387":1,"394":1,"402":1}}],["vivaldi",{"2":{"222":1}}],["virtual",{"2":{"137":1,"460":1}}],["video",{"2":{"73":1,"87":1,"106":1}}],["vitepress",{"2":{"421":1,"470":1,"473":1,"507":1}}],["vitepwa",{"2":{"345":3}}],["vitest",{"0":{"375":1,"384":1},"1":{"376":1},"2":{"370":1,"373":1,"374":1,"375":12,"376":6,"378":1,"379":3,"380":1,"381":3,"382":6,"383":5,"384":4,"402":1,"433":10,"461":1}}],["vitejs",{"2":{"228":3,"345":1}}],["vite",{"0":{"228":1,"345":1,"528":1},"2":{"23":1,"112":1,"114":1,"117":1,"119":1,"126":1,"136":1,"202":1,"203":1,"204":1,"221":2,"222":1,"223":8,"224":6,"227":1,"228":10,"231":2,"234":1,"244":1,"334":1,"344":2,"345":9,"347":1,"375":5,"379":2,"382":1,"383":1,"384":1,"401":1,"402":1,"429":1,"430":1,"432":13,"433":3,"436":1,"438":1,"439":2,"443":1,"472":3,"497":1,"504":1,"512":1,"518":2,"528":1}}],["view>",{"2":{"316":2}}],["viewport",{"2":{"255":1}}],["viewitem",{"2":{"212":3}}],["view",{"2":{"11":1,"96":4,"316":1,"317":2,"319":1,"425":4,"462":2,"463":1}}],["views",{"0":{"96":1,"319":1},"2":{"3":1,"96":1,"310":1,"313":2,"317":3,"423":1}}],["vuefaq",{"2":{"498":1}}],["vuetify",{"2":{"471":1}}],["vuejs",{"2":{"125":3,"129":1,"211":1,"212":2,"227":1,"249":1,"251":1,"322":1,"363":1,"462":1,"497":4}}],["vuex",{"2":{"119":1,"127":1,"363":4,"462":6,"482":1}}],["vuesence",{"2":{"80":2,"111":1,"112":2,"503":1}}],["vuestorefront",{"2":{"71":1}}],["vueuse",{"2":{"23":1,"104":1,"250":1}}],["vue",{"0":{"112":1,"119":1,"169":1,"171":1,"199":1,"201":1,"205":1,"230":1,"231":1,"298":1,"299":1,"309":1,"316":1,"319":1,"352":1,"353":1,"356":1,"363":1,"367":1,"379":1,"398":1,"399":1,"407":1,"418":2,"426":1,"447":1,"452":1,"462":1,"473":1,"489":1,"501":1,"505":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"200":1,"201":1,"202":2,"203":1,"204":1,"205":1,"206":2,"207":2,"208":2,"209":2,"210":2,"211":2,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"380":1,"381":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"502":1,"506":1,"507":1},"2":{"3":2,"10":2,"11":1,"23":2,"41":1,"50":1,"76":2,"102":1,"103":3,"112":2,"119":6,"120":11,"121":13,"122":2,"123":2,"124":4,"125":9,"126":3,"127":1,"128":4,"130":7,"133":1,"135":2,"136":2,"137":5,"139":1,"142":1,"145":3,"146":1,"148":2,"154":1,"168":1,"169":1,"171":6,"175":1,"183":3,"198":1,"199":4,"200":9,"201":11,"202":7,"203":8,"204":16,"205":3,"207":1,"209":1,"210":1,"211":3,"212":6,"213":1,"219":1,"220":2,"221":2,"222":3,"223":4,"224":9,"225":2,"227":3,"228":5,"229":1,"230":5,"231":4,"234":3,"235":2,"237":1,"238":2,"239":6,"240":2,"241":1,"242":1,"243":7,"244":11,"246":6,"247":6,"249":9,"250":4,"251":5,"252":2,"255":16,"256":4,"260":1,"264":1,"265":1,"266":1,"267":4,"271":2,"272":1,"289":2,"294":1,"295":3,"296":1,"297":1,"298":1,"299":3,"300":1,"304":1,"306":4,"307":1,"308":1,"309":4,"310":2,"311":1,"313":4,"314":2,"315":1,"316":12,"317":3,"318":1,"319":7,"324":2,"325":2,"327":1,"328":1,"331":1,"332":1,"335":1,"336":1,"343":3,"345":3,"349":1,"350":1,"351":2,"352":3,"353":1,"356":3,"357":2,"358":6,"359":2,"361":2,"362":2,"363":5,"366":3,"367":1,"368":1,"370":2,"371":1,"372":2,"373":3,"374":7,"375":2,"378":2,"379":6,"380":4,"381":2,"397":1,"400":3,"401":3,"402":4,"404":1,"407":1,"408":1,"411":1,"413":1,"415":2,"416":1,"418":1,"421":1,"423":2,"424":1,"425":2,"426":1,"427":1,"429":1,"430":2,"432":4,"433":15,"435":1,"436":1,"438":1,"440":1,"442":2,"445":1,"447":4,"452":2,"453":1,"456":1,"459":1,"460":7,"461":1,"462":12,"463":16,"471":3,"472":1,"473":22,"476":2,"477":1,"479":1,"489":1,"495":1,"497":2,"498":1,"499":2,"501":7,"502":1,"503":2,"504":3,"506":3,"507":4,"508":2,"509":2,"513":2,"527":2,"528":1,"538":1,"539":2,"547":1,"556":1}}],["эстетики",{"2":{"496":1}}],["эскиза",{"2":{"258":1}}],["эван",{"2":{"463":1}}],["эволюция",{"2":{"471":1}}],["эволюции",{"2":{"334":1}}],["эволюцией",{"2":{"331":1}}],["эра",{"2":{"308":1}}],["эмиттера",{"2":{"355":1}}],["эмитент",{"2":{"325":1}}],["эмиты",{"2":{"124":1}}],["эмпирическое",{"2":{"278":1}}],["эмулятор",{"2":{"222":1}}],["эфемерны",{"2":{"166":1,"257":1}}],["эффектам",{"2":{"351":1}}],["эффектом",{"2":{"313":1}}],["эффектов",{"2":{"98":1,"250":1,"268":1}}],["эффективен",{"2":{"150":1,"356":1,"381":1}}],["эффективней",{"2":{"460":1,"463":2,"472":1}}],["эффективна",{"2":{"443":1}}],["эффективная",{"2":{"308":1,"386":1}}],["эффективные",{"2":{"279":1,"353":1}}],["эффективным",{"2":{"269":1}}],["эффективный",{"2":{"171":1,"436":1}}],["эффективны",{"2":{"149":1,"317":1}}],["эффективной",{"2":{"436":1}}],["эффективности",{"2":{"347":1,"434":1,"460":1}}],["эффективное",{"2":{"258":1,"308":1,"363":1,"504":1}}],["эффективного",{"2":{"209":1,"504":1}}],["эффективно",{"2":{"47":1,"137":1,"260":1,"334":1,"464":1,"507":1,"508":1}}],["эффекты",{"2":{"26":1,"147":1,"167":1}}],["элегантен",{"2":{"376":1}}],["элегантно",{"2":{"270":1}}],["электронных",{"2":{"329":1}}],["электронные",{"2":{"308":1}}],["электронная",{"2":{"329":1}}],["электронной",{"2":{"134":1,"165":1,"329":2,"330":1,"331":1}}],["элементу",{"2":{"171":1,"210":1,"221":1,"243":1,"249":1}}],["элементом",{"2":{"170":1,"171":1,"176":1,"182":1,"210":1,"255":1,"367":1}}],["элементов",{"0":{"238":1,"240":1},"2":{"63":2,"116":1,"137":1,"151":1,"152":1,"153":1,"158":2,"160":1,"163":2,"168":1,"169":1,"170":2,"171":2,"178":1,"199":1,"208":2,"209":2,"212":5,"231":3,"232":1,"237":1,"238":1,"239":1,"246":1,"256":4,"263":1,"268":1,"292":1,"308":1,"339":1,"346":1,"353":1,"443":1,"447":1,"460":4,"461":1,"506":1}}],["элементе",{"2":{"163":2,"164":1,"227":1,"231":3}}],["элементарное",{"2":{"473":1}}],["элементарно",{"2":{"429":1}}],["элементах",{"2":{"251":1}}],["элементам",{"2":{"153":1}}],["элементами",{"0":{"151":1},"2":{"63":1,"123":1,"167":1,"170":1,"208":1,"211":1,"229":1,"231":1,"274":1,"349":1,"447":1}}],["элемента",{"2":{"128":2,"163":1,"164":1,"170":2,"171":1,"176":2,"203":1,"205":2,"209":2,"230":1,"231":5,"239":3,"240":2,"256":4,"258":1,"263":1,"343":1,"364":1,"381":2,"463":1,"472":1}}],["элементы",{"0":{"161":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1},"2":{"29":1,"63":1,"133":1,"149":1,"151":1,"153":1,"154":1,"160":1,"161":2,"170":5,"171":1,"187":1,"199":1,"203":1,"212":1,"231":1,"232":1,"237":1,"239":1,"240":1,"246":1,"249":1,"257":1,"263":1,"336":1,"339":1,"343":1,"359":1,"373":1,"381":2,"417":1,"419":1,"436":1,"448":1,"463":1,"469":1,"472":1}}],["элемент",{"2":{"9":1,"161":1,"164":1,"168":4,"170":1,"171":1,"179":1,"201":3,"207":2,"208":4,"212":1,"229":1,"230":1,"231":7,"240":1,"249":1,"254":1,"298":1,"315":1,"318":1,"343":2,"359":1,"366":1,"367":1,"370":1,"381":1,"496":1}}],["эндрю",{"2":{"268":1}}],["эндпойнтов",{"2":{"115":1}}],["эндпойнты",{"2":{"53":1}}],["эндпойнтам",{"2":{"115":1}}],["эндпойнта",{"2":{"51":1}}],["эндпойнту",{"2":{"41":1,"115":2}}],["энергосбережения",{"2":{"116":1}}],["экстремального",{"2":{"473":1}}],["экстраполированного",{"2":{"299":1}}],["экспериментов",{"2":{"472":1}}],["экспериментировал",{"2":{"463":1}}],["экспериментируя",{"2":{"368":1}}],["экспериментируем",{"0":{"365":1},"1":{"366":1,"367":1}}],["экспериментального",{"2":{"365":1}}],["экспериментальной",{"2":{"212":1}}],["эксперименты",{"2":{"349":1}}],["экспозиции",{"2":{"336":1}}],["экспортом",{"2":{"358":1}}],["экспортируем",{"2":{"281":1,"443":1}}],["экспортируете",{"2":{"462":1}}],["экспортирует",{"2":{"203":1,"228":1,"250":1,"282":1}}],["экспортирующий",{"2":{"252":1,"280":1}}],["экспортировать",{"2":{"250":1,"366":1}}],["экспорта",{"2":{"228":1}}],["экспорт",{"2":{"204":1,"383":1}}],["эксплуатационным",{"2":{"63":1}}],["эквивалент",{"2":{"221":1,"230":1,"320":1}}],["эквивалентны",{"2":{"376":1}}],["эквивалентный",{"2":{"134":1}}],["эквивалентно",{"2":{"377":1}}],["эквивалентное",{"2":{"319":1}}],["эквивалентности",{"2":{"303":1}}],["эквивалентная",{"2":{"381":1}}],["эквивалентна",{"2":{"207":1}}],["экземпляром",{"2":{"287":1}}],["экземпляров",{"2":{"245":1,"462":1}}],["экземпляре",{"2":{"255":1}}],["экземпляры",{"0":{"218":1},"2":{"212":1,"218":1,"316":1}}],["экземпляр",{"2":{"201":1,"255":1,"277":1,"281":2,"443":1}}],["экземпляру",{"2":{"121":1,"171":1,"204":1,"252":1}}],["экосистемой",{"2":{"508":1}}],["экосистеме",{"2":{"345":1,"433":1,"460":1}}],["экосистему",{"2":{"119":1}}],["экосистемы",{"2":{"76":1,"221":1,"309":1}}],["экономии",{"2":{"227":1}}],["экономичным",{"2":{"115":1}}],["экономит",{"2":{"93":1}}],["экранов",{"2":{"181":2}}],["экран",{"2":{"150":1,"182":1,"183":1,"256":1,"265":1,"472":1,"542":1,"554":1}}],["экранах",{"2":{"516":1}}],["экрана",{"2":{"9":1,"23":1,"108":1,"150":1,"151":1,"152":1,"156":4,"166":1,"173":4,"181":3,"183":1,"223":1,"230":1,"319":1,"357":1,"391":1,"515":1,"519":1,"556":1}}],["экране",{"2":{"3":1,"158":1,"212":1,"343":1,"436":5,"451":1,"452":1}}],["эту",{"2":{"118":1,"134":1,"135":1,"143":1,"147":1,"154":1,"168":1,"171":1,"173":1,"179":1,"183":1,"186":1,"204":1,"224":1,"225":1,"227":1,"230":1,"238":1,"240":1,"247":1,"249":2,"250":2,"256":2,"268":2,"291":1,"297":1,"302":1,"308":1,"310":1,"325":1,"331":1,"352":1,"354":1,"358":1,"372":3,"383":2,"393":1,"429":1,"436":1,"442":1,"452":1,"453":1,"461":1,"462":1,"473":1}}],["эталонный",{"2":{"434":1}}],["эта",{"0":{"401":1,"406":1},"1":{"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"86":1,"122":1,"132":1,"137":1,"148":1,"153":1,"171":1,"181":1,"189":1,"193":1,"197":1,"200":1,"204":1,"207":1,"210":1,"211":1,"221":1,"222":1,"223":2,"224":2,"225":1,"227":1,"238":1,"244":1,"247":1,"251":1,"255":1,"256":2,"260":1,"265":1,"266":1,"267":1,"294":1,"295":1,"296":1,"301":1,"304":1,"308":1,"309":1,"330":1,"338":1,"356":1,"358":1,"371":1,"375":2,"376":1,"395":1,"400":1,"401":1,"402":1,"410":1,"413":1,"414":1,"417":1,"433":1,"435":1,"437":1,"443":1,"445":1,"448":1}}],["этап",{"0":{"238":1},"2":{"238":1}}],["этапов",{"2":{"73":1}}],["этапах",{"2":{"372":1}}],["этапами",{"2":{"237":1}}],["этапам",{"2":{"14":1,"79":1}}],["этапа",{"2":{"11":1,"17":1,"79":1}}],["этапы",{"0":{"79":1},"2":{"10":1,"145":1,"372":1,"390":2}}],["этапе",{"2":{"6":1,"7":1,"11":2,"12":1,"17":1,"22":1,"39":1,"51":1,"66":1,"168":1,"171":1,"239":1,"241":1,"251":1,"260":1,"316":1,"329":1,"375":1,"464":1}}],["этическая",{"2":{"196":1}}],["этичный",{"2":{"184":1}}],["этим",{"2":{"119":1,"141":1,"144":1,"149":1,"151":1,"160":1,"167":1,"200":1,"203":1,"227":1,"228":1,"238":1,"240":1,"246":1,"247":1,"255":2,"256":2,"268":1,"298":1,"306":1,"308":1,"311":1,"324":1,"372":1,"385":1,"436":1,"439":1,"451":1,"507":1}}],["этими",{"2":{"63":1,"149":1,"255":1,"295":1,"379":1,"394":1}}],["этих",{"2":{"63":2,"117":1,"119":1,"122":1,"151":1,"156":1,"158":1,"172":1,"178":1,"184":1,"185":1,"199":1,"200":4,"210":1,"225":1,"228":1,"231":1,"260":2,"261":1,"263":1,"270":1,"291":1,"292":1,"300":1,"302":1,"310":1,"316":1,"323":1,"325":3,"331":3,"334":1,"336":2,"344":1,"364":4,"370":1,"375":1,"379":1,"381":2,"382":1,"388":1,"390":1,"391":1,"394":1,"436":1,"454":1,"461":1,"472":2,"473":1}}],["эти",{"2":{"3":1,"63":1,"126":1,"134":3,"135":2,"141":1,"149":1,"150":1,"153":1,"154":1,"156":2,"158":2,"161":2,"162":1,"163":1,"166":2,"167":2,"172":1,"173":1,"189":1,"202":2,"203":1,"204":2,"208":1,"209":1,"218":1,"219":1,"220":1,"222":1,"225":2,"227":3,"237":2,"239":2,"241":2,"244":1,"251":1,"291":1,"299":1,"302":1,"304":2,"308":1,"311":1,"315":1,"319":2,"322":1,"323":1,"324":1,"325":2,"331":2,"332":1,"336":1,"351":1,"354":1,"358":1,"364":2,"368":1,"369":1,"370":2,"373":1,"375":1,"376":1,"378":1,"382":1,"391":1,"394":1,"395":1,"396":1,"436":2,"439":1,"441":2,"443":1,"445":1,"446":1,"448":1,"449":1,"454":1,"462":2}}],["этой",{"0":{"402":1},"2":{"22":1,"48":1,"116":1,"124":1,"131":2,"133":1,"142":1,"144":1,"145":2,"147":2,"151":1,"159":1,"162":1,"171":1,"173":1,"183":2,"185":1,"196":2,"197":1,"198":1,"199":4,"200":1,"204":3,"211":2,"212":1,"213":2,"219":1,"220":1,"222":4,"223":1,"224":2,"227":2,"233":1,"235":4,"236":2,"239":2,"240":1,"244":1,"246":1,"247":3,"249":3,"250":2,"255":1,"256":3,"258":1,"259":1,"260":1,"263":3,"265":1,"266":1,"271":1,"272":1,"288":1,"290":1,"292":3,"296":3,"297":2,"302":1,"304":1,"306":2,"307":1,"308":1,"310":1,"316":1,"319":1,"322":1,"325":1,"331":2,"332":1,"333":1,"334":2,"335":1,"347":2,"348":1,"349":3,"350":3,"361":1,"364":1,"365":1,"367":1,"368":1,"369":1,"370":4,"371":1,"372":2,"374":1,"375":2,"380":1,"384":1,"385":2,"386":1,"390":1,"391":1,"393":1,"394":1,"396":1,"402":3,"404":1,"405":3,"407":1,"408":1,"409":1,"412":1,"415":1,"416":1,"421":1,"434":4,"436":1,"437":1,"440":1,"450":1,"455":1,"457":1,"460":1,"462":1,"471":1,"504":1}}],["этого",{"2":{"12":1,"27":1,"41":1,"59":1,"71":1,"95":1,"102":1,"121":1,"124":1,"134":3,"140":1,"156":2,"157":2,"164":2,"165":1,"168":1,"170":3,"173":2,"181":2,"182":2,"183":1,"202":1,"203":3,"204":1,"205":1,"208":1,"222":1,"229":1,"230":1,"231":3,"239":1,"240":1,"241":1,"243":2,"249":3,"250":1,"251":2,"255":1,"256":2,"263":1,"265":2,"267":2,"268":1,"270":1,"279":2,"280":1,"288":1,"291":1,"292":1,"293":1,"294":1,"295":1,"297":2,"298":1,"300":1,"301":1,"311":1,"313":1,"316":2,"319":1,"323":2,"325":2,"328":2,"329":1,"330":2,"331":1,"336":1,"343":2,"344":1,"346":1,"351":1,"352":1,"353":2,"357":1,"358":2,"361":1,"363":1,"364":3,"365":1,"373":1,"374":1,"375":1,"376":1,"380":1,"381":1,"382":1,"383":1,"385":1,"389":1,"390":1,"391":1,"395":1,"422":1,"432":1,"436":1,"439":1,"441":2,"445":1,"450":1,"453":1,"454":1,"460":1,"462":1,"463":1,"464":1,"472":1,"473":2}}],["этом",{"2":{"12":1,"39":1,"41":1,"63":1,"71":1,"134":2,"136":1,"137":1,"143":1,"156":1,"157":1,"163":1,"165":1,"167":1,"168":1,"169":1,"170":1,"171":1,"174":1,"195":1,"196":1,"200":2,"201":2,"202":1,"204":2,"210":1,"212":1,"224":1,"227":2,"229":1,"231":1,"239":1,"242":1,"246":1,"251":1,"252":1,"255":1,"266":1,"267":1,"270":1,"285":2,"291":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":2,"301":1,"303":2,"316":3,"317":1,"319":1,"323":1,"324":2,"325":1,"328":1,"334":1,"335":1,"338":1,"343":1,"345":1,"350":1,"351":1,"352":1,"356":1,"359":1,"360":2,"361":1,"366":1,"367":1,"372":2,"374":1,"375":1,"378":1,"382":1,"388":1,"390":1,"393":2,"418":1,"422":1,"425":1,"429":1,"432":1,"443":1,"449":1,"452":1,"454":1,"461":2,"462":2,"463":3,"473":2,"507":1}}],["этому",{"2":{"2":1,"16":1,"158":1,"182":1,"221":1,"237":1,"244":2,"266":1,"267":1,"276":1,"282":1,"311":1,"313":1,"322":1,"346":1,"359":1,"376":1,"448":2,"454":1,"473":1}}],["этот",{"2":{"9":1,"13":1,"86":1,"103":1,"112":2,"116":1,"119":1,"123":1,"134":3,"137":2,"144":1,"151":1,"152":1,"153":1,"154":1,"156":1,"157":1,"158":1,"163":1,"164":2,"165":2,"166":1,"167":1,"168":1,"171":2,"176":2,"177":1,"178":3,"181":3,"182":2,"186":2,"187":2,"188":1,"191":1,"194":1,"200":2,"201":3,"202":1,"204":3,"207":1,"222":1,"223":2,"224":4,"228":1,"229":1,"230":1,"231":1,"238":2,"239":2,"240":2,"241":1,"243":1,"244":2,"247":1,"249":1,"250":1,"251":1,"255":1,"256":1,"263":2,"264":2,"265":2,"266":2,"267":1,"268":1,"269":2,"270":2,"276":1,"277":1,"278":1,"280":2,"281":3,"282":1,"283":1,"286":1,"287":1,"289":2,"290":1,"291":1,"293":2,"294":1,"295":2,"297":1,"300":3,"303":3,"313":1,"315":1,"316":1,"318":1,"319":3,"322":1,"324":1,"325":4,"329":1,"330":4,"334":1,"338":1,"345":1,"353":1,"354":1,"356":3,"357":1,"358":4,"360":2,"361":1,"362":2,"364":1,"366":2,"367":2,"372":1,"374":1,"375":1,"380":1,"381":2,"382":1,"383":3,"390":1,"391":1,"395":1,"421":1,"423":1,"433":1,"438":1,"439":1,"440":3,"441":1,"443":1,"444":2,"445":1,"450":2,"452":2,"464":1,"473":2,"528":1}}],["это",{"0":{"227":1,"269":1},"2":{"2":1,"3":1,"11":1,"12":2,"13":1,"23":1,"26":1,"29":1,"33":1,"34":1,"39":1,"40":1,"47":1,"48":1,"50":1,"51":1,"59":2,"62":1,"82":1,"86":2,"89":1,"97":1,"102":1,"103":1,"104":1,"105":1,"115":3,"116":3,"117":3,"122":1,"124":2,"125":1,"127":1,"130":2,"131":1,"134":6,"135":2,"136":1,"137":1,"138":1,"141":1,"143":1,"145":2,"147":1,"149":1,"150":1,"151":2,"152":2,"154":3,"159":3,"162":1,"163":1,"167":1,"168":4,"170":3,"171":1,"172":1,"173":1,"174":1,"175":1,"177":1,"178":4,"179":1,"183":1,"185":2,"187":1,"191":1,"195":1,"197":1,"199":1,"200":9,"201":4,"202":1,"203":7,"204":16,"208":1,"209":1,"210":1,"211":1,"212":4,"218":2,"222":4,"223":6,"224":9,"225":5,"227":2,"228":4,"230":2,"231":7,"232":2,"234":2,"235":1,"238":2,"239":1,"241":1,"242":1,"243":1,"244":2,"245":2,"246":2,"249":2,"250":3,"252":1,"253":1,"254":1,"255":4,"256":7,"257":1,"258":1,"260":4,"261":2,"263":1,"264":2,"265":3,"266":2,"267":2,"268":3,"271":3,"277":1,"280":1,"281":1,"282":1,"284":3,"285":1,"286":3,"287":5,"288":1,"289":4,"291":2,"292":2,"293":1,"294":1,"295":5,"296":6,"297":6,"298":1,"300":2,"301":6,"302":4,"303":7,"304":2,"308":4,"309":2,"313":5,"316":4,"317":2,"319":3,"320":1,"322":1,"324":2,"325":4,"327":2,"328":1,"329":2,"330":1,"331":3,"332":1,"334":1,"336":4,"337":3,"338":2,"340":1,"341":1,"343":5,"344":2,"345":1,"346":1,"351":6,"353":2,"354":2,"355":1,"356":5,"357":2,"358":5,"359":3,"360":5,"361":2,"363":3,"364":8,"366":4,"367":2,"372":4,"373":1,"374":1,"375":2,"376":4,"377":2,"378":2,"381":1,"383":1,"384":1,"385":2,"386":3,"390":4,"391":5,"393":6,"394":6,"395":2,"397":1,"400":2,"411":1,"419":1,"422":1,"423":1,"425":1,"429":2,"432":1,"436":15,"437":3,"438":2,"439":1,"440":1,"444":2,"446":3,"447":2,"448":2,"449":1,"450":2,"452":1,"454":5,"455":1,"456":1,"460":1,"461":1,"462":8,"463":10,"464":5,"465":2,"466":1,"467":1,"468":1,"470":1,"471":1,"472":4,"473":4,"507":1,"555":1}}],["ухудшает",{"2":{"471":1}}],["уязвимость",{"2":{"465":1}}],["уязвимости",{"2":{"462":1}}],["ушли",{"2":{"386":1}}],["ушло",{"2":{"158":1}}],["укрепить",{"2":{"556":1}}],["украдут",{"2":{"330":1}}],["укоряет",{"2":{"471":1}}],["укоренилась",{"2":{"308":1}}],["укажет",{"2":{"381":1}}],["укажу",{"2":{"222":1}}],["указателей",{"2":{"204":1}}],["указателями",{"2":{"204":1}}],["указателя",{"2":{"156":1}}],["указать",{"2":{"135":2,"364":1,"376":1,"382":1,"394":1,"463":1}}],["указано",{"2":{"249":2,"346":1}}],["указанные",{"2":{"391":1}}],["указанных",{"2":{"245":1}}],["указанный",{"2":{"245":1,"327":1,"454":1}}],["указанными",{"2":{"322":1,"326":1,"343":1}}],["указанным",{"2":{"226":1}}],["указанную",{"2":{"117":1,"326":1}}],["указаны",{"2":{"223":1}}],["указаниям",{"2":{"255":1}}],["указания",{"2":{"231":1,"378":1,"543":1}}],["указанием",{"2":{"329":1,"372":1,"376":1,"501":1}}],["указание",{"2":{"143":1}}],["указании",{"2":{"136":1}}],["указана",{"2":{"117":1}}],["указывали",{"2":{"183":1}}],["указывают",{"2":{"338":1}}],["указываются",{"2":{"144":1}}],["указывающие",{"2":{"393":1}}],["указывающих",{"2":{"376":1}}],["указывающий",{"2":{"168":1}}],["указывающей",{"2":{"171":1}}],["указывающее",{"2":{"165":1,"231":1}}],["указывающая",{"2":{"134":1,"165":1}}],["указываем",{"2":{"140":1,"141":1,"228":1}}],["указывает",{"2":{"134":1,"136":1,"143":1,"152":1,"164":1,"168":1,"176":3,"201":1,"204":2,"310":1,"313":3,"316":1,"390":1,"391":1}}],["указывать",{"2":{"134":2,"313":1}}],["унаследован",{"2":{"204":1}}],["универсальный",{"2":{"429":2}}],["универсальней",{"2":{"85":1}}],["уникален",{"2":{"331":1,"462":1}}],["уникальным",{"2":{"360":1,"364":1,"443":1}}],["уникальный",{"2":{"134":1,"209":1,"231":1,"313":1,"316":1,"325":1}}],["уникального",{"2":{"331":1,"376":1,"428":1,"443":1}}],["уникальному",{"2":{"331":1}}],["уникальная",{"2":{"325":1}}],["унификации",{"2":{"118":1}}],["утвердить",{"2":{"381":1}}],["утверждаем",{"2":{"376":1}}],["утверждает",{"2":{"189":1,"282":1}}],["утверждениях",{"2":{"381":1}}],["утверждения",{"0":{"377":1,"378":1},"2":{"376":3,"377":1}}],["утверждений",{"2":{"376":4,"380":1}}],["утверждение",{"2":{"282":1,"376":1,"377":2,"378":1,"381":2}}],["уточняет",{"2":{"338":1}}],["утерянных",{"2":{"331":1}}],["утеряны",{"2":{"325":1}}],["утечек",{"2":{"267":1}}],["утечку",{"2":{"203":1}}],["утилит",{"0":{"466":1}}],["утилитами",{"2":{"466":1}}],["утилита",{"2":{"346":3}}],["утилитарных",{"2":{"225":1}}],["утилиту",{"2":{"104":1}}],["утилиты",{"2":{"95":1,"374":1,"423":2,"444":1,"462":1,"513":1}}],["узлов",{"2":{"331":1}}],["узлами",{"2":{"331":1}}],["узких",{"2":{"181":1}}],["узнаете",{"2":{"204":1,"401":1,"409":1}}],["узнает",{"2":{"171":1,"342":1}}],["узнаем",{"2":{"147":1,"235":1,"244":1,"282":1,"306":1,"334":1,"434":1}}],["узнаваемость",{"2":{"149":1,"159":1,"556":1}}],["узнали",{"2":{"145":1,"152":1,"198":1,"233":1,"258":2,"365":1,"369":1,"396":1}}],["узнать",{"2":{"135":1,"201":1,"311":1,"331":1,"439":2}}],["уж",{"2":{"179":1,"201":1,"218":1,"255":1,"268":1,"449":1}}],["уже",{"2":{"3":1,"16":1,"27":1,"36":1,"38":1,"39":1,"47":1,"86":3,"112":1,"115":1,"118":1,"134":1,"143":2,"150":1,"153":1,"168":1,"171":1,"175":1,"183":1,"203":1,"204":2,"218":1,"223":1,"224":1,"225":1,"227":1,"230":1,"231":1,"237":1,"240":1,"247":1,"256":2,"287":1,"288":1,"292":1,"297":2,"300":2,"316":1,"317":1,"322":1,"331":2,"336":1,"337":1,"345":2,"349":2,"357":1,"358":1,"372":1,"375":1,"383":1,"391":1,"394":1,"400":1,"421":1,"434":1,"460":1,"461":1,"463":1,"464":1,"472":3,"473":1,"501":1,"536":1}}],["угрозой",{"2":{"364":1}}],["уголкам",{"2":{"185":1}}],["угодно",{"2":{"134":1}}],["угла",{"2":{"156":1}}],["углов",{"2":{"156":1}}],["углубление",{"2":{"383":1}}],["углубляться",{"2":{"263":1}}],["углубляясь",{"2":{"174":1}}],["углубиться",{"2":{"224":1}}],["углу",{"2":{"150":2,"152":1,"156":2,"182":1,"346":2}}],["уважает",{"2":{"375":1}}],["увидели",{"2":{"455":1,"472":1}}],["увидеть",{"2":{"134":2,"148":1,"167":1,"175":1,"183":1,"222":1,"223":1,"224":1,"231":2,"236":1,"271":1,"296":1,"307":1,"316":1,"335":1,"350":1,"352":1,"358":1,"361":1,"367":1,"369":1,"371":1,"435":2,"442":1,"444":1,"445":1}}],["увидит",{"2":{"436":1}}],["увидите",{"2":{"200":1,"223":3,"263":1,"266":1,"319":1,"349":1,"367":1}}],["увидим",{"2":{"202":1,"204":1,"211":2,"226":1,"231":1,"239":1,"251":1,"264":1,"290":1,"294":1,"308":1,"311":1,"313":1,"324":1,"330":1,"344":1,"356":1,"360":1,"391":1,"435":1,"447":1}}],["уверенным",{"2":{"473":1}}],["уверенный",{"2":{"374":1}}],["уверенную",{"2":{"158":1}}],["уверены",{"2":{"303":1,"454":1}}],["увеличили",{"2":{"436":1}}],["увеличивая",{"2":{"349":1}}],["увеличивает",{"2":{"244":1,"429":1,"465":1}}],["увеличивается",{"2":{"223":1,"429":1,"448":1}}],["увеличиваем",{"2":{"171":1}}],["увеличивать",{"2":{"171":1}}],["увеличения",{"2":{"199":1}}],["увеличение",{"0":{"337":1},"1":{"338":1,"339":1,"340":1,"341":1,"342":1,"343":1},"2":{"125":1,"308":3}}],["уведомить",{"2":{"168":1,"343":1,"353":1}}],["уведомлять",{"2":{"244":1}}],["уведомляется",{"2":{"291":1}}],["уведомляет",{"2":{"240":1}}],["уведомляющие",{"0":{"165":1}}],["уведомлений",{"0":{"240":1}}],["уведомление",{"2":{"166":3,"343":1}}],["уведомления",{"0":{"166":1},"2":{"166":2,"336":3}}],["уведомлении",{"2":{"165":1}}],["увесистыми",{"2":{"147":1}}],["упаковывает",{"2":{"454":1}}],["упакованных",{"2":{"328":1}}],["упакованные",{"2":{"292":1}}],["упакован",{"2":{"202":1}}],["упакует",{"2":{"202":1}}],["упала",{"2":{"125":1}}],["упорядоченной",{"2":{"375":1}}],["упорядочиваете",{"2":{"267":1}}],["упоминалось",{"2":{"231":1,"247":1,"357":1}}],["упоминали",{"2":{"143":1,"224":1,"297":1,"300":1,"345":1,"450":1}}],["упомянутую",{"2":{"442":1}}],["упомянутый",{"2":{"203":1}}],["упомянутых",{"2":{"129":1,"166":1,"395":1,"402":1}}],["упомянуть",{"2":{"158":1,"256":1,"270":1}}],["упомянутого",{"2":{"144":1,"286":1}}],["уполномоченной",{"2":{"134":1}}],["упражнением",{"2":{"329":1}}],["упражнение",{"2":{"287":1}}],["упражнения",{"2":{"229":2,"232":1,"317":1,"374":1,"449":1}}],["управлению",{"2":{"200":1,"249":1,"269":1,"316":1,"349":1,"356":1}}],["управлении",{"2":{"119":1,"137":1}}],["управлением",{"2":{"222":1}}],["управление",{"0":{"349":1,"386":1,"392":1,"413":1},"1":{"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1},"2":{"79":1,"119":1,"127":2,"149":1,"200":1,"204":1,"239":3,"246":1,"249":1,"251":1,"258":1,"265":1,"282":1,"289":1,"316":1,"334":1,"343":1,"344":1,"359":2,"369":1,"370":1,"385":1,"394":1}}],["управления",{"2":{"56":1,"127":1,"136":1,"137":3,"172":1,"224":1,"230":1,"244":1,"246":1,"252":1,"256":1,"284":1,"292":1,"339":2,"343":1,"350":1,"357":1,"358":1,"359":1,"363":2,"368":1,"392":2,"397":1,"401":1,"413":2,"445":1,"462":3}}],["управляло",{"2":{"257":1}}],["управляемое",{"2":{"472":1}}],["управляемым",{"2":{"555":1}}],["управляемые",{"2":{"263":2}}],["управляемый",{"2":{"137":1}}],["управляет",{"2":{"137":1,"224":1,"240":1,"250":1,"255":1,"256":1,"265":1,"343":1,"386":1}}],["управляется",{"2":{"2":1,"134":1,"516":1}}],["управляются",{"2":{"557":1}}],["управляют",{"2":{"134":1,"172":1}}],["управляющему",{"2":{"2":1}}],["управляться",{"2":{"390":1}}],["управлять",{"2":{"2":1,"157":1,"181":1,"201":1,"203":1,"232":1,"305":1,"309":2,"313":1,"336":1,"351":1,"396":1,"456":1,"463":2}}],["упростит",{"2":{"466":1}}],["упростить",{"2":{"134":1,"249":1,"278":1,"300":1,"331":1}}],["упрощенную",{"2":{"472":1}}],["упрощенным",{"2":{"343":1}}],["упрощенный",{"2":{"300":1,"303":1,"330":1,"354":1}}],["упрощенно",{"2":{"463":1}}],["упрощенного",{"2":{"330":1}}],["упрощенное",{"2":{"202":1,"300":1,"325":1}}],["упрощения",{"2":{"269":1,"271":1,"300":2,"343":1}}],["упрощение",{"0":{"2":1}}],["упрощать",{"2":{"300":1}}],["упрощающий",{"2":{"300":1}}],["упрощают",{"2":{"47":1}}],["упрощает",{"2":{"79":1,"118":1,"332":1,"421":1}}],["умирает",{"2":{"462":1}}],["умными",{"2":{"331":1}}],["умных",{"2":{"308":1}}],["умны",{"2":{"280":1}}],["умные",{"2":{"270":1}}],["умён",{"2":{"231":1}}],["ума",{"2":{"229":1}}],["ум",{"2":{"170":1}}],["умолчанию",{"0":{"543":1},"2":{"123":1,"124":3,"125":1,"136":1,"141":1,"144":1,"171":1,"223":1,"245":2,"246":1,"249":6,"255":1,"287":1,"316":1,"319":3,"328":1,"339":1,"363":1,"391":1,"450":1,"454":1,"538":1}}],["умел",{"2":{"473":1}}],["умело",{"2":{"199":1}}],["умеет",{"2":{"472":1}}],["умеешь",{"2":{"93":2}}],["уместен",{"2":{"356":1}}],["уместно",{"2":{"304":1}}],["умеют",{"2":{"300":1}}],["умеющий",{"2":{"50":1}}],["умение",{"2":{"473":1}}],["умении",{"2":{"471":1}}],["умения",{"2":{"260":1}}],["уменьшить",{"2":{"309":1,"313":1}}],["уменьшение",{"2":{"125":1,"130":1}}],["уме",{"2":{"22":1,"134":1,"220":1}}],["уровень",{"2":{"116":2,"144":2,"227":1,"317":1,"330":1,"464":1,"470":1,"497":1}}],["уровни",{"2":{"300":1}}],["уровней",{"2":{"174":1,"178":1}}],["уровне",{"2":{"136":1,"181":1,"246":1,"247":1,"252":1,"255":1,"295":1,"336":1,"424":2,"438":1,"460":1,"461":1,"473":2}}],["уровнем",{"2":{"114":1}}],["уровнями",{"2":{"317":1,"533":1}}],["уровнях",{"2":{"260":1,"295":1,"440":1}}],["уровня",{"0":{"337":1},"1":{"338":1,"339":1,"340":1,"341":1,"342":1,"343":1},"2":{"74":1,"116":1,"120":1,"125":1,"134":3,"146":1,"261":1,"310":1,"311":1,"332":1,"373":1,"374":1,"463":1,"473":1}}],["удивительная",{"2":{"455":1}}],["удивительных",{"2":{"300":1}}],["удивительные",{"2":{"135":1}}],["уделяя",{"2":{"402":1}}],["уделять",{"2":{"347":1}}],["уделите",{"2":{"376":1}}],["уделить",{"2":{"241":1,"336":1}}],["уделили",{"2":{"332":1,"368":2}}],["удерживать",{"2":{"158":1}}],["удержание",{"2":{"150":1}}],["удачные",{"2":{"303":1}}],["удастся",{"2":{"244":1,"393":1}}],["удается",{"2":{"141":1}}],["удалась",{"2":{"327":1}}],["удалить",{"2":{"187":1,"225":1,"227":1,"230":1,"393":1}}],["удалось",{"2":{"168":1,"376":1}}],["удаляет",{"2":{"364":2}}],["удаляем",{"2":{"250":1,"316":1,"443":1}}],["удаляют",{"2":{"208":1,"449":1}}],["удаляя",{"2":{"134":1,"207":1}}],["удалять",{"2":{"125":1,"392":1,"446":1}}],["удалении",{"2":{"194":1,"212":1}}],["удалением",{"2":{"158":1,"267":1}}],["удаление",{"2":{"158":1,"239":2,"322":1,"392":1,"460":1}}],["удаления",{"2":{"116":1,"125":1,"163":1,"232":1,"267":1,"446":2}}],["удаленном",{"2":{"395":1,"421":1}}],["удаленно",{"2":{"394":1}}],["удаленного",{"2":{"143":1,"386":1,"394":1}}],["удаленные",{"2":{"394":1}}],["удаленных",{"2":{"386":1}}],["удаленный",{"2":{"143":1,"144":1,"386":1,"393":1,"394":3,"421":4,"449":1}}],["удаленными",{"0":{"394":1},"2":{"446":1}}],["удаленным",{"2":{"137":1,"268":1,"394":5,"440":1,"449":1}}],["удалена",{"0":{"125":1},"2":{"125":1}}],["удовлетворения",{"2":{"370":1}}],["удовлетворение",{"2":{"150":1}}],["удовлетворить",{"2":{"237":1,"241":1}}],["удовлетворительный",{"2":{"197":1}}],["удовлетворяющее",{"2":{"63":1,"343":1}}],["удостоверяющим",{"2":{"188":1}}],["удостоверяется",{"2":{"116":2}}],["удостовериться",{"2":{"116":1}}],["удобен",{"2":{"118":1,"150":1,"299":1,"303":1,"383":1,"512":1}}],["удобство",{"2":{"155":1,"159":1,"394":1,"496":2}}],["удобством",{"2":{"17":1}}],["удобства",{"2":{"116":1,"134":1,"176":1,"197":1,"212":1,"222":1,"227":1,"231":2,"288":1,"375":1,"384":1,"446":1,"496":1}}],["удобную",{"0":{"457":1},"2":{"170":1,"433":1,"471":1}}],["удобнее",{"2":{"118":1,"344":1}}],["удобней",{"2":{"23":1,"462":1,"471":1}}],["удобна",{"2":{"76":1,"433":1}}],["удобная",{"2":{"56":1,"86":1,"227":1,"381":1,"423":1}}],["удобны",{"2":{"256":1,"422":1}}],["удобным",{"2":{"218":1,"284":1}}],["удобные",{"2":{"71":1,"449":1}}],["удобных",{"2":{"50":1,"211":1,"300":1,"315":1,"319":1}}],["удобный",{"2":{"17":1,"22":1,"331":1,"421":1,"433":1,"460":1,"470":1,"473":1}}],["удобное",{"2":{"423":1,"439":1}}],["удобного",{"2":{"323":1}}],["удобной",{"2":{"222":1,"323":1,"414":1}}],["удобно",{"2":{"44":1,"63":1,"89":1,"103":1,"114":2,"123":1,"138":1,"151":1,"204":1,"209":1,"223":1,"286":2,"289":1,"301":1,"425":1,"433":1,"449":1,"462":2,"471":1,"503":1,"507":1}}],["убить",{"2":{"473":1}}],["убирать",{"2":{"267":1}}],["убирается",{"2":{"102":1,"556":1}}],["убираем",{"2":{"86":2,"96":2}}],["убывающей",{"2":{"383":1}}],["убедимся",{"2":{"436":1}}],["убедились",{"2":{"331":1}}],["убедитесь",{"2":{"225":1,"300":1,"346":1,"391":1}}],["убедиться",{"2":{"220":1,"231":1,"278":1,"303":1,"313":1,"328":1,"377":1,"447":1}}],["убрать",{"2":{"86":1,"112":1}}],["улицам",{"2":{"473":1}}],["улице",{"2":{"26":1}}],["уложенные",{"2":{"181":1}}],["улучшайте",{"2":{"473":1}}],["улучшая",{"2":{"467":1}}],["улучшать",{"2":{"74":1}}],["улучшена",{"2":{"363":2}}],["улучшению",{"2":{"376":1}}],["улучшение",{"2":{"257":1,"460":1}}],["улучшения",{"2":{"68":1,"200":1,"446":1,"542":1}}],["улучшила",{"2":{"372":1}}],["улучшили",{"2":{"332":1}}],["улучшить",{"2":{"232":1,"233":1,"313":1,"356":1,"372":1,"455":1,"472":1,"555":1}}],["улучшит",{"2":{"208":1}}],["учит",{"2":{"473":2}}],["учителем",{"2":{"473":1}}],["учите",{"2":{"270":2}}],["учиться",{"2":{"464":1}}],["учить",{"2":{"270":1}}],["учитывают",{"2":{"472":1}}],["учитывая",{"2":{"237":1,"238":1,"241":1,"249":1,"256":1,"329":2,"337":1,"360":1}}],["учитывать",{"2":{"150":1,"224":1,"324":1,"336":1,"344":1,"432":1}}],["учреждения",{"2":{"183":1}}],["участию",{"2":{"499":1}}],["участие",{"0":{"499":1}}],["участника",{"2":{"325":2}}],["участниками",{"2":{"325":2}}],["участки",{"2":{"135":1,"231":1,"238":1,"267":1}}],["учатся",{"2":{"152":1}}],["ученика",{"2":{"473":1}}],["учебники",{"2":{"473":1}}],["учебник",{"2":{"473":3}}],["учебного",{"2":{"317":1,"374":1,"449":1}}],["учетной",{"2":{"331":1}}],["учетным",{"2":{"330":1}}],["учетными",{"2":{"325":1}}],["учетные",{"2":{"324":2,"325":1,"331":1}}],["учетных",{"2":{"324":3,"325":1,"329":1}}],["учетом",{"2":{"43":1,"119":1,"221":1,"240":1,"241":1,"373":1}}],["учесть",{"2":{"133":1,"437":1}}],["учтем",{"2":{"40":1}}],["усовершенствование",{"2":{"336":1}}],["усовершенствовать",{"2":{"257":1}}],["усваивать",{"2":{"270":1}}],["усвоить",{"2":{"159":1}}],["усмотрению",{"2":{"224":1,"393":1,"436":1}}],["ускоряет",{"2":{"471":1}}],["ускорение",{"2":{"336":1}}],["ускорению",{"2":{"204":1}}],["ускорить",{"2":{"157":1,"260":1,"464":1,"471":1}}],["усилий",{"2":{"336":1,"341":1,"345":1,"372":1,"455":1}}],["усилия",{"2":{"200":1,"383":1,"436":1,"449":1}}],["усиливает",{"2":{"149":1}}],["услышать",{"2":{"149":1}}],["услуг",{"2":{"188":2,"189":1,"323":1,"464":1}}],["услугу",{"2":{"144":1}}],["услуги",{"2":{"134":1,"190":1,"192":1,"194":2,"196":1,"395":1}}],["услугам",{"2":{"263":1}}],["услуга",{"2":{"133":1,"149":1}}],["усложнению",{"2":{"265":1}}],["усложнение",{"2":{"188":1}}],["усложняться",{"2":{"472":1}}],["усложнять",{"2":{"105":1}}],["условные",{"2":{"208":1,"255":1}}],["условна",{"2":{"14":1}}],["условию",{"2":{"375":1,"376":1}}],["условие",{"2":{"303":1}}],["условием",{"2":{"188":1,"197":1,"363":1}}],["условии",{"2":{"249":1,"281":1,"297":1,"324":1,"325":1,"376":1}}],["условий",{"2":{"166":1,"256":1,"303":1,"336":2,"429":1}}],["условиям",{"2":{"271":1}}],["условиями",{"2":{"131":1}}],["условиях",{"2":{"189":1,"200":1,"372":1}}],["условия",{"2":{"149":1,"241":1,"299":1}}],["устраняет",{"2":{"397":1}}],["устраняя",{"2":{"271":1}}],["устранения",{"2":{"393":1}}],["устранению",{"2":{"372":1}}],["устранить",{"2":{"393":1}}],["устройстве",{"2":{"338":1}}],["устройств",{"2":{"173":1,"334":1,"515":1}}],["устройством",{"2":{"266":1}}],["устройство",{"2":{"150":1,"330":2}}],["устройствами",{"2":{"336":1}}],["устройствам",{"2":{"336":2}}],["устройствах",{"2":{"308":1,"336":3,"339":1,"340":1,"343":1,"436":1}}],["устройства",{"2":{"108":1,"149":1,"330":1,"334":1,"336":2,"473":1}}],["устроена",{"2":{"109":1}}],["устойчивым",{"2":{"232":1}}],["устоявшихся",{"2":{"147":1,"507":1}}],["уступают",{"2":{"161":1}}],["устареть",{"2":{"471":1}}],["устареет",{"2":{"465":1}}],["устаревающих",{"2":{"507":1}}],["устаревает",{"2":{"462":1}}],["устаревший",{"2":{"432":1}}],["устаревшими",{"2":{"308":1}}],["устаревшие",{"2":{"130":1,"433":1}}],["устаревшем",{"2":{"125":1,"336":1}}],["устарели",{"2":{"473":1}}],["устарел",{"2":{"457":1,"460":1,"462":1}}],["устанавливающихся",{"2":{"509":1}}],["устанавливаются",{"2":{"223":1,"344":1,"509":1}}],["устанавливать",{"2":{"254":1,"292":1,"347":1,"396":1,"554":1}}],["устанавливаться",{"2":{"199":1,"308":1,"336":1}}],["устанавливается",{"2":{"432":1,"548":1}}],["устанавливает",{"2":{"181":1,"343":1,"445":1,"512":1}}],["устанавливаемые",{"0":{"336":1}}],["устанавливаем",{"2":{"23":1,"328":2,"344":1,"345":1}}],["установят",{"2":{"388":1}}],["установливаем",{"2":{"316":1}}],["установлена",{"2":{"449":1,"472":1}}],["установленную",{"2":{"421":1}}],["установленный",{"2":{"343":1}}],["установленным",{"2":{"222":1}}],["установлены",{"2":{"387":1,"501":1}}],["установлено",{"2":{"338":1,"342":1,"343":7,"503":1}}],["установлен",{"2":{"171":1,"223":1,"354":1,"389":2,"390":1}}],["установим",{"2":{"374":1,"375":1}}],["установив",{"2":{"222":1,"337":1}}],["установили",{"2":{"224":1,"383":1,"389":1}}],["установил",{"2":{"151":1,"344":1}}],["установит",{"2":{"223":1,"310":1}}],["установите",{"2":{"144":1,"310":1,"343":1,"375":1,"473":1}}],["установить",{"2":{"115":1,"144":3,"222":3,"223":1,"228":1,"310":1,"323":1,"336":2,"343":1,"344":1,"374":1,"378":1,"379":3,"381":1,"383":2,"384":1,"422":1}}],["установкой",{"2":{"145":1,"204":1,"342":1}}],["установке",{"0":{"343":1},"2":{"144":1,"222":1,"223":1,"231":1,"343":6,"344":2,"472":2}}],["установку",{"2":{"133":1,"144":1,"223":1,"224":1,"343":8,"388":1,"390":1}}],["установки",{"2":{"117":1,"123":1,"144":2,"157":1,"223":1,"226":1,"230":1,"255":1,"310":1,"336":2,"343":10,"345":1,"359":1,"366":1,"374":1,"379":1,"381":1,"386":1,"387":4,"388":1,"389":1,"390":1,"402":1,"421":1,"433":1,"449":1,"453":1,"460":1,"536":1}}],["установка",{"0":{"54":1,"221":1,"310":1,"375":1,"379":1,"387":1,"388":1,"389":1,"442":1,"500":1,"501":1,"503":1},"1":{"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"376":1,"380":1,"381":1,"443":1,"444":1,"445":1,"501":1,"502":2,"503":1},"2":{"120":1,"126":1,"140":1,"202":1,"203":1,"204":1,"223":1,"235":1,"236":1,"253":1,"292":1,"310":1,"336":1,"350":1,"370":2,"379":1,"388":1,"501":2}}],["успевает",{"2":{"433":1}}],["успешными",{"2":{"336":1}}],["успешным",{"2":{"301":1}}],["успешный",{"2":{"149":1,"327":1}}],["успешности",{"2":{"423":1}}],["успешностью",{"2":{"22":1}}],["успешной",{"2":{"326":1,"327":1}}],["успешном",{"2":{"303":1}}],["успешного",{"2":{"303":1,"378":1}}],["успешно",{"2":{"226":1,"327":1,"346":1}}],["успехов",{"2":{"405":1}}],["успехом",{"2":{"324":1}}],["успех",{"2":{"63":1,"166":1,"301":1,"370":1}}],["успеха",{"2":{"41":1,"303":3,"324":1,"329":1,"373":1}}],["у",{"0":{"498":1},"2":{"3":1,"12":1,"13":1,"16":3,"17":2,"22":1,"28":1,"29":1,"36":1,"41":1,"43":1,"47":3,"48":1,"59":1,"89":1,"95":1,"97":1,"102":2,"112":1,"115":4,"116":3,"118":1,"123":1,"134":2,"137":1,"144":2,"147":1,"149":1,"152":1,"156":1,"158":3,"166":1,"171":1,"184":1,"186":1,"193":1,"203":2,"204":1,"218":1,"220":1,"223":1,"231":4,"239":1,"243":1,"244":1,"246":1,"249":1,"251":1,"253":1,"257":1,"264":1,"267":1,"291":1,"299":1,"301":1,"302":1,"303":2,"316":1,"317":1,"319":3,"325":2,"329":1,"331":3,"343":1,"344":1,"351":1,"353":2,"356":1,"361":1,"363":1,"364":2,"375":2,"378":1,"379":1,"386":2,"389":2,"390":1,"391":1,"394":1,"421":1,"425":1,"438":1,"442":1,"443":2,"460":1,"462":5,"464":1,"471":1,"472":2,"473":1,"507":1,"528":2,"539":1}}],["флексбокса",{"2":{"468":1}}],["флагманом",{"2":{"463":1}}],["флаг",{"2":{"343":1,"364":2}}],["флажок",{"2":{"162":1,"186":1}}],["флажка",{"2":{"162":1,"186":1,"231":2}}],["форсирует",{"2":{"421":1}}],["форумах",{"2":{"174":1}}],["форм",{"2":{"545":1}}],["формочки",{"2":{"472":1}}],["формой",{"2":{"437":1}}],["формы",{"2":{"157":1,"364":1,"462":1}}],["формуле",{"2":{"325":1}}],["формулы",{"2":{"181":1}}],["формулу",{"2":{"133":1,"200":1,"301":2}}],["формулировки",{"2":{"194":1}}],["формулировок",{"2":{"194":1}}],["формулировать",{"2":{"4":1}}],["формулируется",{"2":{"2":1}}],["форму",{"2":{"116":1,"186":1,"324":1,"329":1,"495":1}}],["формируя",{"2":{"202":1}}],["формируется",{"2":{"183":1}}],["формирует",{"2":{"115":1,"223":1,"472":1}}],["формирование",{"2":{"114":1}}],["форме",{"2":{"76":1,"163":1}}],["формальная",{"2":{"239":1}}],["формальный",{"2":{"204":1}}],["формах",{"2":{"161":1}}],["форма",{"2":{"48":1,"170":1}}],["форматировании",{"2":{"472":1}}],["форматирования",{"2":{"449":1,"504":1}}],["форматирование",{"2":{"433":1}}],["форматированию",{"2":{"161":1}}],["форматирует",{"2":{"433":1}}],["форматируете",{"2":{"267":1}}],["форматов",{"2":{"245":1}}],["форматом",{"2":{"162":1,"383":1}}],["формата",{"2":{"118":1,"472":1}}],["формате",{"2":{"115":1,"204":1,"222":1,"239":1,"250":1,"324":1,"364":1,"382":1,"431":2,"454":1,"472":1}}],["формат",{"2":{"17":1,"152":1,"204":1,"303":1,"325":1,"431":1,"449":1,"501":1}}],["фоне",{"2":{"463":1}}],["фон",{"2":{"431":1}}],["фонт",{"2":{"344":1}}],["фоновые",{"2":{"449":1}}],["фоновыми",{"2":{"436":1}}],["фоновый",{"2":{"344":1}}],["фоновом",{"2":{"168":1}}],["фона",{"2":{"230":1,"340":1,"343":1}}],["фонд",{"2":{"144":1}}],["фондом",{"2":{"144":1}}],["фокус",{"2":{"175":1}}],["фокусироваться",{"2":{"162":1,"175":1}}],["фокусировки",{"2":{"151":1}}],["фокусной",{"2":{"151":1}}],["ферме",{"2":{"137":1}}],["фибоначчи",{"0":{"302":1},"2":{"301":1,"303":1,"374":3,"377":1}}],["фигура",{"2":{"356":1}}],["фигуру",{"2":{"290":1}}],["фигурных",{"2":{"231":1}}],["фигурные",{"2":{"201":1}}],["финальном",{"2":{"464":1}}],["финальную",{"2":{"243":1}}],["финансы",{"2":{"331":1}}],["финляндия",{"2":{"178":1}}],["фиксит",{"2":{"464":1}}],["фиксируют",{"2":{"395":1}}],["фиксируются",{"2":{"381":1}}],["фиксируем",{"2":{"231":1}}],["фиксированного",{"2":{"170":1}}],["фиксация",{"2":{"391":1}}],["фиксации",{"2":{"218":1,"390":2,"391":2}}],["философию",{"2":{"181":1}}],["фильтрасобытия",{"2":{"239":1}}],["фильтрасостояние",{"2":{"239":1}}],["фильтрации",{"2":{"178":1,"231":1,"239":1,"256":1,"296":1}}],["фильтрация",{"2":{"16":1,"22":1}}],["фильтрами",{"2":{"30":1,"35":1}}],["фильтры",{"2":{"4":1,"33":1}}],["фишек",{"2":{"163":1}}],["фитта",{"0":{"156":1}}],["физических",{"2":{"137":1}}],["фидбеки",{"2":{"73":1}}],["фулстек",{"2":{"118":1,"433":1}}],["фулстеков",{"2":{"118":1}}],["футеров",{"2":{"520":1}}],["футером",{"2":{"423":1,"546":1}}],["футер",{"2":{"32":1}}],["фунциональность",{"2":{"86":1}}],["функций",{"2":{"153":1,"162":1,"200":2,"204":1,"246":1,"247":1,"250":1,"255":1,"267":2,"271":1,"277":1,"285":1,"289":1,"291":1,"297":1,"298":1,"300":1,"303":1,"305":1,"360":1,"374":1,"378":1,"379":1,"381":1,"425":1,"440":1,"462":3}}],["функциях",{"2":{"303":1,"351":1,"381":1,"463":1}}],["функциям",{"2":{"249":1,"263":1}}],["функциями",{"2":{"224":1,"247":1,"351":1,"357":1,"462":1}}],["функция",{"2":{"124":1,"144":1,"151":1,"157":1,"204":1,"211":1,"227":1,"231":3,"239":1,"244":2,"250":4,"255":1,"256":2,"265":1,"267":1,"288":2,"290":1,"296":1,"297":1,"301":3,"302":1,"325":1,"329":1,"356":3,"358":3,"360":1,"366":3,"376":4,"377":2,"380":1,"428":1,"436":1,"440":1,"448":1,"460":1,"462":1,"464":1,"465":1}}],["функцию",{"2":{"122":1,"125":1,"135":1,"151":1,"171":2,"173":1,"201":1,"211":1,"231":1,"241":1,"244":3,"245":1,"247":2,"250":5,"252":1,"255":1,"256":1,"265":2,"267":3,"281":1,"286":1,"287":2,"290":1,"291":1,"292":3,"293":1,"296":1,"302":3,"303":3,"316":2,"323":1,"352":3,"353":2,"358":1,"361":2,"363":1,"366":2,"372":1,"376":3,"377":1,"378":1,"380":2,"381":1,"390":1,"425":1,"430":1,"436":1,"443":1,"444":2,"454":1,"462":1,"465":1,"511":1}}],["функцией",{"0":{"122":1},"2":{"91":1,"122":1,"157":1,"170":1,"204":1,"211":1,"223":1,"231":1,"245":1,"263":1,"297":1,"302":1,"366":1,"370":1,"376":1,"536":1}}],["функции",{"0":{"217":1,"250":1},"1":{"251":1},"2":{"40":1,"41":1,"89":2,"91":2,"103":2,"104":1,"115":2,"125":1,"140":1,"149":1,"150":1,"155":1,"156":1,"162":1,"171":1,"200":1,"201":1,"204":6,"215":1,"218":1,"225":1,"244":2,"250":4,"251":1,"255":1,"256":1,"263":1,"265":2,"267":2,"272":1,"282":1,"284":1,"286":1,"288":1,"289":1,"292":1,"296":2,"301":5,"302":3,"303":8,"328":1,"329":2,"343":1,"351":1,"358":1,"360":1,"361":3,"366":1,"373":3,"375":1,"376":6,"377":1,"378":3,"382":1,"423":1,"436":2,"438":1,"440":1,"441":1,"445":1,"446":1,"447":2,"448":1,"462":6,"463":1,"504":1,"509":1,"516":1}}],["функционируют",{"2":{"21":1}}],["функционалом",{"2":{"25":1,"440":1,"501":1,"507":1}}],["функциональную",{"2":{"263":1}}],["функциональным",{"2":{"264":1,"297":1}}],["функциональный",{"2":{"228":1}}],["функциональные",{"0":{"78":1},"2":{"263":1,"269":1,"323":1,"508":1}}],["функциональных",{"2":{"3":1,"154":1,"508":1}}],["функциональной",{"2":{"462":1}}],["функциональном",{"2":{"265":1}}],["функциональному",{"2":{"256":1}}],["функциональности",{"2":{"200":3,"218":1,"225":1,"235":1,"238":1,"239":1,"241":1,"252":1,"256":1,"264":1,"295":1,"297":3,"308":1,"396":1,"504":2}}],["функциональностью",{"2":{"161":1,"204":1,"252":1,"265":2,"297":1}}],["функциональность",{"2":{"11":1,"77":1,"200":1,"204":1,"205":1,"230":1,"233":1,"243":1,"247":1,"258":1,"264":2,"268":1,"291":3,"297":2,"298":1,"336":1,"345":1,"353":1,"354":1,"363":1,"446":1,"503":1,"516":1}}],["функционально",{"2":{"22":1}}],["функционал",{"2":{"9":1,"13":1,"26":1,"48":1,"50":1,"353":1,"464":1,"470":1,"504":1,"508":1,"536":1,"540":1}}],["функционала",{"2":{"9":1,"32":1,"79":1,"105":1,"460":2,"471":1,"503":1,"504":1,"506":1,"508":1,"536":1,"537":1,"545":1}}],["фундаментальное",{"2":{"384":1,"463":1}}],["фундаментальной",{"2":{"200":1}}],["фундаментальными",{"2":{"306":1}}],["фундаментальный",{"2":{"302":1}}],["фундаментальную",{"2":{"260":1}}],["фундаментальная",{"2":{"249":1}}],["фундамента",{"2":{"26":1}}],["фракционирование",{"2":{"332":1}}],["фрагментов",{"2":{"518":1}}],["фрагментом",{"2":{"170":1,"261":1}}],["фрагменте",{"2":{"271":1,"318":1}}],["фрагменты",{"2":{"249":1,"508":1,"518":1}}],["фрагментам",{"2":{"434":1}}],["фрагментах",{"2":{"256":1}}],["фрагмента",{"2":{"201":1,"302":1,"319":1,"376":1}}],["фрагмент",{"2":{"154":1,"166":1,"170":1,"250":1,"256":1,"267":1,"317":1,"444":1}}],["фреймворку",{"2":{"208":1,"336":1}}],["фреймворке",{"2":{"200":1,"460":1,"463":1}}],["фреймворков",{"2":{"199":1,"200":2,"219":1,"221":1,"225":1,"228":1,"364":1,"400":1,"463":1,"504":1,"507":1}}],["фреймворком",{"2":{"124":1,"145":1,"199":1,"203":1,"205":1,"218":1,"220":2,"225":1,"231":1,"460":1,"536":1}}],["фреймворки",{"2":{"199":1,"200":2,"202":1,"212":1,"224":2,"225":2,"234":1,"336":1,"463":2}}],["фреймворк",{"0":{"199":1,"200":1,"226":1,"407":1},"1":{"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"230":1,"231":1,"232":1},"2":{"119":2,"199":1,"200":6,"201":1,"202":1,"211":2,"212":1,"223":1,"224":1,"225":2,"226":1,"242":1,"251":1,"260":1,"266":1,"309":1,"331":1,"344":1,"375":1,"400":1,"407":1,"413":1,"434":1,"446":1,"453":1,"462":1,"507":1}}],["фреймворках",{"0":{"463":1},"2":{"313":1,"359":1,"364":1,"482":1}}],["фреймворками",{"0":{"225":1},"1":{"226":1},"2":{"224":1,"372":1}}],["фреймворка",{"2":{"23":1,"117":1,"119":1,"199":1,"200":3,"201":1,"221":1,"225":1,"231":2,"242":1,"258":2,"267":1,"291":1,"310":1,"349":1,"373":1,"400":2,"401":1,"407":1,"460":2,"507":1}}],["фронте",{"2":{"116":3,"118":2,"461":2,"463":1,"464":2,"473":1}}],["фронтендом",{"2":{"117":1}}],["фронтенды",{"2":{"71":1}}],["фронтенда",{"2":{"10":1,"11":1,"22":1,"41":2,"59":1,"82":1,"462":3,"473":1,"508":2}}],["фронтенд",{"0":{"463":1},"2":{"4":1,"6":1,"23":1,"41":1,"47":1,"115":1,"330":1,"331":1,"422":1,"433":1,"434":1,"461":1,"463":1,"464":1,"472":1,"477":1,"479":1,"482":2,"507":1}}],["фронтендеру",{"2":{"419":1}}],["фронтендера",{"0":{"115":1}}],["фронтенде",{"0":{"81":1},"1":{"82":1,"83":1},"2":{"3":1,"6":1,"13":1,"44":1,"102":1,"329":1,"461":1,"462":2,"463":2,"464":1,"473":1}}],["фронту",{"2":{"115":1,"116":1}}],["фронтэнде",{"2":{"463":1}}],["фронтэндер",{"2":{"115":1}}],["фронтэнд",{"0":{"464":1},"1":{"465":1,"466":1,"467":1,"468":1,"469":1,"470":1},"2":{"115":1,"116":1,"118":1,"497":1}}],["фронта",{"2":{"115":1,"116":1,"463":1}}],["фронт",{"2":{"115":2,"116":3,"433":1}}],["фабричной",{"2":{"358":1}}],["фабрики",{"2":{"290":2}}],["фабрика",{"0":{"290":1}}],["фаренгейта",{"2":{"295":1,"296":2}}],["фасадов",{"2":{"300":1}}],["фасадный",{"2":{"300":1}}],["фасада",{"2":{"299":1,"300":1}}],["фасад",{"0":{"300":1},"2":{"260":1,"296":1,"300":1}}],["фантазийный",{"2":{"237":1}}],["фактического",{"2":{"372":1,"421":1,"472":1}}],["фактические",{"2":{"351":1}}],["фактически",{"2":{"247":1,"446":1}}],["факт",{"2":{"164":1,"462":1}}],["факто",{"2":{"118":1,"310":1,"512":1}}],["фактора",{"2":{"332":1}}],["фактор",{"2":{"297":1,"330":1,"463":1}}],["фактором",{"2":{"256":1,"295":1,"324":1,"441":1}}],["факторов",{"2":{"41":1,"301":1,"370":1,"373":2}}],["факторизация",{"2":{"13":1}}],["файлом",{"2":{"139":1,"224":1,"342":1}}],["файловой",{"2":{"336":1}}],["файловый",{"2":{"137":1}}],["файлов",{"0":{"126":1,"143":1,"217":1},"2":{"11":2,"38":1,"76":1,"109":1,"119":1,"132":1,"135":2,"141":1,"145":2,"195":1,"202":1,"223":1,"225":1,"229":1,"244":2,"256":1,"319":1,"345":1,"375":2,"382":1,"390":3,"421":1,"422":1,"430":1,"432":1}}],["файлу",{"2":{"135":1,"228":1,"267":1,"437":1}}],["файл",{"0":{"338":1},"1":{"339":1,"340":1,"341":1},"2":{"112":1,"135":1,"136":1,"137":1,"139":1,"140":2,"141":2,"152":2,"158":1,"195":2,"202":3,"203":3,"224":12,"225":2,"226":3,"227":2,"228":5,"230":1,"244":2,"255":2,"256":2,"282":1,"284":1,"308":1,"312":1,"313":4,"316":1,"334":1,"336":1,"338":4,"342":3,"344":2,"345":2,"358":1,"361":1,"362":1,"374":1,"375":5,"379":5,"380":1,"382":1,"383":2,"384":1,"390":4,"391":2,"393":6,"397":1,"421":4,"430":1,"433":1,"443":1,"447":1,"448":1,"453":1,"472":2,"518":1}}],["файле",{"2":{"86":1,"112":1,"203":1,"226":1,"243":2,"256":1,"316":2,"319":1,"338":1,"344":1,"359":1,"382":1,"383":1,"393":1,"437":1,"443":1,"449":1,"554":1,"557":2}}],["файлам",{"2":{"135":1,"224":1}}],["файлами",{"2":{"11":1,"38":1,"140":1,"255":1,"390":1}}],["файлах",{"2":{"109":1,"375":2,"376":1,"381":2,"382":3,"433":1}}],["файла",{"2":{"17":1,"117":1,"120":1,"136":1,"138":1,"140":1,"224":1,"226":1,"227":1,"244":1,"255":2,"283":1,"336":1,"338":2,"341":2,"376":2,"382":1,"390":1,"421":3,"437":1,"438":1,"450":2,"453":1,"472":1,"501":2}}],["файлы",{"0":{"38":1,"404":1},"2":{"6":1,"11":1,"17":1,"126":1,"136":2,"137":1,"142":1,"143":2,"144":1,"202":1,"222":1,"223":2,"224":4,"227":2,"236":1,"255":1,"308":1,"310":1,"336":1,"344":1,"345":1,"375":1,"385":2,"386":1,"390":5,"391":3,"392":1,"393":1,"404":1,"421":1,"429":1,"432":1,"449":1,"472":1,"513":1,"538":1}}],["зря",{"2":{"471":1}}],["зрения",{"2":{"11":1,"22":1,"103":1,"123":1,"149":1,"301":1,"316":1,"440":2,"455":1,"462":3,"496":1}}],["звеном",{"2":{"450":1}}],["звездочка",{"2":{"391":1}}],["звучало",{"2":{"374":1}}],["звучит",{"2":{"202":1}}],["звуков",{"2":{"149":1}}],["зерна",{"2":{"473":1}}],["зеркально",{"2":{"451":2,"452":1}}],["зеркальное",{"2":{"135":1}}],["зеленого",{"2":{"376":1}}],["зону",{"2":{"263":1}}],["зона",{"2":{"200":1}}],["змеином",{"2":{"215":1}}],["злоупотреблять",{"2":{"425":1,"436":1}}],["злоупотребление",{"2":{"167":1}}],["злой",{"2":{"147":1}}],["знал",{"2":{"473":1}}],["знатоков",{"2":{"433":1}}],["знать",{"2":{"119":1,"130":1,"135":1,"197":1,"200":1,"202":1,"204":1,"223":1,"251":1,"285":1,"295":1,"306":1,"322":1,"334":1,"343":1,"432":1,"473":2}}],["знающих",{"2":{"473":1}}],["знают",{"2":{"351":1,"471":1}}],["знаю",{"2":{"303":1}}],["знанию",{"2":{"473":1}}],["знаний",{"2":{"368":1,"473":1}}],["знание",{"2":{"260":1,"401":1}}],["знаниями",{"2":{"306":1}}],["знания",{"2":{"197":1,"199":1,"235":1,"251":1,"259":1,"260":1,"306":1,"333":1,"401":1,"434":1,"473":2}}],["знаем",{"2":{"204":1,"251":1,"301":1,"322":1,"381":1,"383":1,"436":1}}],["знает",{"2":{"202":1,"204":2,"295":1,"449":1}}],["знаете",{"2":{"115":1,"330":1}}],["знаки",{"2":{"391":1}}],["знаку",{"2":{"313":1}}],["знаке",{"2":{"229":1}}],["знаками",{"2":{"331":1}}],["знака",{"2":{"215":1,"299":1}}],["знак",{"2":{"201":1,"313":1,"391":1,"448":1}}],["знакомимся",{"2":{"415":1}}],["знакомит",{"2":{"410":1,"413":1}}],["знакомиться",{"2":{"374":1}}],["знакомясь",{"2":{"306":1}}],["знакома",{"2":{"222":1,"256":1}}],["знаком",{"2":{"214":1,"249":1,"322":1}}],["знакомым",{"2":{"203":1}}],["знакомы",{"2":{"153":1,"266":1,"402":1}}],["знакомой",{"2":{"267":1}}],["знакомо",{"2":{"150":1}}],["знакомого",{"2":{"76":1}}],["знакомстве",{"2":{"304":1}}],["знакомство",{"2":{"131":1}}],["знакомства",{"2":{"131":2,"145":1,"276":1}}],["знаменитая",{"2":{"154":1}}],["значимых",{"2":{"227":1}}],["значимое",{"2":{"224":1}}],["значителен",{"2":{"449":1}}],["значительную",{"2":{"200":1,"308":1}}],["значительный",{"2":{"200":1,"445":1,"472":1}}],["значительные",{"2":{"199":1,"297":1,"436":1}}],["значительными",{"2":{"289":1}}],["значительным",{"2":{"125":1}}],["значительных",{"2":{"71":1}}],["значительной",{"2":{"150":1,"154":1,"199":1,"301":1,"308":1,"385":1}}],["значительно",{"2":{"134":1,"200":1,"201":1,"303":1,"332":1,"336":1,"423":1,"433":1,"434":1,"455":1,"471":1,"472":1,"507":1}}],["значительного",{"2":{"125":1,"258":1}}],["значительное",{"2":{"63":1,"372":1,"460":1}}],["значит",{"2":{"12":1,"85":1,"329":1}}],["значков",{"2":{"183":1,"227":2}}],["значком",{"2":{"163":1,"165":1,"173":1}}],["значке",{"2":{"165":1,"341":1}}],["значками",{"2":{"227":2}}],["значка",{"2":{"165":2,"339":1}}],["значки",{"0":{"165":1},"2":{"154":1,"225":1,"227":5,"328":1,"336":1}}],["значок",{"2":{"150":1,"152":1,"165":1,"173":1,"176":2,"227":2}}],["значению",{"2":{"204":2,"231":1,"245":1,"363":1,"376":2,"381":2}}],["значений",{"2":{"204":1,"245":1,"357":1,"359":1,"363":1,"364":1,"381":1,"436":1,"447":1}}],["значением",{"2":{"206":1,"231":1,"245":1,"246":1,"250":1,"287":1,"296":1,"351":1,"352":1,"376":1,"380":1,"381":1,"463":1}}],["значение",{"2":{"124":1,"134":2,"171":1,"191":1,"200":4,"201":1,"204":6,"206":2,"207":2,"209":1,"210":2,"212":1,"231":2,"245":3,"246":3,"250":1,"251":1,"255":1,"281":1,"296":5,"298":1,"301":1,"302":1,"303":2,"316":2,"325":1,"340":1,"351":1,"356":1,"358":2,"366":2,"367":1,"376":1,"377":1,"380":1,"381":4,"421":1,"446":1,"447":1,"452":2,"529":1,"555":1}}],["значения",{"2":{"123":1,"124":1,"136":1,"137":1,"171":1,"200":1,"201":1,"204":1,"206":1,"208":1,"210":1,"212":1,"215":1,"231":3,"244":1,"245":2,"247":1,"301":1,"303":4,"322":1,"324":1,"338":1,"343":1,"359":1,"363":1,"364":2,"365":1,"367":1,"373":1,"378":1,"381":1,"448":1,"463":1,"501":1,"552":1}}],["значениями",{"2":{"245":1,"255":1,"326":1,"366":1}}],["значениям",{"2":{"123":1}}],["значении",{"2":{"115":1,"232":1}}],["зная",{"2":{"59":1,"229":1,"336":1}}],["здравом",{"2":{"269":1}}],["здравым",{"2":{"16":1}}],["здесь",{"0":{"73":1,"399":1},"2":{"3":1,"5":1,"12":1,"70":1,"73":1,"118":1,"119":2,"125":1,"129":1,"132":1,"134":2,"135":1,"137":2,"139":1,"140":1,"142":1,"144":2,"151":2,"153":1,"156":1,"158":1,"161":1,"179":1,"183":1,"188":1,"199":1,"202":1,"203":2,"204":2,"211":1,"212":2,"221":1,"222":1,"223":3,"224":5,"225":1,"228":1,"236":1,"249":3,"255":1,"256":1,"265":1,"267":4,"280":1,"287":1,"288":2,"289":1,"292":2,"294":4,"296":3,"297":1,"301":1,"310":1,"316":1,"319":1,"322":2,"325":1,"329":1,"330":1,"331":1,"336":2,"342":1,"343":1,"351":1,"353":1,"358":1,"359":1,"363":1,"364":2,"373":1,"378":1,"381":1,"382":2,"393":1,"396":1,"437":2,"442":1,"443":2,"446":1,"462":2}}],["зазываниях",{"2":{"465":1}}],["зажимает",{"2":{"463":1}}],["заинтересованные",{"2":{"402":1}}],["заимствован",{"2":{"264":1}}],["зафиксирован",{"2":{"393":1}}],["зафиксированное",{"2":{"33":1}}],["зашифрованных",{"2":{"325":1}}],["зашифрованном",{"2":{"324":1}}],["займет",{"2":{"302":1}}],["застывший",{"2":{"436":1}}],["застыть",{"2":{"436":1}}],["заставки",{"2":{"556":1}}],["заставка",{"2":{"343":1,"542":1,"556":2}}],["заставим",{"2":{"295":1}}],["заставив",{"2":{"194":1}}],["заставить",{"2":{"185":1,"186":1,"191":1,"195":1,"351":1,"365":1}}],["заставили",{"2":{"22":1,"363":1}}],["заставляя",{"2":{"171":1}}],["заставляет",{"2":{"157":1,"436":1}}],["заставлять",{"2":{"116":1}}],["заслуживает",{"2":{"287":1}}],["заумной",{"2":{"270":1}}],["заодно",{"2":{"233":1}}],["заложим",{"2":{"304":1}}],["заложили",{"2":{"221":1}}],["залог",{"2":{"159":1}}],["залогинился",{"2":{"116":1,"462":1}}],["заняв",{"2":{"224":1}}],["занят",{"2":{"436":1}}],["занятость",{"2":{"168":1}}],["занято",{"2":{"168":1}}],["занять",{"2":{"168":1,"461":1}}],["занята",{"2":{"168":2}}],["заново",{"2":{"152":1}}],["занимающие",{"2":{"460":1,"536":1}}],["занимающиеся",{"2":{"372":1}}],["занимаются",{"2":{"461":1}}],["занимают",{"2":{"125":1,"173":1,"235":1,"432":1}}],["занимать",{"2":{"364":2}}],["заниматься",{"2":{"74":1}}],["занимается",{"2":{"149":1,"227":1}}],["занимает",{"2":{"126":1,"199":1,"295":1,"436":2}}],["заботу",{"2":{"463":1}}],["заботитесь",{"2":{"431":1}}],["заботы",{"2":{"396":1}}],["забот",{"2":{"291":1}}],["заботятся",{"2":{"137":1,"401":1}}],["забыл",{"2":{"468":1}}],["забыть",{"2":{"268":1,"287":1,"460":1}}],["забывает",{"2":{"178":1}}],["забывать",{"2":{"144":1}}],["заблокировать",{"2":{"255":1}}],["забудьте",{"2":{"226":1}}],["забрасывается",{"2":{"196":1}}],["защищенное",{"2":{"336":1}}],["защищенному",{"2":{"329":1,"337":1}}],["защищенную",{"2":{"329":1}}],["защищать",{"2":{"144":1}}],["защитить",{"2":{"416":1}}],["защит",{"2":{"313":1,"324":1}}],["защите",{"2":{"145":1}}],["защита",{"0":{"144":1},"2":{"131":1,"324":1}}],["защиты",{"2":{"117":1,"131":1,"325":1}}],["зачем",{"0":{"385":1},"2":{"125":1,"295":1,"316":1,"348":1,"462":1}}],["зачастую",{"2":{"44":1,"189":1,"196":1,"197":1,"240":1,"373":1,"461":1}}],["замаскированная",{"0":{"195":1}}],["замаскирована",{"2":{"190":1}}],["замаскировать",{"2":{"162":1}}],["заманить",{"2":{"188":1}}],["заморозить",{"2":{"302":1}}],["заморожено",{"2":{"301":1}}],["заморочки",{"2":{"116":1}}],["заморачиваться",{"2":{"115":1}}],["замедление",{"2":{"308":1}}],["замечаем",{"2":{"296":1}}],["замечаниями",{"2":{"249":1}}],["замечание",{"2":{"4":1,"74":1,"96":1,"364":1,"448":1}}],["замечательную",{"2":{"323":1}}],["замечательно",{"0":{"227":1}}],["замечательным",{"2":{"201":1}}],["заметка",{"2":{"473":1}}],["заметку",{"2":{"447":1}}],["заметки",{"2":{"239":1,"446":1,"447":1,"472":1}}],["заметок",{"2":{"446":1,"447":2}}],["заметите",{"2":{"447":1}}],["заметить",{"2":{"204":1,"297":1,"303":1,"310":1,"319":2,"376":1,"390":1,"449":1}}],["заметим",{"2":{"338":1}}],["заметили",{"2":{"287":1,"376":1}}],["заметьте",{"2":{"194":1,"238":1,"288":1,"302":1,"367":1,"393":1}}],["заметным",{"2":{"169":1}}],["заметное",{"2":{"126":1}}],["замену",{"2":{"460":2,"463":1,"466":1}}],["замены",{"2":{"264":1,"460":1}}],["заменяет",{"2":{"321":1}}],["заменяем",{"2":{"85":1,"86":1}}],["заменяются",{"2":{"214":1}}],["заменяющий",{"2":{"119":1}}],["заменяя",{"2":{"134":1}}],["замена",{"2":{"119":2,"303":1,"460":1}}],["заменой",{"2":{"95":1}}],["заменится",{"2":{"212":1}}],["замените",{"2":{"211":1}}],["заменить",{"2":{"114":1,"123":1,"464":1,"471":2,"529":1}}],["заменим",{"2":{"95":2}}],["заменив",{"2":{"82":1,"302":1,"363":1}}],["заменено",{"2":{"201":1}}],["заменен",{"2":{"123":2,"249":1}}],["замене",{"2":{"41":1,"83":1}}],["загуглите",{"2":{"465":1}}],["заглянуть",{"2":{"362":1,"433":1}}],["заглавными",{"2":{"215":1,"218":1}}],["загрязнять",{"2":{"316":1}}],["загромождает",{"2":{"204":1}}],["загружен",{"2":{"170":1,"227":1,"313":1}}],["загружено",{"2":{"132":1}}],["загружают",{"2":{"316":1}}],["загружаются",{"2":{"170":1}}],["загружаясь",{"2":{"429":1}}],["загружая",{"2":{"316":1}}],["загружает",{"2":{"195":1,"223":1,"244":1}}],["загружаем",{"2":{"87":1,"95":1,"100":1,"106":1,"112":1}}],["загружать",{"2":{"137":1,"202":1,"212":1,"227":1}}],["загружаться",{"2":{"125":1,"224":1,"244":1}}],["загрузился",{"2":{"342":2}}],["загрузит",{"2":{"202":2,"310":1}}],["загрузить",{"2":{"83":1,"136":1,"143":1,"195":1,"244":2,"308":1,"379":1,"383":1,"404":1}}],["загрузчик",{"2":{"244":1}}],["загрузку",{"2":{"224":1,"244":1,"287":1,"313":1,"327":1,"346":1}}],["загрузке",{"2":{"171":1,"182":1,"183":2,"289":1,"316":1,"374":1,"421":1,"433":1,"472":1}}],["загрузка",{"2":{"121":1,"244":2,"308":1,"309":1,"316":1,"387":1,"421":1,"425":1}}],["загрузки",{"0":{"120":1},"2":{"119":1,"120":1,"170":2,"195":3,"224":1,"225":1,"244":2,"308":2,"313":1,"345":1,"374":1,"421":2,"429":1,"436":2,"460":1,"536":1,"556":1}}],["заголовки",{"2":{"328":2,"450":1}}],["заголовках",{"2":{"328":1}}],["заголовка",{"2":{"255":1,"325":1,"340":1}}],["заголовком",{"2":{"177":1,"186":1,"297":1,"343":1,"527":1}}],["заголовков",{"2":{"117":1}}],["заголовок",{"2":{"231":3,"255":1,"256":1,"319":1,"328":1,"356":1}}],["загорается",{"2":{"102":1}}],["захваченного",{"2":{"381":1}}],["захват",{"2":{"381":1}}],["захватывая",{"2":{"175":1}}],["захвата",{"2":{"156":1,"231":1}}],["захостите",{"2":{"473":1}}],["захостить",{"2":{"115":1,"422":1}}],["захотеть",{"2":{"200":1}}],["захотим",{"2":{"48":1,"105":1}}],["захардкодим",{"2":{"99":1}}],["заранее",{"2":{"472":1}}],["заработать",{"2":{"71":1,"72":1}}],["зародились",{"2":{"199":1}}],["заряде",{"2":{"116":1}}],["зарекомендовавшие",{"2":{"199":1}}],["зарекомендовавшую",{"2":{"39":1}}],["зарегистрируйте",{"2":{"473":1}}],["зарегистрирует",{"2":{"182":1}}],["зарегистрировали",{"2":{"326":1,"327":1}}],["зарегистрировать",{"2":{"255":1,"288":1,"292":1,"345":1}}],["зарегистрироваться",{"2":{"58":1,"325":1,"473":1}}],["зарегистрировано",{"2":{"325":1}}],["зарегистрированной",{"2":{"330":1}}],["зарегистрированное",{"2":{"288":1}}],["зарегистрированным",{"2":{"255":1}}],["зарегистрированных",{"2":{"59":1,"322":1}}],["зарегистрирован",{"2":{"134":1,"329":1,"344":1}}],["зарезервированный",{"2":{"176":1}}],["зарезервированных",{"2":{"134":1}}],["зарезервированное",{"2":{"134":1,"204":1,"438":1}}],["запятыми",{"2":{"448":1}}],["запятой",{"2":{"134":1}}],["запланированных",{"2":{"443":1}}],["запланированы",{"2":{"293":1}}],["запишем",{"2":{"239":1}}],["записывается",{"2":{"331":1}}],["записываются",{"2":{"216":1}}],["записью",{"2":{"448":1}}],["запись",{"2":{"134":2,"448":1}}],["записать",{"2":{"134":1,"364":1}}],["записанный",{"2":{"116":1}}],["записи",{"0":{"134":1},"1":{"136":1},"2":{"59":1,"116":1,"134":4,"146":1,"204":1,"331":1,"366":1,"443":1}}],["записей",{"2":{"48":1,"134":2,"145":1,"176":1,"375":1}}],["запасного",{"2":{"212":1}}],["заполнено",{"2":{"462":1}}],["заполнен",{"2":{"319":1}}],["заполнения",{"2":{"157":1,"255":1}}],["заполнителя",{"2":{"447":1}}],["заполнить",{"2":{"288":1}}],["заполним",{"2":{"231":1}}],["заполнять",{"2":{"341":1}}],["заполняется",{"2":{"317":1}}],["заполнял",{"2":{"249":1}}],["заполняющего",{"2":{"186":1}}],["запоминается",{"2":{"557":1}}],["запоминаемость",{"2":{"159":1}}],["запоминанием",{"2":{"325":1}}],["запоминать",{"2":{"221":1}}],["запомните",{"2":{"203":1}}],["запомнить",{"2":{"164":1,"295":1}}],["запущен",{"2":{"436":1,"461":1}}],["запутывающее",{"2":{"462":1}}],["запутывает",{"2":{"157":1}}],["запутанным",{"2":{"381":1}}],["запутать",{"2":{"360":1}}],["запустили",{"2":{"381":1}}],["запустив",{"2":{"319":2}}],["запустим",{"2":{"202":1,"344":1}}],["запустится",{"2":{"384":1}}],["запустит",{"2":{"223":1,"224":1}}],["запустите",{"2":{"144":1,"231":1,"372":1,"387":1}}],["запустить",{"2":{"59":1,"115":2,"143":1,"223":3,"226":1,"343":1,"356":1,"376":2,"378":1,"384":2,"388":1,"390":1,"394":1,"433":1,"445":1,"454":1}}],["запуском",{"2":{"395":1}}],["запуске",{"2":{"243":1,"244":1,"310":1,"336":1,"340":1,"367":1,"379":1,"472":2}}],["запуск",{"0":{"502":1},"2":{"224":1,"343":1,"359":1,"370":1,"372":1,"376":1,"487":1}}],["запуску",{"2":{"144":1}}],["запускалось",{"2":{"472":1}}],["запускают",{"2":{"395":1}}],["запускаются",{"2":{"204":1,"433":1}}],["запускается",{"2":{"330":1,"432":1,"436":1}}],["запускает",{"2":{"202":1,"316":1,"322":1,"343":2,"395":1}}],["запускаем",{"2":{"112":1,"255":1,"352":1,"353":1}}],["запускаться",{"2":{"436":1}}],["запускать",{"2":{"171":1,"224":3,"319":2,"331":1,"376":1,"379":1,"387":1,"436":1,"554":1}}],["запуска",{"0":{"120":1},"2":{"119":1,"120":1,"123":2,"329":2,"343":1,"351":1,"356":1,"374":1,"375":2,"384":1,"402":1,"449":1}}],["запрограммировать",{"2":{"395":1}}],["запрограммированной",{"2":{"344":1}}],["запрошенное",{"2":{"296":1}}],["запрошен",{"2":{"117":1}}],["запросом",{"2":{"472":1}}],["запросов",{"2":{"11":1,"40":1,"56":1,"59":1,"114":1,"117":1,"118":2,"137":1,"138":1,"322":1,"323":1,"454":3,"512":1}}],["запросу",{"2":{"179":1,"323":1,"386":1}}],["запросить",{"2":{"166":1,"331":1}}],["запросами",{"2":{"276":1}}],["запросам",{"2":{"117":1}}],["запроса",{"2":{"114":1,"117":4,"316":2,"318":1,"322":1,"323":1,"325":1,"326":2,"327":2,"330":1,"333":1,"343":1,"440":1,"443":1,"447":1,"450":1,"451":1,"452":2,"454":3,"472":1}}],["запросы",{"2":{"47":1,"50":1,"51":1,"56":2,"59":2,"82":1,"118":1,"135":1,"137":1,"138":1,"280":1,"433":2,"454":2,"472":2}}],["запросе",{"2":{"47":1,"116":2,"454":1}}],["запрос",{"2":{"41":1,"51":1,"59":1,"83":1,"117":3,"135":1,"137":1,"139":1,"223":1,"324":1,"330":1,"343":3,"344":1,"383":1,"445":1,"449":2,"450":1,"452":1,"454":1}}],["запрещены",{"2":{"116":1}}],["запрашивают",{"2":{"364":1}}],["запрашивающий",{"2":{"116":1,"331":1}}],["запрашиваем",{"2":{"331":1}}],["запрашиваемая",{"2":{"328":1}}],["запрашиваемого",{"2":{"117":1,"366":1}}],["запрашиваемому",{"2":{"116":1}}],["запрашивает",{"2":{"117":1,"196":1}}],["запрашивать",{"2":{"115":1}}],["завернуть",{"2":{"302":1}}],["завершится",{"2":{"393":1}}],["завершиться",{"2":{"372":1}}],["завершить",{"2":{"255":3}}],["завершаться",{"2":{"436":1}}],["завершая",{"2":{"393":1}}],["завершают",{"2":{"364":1}}],["завершает",{"2":{"260":1,"376":1}}],["завершена",{"2":{"436":1}}],["завершенного",{"2":{"344":1}}],["завершенные",{"2":{"231":2}}],["завершенных",{"2":{"231":1}}],["завершение",{"2":{"357":1}}],["завершении",{"2":{"301":1}}],["завершению",{"2":{"255":1}}],["завершения",{"2":{"229":1,"301":1,"379":1,"387":1,"436":1,"437":1,"453":1}}],["зависеть",{"2":{"301":1,"327":1}}],["зависанию",{"2":{"301":1}}],["завис",{"2":{"168":1}}],["зависящих",{"2":{"301":1}}],["зависящие",{"2":{"231":1,"463":1}}],["зависящей",{"2":{"157":1}}],["зависят",{"2":{"150":1,"260":1,"336":1}}],["зависимой",{"2":{"282":1,"289":1}}],["зависимое",{"2":{"200":1}}],["зависимость",{"2":{"254":1,"255":2,"284":1,"286":1,"287":3,"288":3,"289":1,"345":1,"383":1,"384":1,"462":1,"465":1,"471":2,"504":1}}],["зависимостями",{"2":{"224":1,"284":1,"305":1}}],["зависимостей",{"0":{"282":1,"465":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"2":{"86":1,"200":1,"215":1,"223":1,"224":2,"241":1,"246":1,"247":1,"248":1,"252":1,"258":1,"260":1,"282":1,"283":1,"284":1,"286":2,"287":3,"288":2,"290":1,"296":1,"353":1,"374":1,"375":1,"460":1,"463":2,"504":1,"537":1}}],["зависимости",{"0":{"247":1},"2":{"23":2,"56":1,"116":1,"119":1,"134":1,"143":1,"166":1,"181":1,"200":2,"203":1,"204":1,"208":1,"223":3,"224":1,"225":1,"231":1,"243":1,"244":1,"249":1,"251":1,"262":1,"272":2,"276":1,"282":1,"283":1,"284":1,"286":2,"287":4,"289":2,"292":1,"294":1,"304":1,"310":1,"324":1,"343":1,"364":1,"370":1,"375":1,"379":1,"383":2,"388":1,"391":1,"429":1,"436":2,"446":2,"449":1,"453":1,"472":1,"473":1,"507":1}}],["зависит",{"2":{"108":1,"117":1,"121":1,"156":1,"200":1,"201":1,"260":1,"286":1,"324":2,"325":1,"330":1,"370":1,"385":1,"395":1,"507":1}}],["завязанные",{"2":{"39":1}}],["закэшировать",{"2":{"472":1}}],["закладывающих",{"2":{"334":1}}],["заключаться",{"2":{"365":1}}],["заключает",{"2":{"271":1}}],["заключается",{"2":{"164":1,"165":2,"166":1,"171":1,"178":1,"181":1,"187":1,"188":1,"189":1,"191":1,"200":4,"204":1,"212":1,"227":1,"229":1,"238":1,"251":1,"256":1,"267":1,"268":1,"270":1,"284":1,"289":2,"293":1,"297":1,"303":1,"316":2,"329":1,"330":1,"334":1,"364":2,"377":1,"378":1,"380":1,"381":1,"382":1,"454":1}}],["заключенного",{"2":{"202":1}}],["заключена",{"2":{"34":1}}],["закрепления",{"2":{"348":1}}],["закрепить",{"2":{"220":1,"304":1,"333":1}}],["закрываем",{"2":{"257":1}}],["закрывать",{"2":{"255":1}}],["закрытый",{"2":{"421":1}}],["закрытых",{"2":{"331":1}}],["закрытым",{"2":{"324":1}}],["закрытие",{"2":{"255":1}}],["закрытия",{"2":{"150":1,"156":1}}],["закрыть",{"2":{"193":2}}],["закодированное",{"2":{"444":1}}],["закодированные",{"2":{"289":1,"325":1}}],["закомитьте",{"2":{"393":1}}],["закоммичен",{"2":{"393":1}}],["закоммитьте",{"2":{"393":1}}],["закоммитили",{"2":{"391":1}}],["закомментируем",{"2":{"112":1}}],["законченный",{"2":{"473":1}}],["закончить",{"2":{"452":1}}],["закончите",{"2":{"400":1}}],["закончила",{"2":{"358":1}}],["закончилась",{"2":{"131":1}}],["закончили",{"2":{"255":1,"347":1}}],["законодательством",{"2":{"324":1}}],["закономерности",{"2":{"197":1}}],["законом",{"2":{"158":1}}],["законе",{"2":{"156":1,"157":1}}],["закона",{"2":{"156":2,"157":2}}],["закон",{"0":{"156":1,"157":1},"2":{"156":1,"157":1,"200":1,"383":1}}],["законы",{"0":{"155":1},"2":{"155":1,"158":1}}],["заканчивается",{"2":{"364":1}}],["заканчивая",{"2":{"76":2,"145":1,"183":1,"203":1,"238":1,"261":1,"263":1,"332":1}}],["заказа",{"2":{"187":2}}],["заказами",{"2":{"59":1}}],["заказчик",{"2":{"464":1,"468":1}}],["заказчика",{"2":{"62":1}}],["заказчиком",{"2":{"9":1,"12":1}}],["заказ",{"2":{"12":1}}],["заказов",{"2":{"12":1,"36":1,"79":1}}],["заказываете",{"2":{"26":1}}],["заказы",{"2":{"4":1,"59":1,"105":1}}],["закупаете",{"2":{"26":1}}],["зато",{"2":{"301":1}}],["затушевывает",{"2":{"243":1}}],["затронуты",{"2":{"448":1}}],["затронуть",{"2":{"319":1}}],["затронуло",{"2":{"127":1}}],["затруднена",{"2":{"358":1}}],["затруднение",{"2":{"308":1}}],["затрудняет",{"2":{"178":1,"351":1,"363":1,"364":1}}],["затраченные",{"2":{"449":1}}],["затрагиваемым",{"2":{"497":1}}],["затрагивает",{"2":{"127":1}}],["затрагивая",{"2":{"391":1,"392":1}}],["затрагивают",{"2":{"119":1}}],["затраты",{"2":{"278":1}}],["затратно",{"2":{"41":1}}],["затратами",{"2":{"40":1,"464":1}}],["затрат",{"2":{"12":1,"336":1,"436":1}}],["затем",{"2":{"6":1,"89":1,"115":1,"116":1,"120":1,"122":1,"123":1,"134":1,"143":1,"150":1,"181":2,"189":1,"202":2,"224":1,"231":1,"240":1,"250":3,"255":2,"258":1,"263":1,"281":2,"283":1,"289":1,"293":2,"299":1,"303":1,"316":2,"317":1,"323":1,"325":2,"327":1,"328":1,"329":3,"330":1,"331":1,"344":4,"358":1,"361":1,"364":1,"366":2,"376":2,"380":1,"381":2,"384":1,"387":1,"393":2,"395":1,"400":1,"431":1,"434":1,"436":2,"444":2,"447":1,"472":3}}],["задумываемся",{"2":{"182":1}}],["задуман",{"2":{"228":1}}],["задумал",{"2":{"159":1,"186":1,"193":1}}],["задуматься",{"2":{"123":1}}],["задает",{"2":{"460":1}}],["задаем",{"2":{"169":1,"450":1}}],["задаст",{"2":{"453":1}}],["зададим",{"2":{"316":1}}],["задаются",{"2":{"224":1}}],["заданный",{"2":{"339":1}}],["заданными",{"2":{"319":1}}],["заданное",{"2":{"376":1}}],["заданного",{"2":{"301":1,"329":1}}],["заданном",{"2":{"202":1}}],["заданному",{"2":{"115":1,"255":1}}],["задания",{"2":{"286":1}}],["заданиями",{"2":{"257":1}}],["заданий",{"2":{"231":1}}],["задание",{"2":{"168":2,"296":1}}],["задавать",{"2":{"450":1}}],["задаваемые",{"2":{"177":1,"497":1}}],["задав",{"2":{"136":1}}],["задать",{"2":{"116":1,"463":2}}],["задачу",{"2":{"231":1,"372":1,"508":1}}],["задачей",{"2":{"316":1,"385":1,"463":1}}],["задаче",{"2":{"229":1,"232":1}}],["задач",{"2":{"14":1,"62":1,"64":1,"103":1,"158":2,"165":1,"168":1,"181":1,"224":1,"229":1,"231":6,"257":1,"263":1,"271":1,"293":1,"294":1,"322":1,"331":1,"440":1,"443":1,"507":3}}],["задачи",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1},"2":{"12":1,"62":1,"79":1,"157":1,"229":2,"231":3,"232":1,"265":1,"271":1,"299":1,"331":1,"370":1,"372":1,"385":1,"436":2,"441":1}}],["задачами",{"2":{"147":1}}],["задача",{"2":{"11":1,"12":1,"150":1,"151":1,"152":1,"175":1,"231":1,"251":1,"300":1,"309":1,"330":1,"373":1,"375":2,"433":1}}],["задержка",{"2":{"445":1}}],["задержкам",{"2":{"244":1}}],["задеплоится",{"2":{"112":1}}],["задействовано",{"2":{"370":1}}],["задействовать",{"0":{"115":1},"2":{"23":1,"472":1}}],["задействуем",{"2":{"17":1}}],["задокументированный",{"2":{"77":1}}],["задокументировать",{"2":{"9":1}}],["за",{"0":{"153":1},"2":{"2":1,"6":1,"41":1,"50":1,"105":1,"112":1,"116":1,"118":1,"123":1,"133":1,"135":1,"149":1,"153":1,"166":1,"170":1,"171":3,"181":3,"187":1,"199":1,"200":1,"204":1,"208":1,"212":3,"218":1,"222":1,"224":1,"225":1,"227":1,"235":1,"237":2,"239":1,"249":1,"258":1,"265":1,"266":1,"267":3,"268":1,"269":1,"270":1,"286":1,"287":1,"291":1,"292":1,"296":1,"300":2,"301":1,"313":1,"316":2,"322":1,"323":1,"324":7,"328":1,"331":2,"334":1,"344":1,"345":1,"349":1,"353":1,"364":2,"373":1,"376":1,"385":1,"391":1,"394":3,"405":2,"409":1,"425":2,"433":1,"436":4,"440":1,"447":1,"449":1,"460":2,"462":4,"463":6,"473":1,"508":1,"536":1,"557":1}}],["тёмной",{"2":{"557":1}}],["твердые",{"2":{"434":1}}],["творчества",{"2":{"271":1}}],["творческим",{"2":{"241":1}}],["творчески",{"2":{"26":1,"375":1}}],["творческие",{"0":{"26":1}}],["твоего",{"2":{"116":1}}],["твоем",{"2":{"116":1,"433":1}}],["твоему",{"2":{"115":1,"116":1}}],["твой",{"2":{"115":1,"116":1,"433":1}}],["тише",{"2":{"433":1}}],["типизировать",{"2":{"425":1}}],["типизированным",{"2":{"265":1}}],["типизируем",{"2":{"23":1}}],["типичными",{"2":{"225":1}}],["типичный",{"2":{"170":1}}],["типичного",{"2":{"170":2}}],["типом",{"2":{"245":1,"338":1}}],["типографика",{"2":{"154":1}}],["типографики",{"2":{"149":1,"151":1,"153":1}}],["типов",{"2":{"123":1,"161":2,"163":1,"249":1,"282":1,"372":1,"436":1,"461":1,"462":1,"555":1}}],["типе",{"2":{"137":1,"334":1}}],["тип",{"2":{"134":1,"137":2,"144":1,"154":1,"245":1,"316":1,"319":1,"323":1,"325":3,"341":1,"390":1,"437":1,"449":2,"452":1,"454":1,"471":1}}],["типу",{"2":{"123":1}}],["типыref",{"2":{"462":1}}],["типы",{"0":{"17":1},"1":{"18":1,"19":1},"2":{"16":1,"26":1,"91":1,"124":1,"134":1,"163":1,"176":1,"210":1,"245":1,"247":1,"351":1,"376":1,"437":1,"462":1,"520":1}}],["типам",{"2":{"149":1}}],["типами",{"2":{"123":1}}],["типах",{"2":{"145":1,"245":1}}],["типа",{"2":{"11":1,"17":2,"50":1,"71":1,"117":1,"144":1,"203":1,"245":1,"247":1,"272":1,"301":1,"308":1,"331":1,"422":1,"429":1,"432":1,"446":1,"449":1,"464":1,"471":3,"472":1,"473":2,"528":1,"555":1}}],["тканей",{"2":{"263":1}}],["тяжеловеса",{"2":{"460":1,"536":1}}],["тяжеловесности",{"2":{"457":1}}],["тяжелые",{"2":{"436":1}}],["тяжелыми",{"2":{"436":1}}],["тяжелым",{"2":{"161":1}}],["тяжесть",{"2":{"143":1}}],["тщательно",{"2":{"159":1,"185":1,"373":1}}],["тщательную",{"2":{"99":1}}],["тысячи",{"2":{"184":1,"300":1}}],["тысяч",{"2":{"134":1,"265":1}}],["ты",{"2":{"89":2,"116":1,"464":1}}],["тупиковой",{"2":{"472":1}}],["ту",{"2":{"231":1,"292":1,"356":1,"375":1}}],["тумблер",{"2":{"162":4}}],["тумблеры",{"0":{"162":1},"2":{"162":1}}],["туда",{"2":{"44":1,"115":1,"203":1,"467":1}}],["туториал",{"2":{"70":1}}],["тут",{"2":{"41":1,"74":1,"85":1,"105":1,"115":1}}],["тэгов",{"2":{"471":1}}],["тэг",{"2":{"23":1,"87":1,"95":1,"100":1,"106":1,"509":1}}],["тэги",{"2":{"16":1,"163":1,"542":1,"552":1}}],["тайлвинде",{"2":{"468":1}}],["таймер",{"2":{"445":1}}],["таймера",{"2":{"167":1,"329":1}}],["таймстемпа",{"2":{"421":1}}],["тайм",{"2":{"152":1,"443":1}}],["тарифы",{"2":{"422":1}}],["тарифных",{"2":{"190":1}}],["тараканов",{"0":{"188":1}}],["таблетками",{"2":{"163":1}}],["таблетки",{"0":{"163":1}}],["таблицу",{"2":{"224":1,"227":1}}],["таблицы",{"2":{"48":1,"59":1,"199":1,"224":1,"227":1,"239":1,"282":1,"308":1}}],["таблиц",{"2":{"47":3,"170":1,"225":1,"448":1}}],["таблицам",{"2":{"53":1,"59":1}}],["таблицами",{"2":{"47":1}}],["таблица",{"2":{"17":1,"123":1,"134":1,"137":1,"226":1,"308":1,"341":1}}],["таблицах",{"2":{"17":2,"47":1,"51":1}}],["таблицей",{"2":{"43":1}}],["таблице",{"2":{"16":1,"48":2,"59":1,"308":1,"341":1}}],["та",{"2":{"152":1,"179":1,"192":1,"328":1}}],["там",{"2":{"29":1,"115":1,"256":1,"353":1,"421":2,"433":1,"461":1,"462":1,"518":1}}],["такая",{"2":{"147":1,"174":1,"189":1,"268":1,"316":1,"324":1,"325":1}}],["таком",{"2":{"244":1}}],["такому",{"2":{"134":1}}],["таковые",{"2":{"255":1,"322":1}}],["таковы",{"2":{"200":1}}],["таковыми",{"2":{"471":1}}],["таковым",{"2":{"194":1}}],["такова",{"2":{"195":1}}],["такового",{"2":{"116":1}}],["такого",{"2":{"170":1,"185":1,"204":1,"263":1,"276":1,"287":1,"308":2,"336":1,"364":1,"449":1,"456":1}}],["такое",{"0":{"271":1,"308":1,"372":1,"385":1},"2":{"115":1,"116":2,"117":1,"118":1,"146":4,"147":1,"152":1,"182":1,"189":1,"198":2,"199":1,"200":2,"202":1,"212":1,"220":1,"240":2,"259":1,"302":1,"305":1,"308":2,"331":1,"334":1,"336":1,"348":2,"369":2,"397":2,"419":1,"421":1,"436":2,"440":1,"441":1,"456":1,"461":1,"462":1,"463":1,"464":1,"471":1,"472":1}}],["такой",{"2":{"17":1,"138":1,"144":1,"147":1,"167":1,"174":2,"183":1,"185":1,"187":1,"204":1,"235":1,"246":1,"250":1,"264":1,"265":1,"286":1,"290":1,"303":1,"317":1,"325":1,"336":1,"356":1,"378":1,"381":1,"382":1,"439":1,"472":1}}],["такую",{"2":{"97":1,"202":1,"323":1,"325":1,"354":1,"385":1}}],["также",{"2":{"72":1,"99":1,"100":1,"105":1,"112":1,"115":1,"116":3,"119":3,"120":1,"127":2,"128":2,"133":1,"134":3,"139":1,"143":1,"144":4,"145":2,"147":1,"153":2,"154":1,"156":1,"158":1,"159":2,"162":1,"165":1,"177":1,"183":1,"196":1,"197":2,"199":2,"200":3,"203":3,"204":1,"205":2,"211":2,"212":2,"218":1,"222":2,"224":5,"226":1,"228":2,"230":1,"231":8,"232":1,"233":3,"235":1,"245":1,"247":2,"249":2,"251":1,"254":1,"255":1,"256":2,"258":1,"261":1,"264":1,"265":2,"267":1,"270":1,"271":1,"276":1,"280":1,"281":1,"286":2,"289":1,"291":2,"293":3,"295":1,"296":2,"297":1,"298":1,"299":2,"300":1,"302":1,"303":2,"306":1,"308":1,"311":3,"313":5,"316":2,"317":2,"319":7,"322":1,"324":1,"325":4,"326":1,"328":1,"329":2,"331":5,"332":3,"334":1,"336":1,"338":1,"341":1,"343":1,"344":2,"345":1,"346":3,"347":1,"351":1,"353":3,"354":1,"356":2,"358":1,"359":2,"361":1,"364":5,"367":2,"368":1,"373":2,"375":1,"376":1,"378":1,"381":2,"382":1,"383":2,"384":1,"385":1,"386":1,"391":3,"393":1,"394":3,"395":1,"396":3,"400":2,"402":1,"412":1,"414":1,"415":2,"422":1,"425":1,"432":1,"433":1,"434":4,"436":2,"438":1,"440":1,"442":1,"443":2,"444":1,"446":2,"447":1,"448":1,"449":2,"454":3,"455":2,"461":1,"462":2,"463":2,"466":1,"471":2,"472":1,"473":5,"495":1,"501":1,"508":1,"548":1}}],["таки",{"2":{"59":1,"472":1,"473":1}}],["такие",{"2":{"43":1,"63":1,"71":1,"82":1,"128":1,"134":2,"149":1,"150":1,"167":1,"176":1,"187":2,"200":1,"210":2,"225":1,"236":1,"244":2,"245":1,"247":1,"249":2,"261":1,"300":1,"323":1,"331":2,"332":1,"376":1,"381":1,"391":1,"394":1,"449":1,"508":1}}],["такими",{"2":{"149":1,"167":1,"227":1,"249":1,"263":1,"267":1,"308":1,"402":1,"512":1}}],["таким",{"2":{"17":1,"36":1,"48":1,"56":1,"115":1,"116":2,"126":1,"149":1,"151":1,"153":1,"176":1,"189":1,"190":1,"201":1,"202":1,"209":1,"226":1,"228":1,"231":1,"243":1,"246":1,"247":1,"250":1,"281":2,"287":1,"295":1,"298":1,"303":1,"309":1,"313":1,"317":1,"322":1,"325":1,"344":1,"351":1,"375":1,"378":1,"379":1,"381":1,"394":1,"437":1,"448":1,"450":1,"471":1}}],["таких",{"2":{"2":1,"4":1,"22":1,"61":1,"143":1,"149":1,"150":1,"155":1,"158":1,"160":1,"161":1,"168":1,"171":2,"183":1,"187":1,"225":2,"251":1,"265":1,"303":2,"308":1,"313":1,"316":1,"323":2,"325":2,"336":1,"343":1,"358":1,"364":1,"370":1,"376":1,"377":1,"385":1,"391":1}}],["так",{"0":{"121":1},"2":{"9":2,"11":1,"14":1,"16":1,"22":1,"26":2,"32":1,"44":1,"71":1,"72":1,"78":1,"95":1,"97":1,"102":1,"103":1,"104":1,"114":1,"116":1,"118":1,"119":1,"126":1,"135":1,"143":1,"147":1,"149":2,"152":1,"156":1,"157":1,"158":1,"163":1,"167":1,"174":1,"179":1,"182":2,"189":1,"194":1,"199":1,"200":1,"201":2,"204":3,"208":2,"218":1,"221":2,"222":2,"223":1,"224":3,"225":1,"226":1,"227":3,"228":2,"230":1,"231":4,"232":1,"234":1,"244":1,"249":4,"250":1,"255":2,"263":1,"265":1,"268":2,"270":1,"271":1,"289":1,"290":1,"292":1,"297":3,"301":1,"303":1,"304":1,"305":2,"308":3,"324":2,"325":2,"327":1,"328":1,"329":2,"331":1,"334":1,"336":3,"346":1,"347":1,"354":1,"357":1,"358":3,"360":1,"363":1,"364":2,"365":1,"367":1,"372":1,"373":1,"375":2,"376":2,"377":1,"378":1,"379":1,"381":2,"383":1,"386":2,"390":1,"391":1,"393":1,"421":3,"432":1,"433":1,"436":2,"438":1,"440":1,"443":1,"446":1,"449":2,"450":1,"452":1,"454":2,"460":1,"461":1,"462":3,"472":3,"473":4,"497":2,"507":1,"509":1,"511":1,"539":2,"545":1}}],["теcты",{"2":{"461":1}}],["телеграм",{"0":{"498":1},"2":{"497":1}}],["теле",{"2":{"454":1}}],["телефоны",{"2":{"336":1}}],["телефонную",{"2":{"330":1}}],["телефона",{"2":{"329":1,"330":1}}],["телефон",{"2":{"329":1}}],["телодвижения",{"2":{"116":1}}],["тело",{"2":{"89":1,"361":1}}],["теоретическая",{"2":{"442":1}}],["теоретические",{"2":{"221":1,"464":1}}],["теоретически",{"2":{"200":1,"222":1,"364":1,"381":1}}],["теории",{"2":{"301":2}}],["тесно",{"2":{"424":1}}],["тесной",{"2":{"341":1,"425":1}}],["тесную",{"2":{"289":1}}],["тестируем",{"2":{"453":1}}],["тестируемый",{"2":{"375":1}}],["тестирующее",{"2":{"372":1}}],["тестироваться",{"2":{"379":1}}],["тестировать",{"0":{"373":1},"2":{"372":1,"373":2,"378":1}}],["тестированию",{"2":{"370":1,"378":1}}],["тестировании",{"2":{"308":1,"377":1,"381":1,"382":1}}],["тестированием",{"2":{"145":1,"461":2}}],["тестирование",{"0":{"66":1,"342":1,"346":1,"370":1,"372":1,"382":1,"415":1,"461":1},"1":{"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"61":1,"66":1,"143":1,"222":1,"224":1,"370":1,"372":4,"373":1,"381":1,"395":1,"397":1,"454":1,"461":2}}],["тестирования",{"0":{"453":1},"1":{"454":1},"2":{"50":1,"65":1,"115":1,"241":1,"331":1,"346":1,"370":1,"372":5,"373":4,"374":2,"375":2,"376":1,"377":1,"378":1,"379":3,"380":1,"384":1,"385":1,"397":2,"400":1,"415":1,"419":1,"421":1,"434":2,"451":1,"453":1,"455":1,"461":2,"503":1,"545":1}}],["тестам",{"2":{"462":1}}],["тестами",{"2":{"383":2}}],["теста",{"2":{"372":1,"375":1,"380":2}}],["тест",{"2":{"346":1,"372":1,"376":3,"378":1,"381":1,"451":1,"473":1}}],["тестовая",{"2":{"376":1}}],["тестовую",{"2":{"376":1}}],["тестовыми",{"2":{"376":1,"384":1}}],["тестовые",{"2":{"375":1,"382":1,"415":1}}],["тестовый",{"2":{"374":2,"375":4,"377":1,"379":1,"382":2,"384":1,"445":1,"451":1,"452":2}}],["тестовых",{"2":{"144":1,"373":1,"375":1,"376":2}}],["тестовое",{"2":{"445":1}}],["тестового",{"2":{"370":1,"372":2,"373":1,"376":1,"384":1}}],["тестовой",{"2":{"370":1,"380":2}}],["тестов",{"2":{"346":1,"370":2,"372":2,"373":1,"374":1,"375":3,"376":10,"380":1,"381":2,"384":1,"396":1,"461":3}}],["тесты",{"2":{"66":1,"346":1,"372":1,"375":1,"376":3,"378":2,"379":1,"381":1,"382":4,"384":1,"395":1,"461":7,"472":1}}],["тень",{"2":{"464":1}}],["тенденции",{"2":{"471":1}}],["тенденцию",{"2":{"265":1,"385":1}}],["тенденция",{"2":{"186":1}}],["теневым",{"2":{"185":1}}],["тегом",{"2":{"316":1,"393":1}}],["тегов",{"2":{"163":1,"249":1,"298":1}}],["теге",{"2":{"205":1,"225":1}}],["тег",{"2":{"201":1,"203":3,"204":1,"224":1,"225":2,"227":1,"243":1,"297":1,"316":1,"361":1}}],["тегами",{"2":{"249":1}}],["тега",{"2":{"201":2,"224":1,"226":1}}],["теги",{"0":{"163":1},"2":{"249":1}}],["течение",{"2":{"134":1,"204":1,"329":1,"330":1,"364":2,"436":1}}],["течением",{"2":{"125":1,"250":1}}],["тексте",{"2":{"350":1,"393":1}}],["тексты",{"2":{"329":1}}],["текстом",{"2":{"173":1,"222":1,"227":1}}],["текстов",{"0":{"415":1},"2":{"222":1,"224":2,"235":1,"384":1,"385":1}}],["текстовых",{"2":{"329":1,"335":1}}],["текстовые",{"2":{"308":1,"355":1}}],["текстовым",{"2":{"168":1}}],["текстовый",{"2":{"152":1,"166":1,"203":1,"222":1,"391":1,"472":1}}],["текстового",{"2":{"176":1,"329":1}}],["текстовом",{"2":{"164":1}}],["текстовое",{"2":{"91":1,"472":1}}],["текстовую",{"2":{"161":1}}],["текстовая",{"2":{"134":1}}],["текст",{"2":{"161":1,"163":1,"164":1,"179":1,"186":1,"210":1,"257":1,"317":1,"325":1,"380":1,"424":1,"472":2}}],["текстами",{"0":{"386":1}}],["текста",{"2":{"151":1,"161":1,"169":1,"228":1,"231":3,"257":1,"303":1,"376":1,"446":1,"536":1}}],["текущим",{"2":{"250":1}}],["текущий",{"2":{"223":1,"232":1,"256":1,"321":1}}],["текущей",{"2":{"331":1,"390":1,"392":3,"393":2,"421":1,"460":1,"501":1}}],["текущего",{"2":{"176":1,"254":1,"255":2,"331":1}}],["текущее",{"2":{"168":1,"174":1,"322":1}}],["текущему",{"2":{"204":1,"255":1,"322":1,"386":1}}],["текущем",{"2":{"51":1,"223":1,"319":1,"322":1,"344":1}}],["текущую",{"2":{"165":1,"223":1}}],["текущая",{"2":{"80":1}}],["тебе",{"2":{"89":1,"464":1}}],["теряете",{"2":{"462":1}}],["термины",{"2":{"397":1}}],["терминологией",{"2":{"200":1}}],["терминов",{"2":{"200":1,"325":1}}],["термина",{"2":{"149":1}}],["терминала",{"2":{"222":1,"223":1,"390":2,"453":1}}],["терминал",{"2":{"143":1,"222":1,"387":1}}],["терминалом",{"2":{"137":1}}],["терминале",{"2":{"136":1,"223":3,"231":1,"310":1,"345":1,"354":1,"389":2,"393":1,"449":1}}],["терминами",{"2":{"131":2,"197":1,"200":1}}],["терминах",{"2":{"62":1}}],["термин",{"2":{"96":1,"133":1,"181":1,"334":1,"336":1}}],["терпимая",{"2":{"86":1}}],["те",{"2":{"85":1,"137":1,"205":1,"227":1,"243":1,"252":1,"254":1,"261":1,"292":1,"297":1,"304":1,"308":1,"314":1,"321":1,"351":1,"383":1,"385":1,"423":2}}],["техноологии",{"2":{"460":1}}],["технологиями",{"2":{"402":1}}],["технологиям",{"2":{"308":1}}],["технология",{"2":{"300":1,"308":1,"336":1,"419":1,"436":1,"455":1}}],["технологии",{"2":{"199":1,"250":1,"260":1,"308":2,"331":1,"334":1,"336":2,"401":1,"432":1,"473":2}}],["технологий",{"2":{"199":1,"300":2,"308":3,"323":1,"331":3,"334":2,"336":4,"347":1,"395":1,"507":1}}],["технического",{"2":{"470":1,"473":1}}],["техническим",{"2":{"63":1}}],["технический",{"0":{"23":1}}],["технически",{"2":{"12":1,"36":1}}],["технические",{"0":{"132":1,"148":1,"222":1,"236":1,"307":1,"335":1,"350":1,"371":1,"435":1},"2":{"9":1}}],["техник",{"2":{"508":1}}],["техника",{"2":{"171":2}}],["технику",{"2":{"171":1}}],["техники",{"2":{"148":1,"260":1,"447":1}}],["тех",{"2":{"73":1,"142":1,"161":1,"175":1,"188":1,"200":1,"212":1,"224":1,"238":1,"241":2,"243":1,"264":1,"270":1,"284":1,"301":1,"303":1,"308":1,"316":2,"329":1,"331":1,"339":1,"357":1,"379":1,"386":1,"436":1,"472":1}}],["теперь",{"0":{"122":1},"2":{"41":1,"82":1,"83":1,"86":1,"91":1,"95":1,"102":1,"112":2,"119":1,"120":2,"122":1,"124":1,"125":1,"126":2,"127":1,"128":1,"136":2,"143":2,"171":1,"200":1,"204":3,"212":1,"222":1,"224":2,"225":1,"226":2,"227":1,"230":1,"231":3,"238":1,"244":1,"246":2,"249":2,"251":1,"255":1,"256":1,"283":1,"284":1,"295":1,"297":2,"300":3,"302":2,"303":3,"306":1,"308":3,"313":1,"314":1,"316":2,"319":1,"322":1,"328":1,"336":1,"343":2,"349":1,"352":1,"362":1,"366":1,"367":1,"372":1,"374":1,"379":2,"380":1,"382":1,"391":1,"393":2,"436":1,"442":2,"443":1,"445":1,"451":1,"454":1}}],["темой",{"2":{"249":1,"343":1}}],["темам",{"2":{"497":1}}],["тема",{"2":{"225":1,"342":1,"363":1,"543":1,"557":1}}],["темная",{"2":{"184":1,"188":1,"189":1,"543":1}}],["темный",{"2":{"187":1,"336":1}}],["темные",{"0":{"185":1},"1":{"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1},"2":{"185":1,"198":1}}],["темными",{"2":{"194":1}}],["темным",{"2":{"159":1}}],["темных",{"2":{"147":1,"184":1,"196":1,"197":1}}],["темном",{"2":{"196":1}}],["темно",{"2":{"151":1}}],["теми",{"2":{"149":1,"199":1,"289":1,"454":1}}],["тему",{"2":{"118":1,"135":1,"143":1,"158":1,"249":1,"308":1,"372":1,"461":1}}],["теме",{"2":{"116":1,"117":1,"143":1,"271":1,"385":1,"394":1,"462":1}}],["темы",{"0":{"557":1},"2":{"78":1,"145":1,"199":1,"331":1,"349":1,"424":2,"434":2,"464":1,"506":1,"508":1,"545":1,"557":2}}],["тем",{"2":{"2":1,"6":1,"39":1,"118":2,"136":1,"137":1,"156":1,"168":1,"182":1,"200":2,"202":1,"203":1,"204":2,"210":1,"223":1,"224":1,"227":1,"230":1,"269":1,"291":1,"296":1,"300":1,"301":1,"302":1,"303":1,"319":2,"325":1,"331":1,"333":1,"344":1,"364":1,"372":1,"381":1,"393":2,"440":1,"447":1,"448":1,"454":1,"462":1,"507":1,"543":1,"557":3}}],["трагедия",{"2":{"471":1}}],["трафика",{"2":{"336":1}}],["традиционными",{"2":{"308":1}}],["традиционным",{"2":{"303":1}}],["традиционном",{"2":{"200":1,"336":1}}],["традиционно",{"2":{"164":1,"203":1,"281":1,"303":1,"324":1}}],["традиции",{"2":{"227":1}}],["тратить",{"2":{"157":1,"270":1}}],["траекторию",{"2":{"130":1}}],["транзакционной",{"2":{"364":1}}],["транзакционность",{"2":{"17":1}}],["транспорт",{"2":{"511":1}}],["транспортного",{"2":{"511":1}}],["транспортной",{"2":{"83":1}}],["транспортные",{"2":{"118":1,"473":1}}],["транспортным",{"2":{"114":1}}],["транспиляции",{"2":{"432":1}}],["трансформацию",{"2":{"199":1}}],["трансформация",{"2":{"181":1}}],["труднее",{"2":{"269":1}}],["трудночитаемый",{"2":{"270":1}}],["трудности",{"2":{"228":1}}],["трудностями",{"2":{"200":1}}],["трудностей",{"2":{"118":1}}],["трудно",{"2":{"150":1,"204":1,"222":1,"265":1,"383":1}}],["трудозатратней",{"2":{"472":1}}],["трудозатратам",{"2":{"472":1}}],["трудов",{"2":{"223":1}}],["трудоемко",{"2":{"12":1}}],["труда",{"2":{"59":1}}],["трем",{"2":{"348":1}}],["тремя",{"2":{"167":1,"303":1,"444":1}}],["трехуровневая",{"2":{"317":1}}],["трехуровневых",{"2":{"6":1}}],["трех",{"2":{"173":1,"178":1,"333":1,"443":2}}],["трехмесячные",{"2":{"147":1}}],["третьего",{"2":{"330":1}}],["третьей",{"2":{"239":1,"325":1}}],["третье",{"2":{"232":1}}],["третьему",{"2":{"105":1}}],["третий",{"2":{"61":1,"244":1}}],["требовать",{"2":{"286":1}}],["требоваться",{"2":{"170":1}}],["требование",{"2":{"337":1}}],["требованием",{"2":{"144":1}}],["требованиях",{"2":{"372":2}}],["требованиями",{"2":{"137":1,"231":1,"372":1,"455":1}}],["требованиям",{"2":{"63":1,"237":1,"241":1,"336":1,"346":1,"348":1,"372":1,"402":1}}],["требования",{"0":{"77":1,"78":1,"132":1,"148":1,"222":1,"236":1,"307":1,"335":1,"350":1,"371":1,"435":1},"2":{"62":1,"137":1,"234":1,"236":1,"337":1,"370":1,"373":1,"402":1,"471":1,"472":1}}],["требований",{"2":{"61":1,"63":1,"116":1,"370":1,"371":1,"402":1,"435":1,"446":1}}],["требуемого",{"2":{"449":1,"504":1}}],["требуемой",{"2":{"225":1,"449":1}}],["требуеться",{"2":{"432":1}}],["требует",{"2":{"118":1,"130":1,"131":2,"138":1,"224":1,"260":1,"308":1,"313":1,"330":1,"336":1,"338":1,"341":1,"344":1,"372":1,"390":1,"432":1,"455":1}}],["требуется",{"2":{"115":1,"120":1,"122":1,"137":1,"157":1,"241":1,"248":1,"424":1,"449":2}}],["требуются",{"2":{"460":1,"536":1}}],["требуют",{"2":{"188":1,"212":1,"422":1,"436":1}}],["требующее",{"2":{"165":1}}],["требующий",{"2":{"102":1,"313":1}}],["требующих",{"2":{"17":1,"166":1,"168":1}}],["триггерного",{"2":{"343":1}}],["триггерную",{"2":{"179":1}}],["тривиален",{"2":{"328":1}}],["тривиальными",{"2":{"329":1}}],["тривиальность",{"2":{"329":1,"376":1}}],["тривиально",{"2":{"316":1}}],["тривиального",{"2":{"204":1,"351":1}}],["тривиальную",{"2":{"167":1}}],["тривиальна",{"2":{"140":1,"163":1,"168":1,"319":1,"330":1,"343":1,"441":1,"452":1}}],["три",{"2":{"7":1,"11":1,"51":1,"103":2,"176":4,"203":1,"224":1,"225":1,"265":1,"295":1,"296":1,"299":1,"303":1,"325":2,"331":1,"351":1,"366":1,"374":1,"376":1,"421":2,"443":1,"452":1,"555":1}}],["т",{"0":{"240":1},"2":{"4":1,"38":1,"62":2,"109":1,"115":1,"119":1,"120":1,"124":1,"133":1,"149":5,"153":2,"158":2,"162":1,"164":1,"165":1,"166":2,"170":2,"183":1,"200":1,"201":1,"203":1,"204":2,"210":1,"212":1,"222":1,"224":3,"227":1,"249":1,"250":1,"257":2,"263":1,"288":1,"291":1,"295":1,"298":1,"303":1,"308":3,"313":1,"322":1,"323":1,"324":1,"328":1,"329":1,"330":2,"336":3,"338":1,"339":1,"340":1,"351":1,"370":1,"372":3,"373":1,"376":3,"378":1,"379":1,"391":1,"392":1,"395":1,"436":1,"437":1,"449":1,"461":1,"464":1,"469":1,"472":1,"496":1,"506":2,"507":1,"508":4}}],["торопитесь",{"2":{"465":1}}],["тормозит",{"2":{"464":1}}],["тормозящим",{"2":{"436":1}}],["торвальдс",{"2":{"386":1}}],["торвальдсом",{"2":{"386":1}}],["торговые",{"2":{"167":1,"200":1}}],["тонкая",{"2":{"508":1}}],["тонкую",{"2":{"433":1}}],["тонкий",{"2":{"204":2,"228":1,"345":1}}],["тонкостей",{"2":{"147":1}}],["толку",{"2":{"191":1,"302":1,"375":1}}],["только",{"2":{"4":1,"16":1,"22":1,"23":2,"34":1,"39":1,"41":3,"56":1,"58":1,"59":1,"65":1,"68":1,"85":1,"86":1,"91":1,"92":1,"95":1,"97":1,"102":1,"103":1,"105":1,"108":1,"115":1,"116":2,"117":2,"119":1,"123":2,"127":1,"134":3,"144":1,"149":1,"152":1,"153":2,"156":1,"161":1,"162":1,"166":1,"169":1,"175":1,"177":3,"181":2,"195":1,"200":1,"201":1,"202":1,"203":1,"204":2,"206":2,"208":1,"213":1,"223":4,"225":1,"227":4,"228":3,"230":2,"231":4,"232":4,"234":1,"239":2,"243":1,"244":1,"245":1,"247":1,"255":1,"256":2,"257":2,"260":1,"265":1,"266":2,"268":2,"270":1,"277":1,"278":1,"294":1,"303":2,"308":1,"313":1,"316":4,"318":1,"319":4,"325":3,"329":1,"331":1,"336":1,"343":4,"344":2,"347":1,"351":2,"358":1,"359":2,"364":5,"366":1,"376":1,"381":1,"383":1,"384":1,"393":1,"419":1,"424":1,"431":1,"433":3,"435":1,"436":1,"440":2,"448":1,"449":1,"450":1,"460":2,"462":4,"463":1,"468":1,"471":2,"473":1,"501":1,"504":2}}],["тостах",{"2":{"166":1}}],["тостер",{"2":{"504":1}}],["тосте",{"2":{"166":1}}],["тостовое",{"2":{"166":2}}],["тостовые",{"0":{"166":1}}],["той",{"2":{"134":1,"135":1,"153":1,"193":1,"208":1,"231":1,"263":1,"269":1,"270":1,"297":1,"309":1,"343":1,"364":2,"373":1,"385":1,"394":1,"421":1,"436":1,"462":1,"507":1}}],["токены",{"2":{"328":1,"424":1}}],["токенов",{"2":{"325":1,"328":1}}],["токеном",{"2":{"116":1}}],["токенами",{"2":{"325":2}}],["токена",{"2":{"116":2,"325":5}}],["токенах",{"2":{"116":2,"545":1}}],["токену",{"2":{"116":1}}],["токен",{"2":{"116":7,"325":3,"328":1,"496":2}}],["тобой",{"2":{"115":1}}],["тот",{"2":{"41":1,"123":1,"124":1,"125":1,"164":1,"191":1,"200":2,"204":1,"268":1,"280":1,"290":1,"295":3,"296":1,"297":2,"298":1,"299":1,"300":1,"302":1,"303":1,"325":1,"326":1,"331":2,"336":1,"361":3,"364":1,"366":1,"379":1,"439":1,"463":1,"473":1}}],["тоже",{"2":{"16":1,"43":1,"48":1,"112":1,"173":1,"463":1,"472":1}}],["точек",{"2":{"325":1,"364":1,"453":1}}],["точечной",{"2":{"167":1}}],["точка",{"2":{"181":1,"223":1,"224":1,"253":1,"338":1,"450":1,"454":1,"472":1}}],["точками",{"2":{"134":1,"181":1,"449":1}}],["точке",{"2":{"137":1,"269":1,"449":1}}],["точкой",{"2":{"134":2,"165":1,"224":1,"238":1,"325":2,"334":1,"442":2}}],["точку",{"2":{"119":1,"151":2,"201":1,"223":2,"237":1,"281":1,"293":1,"324":1,"326":1,"327":1,"330":2,"440":1}}],["точки",{"0":{"165":1},"2":{"11":1,"22":1,"103":1,"123":1,"149":1,"151":1,"176":2,"203":1,"224":1,"301":1,"363":1,"394":1,"440":3,"454":1,"455":1,"462":3,"496":1}}],["точное",{"2":{"170":1}}],["точностью",{"2":{"150":1}}],["точно",{"2":{"89":1,"105":1,"117":1,"218":1,"297":1,"358":1,"370":1,"376":1}}],["точней",{"2":{"4":1,"472":1}}],["томасу",{"2":{"268":1}}],["тому",{"2":{"181":1,"186":1,"267":1,"270":1,"308":1,"331":1,"332":1,"394":1,"438":1}}],["том",{"2":{"7":1,"13":1,"22":1,"25":2,"62":2,"102":1,"125":1,"136":1,"144":1,"145":1,"147":1,"149":1,"156":2,"164":1,"165":1,"168":1,"177":1,"178":1,"181":1,"187":1,"188":1,"189":1,"197":1,"199":1,"200":4,"201":1,"202":1,"204":1,"208":1,"224":2,"227":1,"231":1,"232":1,"238":1,"241":1,"246":1,"251":1,"256":1,"266":1,"268":1,"270":2,"271":1,"284":1,"289":1,"294":1,"296":2,"300":1,"303":1,"316":1,"329":1,"330":1,"331":1,"334":1,"336":1,"343":2,"349":1,"364":3,"373":1,"375":1,"377":1,"378":1,"381":1,"382":1,"383":2,"393":1,"434":1,"436":1,"440":1,"442":1,"447":2,"450":1,"454":1,"462":1,"472":1,"508":1}}],["тогдашний",{"2":{"126":1}}],["тогда",{"2":{"3":1,"44":1,"104":1,"114":1,"139":1,"211":1,"290":1,"297":1,"303":1,"325":1,"354":1,"436":1}}],["того",{"2":{"2":1,"7":1,"22":1,"43":1,"63":1,"102":1,"112":1,"116":1,"118":1,"123":1,"130":1,"134":1,"135":1,"136":1,"149":1,"150":1,"157":1,"160":1,"164":1,"169":1,"170":1,"176":1,"194":1,"200":2,"201":1,"204":7,"211":1,"220":1,"223":2,"225":1,"227":1,"228":1,"231":2,"238":1,"241":2,"247":1,"249":2,"255":1,"256":1,"258":2,"260":2,"263":1,"264":1,"266":1,"269":1,"281":1,"285":1,"286":1,"288":1,"292":3,"293":1,"294":1,"296":1,"297":1,"302":1,"303":1,"309":1,"310":1,"313":1,"316":2,"322":1,"330":1,"331":1,"336":5,"341":1,"342":1,"343":5,"344":1,"351":1,"353":1,"358":1,"361":1,"366":1,"367":1,"369":1,"370":1,"372":1,"373":1,"374":1,"379":1,"382":1,"386":1,"387":1,"390":2,"391":1,"396":1,"400":1,"416":1,"421":3,"423":1,"432":2,"434":1,"436":3,"439":1,"440":1,"443":1,"448":1,"454":1,"462":1,"463":1,"465":1,"472":3,"527":1,"534":1}}],["то",{"2":{"3":2,"9":1,"12":2,"17":1,"23":3,"26":2,"30":1,"33":1,"35":3,"40":2,"41":2,"48":1,"59":3,"70":1,"71":1,"76":1,"93":1,"95":1,"97":2,"102":1,"109":1,"115":3,"116":4,"122":2,"123":1,"125":1,"127":1,"134":2,"135":3,"136":2,"137":1,"141":1,"144":2,"147":2,"150":2,"152":3,"153":1,"154":1,"156":2,"158":1,"159":4,"165":1,"167":2,"168":1,"170":1,"173":1,"176":1,"183":2,"186":1,"188":1,"189":1,"194":1,"196":1,"198":1,"200":7,"202":1,"203":2,"204":3,"206":2,"207":1,"212":1,"220":2,"222":1,"223":5,"224":1,"225":1,"226":1,"227":3,"228":1,"230":1,"231":2,"232":1,"237":1,"238":1,"239":2,"243":1,"246":1,"247":1,"249":2,"255":1,"256":1,"263":1,"265":1,"267":4,"268":3,"270":4,"271":1,"280":1,"281":1,"282":1,"284":3,"286":1,"287":2,"294":1,"295":5,"296":3,"297":3,"301":1,"303":1,"306":1,"308":2,"310":1,"313":2,"316":2,"319":1,"322":2,"324":1,"325":5,"330":1,"331":1,"336":3,"344":3,"345":1,"346":1,"351":4,"354":1,"355":1,"356":6,"358":3,"359":1,"360":1,"362":1,"363":1,"365":1,"366":2,"367":1,"372":1,"373":1,"375":4,"376":1,"377":1,"379":2,"382":2,"385":1,"390":2,"402":1,"421":1,"422":1,"423":1,"425":2,"432":1,"433":1,"436":10,"437":3,"441":2,"444":1,"445":2,"449":2,"460":2,"461":4,"462":5,"463":1,"464":2,"466":2,"472":6,"473":4,"507":1,"528":2,"536":1}}],["товару",{"2":{"183":1}}],["товаров",{"0":{"38":1,"107":1},"1":{"108":1,"109":1},"2":{"4":1,"22":1,"30":1,"31":1,"41":1,"47":1,"51":1,"79":2,"82":1,"83":1,"95":1,"102":1,"108":2,"167":1,"423":1}}],["товаре",{"2":{"4":1,"31":1,"51":1,"82":1,"83":1}}],["товары",{"2":{"4":1,"7":1,"16":1,"102":1,"187":2}}],["товар",{"0":{"16":1},"2":{"3":2,"16":2,"102":1,"183":1,"187":2}}],["товарам",{"2":{"47":1,"79":1,"95":1}}],["товарами",{"2":{"3":1,"43":1}}],["товара",{"0":{"102":1},"2":{"3":3,"4":2,"7":1,"16":2,"17":1,"22":1,"30":1,"47":2,"48":1,"83":1,"102":1,"108":1,"109":1,"116":1,"192":1,"423":1,"472":1}}],["мгновений",{"2":{"449":1}}],["мгновенную",{"2":{"391":1}}],["мб",{"2":{"364":2}}],["мучается",{"2":{"468":1}}],["мутировать",{"2":{"265":1}}],["мутный",{"2":{"10":1}}],["мусора",{"2":{"267":1}}],["мусор",{"2":{"212":1}}],["многим",{"2":{"270":1}}],["многих",{"2":{"147":1,"157":1,"166":1,"179":1,"187":1,"218":1,"226":1,"228":1,"265":1,"322":1,"370":1,"436":1,"507":1}}],["многие",{"2":{"125":1,"185":1,"267":1,"310":1,"422":1,"433":1,"464":1,"473":1}}],["многолетним",{"2":{"472":1}}],["многолетние",{"2":{"147":1}}],["многопоточной",{"2":{"463":1}}],["многопоточности",{"2":{"414":1}}],["многопоточность",{"0":{"414":1,"434":1},"1":{"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":1,"444":1,"445":1,"446":1,"447":1,"448":1,"449":1,"450":1,"451":1,"452":1,"453":1,"454":1,"455":1,"456":1},"2":{"268":1,"271":1,"294":1,"300":1,"323":1,"334":1,"364":2,"434":1,"435":1,"455":1}}],["многопоточным",{"2":{"400":1}}],["многоплатформенностью",{"2":{"336":1}}],["многостраничное",{"2":{"336":1}}],["многостраничные",{"2":{"308":1}}],["многословны",{"2":{"363":1}}],["многословным",{"2":{"303":1,"344":1,"390":1}}],["многословно",{"2":{"295":1,"303":1,"353":1}}],["многословность",{"2":{"204":1}}],["многословной",{"2":{"204":1}}],["многословен",{"2":{"204":1,"303":1}}],["многочисленные",{"2":{"278":1}}],["многочисленных",{"2":{"229":1}}],["многого",{"2":{"268":1}}],["многоцелевые",{"2":{"265":1}}],["многом",{"2":{"201":1,"260":1}}],["многократно",{"2":{"200":1,"202":1,"235":1,"241":1,"442":1}}],["много",{"2":{"61":1,"72":1,"93":1,"115":1,"116":1,"117":1,"125":1,"134":1,"227":1,"228":1,"255":1,"263":1,"265":1,"295":1,"358":1,"361":1,"429":1,"433":1,"436":3,"439":1,"449":1,"457":1,"460":1,"463":1,"507":1,"536":1}}],["многое",{"2":{"26":1,"140":1,"200":1,"239":1,"242":1,"257":1,"331":1,"394":1}}],["множественного",{"2":{"460":1}}],["множественность",{"2":{"357":1}}],["множественном",{"2":{"319":1}}],["множестве",{"2":{"313":1}}],["множество",{"2":{"134":1,"142":1,"143":1,"161":1,"167":1,"174":1,"226":1,"237":1,"238":1,"239":1,"252":1,"256":1,"264":1,"272":1,"279":1,"284":1,"317":1,"325":2,"331":2,"333":1,"372":1,"373":1,"376":1,"385":1,"433":2,"440":1,"446":1,"449":1,"463":1,"472":1}}],["множеством",{"2":{"85":1,"137":1,"223":1,"227":1,"324":1,"347":1,"386":1}}],["множества",{"2":{"16":1,"181":1,"263":1}}],["мнению",{"2":{"456":1}}],["мнение",{"2":{"223":1,"497":1}}],["мнения",{"2":{"167":1}}],["мне",{"2":{"22":1,"108":1}}],["мягкое",{"2":{"364":1}}],["мягкие",{"2":{"19":1}}],["мягкая",{"2":{"18":1}}],["м",{"2":{"16":1}}],["мидл",{"2":{"464":1}}],["микрософт",{"2":{"472":1}}],["микросервисов",{"2":{"464":1}}],["микросервиса",{"2":{"463":1}}],["микро",{"2":{"433":1}}],["миксинов",{"2":{"204":1,"250":1}}],["миксины",{"0":{"250":1},"1":{"251":1},"2":{"204":2,"250":1,"460":4}}],["миллисекундах",{"2":{"244":1}}],["миллисекунд",{"2":{"244":1}}],["миллисекунды",{"2":{"223":1,"436":1}}],["миллионами",{"2":{"134":1}}],["миллионов",{"2":{"48":1,"72":1}}],["мир",{"2":{"471":1}}],["мира",{"2":{"394":1}}],["миру",{"2":{"385":1,"472":1}}],["миров",{"2":{"336":1}}],["миром",{"2":{"3":1,"34":1}}],["мире",{"2":{"125":1,"202":1,"297":1,"386":1,"402":1}}],["миграции",{"2":{"119":2,"125":1,"204":1,"363":1,"418":1}}],["миграция",{"0":{"119":1,"418":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1},"2":{"204":1}}],["минут",{"2":{"473":1,"508":1}}],["минуточку",{"2":{"436":1}}],["минуты",{"2":{"244":1}}],["минуя",{"2":{"200":1}}],["минусы",{"2":{"471":2}}],["минусов",{"2":{"462":1}}],["минус",{"2":{"105":1,"462":1}}],["минисервере",{"2":{"433":1}}],["мини",{"2":{"433":2,"446":1}}],["миниатюр",{"2":{"167":1}}],["миниатюре",{"2":{"115":1}}],["минималистичным",{"2":{"507":1}}],["минимален",{"2":{"171":1}}],["минимальную",{"2":{"231":1,"504":1}}],["минимальным",{"2":{"356":1}}],["минимальны",{"2":{"224":1}}],["минимальный",{"2":{"170":1,"338":1}}],["минимальной",{"2":{"47":1,"288":1}}],["минимальна",{"2":{"22":1}}],["минимуму",{"2":{"157":1}}],["минимум",{"2":{"12":1,"265":1,"295":1,"313":1,"329":1,"336":1,"339":1,"341":1,"402":2,"433":1,"440":1,"449":1,"462":1,"470":1,"473":2}}],["мае",{"2":{"473":1}}],["маяк",{"2":{"346":1}}],["манифест",{"2":{"348":1,"472":3}}],["манифестом",{"2":{"345":1}}],["манифесте",{"2":{"343":1}}],["манифеста",{"0":{"338":1,"342":1},"1":{"339":1,"340":1,"341":1},"2":{"334":1,"336":2,"338":2,"341":2,"342":2,"344":1,"345":2,"542":1,"554":1}}],["манипулирование",{"2":{"197":1}}],["манипулирования",{"2":{"191":1,"199":1,"208":1}}],["манипулироваться",{"2":{"351":1}}],["манипулировать",{"2":{"185":1,"351":2,"381":1}}],["манипулятивный",{"2":{"194":1}}],["манипулятивных",{"2":{"184":1}}],["манипулятивная",{"2":{"194":1}}],["манипуляций",{"2":{"171":1}}],["манипуляции",{"2":{"116":1,"351":1}}],["манере",{"2":{"218":1}}],["магические",{"2":{"460":1}}],["магия",{"2":{"210":1}}],["магию",{"2":{"203":1,"227":1,"376":1}}],["магазине",{"2":{"472":1}}],["магазины",{"2":{"22":1,"27":1,"79":1,"109":1,"336":2}}],["магазином",{"2":{"22":1}}],["магазинов",{"2":{"21":1,"28":1,"79":1,"109":1,"336":1}}],["магазинах",{"2":{"97":1,"338":1}}],["магазинами",{"2":{"105":1}}],["магазинам",{"2":{"22":1}}],["магазина",{"2":{"14":1,"22":1,"39":2,"78":1,"167":1,"183":1,"336":1,"423":1}}],["магазин",{"0":{"12":1},"2":{"9":1,"12":1,"22":2,"43":1,"70":1,"72":1,"116":1,"506":1,"507":1,"508":1}}],["машине",{"2":{"223":1,"294":1,"473":1}}],["машин",{"2":{"199":1}}],["машиной",{"2":{"137":1}}],["машина",{"2":{"137":1,"158":1}}],["машины",{"2":{"137":1,"256":1,"433":1}}],["максимальная",{"2":{"548":1}}],["максимальную",{"0":{"402":1},"2":{"231":1,"402":1}}],["максимального",{"2":{"370":1}}],["максимально",{"2":{"197":1,"260":1,"334":1,"471":1,"472":1,"512":1}}],["максимум",{"2":{"183":1,"227":1}}],["максимизации",{"2":{"156":1}}],["макрос",{"2":{"124":1}}],["макросами",{"2":{"124":1}}],["макете",{"2":{"542":2}}],["макетов",{"0":{"238":1},"2":{"317":1}}],["макетом",{"2":{"230":1,"238":1}}],["макетами",{"2":{"425":1}}],["макета",{"2":{"231":1,"249":1,"315":1,"506":1}}],["макеты",{"2":{"154":1,"319":1,"343":1,"508":1}}],["макет",{"0":{"27":1},"1":{"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1},"2":{"27":1,"152":1,"181":1,"237":1,"238":2,"542":1,"546":1}}],["материал",{"2":{"109":1}}],["материалах",{"2":{"498":1}}],["материала",{"2":{"74":1,"289":1,"495":1}}],["масштабируемых",{"2":{"463":1}}],["масштабируемой",{"2":{"455":1}}],["масштабирования",{"2":{"200":1,"434":1}}],["масштаб",{"2":{"436":1}}],["масштабе",{"2":{"294":1,"440":1}}],["масштабах",{"2":{"208":1}}],["массовых",{"2":{"446":1}}],["массовый",{"2":{"391":1}}],["массовой",{"2":{"196":1,"394":1}}],["массу",{"2":{"227":1}}],["массиву",{"2":{"292":1,"381":1,"444":1}}],["массива",{"2":{"231":2,"245":1,"317":1,"381":1,"460":3,"463":1,"473":1}}],["массивам",{"2":{"123":2}}],["массиве",{"2":{"209":1,"231":1,"245":1,"381":1}}],["массивы",{"2":{"124":1,"210":1,"245":1,"247":1,"351":1,"437":1,"536":1}}],["массивов",{"2":{"123":1}}],["массив",{"2":{"41":1,"231":5,"245":3,"246":1,"256":1,"292":2,"293":1,"313":1,"318":1,"331":1,"339":1,"341":3,"381":3,"444":2,"448":1,"450":1,"460":3,"463":1}}],["мастере",{"2":{"375":1}}],["мастер",{"2":{"144":1,"453":1}}],["мастером",{"2":{"71":1}}],["маске",{"2":{"430":1}}],["маскируемый",{"2":{"345":1}}],["маскирует",{"2":{"190":1,"193":1}}],["маскируются",{"2":{"195":1}}],["маскировка",{"2":{"195":1}}],["маскироваться",{"2":{"195":1}}],["маску",{"2":{"134":1}}],["маска",{"2":{"117":2}}],["малая",{"2":{"372":1}}],["маленьких",{"2":{"202":1,"263":1}}],["маленький",{"2":{"116":1,"165":2}}],["маленьком",{"2":{"319":1}}],["маленькой",{"2":{"187":1}}],["маленького",{"2":{"165":1,"429":1}}],["маленькая",{"2":{"22":1,"165":1}}],["маломощных",{"2":{"436":1}}],["малого",{"2":{"200":2}}],["мало",{"2":{"38":1,"232":1,"316":1,"318":1,"344":1}}],["маркерами",{"2":{"393":1}}],["маркером",{"2":{"328":1}}],["маркетинговые",{"2":{"150":1}}],["маркетинг",{"2":{"149":1}}],["маркетплейсом",{"2":{"22":1,"76":1}}],["маркетплейсов",{"2":{"21":1}}],["маркетплейс",{"0":{"13":1,"69":1},"1":{"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"9":1,"22":2,"70":1,"79":1}}],["маркетплейса",{"2":{"4":1,"12":1,"22":2,"43":1,"70":1,"78":1,"79":1}}],["маршруте",{"2":{"313":2,"319":3}}],["маршруту",{"2":{"310":1,"313":1,"318":2,"329":1,"333":1}}],["маршрутов",{"0":{"312":1,"318":1},"1":{"313":1,"314":1},"2":{"244":1,"311":1,"315":1,"317":2,"318":1,"319":2,"322":2,"324":1,"325":1}}],["маршрут",{"2":{"136":1,"311":1,"313":5,"316":1,"318":1,"329":1,"330":2}}],["маршрутизации",{"2":{"136":1,"294":1,"306":1}}],["маршрутизацию",{"2":{"11":1}}],["маршрутизатору",{"2":{"319":1}}],["маршрутизатором",{"2":{"127":1,"318":1,"319":1}}],["маршрутизатора",{"0":{"315":1},"2":{"127":1,"306":1,"309":4,"310":1,"316":1,"332":1,"333":1}}],["маршрутизатор",{"2":{"127":1,"308":1,"310":3,"313":1,"314":1,"316":1,"317":1,"318":1,"319":1,"327":1,"411":1}}],["маршрутизаторе",{"2":{"119":1,"127":2,"137":1}}],["маршруты",{"0":{"317":1},"1":{"318":1,"319":1},"2":{"97":1,"309":2,"310":3,"312":1,"313":3,"317":2,"318":2,"322":1,"344":1,"547":1}}],["маршрутам",{"2":{"315":1,"316":1,"319":1,"324":1}}],["маршрутами",{"2":{"136":1,"310":1,"313":1,"322":1}}],["маршрута",{"2":{"7":1,"313":1,"315":1,"316":3,"319":4,"322":3}}],["мыслить",{"2":{"464":1}}],["мыслит",{"2":{"260":1}}],["мышку",{"2":{"433":1}}],["мышление",{"2":{"372":1}}],["мышления",{"2":{"200":1}}],["мыши",{"2":{"164":1,"178":1,"179":1,"211":1,"250":1,"256":2,"341":1}}],["мышью",{"2":{"156":1,"170":1}}],["мышь",{"2":{"152":1,"156":1,"436":1}}],["мы",{"2":{"6":1,"9":1,"12":3,"13":1,"17":2,"18":1,"22":4,"23":2,"36":2,"40":1,"41":4,"48":1,"56":2,"59":1,"86":2,"91":1,"95":1,"97":1,"103":1,"105":1,"120":2,"121":3,"122":1,"124":2,"131":2,"133":2,"134":5,"135":4,"136":3,"137":7,"139":1,"140":2,"141":8,"143":3,"144":1,"145":5,"146":1,"147":2,"150":2,"152":1,"153":2,"154":2,"157":1,"159":1,"169":1,"170":1,"171":10,"175":1,"181":1,"182":1,"183":2,"197":3,"199":3,"200":2,"201":10,"202":4,"203":13,"204":14,"205":1,"206":1,"210":3,"211":8,"212":3,"213":1,"218":1,"219":3,"221":5,"222":4,"223":7,"224":10,"225":4,"226":2,"227":12,"228":8,"229":4,"230":11,"231":22,"232":10,"233":4,"235":7,"237":4,"238":4,"239":4,"241":6,"242":2,"243":3,"244":6,"245":1,"246":7,"247":8,"248":1,"249":11,"250":10,"251":5,"252":3,"254":1,"255":19,"256":18,"257":4,"258":8,"259":3,"260":1,"263":4,"264":1,"266":1,"267":4,"268":2,"271":3,"272":1,"281":5,"282":1,"283":1,"286":1,"287":7,"288":6,"289":2,"290":1,"292":8,"294":3,"295":2,"296":15,"297":5,"298":4,"299":5,"300":6,"301":2,"302":6,"303":11,"304":5,"306":5,"308":9,"309":1,"310":4,"311":9,"313":15,"315":2,"316":20,"317":5,"318":3,"319":11,"322":4,"323":4,"324":7,"325":4,"326":5,"327":3,"328":8,"329":6,"330":2,"331":8,"332":4,"333":1,"334":3,"336":1,"337":1,"338":4,"342":3,"343":8,"344":13,"345":6,"347":3,"349":7,"350":1,"351":4,"352":3,"353":8,"354":4,"355":1,"356":7,"357":3,"358":7,"359":3,"360":4,"361":8,"362":1,"363":5,"364":8,"365":6,"366":10,"367":5,"368":4,"369":1,"370":2,"372":2,"373":3,"374":3,"375":7,"376":10,"377":1,"378":5,"379":1,"380":10,"381":21,"382":3,"383":5,"384":1,"385":2,"387":1,"390":1,"391":5,"393":3,"394":2,"396":2,"409":1,"415":1,"421":2,"434":8,"435":1,"436":4,"437":1,"438":3,"439":6,"440":5,"441":4,"442":6,"443":7,"444":7,"445":2,"446":2,"447":6,"448":8,"449":3,"450":6,"451":1,"452":7,"453":1,"454":13,"455":4,"464":5}}],["молчаливая",{"2":{"501":1}}],["морган",{"2":{"473":1}}],["морскими",{"2":{"269":1}}],["мотивации",{"2":{"473":1}}],["мощь",{"2":{"462":1,"464":1}}],["мощную",{"2":{"364":1}}],["мощного",{"0":{"359":1},"1":{"360":1,"361":1,"362":1,"363":1},"2":{"349":1}}],["мощной",{"2":{"222":1}}],["мощности",{"2":{"199":1,"248":1,"308":1,"334":1,"434":1,"445":1}}],["мощность",{"2":{"137":1,"331":1}}],["мощная",{"2":{"200":1,"446":1}}],["мощный",{"2":{"248":1}}],["мощные",{"2":{"246":1,"336":1}}],["мощных",{"2":{"199":1}}],["мощным",{"2":{"178":1,"302":1}}],["мощными",{"2":{"143":1,"425":1}}],["мой",{"2":{"271":1}}],["моем",{"2":{"432":1}}],["моему",{"2":{"265":1,"272":1,"436":1}}],["мое",{"2":{"223":1}}],["моей",{"2":{"22":1}}],["мошенническими",{"2":{"187":1}}],["могла",{"2":{"447":1}}],["могло",{"2":{"437":1}}],["могли",{"2":{"232":1,"235":1,"255":1,"257":1,"287":2,"296":1,"308":1,"310":1,"311":1,"323":1,"330":1,"353":1,"365":2,"366":1,"381":1,"454":1}}],["могущие",{"2":{"497":1}}],["могу",{"2":{"322":1}}],["могут",{"2":{"17":1,"47":1,"117":2,"128":1,"134":1,"154":1,"163":1,"166":1,"167":3,"168":1,"172":1,"185":1,"199":1,"200":2,"204":1,"208":1,"212":1,"222":1,"224":1,"225":1,"228":1,"238":2,"239":1,"241":1,"245":2,"247":1,"258":1,"259":1,"261":2,"289":1,"293":1,"297":1,"304":1,"308":1,"313":1,"318":1,"322":1,"325":2,"330":1,"331":1,"332":1,"334":1,"336":4,"338":1,"347":1,"354":2,"360":1,"364":2,"365":1,"370":1,"372":1,"373":1,"400":1,"402":1,"423":1,"425":1,"429":1,"433":1,"436":3,"438":1,"441":1,"456":2,"463":2,"465":1,"473":2,"508":1}}],["мог",{"2":{"158":1,"203":1,"308":1,"317":1,"331":1,"359":1,"472":1,"507":1}}],["мои",{"2":{"118":1}}],["монитора",{"2":{"433":1}}],["монитор",{"2":{"433":1}}],["мониторинг",{"2":{"189":1}}],["мониторингом",{"2":{"116":1}}],["монолитных",{"2":{"265":1}}],["монополистом",{"2":{"50":1}}],["монтируется",{"2":{"267":1}}],["монтируем",{"2":{"120":1,"243":1}}],["монтирования",{"2":{"121":1,"267":1,"316":1,"381":1}}],["монетизация",{"2":{"73":1}}],["мобильную",{"2":{"343":1}}],["мобильный",{"2":{"330":1}}],["мобильных",{"2":{"173":3,"176":1,"181":1,"226":1,"308":1,"325":1,"334":1,"336":1,"339":1,"340":1,"343":2,"515":1}}],["мобильные",{"2":{"149":1,"329":1,"331":1,"336":1}}],["мобильного",{"2":{"181":1}}],["мобильном",{"2":{"85":1,"95":1,"108":1,"181":1,"338":1}}],["мобильное",{"0":{"84":1},"1":{"85":1,"86":1,"87":1},"2":{"472":1}}],["мобильной",{"2":{"29":1,"30":1,"33":2,"35":1}}],["мобильная",{"0":{"33":1},"2":{"343":1}}],["модернизируем",{"2":{"336":1}}],["моделям",{"2":{"347":1,"468":1}}],["модели",{"2":{"162":1,"181":1,"200":1,"232":1,"246":1,"316":1,"358":1,"436":1}}],["моделей",{"2":{"124":1,"218":1,"246":1,"363":1}}],["моделью",{"2":{"124":2}}],["модель",{"0":{"15":1,"42":1},"1":{"16":1,"17":1,"18":1,"19":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1},"2":{"39":2,"200":2,"316":1,"442":2,"446":1,"462":2,"463":1,"471":1}}],["модал",{"2":{"255":2,"256":1}}],["модала",{"2":{"255":4}}],["модалы",{"2":{"240":1}}],["модалов",{"0":{"252":1},"1":{"253":1,"254":1,"255":1},"2":{"239":1}}],["модальное",{"2":{"254":1,"504":1}}],["модального",{"2":{"254":4,"255":3}}],["модальной",{"2":{"241":1}}],["модальном",{"2":{"176":1}}],["модальных",{"2":{"175":1,"239":1,"240":1,"241":1,"247":1,"258":1}}],["модальный",{"2":{"175":1,"240":1,"241":2,"254":2,"255":6}}],["модальные",{"0":{"175":1},"2":{"175":1,"238":1,"241":1,"252":1,"256":1,"311":1}}],["модифицировали",{"2":{"316":1}}],["модифицировать",{"2":{"63":1,"140":1,"315":1,"356":1}}],["модифицирует",{"2":{"240":1,"298":1}}],["модифицируем",{"2":{"223":1,"226":1,"231":1,"309":1}}],["модификаций",{"2":{"302":1,"311":1}}],["модификация",{"2":{"221":1,"316":1}}],["модификации",{"0":{"224":1},"2":{"135":1,"207":1,"310":1,"358":1}}],["модификатор",{"2":{"203":1,"246":1}}],["модули",{"2":{"256":1,"265":1,"280":2,"300":1,"423":1,"462":2,"464":1,"467":1}}],["модулях",{"2":{"363":1}}],["модуля",{"2":{"96":1,"358":1,"462":1,"512":1,"542":1,"545":1}}],["модуле",{"2":{"95":1,"97":1,"225":1,"312":1,"366":1,"423":1,"462":1,"463":1}}],["модулей",{"2":{"5":1,"89":1,"266":1}}],["модульная",{"2":{"423":1}}],["модульными",{"2":{"200":1}}],["модульности",{"2":{"127":1}}],["модульной",{"2":{"95":1}}],["модуль",{"0":{"510":1},"1":{"511":1,"512":1},"2":{"4":2,"41":1,"114":2,"138":1,"203":1,"250":1,"252":1,"268":2,"280":2,"289":1,"359":1,"363":1,"423":6,"464":1,"506":2,"508":2,"542":1}}],["моменты",{"2":{"473":1,"497":1}}],["моментов",{"2":{"461":1}}],["моментом",{"2":{"137":1,"256":1,"351":1,"507":1}}],["моментами",{"2":{"324":1}}],["момента",{"2":{"231":1,"328":1,"436":1}}],["момент",{"2":{"9":1,"16":1,"36":1,"43":1,"56":1,"123":1,"134":1,"171":1,"212":1,"224":1,"228":1,"251":1,"255":1,"256":1,"262":1,"286":1,"287":1,"316":1,"336":1,"343":1,"379":1,"390":1,"460":1,"472":1,"514":1,"520":1,"542":1,"549":1}}],["можем",{"2":{"22":1,"23":2,"36":1,"121":1,"124":1,"134":1,"135":1,"136":1,"141":1,"143":1,"145":1,"146":1,"157":1,"171":1,"201":1,"203":5,"204":3,"205":1,"210":1,"211":2,"212":1,"224":3,"225":1,"227":4,"228":3,"230":1,"231":2,"232":2,"237":3,"238":1,"241":2,"243":2,"244":2,"246":2,"247":3,"250":1,"255":2,"256":2,"257":1,"259":2,"263":1,"288":1,"289":1,"296":1,"297":1,"298":1,"302":3,"309":1,"311":3,"313":5,"315":1,"316":2,"317":1,"318":1,"319":3,"326":1,"327":1,"328":1,"329":1,"331":1,"343":2,"344":3,"345":1,"351":3,"354":1,"357":2,"358":3,"364":2,"366":1,"367":2,"369":1,"373":1,"375":2,"376":3,"378":1,"380":1,"381":3,"382":3,"383":1,"384":1,"436":1,"439":4,"440":2,"447":1,"450":1,"454":4}}],["можете",{"2":{"123":2,"125":1,"134":2,"143":1,"154":1,"162":1,"175":1,"181":1,"198":1,"200":5,"202":1,"204":2,"213":1,"218":2,"220":2,"223":1,"224":3,"225":1,"234":1,"271":1,"280":1,"286":1,"295":2,"302":1,"305":2,"311":1,"316":1,"323":1,"336":3,"342":1,"364":1,"376":1,"386":1,"390":1,"391":2,"392":1,"394":1,"395":1,"424":2,"429":1,"436":2,"445":1,"447":1,"495":1}}],["может",{"2":{"2":2,"3":1,"4":1,"14":1,"16":1,"17":1,"18":1,"26":1,"43":1,"44":1,"61":1,"62":1,"63":1,"96":1,"98":1,"105":2,"109":1,"115":2,"116":2,"117":1,"118":1,"119":1,"123":2,"124":2,"125":1,"134":2,"137":1,"140":1,"147":1,"149":1,"157":1,"158":1,"162":1,"163":2,"164":2,"165":1,"166":1,"167":1,"168":4,"170":4,"177":1,"178":3,"179":2,"186":1,"190":2,"194":2,"195":2,"196":1,"198":1,"199":1,"200":4,"202":1,"203":3,"204":3,"207":1,"212":2,"223":3,"224":1,"228":1,"229":1,"232":1,"235":1,"238":2,"239":1,"241":3,"244":3,"247":1,"249":3,"251":2,"252":2,"256":2,"263":1,"264":1,"265":1,"267":2,"268":1,"269":1,"276":1,"277":1,"281":2,"288":1,"291":1,"294":2,"295":4,"297":3,"302":1,"303":2,"317":1,"324":1,"325":2,"330":1,"331":3,"334":1,"335":1,"336":3,"338":2,"342":1,"343":7,"344":1,"349":1,"351":1,"353":1,"354":2,"357":1,"358":1,"360":1,"361":1,"364":7,"366":1,"370":1,"372":4,"375":3,"381":2,"383":2,"388":1,"393":2,"394":1,"395":1,"402":1,"421":1,"425":4,"429":1,"432":1,"433":1,"436":9,"437":3,"440":1,"441":2,"444":1,"446":1,"452":2,"460":1,"461":1,"462":6,"463":3,"465":1,"471":3,"472":6,"473":1,"501":1,"507":2,"511":1,"534":1,"548":1,"556":1}}],["можно",{"2":{"3":1,"4":1,"9":1,"10":1,"12":1,"16":2,"22":1,"25":1,"26":1,"27":1,"29":2,"35":1,"36":1,"40":4,"43":1,"44":1,"53":1,"56":1,"59":1,"61":1,"72":2,"73":1,"82":1,"85":1,"86":1,"89":1,"91":1,"98":1,"102":1,"104":2,"105":1,"108":1,"109":1,"114":1,"115":2,"116":4,"118":1,"124":1,"127":1,"129":1,"132":1,"134":4,"140":1,"142":1,"143":1,"144":2,"148":1,"149":1,"152":1,"153":1,"156":1,"157":1,"158":1,"161":1,"162":1,"167":1,"168":1,"176":1,"178":2,"179":1,"181":1,"185":1,"195":1,"200":2,"201":1,"202":3,"211":1,"212":3,"218":1,"222":5,"225":4,"226":2,"227":3,"228":3,"232":1,"233":1,"235":1,"236":1,"244":1,"246":3,"248":1,"249":3,"251":1,"254":1,"255":1,"256":2,"257":1,"263":2,"265":3,"268":1,"271":2,"284":1,"288":1,"292":1,"294":1,"295":1,"297":3,"300":1,"302":2,"303":2,"305":1,"307":1,"308":1,"316":3,"317":1,"319":3,"322":4,"323":1,"325":4,"327":1,"329":1,"330":2,"331":1,"332":1,"333":2,"336":1,"343":1,"344":2,"345":1,"347":1,"348":1,"353":1,"359":1,"361":1,"362":1,"363":1,"364":3,"367":1,"369":1,"370":2,"371":1,"372":3,"373":1,"374":1,"375":1,"376":3,"379":2,"380":1,"381":1,"383":1,"384":1,"388":2,"389":1,"390":3,"394":1,"395":2,"404":1,"405":1,"422":3,"423":1,"425":2,"429":1,"433":2,"434":2,"436":2,"437":1,"438":1,"439":1,"440":2,"441":1,"442":1,"445":1,"446":2,"447":1,"449":2,"456":1,"460":2,"462":3,"463":3,"464":2,"471":1,"472":3,"473":5,"501":1,"504":1,"509":1,"514":1,"520":1,"536":1,"549":1,"555":1}}],["механической",{"2":{"473":1}}],["механизмы",{"2":{"462":1}}],["механизм",{"2":{"357":1}}],["медленней",{"2":{"462":1}}],["медиазапросов",{"2":{"181":1}}],["медиазапросами",{"2":{"181":1}}],["межпроцессное",{"2":{"449":1}}],["межпроцессного",{"2":{"437":1}}],["межпроцессные",{"2":{"303":1}}],["межстрочные",{"2":{"270":1}}],["между",{"0":{"104":1,"151":1},"2":{"3":1,"17":1,"22":1,"34":1,"43":2,"62":2,"63":1,"104":1,"117":1,"119":1,"123":1,"144":1,"147":1,"149":1,"156":1,"167":1,"170":1,"176":1,"199":3,"200":3,"203":1,"204":2,"220":1,"224":1,"231":2,"237":1,"238":1,"243":1,"246":1,"247":1,"249":1,"250":2,"252":1,"256":1,"268":1,"271":1,"274":1,"275":1,"289":1,"291":1,"294":1,"295":1,"296":1,"297":1,"300":1,"305":2,"309":1,"313":1,"316":1,"324":1,"325":3,"330":1,"332":1,"336":1,"348":1,"349":1,"350":1,"351":1,"359":1,"360":1,"363":1,"368":1,"369":2,"384":1,"386":1,"417":1,"425":2,"433":1,"436":2,"440":2,"441":2,"449":1,"462":2,"472":1,"473":2}}],["мелких",{"2":{"269":1,"462":1}}],["мелкие",{"2":{"157":1,"263":1}}],["мельчайшей",{"2":{"263":1}}],["мечом",{"2":{"194":1}}],["мегабайт",{"2":{"537":1}}],["мега",{"2":{"178":4}}],["мегаменю",{"0":{"178":1},"2":{"29":1,"178":2,"179":1}}],["мета",{"2":{"542":1,"552":1}}],["метасервисы",{"2":{"328":1}}],["метрике",{"2":{"472":1}}],["метрики",{"2":{"472":1}}],["метку",{"2":{"351":1}}],["метка",{"2":{"325":1}}],["метки",{"0":{"165":1},"2":{"393":1}}],["методом",{"2":{"330":1,"472":1}}],["методологии",{"2":{"308":1,"309":1}}],["методов",{"2":{"14":1,"287":1,"289":1,"318":1,"319":1,"322":2,"325":1,"330":1,"354":1,"360":1,"363":1,"376":3,"444":1,"460":1}}],["методу",{"2":{"303":1}}],["методе",{"2":{"204":1,"281":1,"313":1,"454":1}}],["метод",{"0":{"280":1,"281":1},"2":{"116":1,"123":1,"181":3,"201":3,"204":1,"243":2,"247":1,"252":1,"255":2,"256":1,"265":1,"281":3,"287":2,"290":2,"292":3,"294":1,"303":3,"313":1,"320":1,"322":1,"325":2,"330":3,"343":2,"381":2,"438":1,"443":3,"448":1,"449":1,"451":1,"454":1,"501":1}}],["методы",{"0":{"217":1},"2":{"79":1,"117":1,"121":1,"123":1,"199":1,"201":1,"202":1,"247":1,"252":1,"255":1,"266":1,"267":1,"281":1,"292":1,"295":1,"303":1,"306":1,"313":1,"322":1,"323":2,"356":1,"359":1,"361":2,"363":1,"364":1,"368":1,"369":1,"381":2,"443":2,"449":2,"450":1,"454":2,"455":1,"462":1}}],["методах",{"2":{"364":1}}],["методами",{"2":{"303":1,"330":1,"462":1,"473":1}}],["методам",{"2":{"204":1,"323":1,"380":1,"450":1}}],["метода",{"2":{"3":1,"255":1,"279":1,"292":1,"297":1,"313":1,"330":1,"366":1,"368":1,"438":1,"448":1,"449":2,"450":2,"452":1,"454":2,"472":1}}],["месяцев",{"2":{"144":1}}],["месяца",{"2":{"144":1}}],["места",{"2":{"339":1,"356":1,"364":2,"391":1,"402":1,"460":1}}],["местах",{"2":{"157":1,"366":1}}],["местным",{"2":{"324":1}}],["мест",{"2":{"105":1,"472":1}}],["месте",{"2":{"91":1,"105":1,"203":1,"228":1,"268":1,"289":1,"316":1,"343":1,"353":1,"395":1,"449":1,"463":1}}],["местом",{"2":{"178":1,"183":1,"311":1}}],["местоположение",{"2":{"170":1}}],["место",{"2":{"86":1,"126":1,"178":1,"199":1,"212":1,"224":1,"235":1,"315":1,"364":2,"463":1}}],["мешает",{"2":{"112":1}}],["мер",{"2":{"372":1,"454":1}}],["меры",{"2":{"116":1,"158":1,"327":1}}],["меру",{"2":{"23":1}}],["мере",{"2":{"12":2,"133":1,"170":1,"176":1,"199":2,"202":1,"204":2,"211":1,"219":1,"221":2,"232":1,"238":1,"244":1,"266":1,"284":1,"288":1,"296":1,"301":1,"304":1,"308":1,"325":1,"336":1,"341":1,"370":1,"402":1,"436":1,"442":1}}],["ментор",{"2":{"473":2}}],["менталитета",{"2":{"130":1}}],["меньших",{"2":{"336":1}}],["меньшим",{"2":{"308":1,"331":1}}],["меньший",{"2":{"204":1,"463":1}}],["меньшего",{"2":{"244":1}}],["меньше",{"2":{"167":1,"270":1,"436":1,"463":1,"540":1}}],["менеджера",{"2":{"388":1,"421":1}}],["менеджер",{"2":{"116":3,"223":1,"365":1,"375":1}}],["менее",{"2":{"2":1,"152":1,"230":1,"296":1,"300":1,"301":1,"303":1,"319":1,"333":1,"363":1,"364":1,"372":1,"454":1,"472":1,"507":1}}],["меня",{"2":{"462":1}}],["меняющими",{"2":{"208":1}}],["меняются",{"2":{"209":1,"221":1,"460":1}}],["меняют",{"2":{"200":1}}],["меняете",{"2":{"462":1}}],["меняет",{"2":{"204":1}}],["меняется",{"2":{"114":1,"316":1,"319":1,"450":1}}],["меняем",{"2":{"139":1,"464":1}}],["меняя",{"2":{"17":1,"86":1,"508":1}}],["меняться",{"2":{"313":1,"370":1,"460":1}}],["менять",{"2":{"17":1,"41":1,"105":1,"330":1,"429":1,"545":1}}],["меню",{"0":{"84":1,"173":1,"176":1,"177":1,"179":1},"1":{"85":1,"86":1,"87":1},"2":{"3":2,"4":1,"29":1,"30":1,"33":1,"85":1,"95":1,"98":2,"150":1,"151":1,"152":2,"153":1,"158":1,"164":5,"170":1,"173":4,"174":1,"176":7,"177":3,"178":8,"179":3,"181":2,"183":2,"223":1,"238":1,"249":2,"310":1,"316":1,"341":2,"342":1,"343":3,"346":2,"423":1,"425":2,"527":1,"542":1}}],["ах",{"2":{"460":1}}],["ами",{"2":{"443":1}}],["аута",{"2":{"443":1}}],["аутентифицирует",{"2":{"330":1}}],["аутентифицирующему",{"2":{"325":1}}],["аутентификаторы",{"2":{"329":1}}],["аутентификацией",{"2":{"116":1}}],["аутентификацию",{"2":{"115":1,"325":2,"326":1}}],["аутентификация",{"0":{"116":1,"324":1,"325":1,"329":2,"330":1,"331":1},"2":{"79":1,"116":5,"323":1,"324":1,"327":2,"329":2,"330":1}}],["аутентификации",{"0":{"323":1},"1":{"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1},"2":{"59":1,"116":1,"306":2,"313":1,"322":1,"323":1,"324":4,"325":5,"326":4,"327":2,"328":1,"330":5,"331":1,"332":2,"333":2,"424":3,"450":2,"462":1,"496":2,"545":1}}],["аутентификаций",{"2":{"40":1}}],["аудио",{"2":{"429":1}}],["апгрейд",{"2":{"472":1}}],["апдейта",{"2":{"421":1}}],["апплеты",{"2":{"199":1}}],["аппаратное",{"2":{"336":1,"402":1}}],["аппаратного",{"2":{"301":1}}],["аппаратному",{"2":{"137":1,"402":1}}],["аппаратных",{"2":{"455":1}}],["аппаратные",{"2":{"149":1}}],["аппаратным",{"2":{"149":1}}],["аппарате",{"2":{"62":1}}],["азы",{"2":{"200":1}}],["аварийно",{"2":{"364":1}}],["авиабилетов",{"2":{"191":1}}],["авиабилеты",{"2":{"187":1}}],["автошколе",{"2":{"473":1}}],["автономным",{"2":{"400":1}}],["автономной",{"2":{"344":1}}],["автономности",{"2":{"343":1}}],["автономное",{"2":{"334":1,"336":1}}],["автономного",{"2":{"201":1,"336":2,"343":1}}],["автозаполнения",{"2":{"363":1}}],["автор",{"2":{"398":1}}],["авторство",{"2":{"268":1}}],["авторизации",{"2":{"325":2}}],["авторизационный",{"2":{"116":1}}],["авторизация",{"0":{"116":1},"2":{"79":1,"116":4}}],["автоматы",{"2":{"256":1}}],["автомат",{"2":{"256":2}}],["автоматического",{"2":{"144":1,"200":1,"345":1,"421":1,"455":1}}],["автоматические",{"2":{"395":1}}],["автоматически",{"2":{"53":1,"112":2,"134":1,"187":1,"199":1,"204":1,"223":1,"224":1,"227":1,"231":1,"244":2,"295":1,"296":1,"297":1,"309":1,"313":1,"316":2,"319":1,"322":2,"331":1,"343":2,"363":1,"367":1,"376":1,"379":1,"421":1,"448":2,"463":1,"527":1}}],["автоматизацией",{"2":{"473":1}}],["автоматизацию",{"2":{"224":1}}],["автоматизации",{"2":{"65":1,"334":1,"419":1,"421":2}}],["автоматизированный",{"2":{"395":1}}],["автоматизированными",{"2":{"383":1}}],["автоматизированных",{"2":{"372":1,"396":1}}],["автоматизированное",{"2":{"372":1,"397":1}}],["автоматизировано",{"2":{"372":1}}],["автоматизировать",{"2":{"143":1}}],["автоматизирует",{"2":{"144":1}}],["автообновление",{"2":{"144":1}}],["автокомплита",{"2":{"89":1}}],["автокомплит",{"0":{"89":1},"2":{"89":1}}],["ассоциируют",{"2":{"394":1}}],["ассоциируются",{"2":{"149":1}}],["асинхронная",{"2":{"302":1,"436":1}}],["асинхронную",{"2":{"268":1,"301":1,"302":1,"378":1,"436":1,"511":1}}],["асинхронно",{"2":{"364":1}}],["асинхронное",{"2":{"305":1}}],["асинхронном",{"2":{"303":1}}],["асинхронного",{"2":{"244":1,"293":1,"323":1,"370":1,"436":1}}],["асинхронной",{"2":{"166":1,"301":1,"302":1,"448":1}}],["асинхронным",{"2":{"303":1,"358":1}}],["асинхронными",{"2":{"276":1,"303":1,"436":1,"449":1}}],["асинхронных",{"2":{"300":1,"301":2,"302":1,"323":1,"425":1}}],["асинхронный",{"0":{"244":1,"378":1},"2":{"378":1,"436":1}}],["асинхронные",{"0":{"276":1},"2":{"212":1,"301":2,"308":1,"373":1,"436":1}}],["аспекте",{"2":{"461":1,"463":1}}],["аспекты",{"2":{"149":1,"407":1}}],["аспект",{"2":{"74":1,"150":1}}],["аспиранты",{"2":{"74":1}}],["абзаца",{"2":{"154":1,"164":1,"186":1}}],["абзацев",{"2":{"154":1}}],["абы",{"2":{"118":1}}],["абсолютно",{"2":{"473":2}}],["абсолютном",{"2":{"115":1}}],["абсолютный",{"2":{"141":1}}],["абстрагированный",{"2":{"271":1}}],["абстрагирование",{"2":{"114":1,"268":1}}],["абстрагировать",{"2":{"268":1}}],["абстракции",{"2":{"260":1,"282":1}}],["абстракция",{"0":{"3":1,"113":1},"1":{"114":1},"2":{"263":1,"511":1}}],["абстрактный",{"2":{"542":1}}],["абстрактны",{"2":{"219":1}}],["абстрактное",{"2":{"218":1}}],["анонсы",{"2":{"498":1}}],["аномалией",{"2":{"385":1}}],["антипаттерн",{"2":{"351":1}}],["антипаттерны",{"2":{"271":1}}],["антипаттерном",{"2":{"271":1,"425":1}}],["анимационный",{"2":{"425":1}}],["анимация",{"2":{"250":1}}],["анимацию",{"2":{"199":1,"472":1}}],["анимации",{"2":{"149":1,"212":3,"309":1}}],["английского",{"2":{"473":1}}],["английском",{"2":{"403":1,"473":2}}],["англ",{"2":{"117":1,"331":1}}],["аналогу",{"2":{"472":1}}],["аналогов",{"2":{"463":1}}],["аналогом",{"2":{"462":1}}],["аналогами",{"2":{"360":1}}],["аналог",{"2":{"124":1,"375":1,"425":1,"462":1}}],["аналогию",{"2":{"473":1}}],["аналогией",{"2":{"464":1}}],["аналогичен",{"2":{"249":1,"270":1,"516":1,"548":1}}],["аналогичную",{"2":{"381":1}}],["аналогичные",{"2":{"462":1}}],["аналогичным",{"2":{"231":1,"373":1}}],["аналогичных",{"2":{"98":1,"336":1}}],["аналогичный",{"2":{"89":1,"152":1,"249":1,"331":1,"359":1,"473":1}}],["аналогичного",{"2":{"507":1}}],["аналогичном",{"2":{"22":1}}],["аналогично",{"2":{"2":1,"18":1,"339":1,"438":1}}],["аналогии",{"2":{"249":1}}],["аналоги",{"0":{"22":1},"2":{"5":1,"462":1}}],["аналитика",{"2":{"62":1}}],["анализировать",{"2":{"346":1}}],["анализа",{"2":{"14":1,"333":1,"436":1}}],["анализ",{"0":{"8":1,"20":1,"62":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"21":1,"22":1},"2":{"12":1,"61":1,"151":1,"181":1}}],["академическое",{"2":{"287":1}}],["академических",{"2":{"199":1}}],["аккуратней",{"2":{"461":1}}],["аккуратно",{"2":{"375":1}}],["аккордеона",{"2":{"177":1,"178":1}}],["аккордеонное",{"2":{"177":1,"179":2}}],["аккордеонные",{"0":{"177":1}}],["аккаунт",{"2":{"116":1}}],["аккаунтом",{"2":{"116":1}}],["аккаунта",{"2":{"98":1,"423":1}}],["акт",{"2":{"390":1}}],["актуальность",{"2":{"308":1,"497":1}}],["актуальные",{"2":{"363":1}}],["актуальных",{"2":{"308":1,"442":1}}],["актуальны",{"2":{"158":1,"332":1}}],["актуален",{"2":{"204":1}}],["активных",{"2":{"447":1}}],["активными",{"2":{"436":1}}],["активного",{"2":{"255":1}}],["активности",{"2":{"189":1}}],["активно",{"2":{"144":1,"239":1,"463":1}}],["активен",{"2":{"316":1}}],["активы",{"2":{"225":1,"344":1}}],["активизируется",{"2":{"329":1}}],["активизируются",{"2":{"179":1}}],["активировать",{"2":{"343":1,"390":1}}],["активированным",{"2":{"344":1}}],["активирован",{"2":{"162":1,"364":1}}],["активирует",{"2":{"164":1}}],["активации",{"2":{"162":2,"164":1,"344":1,"438":1}}],["акции",{"2":{"4":1}}],["атомарного",{"2":{"225":1,"263":1}}],["аттрибутах",{"2":{"471":1}}],["аттрибута",{"2":{"244":1}}],["аттрибут",{"2":{"201":1}}],["аттрибуту",{"2":{"13":1}}],["атрибутом",{"2":{"251":1}}],["атрибутов",{"2":{"155":1,"163":1,"190":1,"251":1,"255":1,"322":1,"338":3,"372":1}}],["атрибутами",{"2":{"244":1,"320":1}}],["атрибутам",{"2":{"231":1,"370":1}}],["атрибута",{"2":{"206":1,"207":1,"209":1,"231":2,"249":1,"287":1,"316":1,"318":1,"319":2,"339":1,"366":1}}],["атрибуту",{"2":{"161":1,"204":1,"287":2}}],["атрибут",{"2":{"122":2,"124":1,"200":2,"203":3,"204":1,"206":1,"209":2,"245":1,"298":1,"299":1,"316":4,"318":2,"319":1,"338":1,"339":1,"340":1,"341":1}}],["атрибуте",{"2":{"122":1,"443":1}}],["атрибуты",{"2":{"63":1,"123":2,"204":1,"205":1,"244":2,"245":2,"261":1,"322":1,"338":2}}],["ат",{"2":{"116":2}}],["алиаса",{"2":{"432":1}}],["алиасы",{"2":{"432":1}}],["алиас",{"2":{"432":2}}],["алгоритму",{"2":{"325":1}}],["алгоритмы",{"2":{"269":1}}],["алгоритм",{"2":{"267":1,"325":2}}],["алгоритмов",{"2":{"62":1}}],["альтернативной",{"2":{"287":1}}],["альтернативный",{"2":{"204":1,"243":1,"249":1,"438":1}}],["альтернативные",{"2":{"62":1,"191":1}}],["альтернативы",{"2":{"227":1,"382":1,"389":1}}],["альтернативой",{"2":{"170":1,"178":1,"244":2,"265":1}}],["альтернативах",{"2":{"162":1}}],["альтернатива",{"2":{"89":1,"115":1,"144":1,"295":1,"351":1,"381":1,"383":1}}],["альтернатив",{"2":{"50":1,"181":1,"349":1,"351":1,"436":1}}],["аргумент",{"2":{"245":1,"249":1,"360":1}}],["аргументов",{"2":{"245":1,"351":1,"381":2}}],["аргументы",{"2":{"228":1,"366":1}}],["аргументами",{"2":{"376":1,"381":1}}],["аргумента",{"2":{"123":1,"201":1,"243":1,"244":1,"245":1,"288":1,"296":1,"336":1,"360":2,"366":1,"376":2,"380":1,"454":1}}],["арендовать",{"2":{"145":1}}],["арендуем",{"2":{"137":1}}],["артефакты",{"2":{"62":1}}],["архитектуру",{"2":{"455":1}}],["архитектур",{"2":{"400":1,"455":1}}],["архитектурой",{"2":{"200":1,"222":1}}],["архитектуре",{"2":{"95":1,"434":1,"444":1}}],["архитектурные",{"0":{"423":1},"1":{"424":1,"425":1,"426":1,"427":1,"428":1}}],["архитектурный",{"2":{"263":1}}],["архитектурными",{"2":{"200":1,"440":1}}],["архитектурных",{"2":{"63":1,"221":1,"440":1}}],["архитектурная",{"2":{"200":1}}],["архитектурной",{"2":{"460":1}}],["архитектурное",{"2":{"63":1}}],["архитектурно",{"2":{"6":1,"462":1}}],["архитектуры",{"2":{"40":1,"76":1,"137":1,"147":1,"261":1,"263":1,"272":1,"323":1,"402":1,"408":1,"414":1,"436":1,"455":1,"508":1}}],["архитектура",{"0":{"1":1,"6":1,"63":1,"464":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"465":1,"466":1,"467":1,"468":1,"469":1,"470":1},"2":{"61":1,"63":2,"238":1,"363":1,"423":2,"442":1,"464":2,"496":1}}],["адресом",{"2":{"223":1}}],["адресов",{"2":{"134":2}}],["адресе",{"2":{"134":1,"136":1,"317":2}}],["адресное",{"2":{"134":1}}],["адресата",{"2":{"134":1}}],["адресату",{"2":{"134":1}}],["адресах",{"2":{"134":1,"136":1}}],["адреса",{"2":{"134":5,"144":1,"183":1,"224":1,"309":1}}],["адрес",{"2":{"134":8,"136":1,"206":1,"223":1,"231":1,"308":1,"316":1,"326":1,"331":2,"339":1,"341":1,"384":1,"454":1}}],["адресу",{"2":{"112":1,"117":1,"129":1,"134":1,"148":1,"156":1,"222":1,"235":1,"249":1,"251":1,"255":1,"307":1,"322":2,"331":1,"335":1,"363":1,"371":1,"404":1,"454":2,"527":1}}],["администратора",{"2":{"390":1}}],["административного",{"2":{"134":1}}],["административная",{"2":{"79":1}}],["администрирования",{"2":{"138":1}}],["админ",{"2":{"116":1,"423":1}}],["админке",{"2":{"13":1,"116":1}}],["админка",{"2":{"12":1,"56":1}}],["адаптация",{"2":{"344":1}}],["адаптации",{"2":{"271":1,"336":1}}],["адаптацию",{"2":{"265":1}}],["адаптировать",{"2":{"269":1,"314":1}}],["адаптированная",{"2":{"222":1}}],["адаптируется",{"2":{"181":2}}],["адаптивны",{"2":{"530":1}}],["адаптивный",{"2":{"334":1}}],["адаптивного",{"2":{"507":1}}],["адаптивноcти",{"2":{"468":1}}],["адаптивность",{"0":{"35":1,"509":1},"2":{"464":1,"471":1,"509":2}}],["адаптивностью",{"2":{"25":1}}],["адаптивности",{"2":{"23":1,"98":1}}],["адаптивная",{"2":{"36":1}}],["адаптер",{"0":{"82":1},"1":{"83":1},"2":{"41":2,"512":2,"542":1}}],["адаптеры",{"0":{"41":1},"2":{"41":1}}],["а",{"2":{"4":1,"11":1,"12":2,"16":1,"23":1,"25":1,"39":1,"74":1,"96":2,"102":1,"104":1,"105":1,"115":1,"116":2,"117":2,"119":2,"120":1,"122":1,"123":2,"124":1,"128":1,"134":3,"143":2,"144":2,"147":1,"149":1,"150":2,"151":2,"152":1,"153":2,"158":1,"159":1,"170":2,"174":1,"176":1,"177":1,"181":2,"183":1,"187":1,"189":1,"191":1,"195":1,"200":4,"201":1,"202":1,"203":1,"204":4,"211":1,"212":1,"214":1,"221":1,"223":2,"224":6,"225":2,"228":6,"231":5,"232":1,"233":2,"234":1,"235":1,"245":1,"246":2,"247":2,"249":1,"250":1,"254":2,"255":2,"256":1,"257":1,"263":2,"264":1,"267":3,"270":1,"271":2,"276":1,"281":3,"282":2,"286":1,"291":1,"293":1,"294":1,"295":3,"297":1,"298":1,"299":1,"300":1,"302":1,"311":1,"313":3,"316":4,"317":1,"318":1,"319":3,"322":1,"324":2,"325":3,"326":1,"329":5,"330":1,"331":3,"332":1,"334":1,"336":3,"338":1,"341":2,"343":3,"344":4,"345":1,"346":3,"349":1,"351":3,"353":1,"355":1,"359":1,"360":1,"361":4,"363":2,"364":3,"366":2,"367":1,"373":1,"376":3,"377":1,"378":3,"380":2,"381":2,"382":2,"385":3,"387":1,"391":1,"393":3,"394":2,"395":1,"396":2,"400":2,"412":1,"415":2,"425":2,"434":3,"436":2,"438":2,"440":2,"442":1,"443":1,"444":1,"446":2,"449":1,"454":2,"455":2,"456":1,"460":2,"462":5,"463":1,"464":1,"466":1,"472":5,"473":4,"504":1,"508":1,"515":1,"534":1}}],["ощущениям",{"2":{"472":1}}],["ощущение",{"2":{"153":1}}],["ощутим",{"2":{"455":1}}],["ощутить",{"2":{"436":1}}],["оцените",{"2":{"425":1}}],["оценить",{"2":{"347":1,"445":1}}],["оценки",{"2":{"346":2,"372":1,"412":1}}],["охватить",{"2":{"336":2,"373":1}}],["охватывают",{"2":{"249":1,"332":1}}],["охватывает",{"2":{"144":1,"149":1,"163":1,"497":1}}],["оживают",{"2":{"336":1}}],["ожидая",{"2":{"301":1,"329":1}}],["ожидание",{"2":{"445":1}}],["ожиданий",{"2":{"385":1}}],["ожидания",{"2":{"244":1,"303":1,"329":1}}],["ожидании",{"2":{"232":1}}],["ожидалось",{"2":{"231":1,"298":1,"302":1,"377":1,"381":1,"445":1}}],["ожидающие",{"2":{"229":1,"231":1}}],["ожидаемую",{"2":{"381":1}}],["ожидаемому",{"2":{"284":1,"376":1}}],["ожидаемых",{"2":{"372":1}}],["ожидаемый",{"2":{"287":1}}],["ожидаемым",{"2":{"246":1}}],["ожидаемые",{"2":{"204":1}}],["ожидает",{"2":{"207":1,"211":1,"302":1,"319":1,"329":1,"444":1}}],["ожидается",{"2":{"125":1,"372":1,"377":1}}],["ожидать",{"2":{"176":1,"358":1,"361":1,"363":1}}],["оговорками",{"2":{"204":1}}],["огромен",{"2":{"225":1}}],["огромный",{"2":{"393":1,"431":1}}],["огромные",{"2":{"200":1}}],["огромного",{"2":{"268":1}}],["огромном",{"2":{"134":1}}],["огромная",{"2":{"200":1}}],["ограничивают",{"2":{"336":1}}],["ограничивает",{"2":{"48":1,"203":1,"231":1}}],["ограничить",{"2":{"227":1}}],["ограничимся",{"2":{"331":1}}],["ограничим",{"2":{"150":1}}],["ограничен",{"2":{"364":1}}],["ограничено",{"2":{"303":1}}],["ограниченным",{"2":{"324":1}}],["ограниченный",{"2":{"296":1}}],["ограниченного",{"2":{"134":1,"168":1,"170":1}}],["ограниченное",{"2":{"134":1,"151":1}}],["ограничены",{"2":{"225":1}}],["ограничений",{"2":{"204":1,"364":2,"373":1,"462":1,"472":1}}],["ограничением",{"2":{"171":1,"246":1}}],["ограничение",{"2":{"146":1,"308":1,"364":2}}],["ограничения",{"2":{"128":1,"200":1,"248":1,"300":1,"353":1,"356":1,"364":3,"456":2,"471":1}}],["оффлайн",{"2":{"472":2}}],["оффлайном",{"2":{"336":1}}],["оформить",{"2":{"423":1}}],["оформлении",{"2":{"187":1}}],["оформлением",{"2":{"356":1}}],["оформление",{"2":{"79":1}}],["оформления",{"2":{"25":1,"187":1,"447":1}}],["официальная",{"2":{"338":1,"462":1,"497":1}}],["официальную",{"2":{"221":1,"363":1}}],["официальные",{"2":{"373":1,"387":1,"396":1,"433":1}}],["официальными",{"2":{"415":1}}],["официальным",{"2":{"202":1,"228":1,"363":1}}],["официальных",{"2":{"134":1,"228":1,"372":1}}],["официальный",{"2":{"119":1,"125":1,"178":1,"222":5,"251":1,"309":1,"388":1,"413":1}}],["официально",{"2":{"359":1,"462":1}}],["официального",{"2":{"222":1,"387":1}}],["официальному",{"2":{"358":1}}],["официальном",{"2":{"178":1,"226":1,"363":1,"371":1}}],["официальное",{"2":{"127":1}}],["официальной",{"2":{"119":1,"128":1,"129":1,"137":1,"138":1,"142":1,"211":1,"212":1,"222":1,"249":1,"251":1,"313":1,"322":2,"376":1,"379":1,"380":1,"388":1,"389":1,"425":1,"450":1}}],["очищен",{"2":{"447":1}}],["очищаются",{"2":{"212":1}}],["очищаться",{"2":{"116":1}}],["очистит",{"2":{"555":1}}],["очистить",{"2":{"226":1,"232":1,"292":1}}],["очистки",{"2":{"384":1}}],["очистке",{"2":{"291":1}}],["очереди",{"2":{"185":1,"232":1,"294":1}}],["очередь",{"2":{"25":1,"201":1,"256":1,"263":2,"293":2,"294":1,"303":2,"308":1,"318":1,"423":1,"436":1,"440":1,"462":2}}],["очевидны",{"2":{"240":1}}],["очевидным",{"2":{"150":1,"201":1,"203":1,"313":1,"447":1}}],["очевидной",{"2":{"251":1,"323":1,"373":1}}],["очевидно",{"2":{"16":1,"22":1,"151":1,"202":1,"313":1}}],["очень",{"2":{"3":1,"12":1,"14":1,"39":1,"40":1,"41":1,"44":1,"50":1,"51":1,"71":1,"92":1,"115":2,"116":3,"130":1,"137":4,"138":1,"142":1,"149":1,"154":1,"159":1,"162":1,"167":1,"168":1,"176":1,"178":1,"182":1,"188":1,"189":1,"200":1,"201":1,"202":2,"204":1,"209":1,"222":3,"223":3,"224":1,"232":1,"241":1,"244":1,"246":1,"247":1,"248":1,"249":1,"252":1,"256":1,"265":3,"267":1,"269":1,"277":1,"282":1,"284":1,"287":1,"289":2,"291":1,"293":1,"297":2,"299":2,"300":1,"301":2,"302":1,"308":1,"311":1,"316":1,"329":1,"331":1,"354":1,"358":2,"364":1,"374":1,"375":1,"381":2,"383":2,"385":2,"391":1,"392":1,"396":1,"422":1,"425":1,"432":1,"433":4,"437":1,"438":1,"446":3,"447":1,"449":1,"450":1,"455":1,"459":1,"460":3,"461":1,"462":1,"463":1,"470":1,"471":1,"472":3,"473":4,"512":1,"536":2}}],["ооп",{"2":{"103":1,"264":4,"265":1,"462":1,"463":1,"464":3}}],["ом",{"2":{"92":1,"224":1,"390":1,"393":1,"396":1,"397":1,"463":1,"472":1}}],["оригинал",{"2":{"391":1}}],["оригинальный",{"2":{"295":1}}],["оригинального",{"2":{"162":1}}],["ориентацию",{"2":{"340":1}}],["ориентация",{"2":{"200":1}}],["ориентации",{"2":{"181":1}}],["ориентированных",{"2":{"464":1}}],["ориентированными",{"2":{"203":1}}],["ориентированное",{"2":{"440":1,"463":1}}],["ориентированного",{"2":{"3":1,"264":1,"463":1}}],["ориентироваться",{"2":{"22":1,"173":1}}],["ориентируемся",{"2":{"12":1,"13":1}}],["оранжевого",{"2":{"151":1}}],["органами",{"2":{"263":1}}],["органом",{"2":{"144":1}}],["организм",{"2":{"263":1}}],["организовываться",{"2":{"256":1}}],["организовывать",{"2":{"204":1}}],["организован",{"2":{"375":1}}],["организованными",{"2":{"332":1}}],["организованности",{"2":{"153":1}}],["организованы",{"2":{"126":1,"178":1}}],["организовать",{"2":{"118":1,"202":1,"204":1,"233":1,"306":1,"315":1,"332":1,"395":1,"425":1,"442":1}}],["организация",{"2":{"204":1}}],["организациям",{"2":{"196":1}}],["организациях",{"2":{"178":1,"310":1}}],["организаций",{"2":{"134":2}}],["организацией",{"2":{"134":1,"180":1}}],["организацию",{"2":{"126":1,"223":1,"375":1}}],["организации",{"0":{"126":1,"180":1},"1":{"181":1,"182":1,"183":1,"184":1},"2":{"73":1,"119":1,"134":1,"201":1,"267":1,"330":1,"331":1,"356":1,"370":1,"375":1,"422":1,"463":1}}],["ошибетесь",{"2":{"203":1}}],["ошибемся",{"2":{"40":1}}],["ошибку",{"2":{"286":1,"287":1,"303":1,"376":2,"377":1,"437":2,"447":1}}],["ошибкам",{"2":{"360":1,"370":2}}],["ошибками",{"2":{"92":1}}],["ошибка",{"0":{"377":1},"2":{"166":1,"204":1,"303":1,"331":1,"381":1,"437":1,"448":1,"464":1}}],["ошибке",{"2":{"158":1,"301":1,"377":1,"393":1}}],["ошибки",{"2":{"92":2,"117":1,"302":1,"323":1,"327":1,"328":1,"372":1,"376":1,"377":2,"433":1,"437":2,"448":1}}],["ошибок",{"2":{"68":1,"158":3,"287":2,"292":1,"295":1,"328":1,"329":1,"372":2,"376":1,"482":1}}],["ов",{"2":{"48":1,"73":1}}],["одинаковую",{"2":{"363":1}}],["одинаковым",{"2":{"296":1}}],["одинаковыми",{"2":{"232":1,"432":1}}],["одинаковы",{"2":{"232":1,"397":1,"454":1}}],["одинаковых",{"2":{"231":1}}],["одинаковый",{"2":{"153":1,"364":1}}],["одинакового",{"2":{"170":1}}],["одинаковое",{"2":{"152":1}}],["одинаково",{"2":{"122":1,"231":1,"354":1}}],["один",{"2":{"36":1,"41":1,"43":1,"58":1,"103":1,"104":1,"116":2,"123":1,"134":1,"152":1,"162":1,"167":1,"174":1,"191":1,"195":1,"202":1,"203":1,"206":1,"212":1,"222":1,"223":1,"230":1,"231":2,"239":1,"243":1,"244":3,"249":1,"251":1,"255":2,"256":2,"257":1,"265":1,"268":1,"269":1,"277":2,"278":1,"280":1,"290":1,"291":2,"297":1,"298":1,"299":1,"308":1,"313":1,"317":1,"319":2,"324":1,"328":1,"330":2,"331":1,"343":3,"354":1,"361":1,"363":1,"374":1,"376":2,"378":1,"379":1,"384":1,"425":3,"432":1,"440":1,"451":1,"454":1,"461":1,"462":4,"472":1}}],["одаренный",{"2":{"26":1}}],["одних",{"2":{"357":1}}],["одни",{"2":{"261":1,"308":1,"317":1,"385":1,"386":1,"423":2}}],["одним",{"2":{"14":1,"41":1,"130":1,"178":1,"196":1,"203":1,"204":1,"227":3,"232":1,"241":1,"246":1,"249":1,"256":2,"300":1,"323":1,"325":1,"373":1,"436":1,"449":2,"456":1}}],["одними",{"2":{"3":1,"227":1}}],["одну",{"2":{"82":1,"149":1,"181":1,"193":1,"227":1,"265":1,"292":1,"297":1,"313":1,"330":1,"356":1,"364":1,"366":1,"375":1,"452":1,"454":1,"463":1}}],["одна",{"2":{"108":1,"109":1,"152":2,"170":1,"177":1,"195":1,"256":1,"319":1,"342":1,"383":1,"436":1}}],["однажды",{"2":{"71":1}}],["однако",{"2":{"12":1,"13":1,"23":1,"50":1,"71":2,"130":1,"132":1,"142":1,"144":1,"148":1,"150":1,"167":1,"170":1,"174":1,"176":1,"178":2,"182":1,"184":1,"200":2,"203":1,"204":5,"218":1,"219":1,"221":1,"222":1,"223":1,"225":1,"227":1,"232":1,"241":1,"243":1,"244":2,"245":2,"251":1,"255":1,"265":1,"267":1,"269":1,"279":1,"296":1,"297":2,"302":2,"303":1,"308":1,"310":1,"313":1,"316":1,"318":1,"319":1,"324":1,"325":3,"336":2,"338":1,"343":1,"344":2,"351":1,"356":1,"358":1,"360":2,"363":1,"370":1,"372":1,"373":2,"376":1,"378":1,"381":2,"388":1,"390":1,"435":1,"436":2,"446":1,"447":1,"457":1,"460":1,"462":2,"471":1,"472":2,"473":2,"503":1,"504":1,"536":1}}],["однозначных",{"2":{"436":1}}],["однозначно",{"2":{"364":1,"433":1,"463":1}}],["однокомпонентного",{"2":{"446":1}}],["однокомпонентное",{"2":{"234":1,"446":1}}],["однократный",{"2":{"376":1}}],["одноразового",{"2":{"329":1}}],["одноразовому",{"0":{"329":1}}],["одноименный",{"2":{"316":1}}],["однопоточным",{"2":{"436":1}}],["однопоточными",{"2":{"301":1}}],["однопоточных",{"2":{"276":1}}],["однофайловыми",{"2":{"375":1}}],["однофайловый",{"2":{"203":1}}],["однофайловых",{"0":{"203":1},"2":{"201":1,"266":1,"379":1,"397":1}}],["однофайловые",{"2":{"199":1,"220":1,"224":1,"378":1}}],["одновременно",{"2":{"137":1,"158":1,"177":1,"223":1,"232":1,"252":1,"295":1,"376":1,"382":1,"423":1,"425":1}}],["одновременного",{"2":{"124":1,"356":1}}],["одновременных",{"2":{"137":1}}],["одностраничных",{"2":{"411":1,"434":1}}],["одностраничными",{"2":{"306":1}}],["одностраничные",{"0":{"306":1,"411":1},"1":{"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1},"2":{"127":1,"135":2,"175":1,"244":1,"251":1,"308":1,"450":1}}],["одностраничное",{"2":{"258":1,"334":1}}],["одностраничного",{"2":{"131":1}}],["одного",{"2":{"128":1,"138":1,"176":1,"234":1,"235":1,"256":1,"277":1,"301":1,"331":1,"359":1,"364":1,"370":1,"375":1,"386":1,"391":1,"444":1,"462":2}}],["одномоментное",{"2":{"363":1}}],["одному",{"2":{"134":1,"287":1,"375":1}}],["одном",{"2":{"103":1,"105":1,"134":1,"156":1,"163":1,"167":1,"175":1,"181":1,"203":1,"228":1,"229":1,"232":1,"268":1,"271":1,"289":1,"301":1,"360":1,"364":1,"374":1,"382":1,"436":1,"463":1}}],["одно",{"2":{"48":1,"168":1,"200":1,"204":1,"245":1,"249":1,"256":1,"264":1,"268":1,"269":1,"292":1,"295":1,"297":1,"303":2,"316":1,"324":1,"356":1,"357":1,"373":1,"375":1,"376":1,"381":1,"394":1,"421":1,"463":1}}],["одной",{"2":{"16":1,"34":1,"50":1,"153":1,"169":1,"181":1,"200":3,"231":1,"248":1,"257":1,"265":1,"286":1,"291":1,"300":1,"301":1,"308":1,"331":1,"336":1,"343":1,"349":1,"364":1,"381":1,"385":1,"394":1,"429":1,"436":1,"462":1,"507":1}}],["ознакомления",{"2":{"363":1,"503":1}}],["ознакомьтесь",{"2":{"331":1,"367":1,"442":1,"473":1}}],["ознакомительный",{"2":{"396":1}}],["ознакомиться",{"2":{"56":1,"116":1,"132":1,"134":1,"151":1,"247":1,"250":1,"322":1,"350":1,"366":1,"507":1,"508":1}}],["ознакомились",{"2":{"202":1}}],["означают",{"2":{"308":1,"397":1}}],["означает",{"2":{"11":2,"144":1,"150":1,"151":1,"178":1,"200":2,"204":1,"225":1,"228":1,"239":1,"245":1,"246":1,"250":1,"260":1,"269":2,"291":1,"295":1,"297":1,"313":1,"323":1,"328":1,"356":1,"359":1,"376":1,"386":1,"436":2,"501":1,"504":1}}],["озон",{"2":{"4":1}}],["осущестляется",{"2":{"429":1}}],["осуществляет",{"2":{"320":1}}],["осуществляется",{"2":{"137":1,"144":2,"278":1,"360":1,"364":1}}],["осуществляются",{"2":{"277":1}}],["осуществляться",{"2":{"246":1,"290":1,"324":1,"325":1,"331":1}}],["осуществлять",{"2":{"246":1,"437":1}}],["осуществления",{"2":{"114":1,"323":1}}],["освоения",{"2":{"396":1}}],["освоении",{"2":{"336":1}}],["освобождаем",{"2":{"267":1}}],["освобождать",{"2":{"267":1}}],["освобождения",{"2":{"267":1}}],["освободить",{"2":{"267":1}}],["осваивать",{"2":{"221":1}}],["осведомлен",{"2":{"189":1}}],["освежить",{"2":{"135":1}}],["оскорбления",{"2":{"194":1}}],["острова",{"2":{"238":1}}],["осторожность",{"2":{"436":1}}],["осторожно",{"2":{"182":1}}],["останемся",{"2":{"444":1}}],["останова",{"2":{"181":2}}],["остановится",{"2":{"170":1}}],["остановиться",{"2":{"125":1}}],["остановимся",{"2":{"12":1,"231":1,"239":1,"282":1,"313":1,"372":1,"442":1}}],["остаться",{"2":{"392":1,"462":1}}],["осталось",{"2":{"227":1,"362":1}}],["остальная",{"2":{"452":1}}],["остальной",{"2":{"255":1}}],["остальное",{"2":{"50":1,"203":1,"361":1,"433":1}}],["остальным",{"2":{"227":1}}],["остальными",{"2":{"175":1}}],["остальных",{"2":{"122":1,"152":1,"260":1,"304":2,"397":1,"450":1}}],["остальные",{"2":{"17":1,"100":1,"122":1,"176":1,"195":1,"316":1}}],["остается",{"2":{"96":1,"114":1,"119":1,"223":1,"316":1}}],["оставались",{"2":{"436":1}}],["оставаться",{"2":{"269":1,"287":1}}],["оставьте",{"2":{"425":1}}],["оставшихся",{"2":{"267":1}}],["оставшейся",{"2":{"223":1}}],["оставить",{"2":{"186":1}}],["оставим",{"2":{"7":1,"99":1}}],["оставляем",{"2":{"97":1}}],["оставлять",{"2":{"73":1,"168":1}}],["остаются",{"2":{"17":1,"370":1,"512":1}}],["ос",{"2":{"162":1,"166":3,"168":1,"222":1,"224":1,"340":1,"433":1}}],["особый",{"2":{"378":1}}],["особых",{"2":{"246":1,"341":1,"345":1,"402":1,"455":1}}],["особенного",{"2":{"445":1}}],["особенностей",{"2":{"297":1,"301":1,"436":1}}],["особенностью",{"2":{"296":1}}],["особенность",{"2":{"130":1,"463":1}}],["особенно",{"2":{"118":1,"137":1,"158":1,"222":1,"265":1,"270":1,"290":1,"293":1,"301":1,"303":1,"434":1,"449":1,"461":1,"508":1}}],["особому",{"2":{"336":1}}],["особого",{"2":{"287":1,"338":1}}],["особое",{"2":{"134":1,"336":1}}],["особо",{"2":{"73":1}}],["основополагающих",{"2":{"300":1}}],["основополагающим",{"2":{"144":1}}],["основу",{"2":{"260":1,"334":1,"396":1}}],["основ",{"2":{"219":1,"291":1,"374":1,"400":1,"473":1}}],["основательным",{"2":{"462":1}}],["основателя",{"2":{"189":1}}],["основа",{"2":{"220":1,"394":1}}],["основано",{"2":{"394":1}}],["основанное",{"2":{"374":1}}],["основанного",{"2":{"284":1,"372":1}}],["основанные",{"2":{"460":1}}],["основанным",{"2":{"232":1}}],["основанный",{"2":{"222":1,"226":1}}],["основанных",{"2":{"137":1}}],["основана",{"2":{"269":1}}],["основан",{"2":{"152":1,"325":1,"344":1,"384":1}}],["основаны",{"2":{"147":1,"200":1,"343":1,"396":1}}],["основании",{"2":{"89":1,"294":1,"443":1}}],["основе",{"2":{"150":1,"190":1,"199":1,"200":1,"212":1,"223":1,"229":1,"244":1,"308":1,"319":1,"323":1,"329":1,"346":1,"364":1,"376":1,"392":1,"395":1,"412":1,"446":3,"462":1}}],["основываясь",{"2":{"255":1,"290":1}}],["основы",{"2":{"145":1,"221":1,"292":1,"304":1,"409":1}}],["основную",{"2":{"316":1,"354":1}}],["основная",{"2":{"34":1,"74":1,"131":1,"134":1,"149":1,"151":1,"159":1,"165":1,"168":1,"178":1,"181":1,"188":1,"212":1,"231":1,"268":1,"277":1,"293":1,"329":1,"330":1,"334":1}}],["основное",{"0":{"351":1},"1":{"352":1,"353":1},"2":{"250":1,"284":1,"300":1,"347":1,"364":1,"462":1}}],["основной",{"2":{"35":1,"119":1,"151":1,"174":1,"181":2,"187":1,"224":1,"227":1,"230":2,"244":1,"301":2,"313":1,"325":1,"331":1,"340":1,"343":2,"364":1,"391":1,"433":1,"436":1,"462":1,"470":1}}],["основного",{"2":{"29":2,"114":1,"230":1,"291":1,"365":1}}],["основном",{"2":{"10":1,"83":1,"132":1,"148":1,"153":1,"164":1,"167":1,"168":1,"173":1,"177":1,"197":1,"212":1,"221":1,"287":1,"288":1,"297":1,"308":1,"313":1,"324":1,"325":1,"340":1,"356":1,"438":1,"452":1,"507":1}}],["основным",{"2":{"174":1,"201":1,"238":1,"348":1}}],["основными",{"2":{"39":1,"147":1,"235":1}}],["основные",{"0":{"28":1},"1":{"29":1,"30":1,"31":1,"32":1},"2":{"23":1,"59":1,"63":1,"96":1,"116":1,"145":1,"154":1,"240":1,"245":1,"419":1,"437":1,"446":1,"461":1,"464":1,"497":1}}],["основных",{"2":{"17":1,"63":1,"73":1,"119":1,"173":1,"256":1,"387":1,"461":1}}],["о",{"0":{"135":1,"463":1},"1":{"136":1},"2":{"4":1,"10":1,"11":3,"31":1,"51":1,"58":1,"62":1,"82":1,"83":1,"89":1,"119":1,"127":1,"128":1,"130":1,"134":2,"137":1,"145":4,"147":2,"149":1,"158":1,"164":1,"166":3,"168":3,"178":1,"181":1,"182":1,"183":1,"197":2,"199":1,"200":1,"201":2,"202":1,"203":1,"204":1,"223":1,"224":1,"225":1,"231":1,"232":1,"235":2,"241":1,"245":1,"251":2,"256":2,"258":1,"266":1,"270":2,"296":1,"297":1,"298":1,"316":1,"319":1,"322":2,"328":1,"336":4,"337":1,"343":2,"345":2,"364":3,"373":2,"375":1,"376":1,"378":1,"383":6,"385":1,"391":1,"393":1,"394":2,"396":1,"401":1,"408":1,"425":1,"431":1,"434":1,"436":1,"439":1,"441":1,"442":2,"447":1,"450":2,"454":1,"460":2,"463":2,"472":2,"482":1,"498":1,"554":1}}],["окажется",{"2":{"330":1}}],["оказывается",{"2":{"192":1}}],["оказывают",{"2":{"184":1}}],["оказалось",{"2":{"71":1}}],["оказание",{"2":{"68":1}}],["оказать",{"2":{"63":1}}],["оказаться",{"2":{"4":1,"223":1,"344":1}}],["окружению",{"2":{"421":1}}],["окружения",{"2":{"421":1,"422":1,"507":1}}],["окружений",{"2":{"421":1}}],["окружение",{"2":{"212":1,"379":1}}],["окружении",{"2":{"166":1,"436":1}}],["окружающей",{"2":{"250":1}}],["окружающим",{"2":{"3":1,"34":1}}],["окружает",{"2":{"203":2}}],["окружности",{"2":{"169":1}}],["окне",{"2":{"166":1,"176":1,"193":1,"336":1,"381":1}}],["окном",{"2":{"423":1}}],["окно",{"2":{"164":1,"175":1,"193":1,"223":1,"254":1,"313":1,"331":1,"378":1,"380":1,"390":1,"453":1,"504":1}}],["окна",{"2":{"150":1,"152":1,"156":2,"157":1,"166":1,"238":1,"250":2,"254":1,"267":2,"340":1,"343":1,"364":1,"390":1,"554":1}}],["окошко",{"2":{"302":1}}],["окончательный",{"2":{"371":1}}],["окончательные",{"2":{"136":1}}],["окончательном",{"2":{"230":1}}],["окончания",{"2":{"376":1}}],["окончании",{"2":{"226":1,"256":1}}],["окончанием",{"2":{"158":1}}],["около",{"2":{"86":1}}],["опен",{"2":{"473":1}}],["оперировать",{"2":{"296":1,"443":1}}],["оперирующие",{"2":{"39":1}}],["оперируют",{"2":{"3":1}}],["оперативной",{"2":{"433":1}}],["оператора",{"2":{"366":1}}],["оператор",{"2":{"256":1,"438":1}}],["операциям",{"2":{"449":1}}],["операциями",{"2":{"267":1,"303":1}}],["операциях",{"2":{"364":1}}],["операция",{"2":{"244":1,"296":2,"302":1,"328":1,"330":1,"448":2}}],["операцией",{"2":{"244":1}}],["операций",{"2":{"208":1,"295":2,"301":2,"302":1,"303":2,"316":1,"331":2,"366":2,"387":1,"394":1,"446":1,"449":1,"460":1}}],["операции",{"2":{"166":1,"239":1,"240":1,"241":1,"244":1,"282":2,"297":2,"301":3,"302":1,"303":1,"324":1,"327":1,"364":1,"373":1,"392":1,"436":1,"443":1,"446":2,"447":2,"448":2,"449":5}}],["операцию",{"2":{"158":1,"194":1,"265":1,"301":1,"303":2}}],["операционные",{"2":{"336":1}}],["операционных",{"2":{"336":1,"343":1,"455":1}}],["операционными",{"2":{"334":1,"336":1}}],["операционной",{"2":{"144":1,"336":3,"338":1,"341":1,"364":1,"387":1,"402":1}}],["операционная",{"2":{"137":1,"336":1}}],["операционную",{"2":{"137":1}}],["опираться",{"2":{"381":1}}],["опираясь",{"2":{"297":1}}],["описательные",{"0":{"341":1},"2":{"341":1}}],["описательным",{"2":{"247":1,"334":1,"338":1}}],["описательная",{"2":{"239":1}}],["описать",{"2":{"203":1}}],["описанная",{"2":{"442":1}}],["описанных",{"2":{"183":1,"222":1,"266":1}}],["описанным",{"2":{"79":1}}],["описан",{"2":{"421":1}}],["описаны",{"2":{"120":1,"126":1,"199":1}}],["описаний",{"2":{"231":1}}],["описании",{"2":{"183":1}}],["описания",{"2":{"62":1,"121":1,"176":1,"204":1,"231":1,"338":1,"376":1,"381":1}}],["описанию",{"2":{"48":1}}],["описание",{"0":{"506":1},"2":{"47":1,"62":3,"73":1,"91":1,"95":1,"108":1,"109":1,"134":1,"192":1,"203":1,"212":1,"229":1,"231":2,"276":1,"322":1,"341":1,"376":2,"437":1,"472":1}}],["описанием",{"2":{"11":1,"160":1,"341":1}}],["описываются",{"2":{"497":1}}],["описывающий",{"2":{"447":1}}],["описывающие",{"2":{"204":1}}],["описывайте",{"2":{"470":1}}],["описываться",{"2":{"70":1}}],["описывает",{"2":{"51":1,"63":2}}],["оповестить",{"2":{"463":1}}],["оповещение",{"2":{"365":1}}],["оповещения",{"2":{"291":1,"356":2}}],["оповещает",{"2":{"291":1}}],["опору",{"2":{"158":1}}],["опытным",{"2":{"508":1}}],["опытный",{"2":{"473":1}}],["опытных",{"2":{"118":1,"152":1,"418":1,"497":2}}],["опытному",{"2":{"473":1,"507":1}}],["опыту",{"2":{"159":1,"265":1,"272":1,"436":1}}],["опытом",{"2":{"149":1}}],["опыт",{"2":{"145":1,"149":1,"168":1,"184":1,"197":1,"203":1,"302":1,"472":1,"473":3,"496":2,"555":1}}],["опыта",{"2":{"118":1,"147":1,"184":1,"197":1,"201":1,"350":1,"375":1,"417":1,"440":1}}],["опущены",{"2":{"315":1,"328":1,"343":1}}],["опущено",{"2":{"255":1}}],["опубликовывать",{"2":{"291":1}}],["опубликовала",{"2":{"363":1}}],["опубликовал",{"2":{"158":1}}],["опубликовать",{"2":{"95":1,"131":1,"292":1,"354":1,"416":1}}],["опускаю",{"2":{"255":1}}],["опустили",{"2":{"329":1}}],["опустил",{"2":{"239":1}}],["опустим",{"2":{"235":1}}],["опустить",{"2":{"9":1,"364":1}}],["опционально",{"2":{"341":1,"495":1}}],["опциональными",{"2":{"338":1}}],["опция",{"2":{"223":2,"224":1,"265":1,"390":1}}],["опциями",{"2":{"112":1,"120":1,"144":1,"157":2,"255":1,"345":1,"450":1,"501":1}}],["опцию",{"2":{"92":1,"186":1,"193":1,"310":1,"375":1,"383":1}}],["опций",{"2":{"85":1,"144":1,"157":1,"178":3,"179":2,"191":1,"224":1,"227":1,"381":1,"542":1}}],["опции",{"0":{"137":1,"228":1,"541":1,"542":1},"1":{"138":1,"139":1,"140":1,"141":1,"142":1,"542":1,"543":1,"544":1,"545":1},"2":{"16":1,"144":1,"176":1,"203":1,"204":1,"228":1,"249":1,"450":1,"460":1,"501":1}}],["оптимизируют",{"2":{"373":1}}],["оптимизируя",{"2":{"63":1}}],["оптимизирован",{"2":{"244":1}}],["оптимизировать",{"2":{"202":1,"224":1,"372":1}}],["оптимизаций",{"2":{"202":1,"436":1}}],["оптимизация",{"2":{"79":1,"472":1}}],["оптимизации",{"2":{"48":1,"171":1,"436":1}}],["опять",{"2":{"56":1,"137":1,"292":1,"351":1,"353":1,"360":1,"381":1,"394":1}}],["оправдывает",{"2":{"449":1}}],["оправдали",{"2":{"385":1}}],["оправдан",{"2":{"130":1}}],["опробованы",{"2":{"71":1}}],["опрятностью",{"2":{"17":1}}],["определённых",{"2":{"464":1}}],["определил",{"2":{"313":1,"316":1}}],["определились",{"2":{"247":1,"255":1}}],["определили",{"2":{"218":1,"233":1,"238":1}}],["определите",{"2":{"255":1}}],["определиться",{"2":{"200":1}}],["определить",{"2":{"16":1,"62":1,"124":1,"153":1,"169":1,"231":1,"247":1,"255":2,"260":1,"312":1,"316":1,"319":1,"331":1,"344":1,"370":1,"400":1,"448":1}}],["определим",{"2":{"230":2,"237":1}}],["определяя",{"2":{"359":1}}],["определяю",{"2":{"204":1}}],["определяют",{"2":{"201":2,"204":2,"245":1}}],["определяются",{"2":{"62":1}}],["определяющая",{"2":{"340":1}}],["определяющих",{"2":{"341":1}}],["определяющим",{"2":{"256":1,"441":1}}],["определяющий",{"2":{"224":1,"449":1}}],["определяющие",{"2":{"200":1,"203":2}}],["определяющую",{"2":{"134":1}}],["определять",{"2":{"124":1,"204":1,"225":1,"247":1,"316":1,"364":1}}],["определяемой",{"2":{"244":1}}],["определяемого",{"2":{"208":1}}],["определяемое",{"2":{"63":1}}],["определяем",{"2":{"169":1,"201":2,"231":1,"255":1,"313":1,"316":1,"319":1,"343":1,"359":1,"444":2,"448":1}}],["определяете",{"2":{"203":1,"462":1}}],["определяется",{"2":{"116":1,"204":1,"344":1,"443":1}}],["определяет",{"2":{"63":1,"116":1,"156":1,"199":1,"200":1,"201":1,"203":1,"224":1,"277":1,"280":1,"291":2,"340":1,"343":1}}],["определено",{"2":{"212":1,"376":1}}],["определен",{"2":{"204":1,"319":1,"377":1,"441":1}}],["определены",{"2":{"155":1,"244":1,"245":1,"313":1,"557":1}}],["определений",{"2":{"245":1}}],["определении",{"2":{"171":1,"244":1,"245":1,"319":2,"331":1}}],["определение",{"0":{"238":1,"239":1,"240":1,"312":1,"318":1},"1":{"313":1,"314":1},"2":{"135":1,"149":1,"246":1,"249":1,"295":1,"316":1,"319":2,"360":1,"462":1,"507":1}}],["определением",{"2":{"122":1,"149":1,"243":1,"251":1,"255":1,"315":1}}],["определению",{"2":{"127":1,"200":1,"241":1,"319":2}}],["определения",{"2":{"3":1,"170":1,"185":1,"200":1,"231":1,"242":1,"245":3,"246":1,"249":1,"317":2,"319":1,"333":1,"343":2,"353":1,"360":1,"436":1,"464":1}}],["определенную",{"2":{"224":1,"324":1,"330":1,"336":1,"395":1}}],["определенный",{"2":{"266":1,"287":1,"327":1,"329":1,"344":1,"359":1,"443":1}}],["определенных",{"2":{"155":1,"308":1,"325":1,"336":1,"462":1,"507":1}}],["определенными",{"2":{"136":1,"150":1,"203":1,"204":2,"237":1,"507":1,"508":1}}],["определенным",{"2":{"115":1,"116":1,"297":1,"440":1}}],["определенные",{"2":{"91":1,"181":1,"200":1,"201":1,"204":1,"226":1,"240":1,"249":1,"265":1,"271":1,"319":1,"382":1,"391":1,"394":1}}],["определенном",{"2":{"343":1}}],["определенному",{"2":{"41":1,"115":1,"200":1,"376":1}}],["определенное",{"2":{"343":1,"354":1}}],["определенного",{"2":{"7":1,"228":1,"297":1,"330":1,"460":1}}],["определенной",{"2":{"7":1,"11":1,"51":1,"179":1,"392":1,"504":2}}],["оплаты",{"2":{"4":1,"12":1,"79":1,"192":1}}],["обёртку",{"2":{"504":1}}],["обзора",{"2":{"369":1}}],["обзор",{"2":{"349":1,"363":1,"457":1}}],["обхода",{"2":{"271":1,"454":1}}],["обходимся",{"2":{"23":1}}],["обиход",{"2":{"269":1}}],["обучающие",{"2":{"473":2}}],["обучающего",{"2":{"232":1}}],["обучение",{"2":{"232":1,"471":1,"473":1}}],["обучением",{"2":{"147":1}}],["обучения",{"2":{"72":1,"147":1}}],["обман",{"2":{"472":1}}],["обмануть",{"2":{"185":1,"186":1}}],["обманных",{"2":{"184":1}}],["обменять",{"2":{"327":1}}],["обмена",{"2":{"316":1,"324":1,"325":3,"339":1,"349":1,"357":1,"369":1,"394":1,"437":1,"443":1}}],["обмену",{"2":{"204":1,"353":1}}],["обмен",{"2":{"144":1,"246":1,"324":1,"325":1}}],["обмениваются",{"2":{"349":1}}],["обмениваться",{"2":{"41":1,"250":1,"252":1}}],["обменивается",{"2":{"3":1}}],["обсуждение",{"2":{"462":1}}],["обсуждали",{"2":{"336":1}}],["обсуждать",{"2":{"251":1}}],["обсуждается",{"2":{"150":1}}],["обсервер",{"2":{"260":1}}],["обслуживается",{"2":{"223":1}}],["обслуживании",{"2":{"228":1,"289":1,"414":1}}],["обслуживанием",{"2":{"297":1}}],["обслуживание",{"2":{"144":1,"149":1,"337":1}}],["обслуживания",{"2":{"135":1,"137":1,"141":1,"145":1,"295":1,"344":1,"450":1,"454":1}}],["обслуживать",{"2":{"137":1,"269":1}}],["обслуживаться",{"2":{"135":1,"336":1}}],["обстоятельствах",{"2":{"179":1}}],["обстоятельств",{"2":{"12":1}}],["обновят",{"2":{"388":2}}],["обновим",{"2":{"367":1}}],["обновить",{"2":{"344":1,"379":1}}],["обновится",{"2":{"223":1,"463":1}}],["обновилось",{"2":{"296":1}}],["обновляют",{"2":{"449":1}}],["обновляться",{"2":{"311":2,"461":1}}],["обновлять",{"2":{"256":1,"330":1}}],["обновляется",{"2":{"256":1,"317":2}}],["обновляет",{"2":{"116":1,"231":1,"250":1,"297":1,"316":1}}],["обновляем",{"2":{"97":1,"257":1}}],["обновлено",{"2":{"246":1}}],["обновлении",{"2":{"295":1,"364":1,"365":1,"463":1}}],["обновлением",{"2":{"229":1}}],["обновление",{"2":{"206":1,"232":1,"296":1,"363":1,"421":1,"463":1}}],["обновления",{"2":{"144":2,"223":1,"267":1,"316":1,"336":1,"446":1}}],["обнаружении",{"2":{"394":1}}],["обнаружения",{"2":{"123":2,"267":1,"308":1,"316":2}}],["обнаруживает",{"2":{"343":1,"395":1}}],["обнаруживаем",{"2":{"223":1}}],["обнаружились",{"2":{"472":1}}],["обнаружили",{"2":{"270":1,"436":1}}],["обнаружить",{"2":{"249":1,"465":1}}],["обнаружите",{"2":{"224":1}}],["обнуляет",{"2":{"116":1}}],["оба",{"2":{"115":1,"244":1,"290":1,"302":1,"322":1,"395":1,"432":1,"436":1,"454":1,"539":1}}],["общую",{"2":{"149":1,"204":1,"239":1,"243":1,"334":1}}],["общепризнанная",{"2":{"497":1}}],["общедоступным",{"2":{"331":1}}],["общее",{"2":{"231":1,"351":1,"442":1,"496":1}}],["общения",{"2":{"196":1}}],["общение",{"2":{"118":1,"349":1,"479":1}}],["общей",{"2":{"174":1,"180":1,"200":1,"239":1,"245":1,"263":1,"364":1,"436":1,"460":1}}],["общего",{"2":{"152":1,"263":1,"297":1,"442":1,"508":2}}],["общем",{"2":{"133":1,"200":1,"250":1,"263":1,"308":1}}],["общая",{"2":{"86":1,"192":1,"264":1}}],["общим",{"2":{"357":1}}],["общих",{"2":{"158":1,"200":2,"400":1}}],["общий",{"2":{"63":1,"144":1,"147":1,"218":1,"237":1,"290":1,"329":1,"357":1,"417":1,"440":1}}],["общие",{"0":{"78":1,"160":1,"172":1,"180":1},"1":{"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"181":1,"182":1,"183":1,"184":1},"2":{"63":1,"78":1,"95":1,"163":1,"233":1,"322":1,"323":1,"333":1,"417":2,"424":1}}],["обязательная",{"2":{"504":1}}],["обязательно",{"2":{"244":1,"473":2}}],["обязательной",{"2":{"223":1}}],["обязательные",{"2":{"261":1,"326":1}}],["обязательными",{"2":{"218":1}}],["обязательным",{"2":{"204":1,"363":1}}],["обязательных",{"2":{"23":1}}],["обязанность",{"2":{"196":1}}],["обязанности",{"2":{"149":1}}],["обязаны",{"2":{"74":1}}],["об",{"2":{"71":1,"134":1,"156":1,"157":1,"158":1,"166":1,"189":1,"200":1,"202":1,"204":2,"210":1,"224":1,"246":1,"247":1,"250":1,"270":1,"281":1,"282":1,"285":1,"291":1,"300":1,"323":1,"325":1,"343":1,"360":1,"365":1,"390":1,"393":1,"424":1,"442":1,"454":1,"463":2,"473":1}}],["объявим",{"2":{"358":1}}],["объявивший",{"2":{"351":1}}],["объявили",{"2":{"230":1,"231":1}}],["объявить",{"2":{"203":1,"243":1}}],["объявляя",{"2":{"356":1}}],["объявляют",{"2":{"204":2}}],["объявлять",{"2":{"122":1,"204":1,"231":1,"242":1}}],["объявляете",{"2":{"436":1}}],["объявляется",{"2":{"117":1,"204":1,"205":1}}],["объявляем",{"2":{"121":1,"141":2,"201":1,"204":1,"231":1,"256":1,"287":1,"288":1,"292":1,"296":3,"298":1,"325":1,"352":1,"358":1,"360":1,"361":1,"366":1,"452":1}}],["объявлены",{"2":{"462":1}}],["объявлено",{"2":{"211":1}}],["объявленным",{"2":{"204":1}}],["объявленного",{"2":{"117":1}}],["объявления",{"2":{"195":1,"303":1}}],["объявление",{"2":{"117":1,"244":1,"246":2,"303":1}}],["объяснить",{"2":{"308":2,"473":1}}],["объяснимо",{"2":{"394":1}}],["объясним",{"2":{"230":1,"374":1}}],["объяснению",{"2":{"472":1}}],["объяснения",{"2":{"187":1}}],["объяснение",{"2":{"73":1,"91":1,"92":1}}],["объясняющие",{"2":{"270":1}}],["объясняя",{"2":{"133":1}}],["объясняет",{"2":{"62":1,"473":1}}],["объем",{"2":{"231":1,"271":1}}],["объемном",{"2":{"189":1}}],["объему",{"2":{"47":1}}],["объединению",{"2":{"385":1}}],["объединением",{"2":{"385":1}}],["объединение",{"2":{"17":1,"63":1,"329":1,"330":1}}],["объединены",{"2":{"263":1}}],["объединен",{"2":{"224":1}}],["объединяющие",{"2":{"373":1}}],["объединяются",{"2":{"134":1,"149":1}}],["объединяет",{"2":{"330":1,"376":1}}],["объединять",{"2":{"16":1,"386":3}}],["объединить",{"2":{"104":1,"393":1}}],["объективная",{"2":{"497":1}}],["объективных",{"2":{"12":1}}],["объектах",{"2":{"287":1,"460":1}}],["объекта",{"2":{"204":2,"207":1,"209":1,"245":2,"247":1,"256":2,"267":1,"277":1,"284":1,"285":1,"286":1,"287":1,"289":1,"293":1,"295":2,"296":4,"297":4,"298":1,"300":2,"319":1,"358":1,"361":1,"364":1,"366":2,"367":1,"378":1,"380":1,"447":2,"452":1,"454":1,"460":2,"462":1,"463":1,"464":1}}],["объектами",{"2":{"274":1,"291":1,"295":1,"357":1,"460":1}}],["объектам",{"2":{"117":2,"123":2,"436":1}}],["объектом",{"2":{"204":1,"280":1,"291":1,"292":1,"295":1,"296":1,"300":1,"313":1,"358":2,"364":1,"366":1,"454":1}}],["объектов",{"2":{"17":1,"123":1,"218":1,"256":1,"264":1,"273":1,"290":1,"295":1,"339":1,"341":2,"364":1,"366":1,"454":1,"460":1}}],["объекту",{"2":{"164":1,"204":1,"225":1,"249":1,"286":2,"287":1,"289":1,"293":1,"295":1,"297":1,"313":1,"319":1,"364":1}}],["объекты",{"2":{"124":1,"204":2,"210":1,"215":1,"225":1,"231":1,"245":1,"247":1,"322":2,"351":1,"363":1,"364":1,"376":1,"437":1,"454":1,"460":1,"462":1,"463":1}}],["объект",{"0":{"312":1},"1":{"313":1,"314":1},"2":{"103":1,"104":1,"120":1,"122":2,"123":6,"201":3,"203":1,"204":9,"243":1,"244":1,"245":3,"247":2,"249":1,"250":1,"252":1,"255":2,"256":2,"264":1,"277":1,"278":1,"280":2,"282":2,"288":3,"289":1,"290":1,"291":2,"292":1,"294":1,"295":5,"296":6,"297":2,"300":2,"303":3,"313":3,"316":2,"318":1,"319":3,"320":1,"322":3,"323":1,"325":3,"326":2,"331":4,"339":1,"341":1,"345":1,"351":1,"354":1,"356":1,"357":2,"359":1,"360":5,"361":1,"363":1,"364":3,"366":5,"367":2,"376":1,"380":2,"381":1,"437":1,"443":1,"447":2,"448":2,"450":1,"454":1,"460":2}}],["объекте",{"2":{"103":1,"201":1,"286":1,"319":1,"343":1,"437":1,"460":1,"473":1}}],["объектным",{"2":{"464":1}}],["объектный",{"2":{"280":1,"288":1}}],["объектные",{"2":{"17":1}}],["объектной",{"2":{"436":1}}],["объектного",{"2":{"295":1}}],["объектно",{"2":{"3":1,"203":1,"264":1,"463":1,"464":1}}],["образец",{"2":{"421":1}}],["образу",{"2":{"200":1}}],["образованную",{"2":{"325":1}}],["образовательный",{"2":{"74":1}}],["образом",{"2":{"17":1,"36":1,"48":1,"56":1,"115":1,"116":2,"126":1,"134":2,"135":1,"151":1,"154":1,"157":1,"170":2,"183":1,"189":1,"190":1,"202":2,"209":2,"225":1,"226":3,"228":3,"229":1,"230":1,"231":2,"237":1,"238":2,"241":1,"243":1,"246":2,"247":3,"249":1,"250":1,"254":1,"255":2,"256":1,"267":1,"281":1,"284":1,"287":2,"289":1,"294":1,"295":2,"297":1,"298":1,"300":1,"302":1,"303":2,"309":1,"311":1,"313":1,"317":2,"319":1,"324":1,"331":1,"343":1,"344":1,"345":1,"351":1,"354":1,"355":1,"373":1,"375":2,"378":1,"379":1,"381":1,"383":1,"384":2,"388":1,"393":1,"394":1,"437":2,"448":1,"450":2,"451":1,"471":1,"511":1}}],["обработать",{"2":{"449":1}}],["обработана",{"2":{"212":1,"447":1}}],["обработчика",{"2":{"365":1}}],["обработчиком",{"2":{"296":1}}],["обработчиков",{"2":{"123":1}}],["обработчике",{"2":{"296":1}}],["обработчики",{"2":{"295":1}}],["обработчик",{"2":{"287":1,"366":1,"444":1}}],["обработке",{"2":{"436":1,"464":1}}],["обработка",{"2":{"328":1,"436":2,"454":1,"464":1}}],["обработкой",{"2":{"267":1}}],["обработку",{"2":{"158":1,"324":1,"336":1,"357":1,"436":1}}],["обработки",{"2":{"141":1,"200":1,"228":1,"256":1,"287":1,"292":1,"293":2,"294":1,"300":1,"302":1,"323":1,"324":1,"436":1,"444":1}}],["обрабатываем",{"2":{"437":2}}],["обрабатывает",{"2":{"250":1,"282":2,"324":1}}],["обрабатывается",{"2":{"127":1}}],["обрабатывающий",{"2":{"325":1}}],["обрабатывают",{"2":{"244":1}}],["обрабатываются",{"2":{"62":1,"454":1,"473":1}}],["обрабатывать",{"2":{"224":1,"230":1,"295":1,"302":1,"308":1,"328":1,"356":1,"429":1,"439":1,"450":1,"472":2}}],["обрабатываться",{"2":{"224":1,"294":1}}],["обратимся",{"2":{"358":1}}],["обратился",{"2":{"188":1}}],["обратит",{"2":{"195":1}}],["обратитесь",{"2":{"128":1,"439":1}}],["обратите",{"2":{"122":1,"123":1,"136":1,"139":1,"153":1,"154":1,"178":1,"181":1,"183":1,"201":3,"203":1,"204":1,"224":1,"230":2,"231":3,"246":1,"255":1,"256":3,"281":1,"296":2,"301":1,"303":1,"313":2,"319":1,"325":1,"329":1,"353":1,"356":1,"360":1,"363":1,"376":1,"378":1,"381":3,"391":1,"436":1,"438":1,"447":1,"450":1}}],["обратиться",{"2":{"212":1,"345":1,"435":1}}],["обратить",{"2":{"105":1,"165":1,"183":1,"186":1,"199":1,"200":1,"291":1,"316":1,"436":1}}],["обратных",{"2":{"303":1}}],["обратными",{"2":{"303":1}}],["обратный",{"0":{"301":1},"1":{"302":1},"2":{"301":1}}],["обратные",{"2":{"260":1}}],["обратную",{"2":{"134":1,"158":1,"295":1}}],["обратная",{"2":{"125":1}}],["обратное",{"2":{"296":1}}],["обратном",{"2":{"247":1}}],["обратного",{"2":{"140":1,"301":3,"302":1,"303":3,"438":1,"454":1}}],["обратной",{"2":{"68":1,"168":1,"204":1,"250":1,"308":1,"318":1,"372":1,"434":1}}],["обратно",{"2":{"44":1,"116":1,"163":1,"295":1,"327":1,"364":1,"436":1,"451":1}}],["обращающегося",{"2":{"437":1}}],["обращаются",{"2":{"244":1,"364":1}}],["обращались",{"2":{"436":1}}],["обращаясь",{"2":{"380":1}}],["обращаемся",{"2":{"363":1,"380":1,"443":1,"444":1}}],["обращается",{"2":{"117":1,"224":1,"308":1}}],["обращаешься",{"2":{"115":1}}],["обращаться",{"2":{"53":1,"115":1,"199":1,"224":1,"225":1,"231":1,"313":1,"336":1,"351":1,"358":1,"364":2,"365":1,"381":1,"454":2,"473":1}}],["обращений",{"2":{"281":1,"366":2,"443":1,"511":1}}],["обращения",{"2":{"204":1,"344":1,"454":1,"472":1,"511":1}}],["обращении",{"2":{"115":1,"438":1,"472":2}}],["обращением",{"2":{"513":1}}],["обращение",{"2":{"41":1,"316":1}}],["обложка",{"2":{"149":1}}],["обладают",{"2":{"347":1}}],["обладает",{"2":{"200":1}}],["область",{"2":{"173":1,"179":1,"255":2,"315":1,"329":1,"344":2,"370":1}}],["областью",{"2":{"170":1}}],["области",{"2":{"137":1,"147":1,"171":2,"181":1,"204":2,"262":1,"271":1,"343":1,"375":1,"462":1}}],["облачном",{"2":{"419":1,"422":1}}],["облачное",{"2":{"115":1}}],["облачные",{"2":{"331":1,"422":1}}],["облачных",{"2":{"39":1,"115":1}}],["облегчили",{"2":{"463":1}}],["облегчит",{"2":{"444":1,"466":1}}],["облегчения",{"2":{"434":1,"504":1}}],["облегчен",{"2":{"29":1}}],["облегчающего",{"2":{"385":1}}],["облегчают",{"2":{"373":1}}],["облегчат",{"2":{"224":1,"434":1}}],["облегчать",{"2":{"23":1}}],["облегчает",{"2":{"3":1,"83":1,"154":1,"265":1}}],["обычная",{"2":{"134":1,"186":1,"338":1,"393":1}}],["обычное",{"2":{"336":2,"472":1}}],["обычном",{"2":{"204":1,"225":1,"286":1,"291":1,"303":1,"304":1,"376":1,"377":1}}],["обычной",{"2":{"102":1,"116":1,"373":1,"463":1}}],["обычного",{"2":{"39":1,"58":1,"151":1,"153":1,"163":1,"176":1,"200":1,"203":1,"301":1,"302":2,"303":1,"336":1,"447":1}}],["обычно",{"2":{"28":1,"30":1,"50":1,"85":1,"109":1,"116":1,"118":1,"134":1,"137":3,"140":1,"144":1,"150":1,"163":1,"164":1,"170":3,"172":1,"173":1,"174":1,"176":1,"183":1,"187":1,"193":1,"200":1,"202":1,"212":1,"221":1,"238":2,"239":1,"241":1,"250":1,"256":1,"293":1,"296":1,"325":1,"330":1,"340":1,"341":1,"390":1,"394":1,"425":1,"436":1,"440":2,"443":1,"460":1,"461":1,"462":2,"463":1,"472":1,"473":1,"507":1,"536":1}}],["обычным",{"2":{"222":1,"225":1,"380":1,"472":1}}],["обычными",{"2":{"103":1,"227":1,"357":1,"429":1}}],["обычный",{"2":{"161":1,"203":2,"223":1,"257":1,"280":1,"351":1,"380":1,"391":1,"432":1,"440":1}}],["обычных",{"2":{"22":1,"218":1,"306":1,"336":1,"379":1,"472":1}}],["обычные",{"2":{"17":1,"249":1,"297":1,"363":1,"392":1,"463":1}}],["обещанных",{"2":{"303":1}}],["обещанной",{"2":{"303":2}}],["обещаний",{"2":{"303":2}}],["обещаниe",{"0":{"303":1}}],["обещаниями",{"2":{"303":1}}],["обещания",{"2":{"255":2,"302":1,"303":4,"443":1,"448":1}}],["обещание",{"2":{"244":1,"254":2,"255":1,"303":2,"443":1,"452":1}}],["оберток",{"2":{"472":1}}],["обертывания",{"2":{"303":1}}],["обертку",{"2":{"380":1,"381":1,"511":1}}],["обертка",{"2":{"114":1,"212":1,"463":1}}],["обертки",{"0":{"466":1},"2":{"23":1,"230":1,"231":1,"380":1,"381":2,"446":1,"466":1,"472":1}}],["обернуть",{"2":{"281":1,"302":1,"303":1,"357":1,"377":1,"464":1}}],["обернутых",{"2":{"381":1}}],["обернуты",{"2":{"266":1}}],["обернутый",{"2":{"212":1}}],["обернутую",{"2":{"250":1}}],["обернем",{"2":{"231":1,"354":1,"365":1}}],["обеспечат",{"2":{"241":1,"422":1}}],["обеспечим",{"2":{"445":1}}],["обеспечит",{"2":{"372":1}}],["обеспечить",{"2":{"159":1,"170":1,"200":1,"281":1,"292":1,"417":1}}],["обеспечивает",{"2":{"199":1,"204":1,"222":2,"232":1,"244":1,"293":1,"302":1,"308":1,"315":1,"325":1,"351":1,"383":1}}],["обеспечивается",{"2":{"144":1,"547":1}}],["обеспечивая",{"2":{"168":1,"336":1}}],["обеспечивающая",{"2":{"446":1}}],["обеспечивающие",{"2":{"134":2,"370":1,"455":1}}],["обеспечивают",{"2":{"130":1,"243":1,"364":1,"445":1}}],["обеспечьте",{"2":{"158":1}}],["обеспечении",{"2":{"157":1,"263":1}}],["обеспечению",{"2":{"137":1,"372":1,"402":1,"455":1}}],["обеспечением",{"2":{"149":1,"372":1,"383":1}}],["обеспечение",{"2":{"133":1,"137":2,"147":1,"149":2,"195":1,"370":1,"372":2,"385":1,"400":1,"402":1,"440":1}}],["обеспечения",{"0":{"260":1,"261":1,"271":1,"408":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1},"2":{"61":1,"63":1,"76":1,"118":1,"125":1,"147":1,"149":1,"155":1,"157":1,"195":1,"199":1,"200":1,"212":1,"225":1,"229":1,"234":1,"235":1,"239":1,"243":1,"250":2,"260":1,"261":2,"269":1,"270":1,"271":1,"301":1,"304":1,"354":1,"365":1,"370":4,"372":2,"374":1,"385":2,"395":1,"408":2,"434":1,"441":1,"461":1}}],["обе",{"2":{"120":1,"149":1,"343":1,"364":1,"382":1,"393":1}}],["обеих",{"2":{"9":1,"393":1}}],["обобщение",{"2":{"508":1}}],["обобщить",{"2":{"198":1}}],["оболочку",{"2":{"472":1}}],["оболочки",{"2":{"423":1}}],["обоснование",{"0":{"507":1}}],["обоснования",{"2":{"464":1}}],["обоснованное",{"2":{"190":1}}],["обоих",{"2":{"281":1,"364":2,"366":1,"375":1,"548":1}}],["обоими",{"2":{"239":1}}],["обоюдоострым",{"2":{"194":1}}],["обоюдная",{"2":{"74":1}}],["обо",{"2":{"152":1}}],["обороты",{"2":{"330":1}}],["оборудовании",{"2":{"147":1,"336":1}}],["оборудование",{"2":{"137":1}}],["оборачивайте",{"2":{"471":1}}],["оборачивает",{"2":{"439":1}}],["оборачивать",{"2":{"105":1,"303":1}}],["оборачивая",{"2":{"23":1}}],["обозначение",{"2":{"249":1,"313":1}}],["обозначениях",{"2":{"322":1}}],["обозначения",{"2":{"134":1,"176":1,"255":1,"319":1}}],["обозначить",{"2":{"238":1,"343":1}}],["обозначают",{"2":{"231":1}}],["обозначаются",{"2":{"162":1,"215":1}}],["обозначающий",{"2":{"152":1}}],["обозначается",{"2":{"170":1}}],["обозначает",{"2":{"134":1,"263":1}}],["обойтись",{"2":{"23":1,"222":1,"228":1}}],["обширен",{"2":{"13":1}}],["оно",{"2":{"139":1,"152":1,"159":1,"164":1,"166":2,"177":1,"178":2,"182":1,"200":1,"204":1,"223":1,"229":1,"232":1,"244":1,"247":1,"257":1,"292":1,"303":2,"305":1,"313":1,"319":1,"325":1,"334":1,"336":3,"340":1,"359":1,"360":1,"367":1,"372":3,"374":2,"381":1,"397":1,"438":2,"450":1,"472":1}}],["она",{"2":{"34":1,"36":1,"63":2,"125":1,"143":1,"189":1,"195":1,"196":1,"197":1,"200":1,"203":1,"206":1,"207":2,"210":1,"211":1,"212":2,"227":1,"228":1,"229":1,"250":1,"256":1,"260":1,"263":1,"267":2,"287":1,"288":1,"292":1,"297":1,"331":1,"336":1,"343":1,"356":1,"358":2,"364":1,"369":1,"372":2,"376":3,"385":1,"421":1,"443":1,"446":1,"447":1,"460":2,"462":2,"463":1,"465":1,"536":2}}],["онлайновыми",{"2":{"396":1}}],["онлайном",{"2":{"336":1}}],["онлайн",{"0":{"69":1},"1":{"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"12":1,"14":1,"27":1,"70":1,"116":1,"142":1,"145":1,"164":1,"370":1,"394":1,"423":1,"432":1,"433":1,"472":1,"507":1,"508":1,"545":1}}],["они",{"2":{"3":3,"21":1,"44":1,"109":1,"134":1,"135":1,"137":1,"147":2,"148":1,"150":2,"152":1,"156":1,"157":1,"160":1,"161":1,"163":2,"166":1,"167":1,"173":1,"176":1,"178":1,"179":1,"183":1,"199":1,"200":2,"208":3,"209":1,"212":3,"213":1,"214":1,"216":1,"217":1,"218":1,"221":1,"224":1,"225":1,"247":1,"249":1,"257":1,"258":1,"260":1,"261":1,"263":1,"265":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"286":1,"289":1,"296":1,"300":1,"301":1,"302":1,"303":2,"313":1,"315":1,"318":1,"322":4,"329":2,"331":1,"332":2,"334":1,"336":4,"338":1,"341":1,"343":2,"344":1,"347":1,"356":1,"363":2,"372":1,"373":2,"376":3,"379":1,"381":2,"393":1,"394":2,"396":2,"397":1,"421":1,"424":2,"429":3,"432":1,"436":4,"443":1,"446":1,"447":2,"449":1,"450":1,"454":1,"462":1,"463":2,"467":1,"472":1,"473":2}}],["он",{"0":{"385":1},"2":{"2":1,"30":1,"32":1,"50":1,"62":1,"89":1,"105":1,"116":3,"118":1,"119":1,"120":1,"123":2,"124":1,"126":1,"134":4,"140":2,"146":2,"149":3,"151":2,"152":2,"156":1,"158":1,"159":1,"162":3,"163":1,"166":1,"168":1,"170":1,"171":2,"175":1,"176":1,"177":1,"178":1,"181":1,"182":1,"186":2,"187":1,"188":1,"191":1,"193":1,"194":2,"199":1,"200":2,"203":2,"204":1,"212":2,"222":1,"223":3,"224":4,"225":1,"226":2,"227":1,"228":2,"231":1,"237":1,"239":2,"243":1,"244":2,"251":2,"254":2,"256":3,"264":1,"265":2,"266":1,"268":2,"269":1,"270":1,"271":1,"280":1,"281":1,"284":1,"286":1,"287":1,"289":1,"290":1,"291":4,"293":1,"295":2,"297":1,"298":3,"300":1,"301":2,"313":1,"315":1,"316":5,"317":1,"319":3,"320":2,"322":1,"324":1,"325":2,"330":1,"334":1,"336":1,"338":1,"342":1,"343":3,"344":3,"345":1,"348":1,"351":2,"358":1,"359":1,"360":1,"364":3,"366":1,"372":2,"375":3,"376":2,"379":2,"381":1,"382":1,"383":1,"384":1,"386":3,"387":1,"390":2,"395":1,"397":3,"402":1,"421":2,"432":1,"433":2,"436":5,"437":1,"438":2,"440":1,"441":1,"443":3,"444":1,"446":2,"450":1,"451":1,"460":1,"461":1,"462":1,"463":1,"464":1,"472":3}}],["отчетности",{"2":{"383":1}}],["отчета",{"2":{"383":1}}],["отчет",{"2":{"376":1,"383":3}}],["отходят",{"2":{"370":1}}],["отец",{"2":{"353":1}}],["отовсюду",{"2":{"462":1}}],["отодвигает",{"2":{"284":1}}],["отобрав",{"2":{"373":1}}],["отобразим",{"2":{"255":1}}],["отобразит",{"2":{"223":1,"229":2}}],["отобразить",{"2":{"166":1,"170":1,"207":1,"212":1,"227":1}}],["отобразится",{"2":{"164":1}}],["отображен",{"2":{"316":1}}],["отображено",{"2":{"209":1}}],["отображении",{"2":{"152":1,"165":1,"166":1,"208":1,"212":2,"224":1,"231":1,"436":1}}],["отображения",{"2":{"98":1,"152":1,"153":1,"163":1,"164":3,"167":4,"175":1,"177":1,"179":1,"200":1,"201":1,"208":2,"209":1,"231":4,"244":1,"247":1,"251":1,"255":2,"256":1,"311":1,"339":1,"356":1,"384":1,"447":1,"472":1}}],["отображением",{"2":{"244":1,"339":1}}],["отображение",{"2":{"22":1,"135":1,"176":1,"436":1,"462":1}}],["отображая",{"2":{"309":1}}],["отображаемому",{"2":{"380":1}}],["отображаемый",{"2":{"255":1,"436":1}}],["отображаемые",{"2":{"204":1}}],["отображаем",{"2":{"244":1,"255":1,"353":1}}],["отображается",{"2":{"164":1,"176":1,"183":1,"193":1,"212":1,"244":1,"249":1,"265":1,"311":1,"319":1}}],["отображает",{"2":{"152":1,"167":1,"231":1,"239":2,"311":1,"359":1}}],["отображать",{"2":{"170":1,"310":1,"311":1,"313":1,"316":1,"355":1,"424":1,"429":1,"451":1}}],["отображаться",{"2":{"166":1,"176":1,"177":1,"223":1,"244":2,"315":1,"318":2,"319":1,"339":1,"343":2,"346":1}}],["отображающего",{"2":{"384":1}}],["отображающий",{"2":{"168":1,"297":1,"462":1}}],["отображающая",{"2":{"164":1,"231":1}}],["отображаются",{"2":{"173":1,"176":1,"183":1,"204":1,"227":2,"363":1}}],["отображают",{"2":{"163":1,"179":1,"183":1,"351":1}}],["отбрасывании",{"2":{"267":1}}],["отладка",{"2":{"358":1}}],["отложено",{"2":{"232":1,"436":1}}],["отложенных",{"2":{"231":2}}],["отличную",{"2":{"345":1}}],["отличный",{"2":{"222":1,"309":1,"345":1,"381":1,"473":1}}],["отличным",{"2":{"143":1,"346":1}}],["отличного",{"2":{"440":1}}],["отличной",{"2":{"436":1}}],["отличное",{"2":{"195":1,"289":1,"432":1}}],["отлично",{"2":{"134":1,"303":1,"463":1}}],["отличает",{"2":{"306":1}}],["отличается",{"2":{"22":1,"117":1,"133":1,"146":1,"316":1,"380":1,"397":1,"461":1}}],["отличать",{"2":{"250":1}}],["отличаться",{"2":{"222":1,"224":1,"276":1}}],["отличалась",{"2":{"151":1}}],["отличающим",{"2":{"256":1}}],["отличающий",{"2":{"134":1}}],["отличаются",{"2":{"144":1,"460":1}}],["отличия",{"2":{"463":1}}],["отличительных",{"2":{"297":1}}],["отличительной",{"2":{"296":1}}],["отличить",{"2":{"195":1}}],["отличимы",{"2":{"151":1}}],["отличий",{"2":{"133":1}}],["отличием",{"2":{"232":1,"454":1}}],["отличие",{"2":{"26":1,"39":1,"140":1,"144":1,"157":1,"162":1,"208":1,"221":1,"224":1,"227":1,"231":1,"245":1,"284":1,"357":1,"363":1,"364":2,"372":1,"395":1,"460":1,"462":2,"463":1}}],["отнимают",{"2":{"461":1}}],["отнести",{"2":{"322":1}}],["отнесены",{"2":{"172":1}}],["относящаяся",{"2":{"498":1}}],["относящейся",{"2":{"323":1}}],["относятся",{"2":{"185":2,"308":1}}],["относительно",{"2":{"443":1,"444":1,"472":1}}],["относительные",{"2":{"228":1}}],["относить",{"2":{"338":2}}],["относиться",{"2":{"239":1}}],["относится",{"2":{"2":1,"23":1,"95":1,"149":1,"153":1,"181":1,"204":4,"249":1,"265":1,"267":2,"303":1,"334":1,"436":1}}],["отношений",{"2":{"239":1,"354":1}}],["отношении",{"2":{"208":1}}],["отношению",{"2":{"204":1}}],["отношения",{"2":{"43":1,"243":1,"291":1,"343":1,"351":1}}],["отношение",{"2":{"43":1}}],["оттенок",{"2":{"336":1}}],["отторжение",{"2":{"158":1}}],["оттуда",{"2":{"102":1}}],["отредактирован",{"2":{"554":1}}],["отредактированы",{"2":{"390":1,"393":1}}],["отредактировать",{"2":{"393":1}}],["отредактируйте",{"2":{"393":1}}],["отрендерит",{"2":{"327":1}}],["отреагировать",{"2":{"211":1}}],["отрисовкой",{"2":{"472":1}}],["отрисованные",{"2":{"381":1}}],["отрисовываться",{"2":{"313":1}}],["отрицательных",{"2":{"303":2,"377":1}}],["отрицательные",{"2":{"147":1,"322":1}}],["отрицательного",{"2":{"303":1,"377":1}}],["отражение",{"2":{"367":1}}],["отражалось",{"2":{"317":1}}],["отражаются",{"2":{"199":1}}],["отражается",{"2":{"357":1,"367":1}}],["отражает",{"2":{"151":1,"240":1,"451":1}}],["отражаться",{"2":{"206":1}}],["отражать",{"2":{"126":1,"151":1,"451":1,"452":1}}],["отразятся",{"2":{"245":1}}],["отраслевым",{"2":{"222":1}}],["отраслевыми",{"2":{"150":1}}],["отрасли",{"2":{"160":1,"196":1,"310":1,"347":1}}],["откуда",{"2":{"463":1}}],["отката",{"2":{"421":1}}],["отказывается",{"2":{"343":1}}],["отказа",{"2":{"330":1,"331":1}}],["отказаться",{"2":{"329":1}}],["отказ",{"2":{"144":1,"188":1,"194":1,"254":1,"378":1}}],["отключить",{"2":{"460":1}}],["отключена",{"2":{"390":1}}],["откладывается",{"2":{"436":1}}],["отклонив",{"2":{"444":1}}],["отклонить",{"2":{"241":1,"343":1,"443":1}}],["отклоняется",{"2":{"325":1}}],["отклоняем",{"2":{"303":1}}],["отклоняющий",{"2":{"323":1}}],["отклонения",{"2":{"255":2}}],["отклонение",{"2":{"165":1,"255":1}}],["отклонено",{"2":{"244":1,"303":1}}],["откроем",{"2":{"227":1,"453":1}}],["откройте",{"2":{"223":2,"228":1,"231":1,"346":1,"390":1}}],["откровенного",{"2":{"194":1}}],["открыла",{"2":{"268":1}}],["открыв",{"2":{"228":1}}],["открываемость",{"2":{"363":1}}],["открываем",{"2":{"344":1}}],["открывает",{"2":{"201":1,"240":1,"255":1,"256":1,"282":1,"284":1,"376":1,"381":1}}],["открывается",{"2":{"164":1,"175":1,"193":1,"515":1}}],["открываться",{"2":{"336":1}}],["открывать",{"2":{"254":1,"364":1}}],["открывающем",{"2":{"205":1}}],["открывающих",{"2":{"183":1}}],["открываются",{"2":{"164":1}}],["открыт",{"2":{"515":1}}],["открытия",{"2":{"346":1,"384":1}}],["открытии",{"2":{"254":1}}],["открытие",{"2":{"239":1}}],["открытых",{"2":{"331":1,"364":1}}],["открытый",{"2":{"270":1}}],["открытыми",{"2":{"473":1}}],["открытым",{"2":{"223":1}}],["открытые",{"2":{"115":1}}],["открытого",{"2":{"386":1}}],["открыто",{"2":{"165":1,"339":1}}],["открытом",{"2":{"145":1,"473":1}}],["открыть",{"2":{"143":1,"152":3,"224":1,"241":1,"254":1,"330":1,"331":2,"367":1,"375":1,"390":1,"436":1}}],["отзывами",{"2":{"472":1}}],["отзывчивой",{"2":{"436":1}}],["отзывчивого",{"2":{"181":1,"336":1}}],["отзывчивых",{"2":{"400":1}}],["отзывчивый",{"2":{"181":1}}],["отзывчивые",{"0":{"181":1},"2":{"336":2}}],["отзывчивыми",{"2":{"125":1,"334":1}}],["отзывы",{"2":{"4":1,"47":1,"79":1}}],["отследить",{"2":{"385":1}}],["отслеживать",{"2":{"390":1,"391":2,"396":1}}],["отслеживаться",{"2":{"390":1}}],["отслеживаются",{"2":{"363":1}}],["отслеживании",{"2":{"442":1}}],["отслеживание",{"2":{"370":1,"385":1}}],["отслеживанию",{"2":{"291":1,"296":1}}],["отслеживания",{"2":{"209":1,"222":1,"254":1,"293":1,"364":1,"384":1,"390":1,"460":2}}],["отслеживает",{"2":{"224":1,"460":3}}],["отсутствовавшие",{"2":{"446":1}}],["отсутствует",{"2":{"383":1}}],["отсутствие",{"2":{"370":1}}],["отсутствий",{"2":{"59":1}}],["отсылается",{"2":{"364":1}}],["отсылаю",{"2":{"119":1,"303":1,"316":1,"450":1}}],["отстает",{"2":{"473":1}}],["отстают",{"2":{"336":1}}],["отставать",{"2":{"336":1}}],["отстоит",{"2":{"331":1}}],["отступов",{"2":{"267":1}}],["отступам",{"2":{"154":1}}],["отсюда",{"2":{"227":1,"454":1}}],["отписки",{"2":{"356":1}}],["отпечаток",{"2":{"116":1,"270":1}}],["отправитель",{"2":{"454":1}}],["отправить",{"2":{"143":1,"329":1,"331":1,"437":1,"451":1}}],["отправили",{"2":{"327":1,"328":1}}],["отправленные",{"2":{"324":1}}],["отправленную",{"2":{"308":1,"451":1}}],["отправляя",{"2":{"441":1}}],["отправлять",{"2":{"330":1,"336":1,"355":1,"444":1,"472":1}}],["отправляемого",{"2":{"452":1}}],["отправляем",{"2":{"328":1,"394":1,"445":1,"452":1}}],["отправляемые",{"2":{"204":1}}],["отправляет",{"2":{"116":1,"308":1,"386":1,"438":1,"445":1}}],["отправляется",{"2":{"3":1,"329":1}}],["отправляли",{"2":{"158":1}}],["отправки",{"2":{"330":2,"452":2,"454":1}}],["отправке",{"2":{"291":1}}],["отправка",{"2":{"114":1,"329":1}}],["отправной",{"2":{"238":1,"334":1}}],["отправная",{"2":{"223":1,"224":1,"253":1,"338":1}}],["отправную",{"2":{"119":1,"237":1}}],["отяжелел",{"2":{"50":1}}],["отмечают",{"2":{"372":1}}],["отмечаем",{"2":{"22":1,"97":1}}],["отмеченных",{"2":{"346":1}}],["отмеченным",{"2":{"186":1}}],["отмечена",{"2":{"346":1}}],["отметить",{"2":{"229":1,"231":1,"247":1,"256":2,"276":1,"294":1,"300":1,"308":1,"336":1,"351":1,"357":1,"450":1,"471":1,"473":1}}],["отметим",{"2":{"33":1}}],["отметьте",{"2":{"186":1}}],["отметка",{"2":{"165":1}}],["отменяет",{"2":{"308":1}}],["отменять",{"2":{"158":1}}],["отменены",{"2":{"293":1}}],["отменен",{"2":{"255":1}}],["отменена",{"2":{"229":1,"330":1}}],["отмене",{"2":{"254":1}}],["отмены",{"2":{"188":1}}],["отменит",{"2":{"188":1}}],["отменить",{"2":{"158":1,"194":1,"241":1,"255":1}}],["отдавать",{"2":{"472":1}}],["отдаваемыми",{"2":{"11":1}}],["отдачи",{"2":{"383":1}}],["отделяет",{"2":{"293":1}}],["отделить",{"2":{"463":1,"473":1}}],["отделит",{"2":{"203":1}}],["отделены",{"2":{"178":1}}],["отделку",{"2":{"26":1}}],["отдельная",{"2":{"67":1,"102":1,"117":1,"336":1}}],["отдельного",{"2":{"313":1,"423":1,"463":1,"508":1}}],["отдельности",{"2":{"271":1}}],["отдельном",{"2":{"268":1,"344":1,"359":1,"462":1}}],["отдельно",{"2":{"61":1,"508":1}}],["отдельной",{"2":{"43":1,"90":1,"170":1,"453":1}}],["отдельное",{"2":{"33":1}}],["отдельным",{"2":{"436":1}}],["отдельными",{"2":{"117":1}}],["отдельных",{"2":{"145":1,"229":1,"253":1,"381":1,"382":2,"436":1,"455":1,"555":1}}],["отдельный",{"2":{"9":1,"41":1,"83":1,"85":1,"98":1,"102":1,"105":2,"114":2,"203":1,"268":1,"363":1,"395":1,"423":1,"471":1}}],["отдельные",{"2":{"2":1,"11":1,"79":1}}],["отдельную",{"2":{"3":1,"22":1,"263":1,"339":1,"394":1,"462":1}}],["от",{"0":{"402":1},"2":{"3":1,"22":1,"23":2,"26":1,"39":1,"56":1,"68":1,"70":1,"73":1,"86":1,"108":1,"114":1,"116":1,"117":4,"121":1,"127":1,"130":1,"133":1,"134":4,"140":1,"143":1,"144":2,"146":1,"147":1,"150":1,"151":2,"156":1,"157":2,"161":2,"162":1,"164":1,"165":1,"166":2,"171":1,"176":1,"178":2,"179":1,"181":3,"183":2,"186":1,"188":1,"194":2,"195":2,"196":1,"199":2,"200":3,"201":1,"203":1,"204":3,"208":2,"219":1,"221":1,"222":1,"224":2,"225":3,"227":1,"231":4,"233":1,"238":1,"239":1,"245":2,"246":1,"249":1,"250":1,"251":1,"256":3,"258":1,"260":2,"262":1,"263":1,"268":1,"271":1,"272":2,"276":1,"286":1,"291":1,"293":1,"294":1,"295":3,"297":1,"298":1,"300":1,"301":3,"304":1,"306":1,"324":4,"325":2,"327":1,"328":1,"329":1,"330":5,"331":1,"332":1,"336":3,"343":3,"351":1,"354":1,"356":3,"357":1,"358":1,"363":2,"364":3,"370":1,"372":1,"374":1,"380":1,"383":1,"385":4,"390":1,"394":1,"395":3,"397":1,"402":1,"422":1,"429":1,"436":2,"437":2,"438":1,"440":1,"442":1,"446":3,"447":1,"453":1,"455":1,"460":1,"461":2,"462":3,"463":3,"467":1,"471":1,"473":4,"496":1,"504":1,"507":1,"508":1,"536":1}}],["отводится",{"2":{"151":1}}],["отвечал",{"2":{"454":1}}],["отвечающие",{"2":{"462":1,"463":1}}],["отвечающий",{"2":{"436":1,"454":1}}],["отвечающего",{"2":{"385":1}}],["отвечаем",{"2":{"324":2,"454":1}}],["отвечает",{"2":{"116":1,"149":1,"191":1,"224":1,"237":1,"238":1,"239":2,"240":1,"241":1,"344":1,"353":1,"383":1,"425":1,"557":1}}],["отвечать",{"2":{"6":1,"402":1,"440":1}}],["ответы",{"2":{"443":1}}],["ответственная",{"2":{"462":1}}],["ответственностью",{"2":{"265":2}}],["ответственность",{"2":{"260":1,"263":1,"287":1,"291":1,"324":2}}],["ответственности",{"0":{"263":1,"265":1},"2":{"260":1,"263":4}}],["ответственным",{"2":{"2":1}}],["ответьте",{"2":{"259":1,"348":1}}],["ответить",{"2":{"200":1,"220":1,"383":1}}],["ответов",{"2":{"174":1,"497":2}}],["ответе",{"2":{"117":2}}],["ответах",{"2":{"497":1}}],["ответа",{"2":{"4":2,"301":1,"324":1,"328":1,"329":2,"344":1,"443":1,"452":1,"454":3}}],["ответ",{"2":{"4":1,"117":2,"163":1,"240":1,"308":1,"316":1,"324":2,"326":1,"344":1,"378":1,"381":1,"436":1,"445":1,"454":2,"473":1,"495":1}}],["отвлечься",{"2":{"3":1}}],["н",{"2":{"473":1}}],["нынешними",{"2":{"230":1}}],["ный",{"2":{"71":1}}],["нюансов",{"2":{"117":1,"119":1}}],["нулевой",{"2":{"345":1}}],["нулевые",{"2":{"134":1}}],["нулей",{"2":{"300":1}}],["нуля",{"2":{"200":1,"221":2,"304":1}}],["нули",{"2":{"134":1}}],["ну",{"2":{"83":1,"255":1,"300":1}}],["нуждающихся",{"2":{"362":1}}],["нуждаются",{"2":{"247":1}}],["нужд",{"2":{"323":1,"358":1}}],["нужды",{"2":{"221":1}}],["нужен",{"0":{"385":1},"2":{"17":1,"288":1,"316":3,"345":1,"348":1,"388":1,"421":1,"432":1,"462":2,"472":1,"473":2,"528":1}}],["нужную",{"2":{"289":1,"387":1,"527":1}}],["нужна",{"2":{"12":1,"118":1,"125":1,"200":1,"264":1,"267":1,"423":1,"431":1,"460":1,"465":1}}],["нужное",{"2":{"86":1,"421":1}}],["нужно",{"2":{"12":1,"39":1,"41":2,"59":1,"62":1,"82":1,"83":1,"95":2,"102":1,"112":1,"116":2,"121":1,"123":1,"134":2,"141":1,"147":1,"169":1,"170":1,"200":1,"201":1,"202":1,"204":2,"208":1,"212":1,"221":1,"224":1,"227":2,"230":1,"231":1,"232":1,"239":1,"244":1,"249":1,"250":1,"255":1,"265":1,"287":1,"292":1,"295":1,"303":1,"316":2,"325":1,"329":1,"356":1,"361":1,"372":1,"375":1,"378":1,"390":1,"391":1,"393":1,"421":1,"425":1,"429":2,"432":2,"447":1,"454":1,"460":1,"461":2,"462":2,"464":1,"471":1,"472":2,"473":1}}],["нужного",{"2":{"9":1,"183":1}}],["нужных",{"2":{"460":1,"536":1}}],["нужный",{"2":{"134":1,"195":1,"227":1,"461":1,"540":1}}],["нужные",{"2":{"115":1,"409":1,"552":1}}],["нужны",{"2":{"7":1,"51":1,"103":1,"379":1,"381":1,"424":1,"460":1,"464":1,"472":1,"536":1}}],["нужным",{"2":{"3":1}}],["нём",{"2":{"41":1,"102":1,"468":1}}],["нежелаемые",{"2":{"507":1}}],["нежелательных",{"2":{"226":1}}],["нежелательные",{"2":{"167":1}}],["нежелательная",{"2":{"225":1}}],["неудобно",{"2":{"429":1}}],["неудачей",{"2":{"372":1,"393":1}}],["неудачи",{"2":{"303":2,"372":1}}],["неудачное",{"2":{"462":1}}],["неудачного",{"2":{"303":1}}],["неудачной",{"2":{"244":1,"376":2}}],["неудачный",{"2":{"327":1}}],["неудачные",{"2":{"302":1}}],["неудачным",{"2":{"301":1,"330":1}}],["неудача",{"2":{"301":1}}],["неуклюжим",{"2":{"381":1}}],["нелогично",{"2":{"462":1}}],["нелегкая",{"2":{"373":1}}],["нельзя",{"2":{"86":1,"364":1,"463":1}}],["неэффективным",{"2":{"472":1}}],["неэффективной",{"2":{"356":1}}],["неэтичной",{"2":{"185":1}}],["нецелесообразно",{"2":{"322":1}}],["недействительным",{"2":{"381":1}}],["неделимого",{"2":{"263":1}}],["недопущения",{"2":{"519":1}}],["недопонимание",{"2":{"62":1}}],["недорого",{"2":{"422":1}}],["недочеты",{"2":{"372":1}}],["недостающие",{"2":{"379":1,"383":1}}],["недостаточно",{"2":{"330":1,"334":1,"335":1}}],["недостаток",{"2":{"302":1,"356":1}}],["недостатком",{"2":{"357":1,"436":2}}],["недостатков",{"2":{"243":1,"308":1,"324":1,"330":1}}],["недостатка",{"2":{"222":1,"328":1}}],["недостатки",{"2":{"204":1,"308":1,"324":1,"336":2,"358":1,"375":1}}],["недоступна",{"2":{"125":1}}],["недоумении",{"2":{"168":1}}],["независимы",{"2":{"462":1}}],["независимых",{"2":{"375":2}}],["независимость",{"2":{"423":1}}],["независимо",{"2":{"271":1,"343":1,"354":1,"356":2,"390":1,"423":1}}],["независимое",{"2":{"258":1}}],["незавершенных",{"2":{"231":1}}],["незаслужено",{"2":{"116":1}}],["неиспользуемых",{"2":{"267":1}}],["неиспользуемые",{"2":{"225":1}}],["неисчерпывающими",{"2":{"262":1}}],["неизменяемым",{"2":{"331":1}}],["неизменяемое",{"2":{"204":1}}],["неизменным",{"2":{"287":1}}],["неизбежным",{"2":{"178":1}}],["нечто",{"2":{"221":1,"311":1,"319":1,"359":1,"462":1}}],["нередко",{"2":{"330":1}}],["нереактивных",{"2":{"316":1}}],["нереактивные",{"2":{"204":1}}],["нерационального",{"2":{"267":1}}],["неразличенно",{"2":{"149":1}}],["ненужную",{"2":{"269":1}}],["ненужной",{"2":{"462":1}}],["ненужного",{"2":{"269":1}}],["ненужному",{"2":{"265":1}}],["ненужное",{"2":{"118":1}}],["ненужным",{"2":{"264":1}}],["ненависть",{"2":{"193":1}}],["ненаправленность",{"0":{"191":1}}],["неочевидные",{"2":{"497":1}}],["неотзывчивым",{"2":{"364":1,"436":1}}],["неотъемлемой",{"2":{"243":1,"300":1}}],["неоднократно",{"2":{"290":1,"300":1,"322":1}}],["неоптимизированных",{"2":{"472":1}}],["неопределено",{"2":{"303":1}}],["неопределенное",{"2":{"381":1}}],["неопределенном",{"2":{"168":1,"303":1}}],["неопределенных",{"2":{"303":1}}],["неопределенна",{"2":{"301":1}}],["неопытный",{"2":{"270":1}}],["необязателен",{"2":{"438":1}}],["необязательными",{"2":{"320":1}}],["необязательным",{"2":{"245":1}}],["необязательные",{"2":{"56":1}}],["необычными",{"2":{"400":1}}],["необычно",{"2":{"249":1}}],["необходимую",{"2":{"447":1,"472":1}}],["необходима",{"2":{"356":1}}],["необходим",{"2":{"144":1,"292":1,"362":1,"397":1,"422":1}}],["необходимы",{"2":{"322":1,"325":1,"332":1,"396":1,"424":1}}],["необходимыми",{"2":{"227":1,"293":1,"504":1}}],["необходимым",{"2":{"197":1,"338":1,"507":1}}],["необходимые",{"2":{"133":1,"222":1,"249":1,"336":1,"341":1,"344":1,"416":1,"433":1,"454":1}}],["необходимых",{"2":{"119":1,"131":1,"361":1,"375":1,"556":1}}],["необходимый",{"2":{"50":1,"133":1,"187":1,"473":1}}],["необходимому",{"2":{"157":1}}],["необходимость",{"2":{"102":1,"151":1,"165":1,"240":1,"271":1,"323":1,"385":1,"390":1,"397":1}}],["необходимости",{"2":{"59":1,"119":1,"144":1,"200":2,"204":1,"227":1,"244":2,"288":1,"297":2,"308":1,"309":2,"313":1,"316":1,"322":1,"325":3,"341":1,"358":1,"383":1,"421":1,"424":1,"429":1,"436":1,"442":1,"504":2}}],["необходимое",{"2":{"85":1,"156":1,"241":1,"376":1}}],["необходимой",{"2":{"12":1,"292":1,"293":1}}],["необходимо",{"0":{"339":1},"2":{"9":1,"12":1,"59":1,"116":1,"125":2,"133":1,"134":2,"135":6,"137":1,"140":1,"144":1,"145":1,"146":1,"150":1,"161":1,"183":2,"199":1,"200":3,"204":3,"212":1,"224":1,"225":1,"227":1,"230":1,"237":1,"238":1,"239":2,"243":1,"244":1,"245":1,"247":1,"249":1,"254":1,"255":2,"256":1,"264":1,"265":1,"267":2,"278":2,"281":1,"292":1,"294":1,"295":6,"298":1,"300":1,"301":2,"303":1,"308":1,"310":1,"312":1,"314":1,"316":2,"318":1,"319":1,"322":1,"324":1,"325":2,"326":1,"327":2,"329":1,"330":1,"331":1,"336":2,"343":1,"344":2,"345":2,"356":1,"359":2,"363":1,"373":4,"374":2,"375":1,"376":2,"377":1,"378":1,"379":1,"382":2,"383":1,"388":1,"390":1,"394":1,"397":1,"425":1,"437":1,"438":2,"439":1,"440":1,"447":1,"448":2,"449":1,"454":1,"507":1,"528":1,"529":1,"552":1}}],["негативный",{"2":{"168":1}}],["негативных",{"2":{"168":1,"268":1}}],["него",{"2":{"9":1,"11":1,"86":1,"89":1,"102":1,"104":1,"117":1,"130":2,"144":1,"177":1,"179":1,"182":1,"196":1,"212":1,"222":1,"225":1,"228":1,"231":1,"270":1,"281":1,"319":1,"328":1,"329":1,"353":1,"366":1,"375":1,"379":1,"381":1,"382":1,"386":1,"431":1,"433":1,"462":2,"518":1}}],["неяркой",{"2":{"162":1}}],["неявно",{"2":{"103":1}}],["невероятно",{"2":{"373":1}}],["невелика",{"2":{"316":1}}],["невелик",{"2":{"231":1}}],["невелики",{"2":{"137":1}}],["невозможен",{"2":{"309":1}}],["невозможна",{"2":{"449":1}}],["невозможным",{"2":{"188":1}}],["невозможной",{"2":{"373":1}}],["невозможность",{"2":{"188":1}}],["невозможности",{"2":{"12":1}}],["невозможно",{"2":{"134":1,"142":1,"195":1,"225":1,"256":1,"263":1,"373":1,"462":1,"473":1}}],["невыполненных",{"2":{"229":1}}],["неё",{"2":{"91":1,"95":1,"116":1,"224":1,"331":1,"511":1}}],["нефункциональные",{"0":{"77":1},"2":{"62":1}}],["некую",{"2":{"293":1}}],["некоего",{"2":{"462":1}}],["некое",{"2":{"165":1}}],["некой",{"2":{"116":1}}],["некоторая",{"2":{"331":1}}],["некоторый",{"2":{"232":1}}],["некоторыми",{"2":{"131":2,"228":1,"231":1,"271":1,"317":1,"345":1,"372":1,"446":1}}],["некоторым",{"2":{"131":2,"161":1,"436":1}}],["некоторые",{"2":{"128":1,"130":1,"134":2,"147":1,"150":2,"157":1,"168":1,"172":1,"173":1,"176":1,"188":1,"195":1,"197":1,"199":1,"200":3,"204":2,"221":1,"222":2,"224":3,"225":4,"228":1,"229":1,"233":1,"249":1,"251":1,"261":1,"267":1,"270":1,"291":1,"292":1,"300":1,"308":1,"322":1,"323":1,"328":1,"331":1,"333":2,"336":3,"338":2,"343":1,"348":1,"349":2,"353":1,"364":2,"370":1,"380":2,"384":1,"393":1,"394":1,"443":1,"444":1,"446":1,"460":1,"472":1}}],["некоторых",{"2":{"47":1,"123":1,"149":1,"163":1,"187":1,"195":1,"212":1,"223":1,"224":1,"225":1,"227":1,"235":1,"251":1,"266":1,"276":1,"279":1,"289":1,"325":1,"331":1,"336":2,"351":1,"372":1,"373":1,"382":1,"425":1,"436":1,"450":1}}],["некоторое",{"2":{"204":1,"276":1,"375":1,"376":1}}],["некоторой",{"2":{"126":1,"257":1,"293":1,"294":1,"344":1,"376":1,"381":1,"441":1}}],["некотором",{"2":{"70":1,"330":1,"462":1}}],["некоторую",{"2":{"115":1}}],["некритичными",{"2":{"40":1}}],["некий",{"2":{"9":1,"295":1,"472":1}}],["небольшом",{"2":{"316":1}}],["небольшого",{"2":{"115":1,"116":1,"201":1,"351":1,"365":1}}],["небольшой",{"0":{"100":1},"2":{"105":1,"137":1,"164":1,"231":1,"250":1,"449":1,"453":1,"454":1,"457":1,"472":1}}],["небольшое",{"2":{"38":1,"123":1,"136":1,"165":1,"175":1,"201":1,"212":1}}],["небольших",{"2":{"181":1,"204":1,"244":1,"349":1,"358":1,"383":1,"471":1,"508":1}}],["небольшим",{"2":{"130":1,"200":1,"232":1}}],["небольшими",{"2":{"91":1,"346":1,"367":1}}],["небольшие",{"2":{"79":1,"148":1,"170":1,"269":1}}],["небольшая",{"0":{"257":1},"2":{"86":1}}],["небольшую",{"2":{"2":1,"187":1,"472":1}}],["ней",{"2":{"34":1,"40":1,"115":2,"148":1,"221":1,"250":1,"292":1,"351":1,"364":2,"376":1,"409":1,"413":1,"414":1,"417":1,"452":1,"460":1,"462":1,"465":1,"472":1,"536":1}}],["нетривиальная",{"2":{"433":1}}],["нетривиальные",{"2":{"373":1}}],["нетривиальных",{"2":{"370":1,"385":1}}],["нетерпеливые",{"2":{"167":1}}],["нет",{"2":{"30":1,"32":1,"71":1,"96":1,"116":2,"119":1,"134":1,"144":1,"158":1,"173":1,"178":1,"187":1,"204":2,"207":1,"220":1,"222":1,"223":1,"231":1,"234":1,"257":2,"281":1,"292":1,"297":1,"314":1,"319":1,"322":1,"358":2,"361":1,"375":2,"376":1,"378":2,"402":1,"436":3,"472":1,"473":2}}],["немножко",{"2":{"472":1}}],["немногие",{"2":{"189":1}}],["немного",{"2":{"86":1,"98":1,"201":1,"219":1,"226":1,"232":1,"248":1,"298":1,"303":1,"311":1,"319":1,"325":1,"336":3,"360":1,"448":1,"463":1,"465":1,"471":1}}],["немедленным",{"2":{"445":1}}],["немедленное",{"2":{"441":1}}],["немедленно",{"2":{"256":1,"357":1}}],["немодифицированный",{"2":{"295":1}}],["нему",{"2":{"116":1,"117":1,"139":1,"249":1,"316":1,"322":1,"381":1,"394":1,"433":1,"462":1}}],["немаленький",{"2":{"44":1}}],["нем",{"2":{"29":1,"32":1,"95":1,"116":2,"117":1,"182":1,"199":1,"200":1,"297":1,"300":1,"362":1,"364":1,"376":1,"380":1,"421":2,"422":1,"436":1,"448":1,"473":1,"498":1}}],["непустое",{"2":{"207":1}}],["непрямой",{"2":{"462":1}}],["непрактичным",{"2":{"385":1}}],["неправильно",{"2":{"325":1}}],["неправильном",{"2":{"208":1,"330":1}}],["неприятных",{"2":{"250":1}}],["непрерывно",{"2":{"395":1}}],["непрерывной",{"2":{"143":1}}],["непрерывная",{"0":{"395":1},"2":{"394":1,"395":3,"419":1}}],["непредусмотренные",{"2":{"185":1}}],["непроизвольным",{"2":{"360":1}}],["непроизвольных",{"2":{"168":1}}],["непростой",{"2":{"98":1}}],["непростая",{"2":{"25":1}}],["неплохим",{"2":{"115":1}}],["неплохой",{"2":{"464":1}}],["неплохо",{"2":{"92":1,"105":1,"299":1,"473":1,"539":1}}],["неполным",{"2":{"394":1}}],["неполный",{"0":{"262":1},"1":{"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1},"2":{"119":1,"160":1,"163":1,"260":1,"272":1}}],["непостоянен",{"2":{"232":1}}],["непосредственный",{"2":{"183":1}}],["непосредственное",{"2":{"184":1}}],["непосредственно",{"2":{"40":1,"122":1,"137":1,"143":1,"183":1,"202":1,"223":1,"224":2,"225":2,"231":1,"243":1,"264":1,"267":2,"281":1,"295":1,"298":1,"319":1,"331":2,"344":1,"345":1,"381":2,"438":1,"443":1,"447":1,"448":1,"460":1,"503":1,"507":1}}],["непонятным",{"2":{"224":1}}],["неподкованых",{"2":{"12":1}}],["нее",{"2":{"23":1,"173":1,"204":1,"355":1,"357":1,"391":1,"392":1,"462":1,"463":1}}],["несущественные",{"2":{"482":1}}],["нестандартные",{"2":{"473":1}}],["нестандартных",{"2":{"324":1}}],["нести",{"2":{"324":1}}],["несем",{"2":{"324":1}}],["несмотря",{"2":{"167":2,"271":1,"351":1,"375":1,"376":1,"449":1,"473":1}}],["несовместимости",{"2":{"199":2}}],["несомненно",{"2":{"147":1}}],["несоответствия",{"2":{"393":1}}],["несоответствие",{"2":{"122":2,"393":1}}],["несоответствию",{"2":{"62":1}}],["несложен",{"2":{"144":1}}],["несложных",{"2":{"472":1}}],["несложный",{"2":{"12":1}}],["несложно",{"2":{"22":1,"39":1,"58":1,"116":1,"425":1}}],["несколькими",{"2":{"228":1,"247":1,"257":1,"331":1,"456":1}}],["нескольким",{"2":{"117":1,"246":1,"269":1}}],["нескольких",{"2":{"43":1,"124":1,"133":1,"134":2,"204":1,"223":1,"230":1,"241":1,"243":1,"250":1,"259":1,"260":1,"265":1,"271":1,"311":1,"317":1,"330":1,"334":1,"347":1,"356":1,"364":1,"385":2,"393":1,"423":1,"425":1,"432":1,"440":1,"447":1,"454":1,"461":1,"462":1,"463":1,"504":1}}],["несколько",{"2":{"11":1,"29":1,"38":1,"99":1,"109":2,"132":1,"134":3,"137":1,"158":1,"162":1,"167":2,"181":1,"183":1,"190":1,"195":2,"198":1,"200":1,"201":1,"202":3,"204":1,"211":2,"212":1,"224":1,"227":2,"231":1,"241":2,"243":1,"244":2,"246":2,"249":3,"256":1,"257":1,"262":1,"265":2,"268":1,"271":1,"291":1,"297":1,"300":1,"302":1,"306":1,"319":2,"322":1,"323":1,"325":2,"332":1,"336":1,"343":1,"344":1,"351":1,"354":1,"356":1,"364":2,"375":3,"376":3,"380":1,"381":1,"421":1,"425":3,"436":1,"449":1,"453":1,"455":1,"462":2,"464":1,"472":1}}],["несвязанные",{"2":{"3":1}}],["не",{"0":{"118":1,"268":1},"2":{"3":1,"10":2,"17":1,"22":2,"23":1,"26":1,"32":1,"33":1,"39":3,"40":1,"41":1,"48":1,"50":1,"51":1,"56":1,"59":2,"65":1,"67":1,"68":1,"73":3,"74":1,"76":1,"86":1,"92":1,"93":2,"96":1,"104":1,"105":2,"114":1,"115":4,"116":4,"117":3,"118":2,"119":4,"121":2,"122":1,"123":4,"124":2,"125":1,"129":1,"131":1,"133":1,"134":4,"136":1,"137":4,"139":1,"140":1,"141":2,"142":1,"143":2,"144":2,"148":1,"149":1,"150":2,"152":3,"154":3,"156":1,"161":2,"162":1,"165":3,"166":1,"167":1,"168":4,"170":5,"171":1,"173":1,"174":3,"175":2,"176":1,"178":5,"179":1,"182":3,"184":1,"186":4,"187":3,"188":1,"190":2,"192":1,"194":2,"195":1,"196":1,"199":2,"200":3,"201":2,"202":2,"203":2,"204":9,"206":1,"207":1,"208":1,"209":1,"211":2,"212":4,"213":1,"218":2,"221":3,"222":1,"223":6,"224":5,"225":3,"226":1,"227":5,"228":8,"230":2,"232":3,"234":1,"235":2,"238":1,"240":1,"241":3,"243":1,"244":1,"245":1,"246":2,"247":3,"249":5,"250":2,"251":4,"255":2,"256":3,"260":4,"261":2,"263":1,"264":3,"265":1,"266":3,"267":4,"268":3,"269":2,"270":2,"271":1,"276":1,"277":1,"280":1,"281":2,"284":1,"286":5,"287":4,"288":2,"289":2,"292":5,"294":1,"295":4,"296":1,"297":2,"298":1,"300":3,"301":7,"302":4,"303":5,"308":6,"310":2,"313":4,"316":6,"318":1,"319":3,"321":1,"322":1,"324":2,"325":3,"327":1,"328":2,"329":4,"330":6,"331":4,"333":1,"336":6,"338":3,"339":1,"341":2,"343":1,"344":7,"346":2,"347":1,"351":3,"353":4,"356":1,"358":1,"359":2,"360":1,"363":2,"364":11,"365":1,"366":1,"370":1,"371":1,"372":3,"373":1,"375":2,"376":4,"377":5,"378":2,"379":1,"380":1,"381":3,"382":3,"384":1,"385":3,"388":1,"390":6,"391":4,"392":1,"393":3,"394":1,"397":1,"419":1,"421":1,"424":1,"425":2,"429":1,"431":1,"433":7,"435":1,"436":11,"440":2,"441":1,"443":1,"445":1,"446":1,"447":3,"448":5,"449":4,"454":2,"455":1,"456":1,"459":1,"460":7,"461":1,"462":11,"463":6,"464":3,"465":5,"466":1,"468":2,"471":1,"472":10,"473":5,"497":1,"503":1,"504":3,"507":2,"508":1,"518":1,"528":2,"539":1,"555":1}}],["ни",{"2":{"204":1,"249":1,"276":1,"287":1,"324":1,"359":1,"364":3,"374":1,"375":1,"376":1,"391":1}}],["низкоуровневый",{"2":{"507":1}}],["низком",{"2":{"295":1}}],["низкие",{"2":{"137":1}}],["низвело",{"2":{"102":1}}],["никогда",{"2":{"118":1,"134":1,"170":1,"224":1,"228":1,"243":1,"330":1,"344":1,"473":1}}],["никаким",{"2":{"316":1}}],["никакие",{"2":{"230":1}}],["никаких",{"2":{"118":1,"381":1,"462":1}}],["никакого",{"2":{"187":1}}],["никакой",{"2":{"171":1,"256":1,"257":1,"462":1,"472":1}}],["никак",{"2":{"3":1,"316":1}}],["нижняя",{"2":{"542":1}}],["нижний",{"2":{"153":1,"255":1}}],["нижней",{"2":{"170":1,"171":1,"173":1,"181":1,"183":1,"343":1}}],["нижнем",{"2":{"150":1,"152":1,"156":2,"183":1,"214":1,"230":1}}],["нижнее",{"2":{"85":1}}],["ниже",{"2":{"10":1,"117":1,"125":1,"137":1,"160":1,"163":1,"165":1,"183":2,"247":1,"319":1,"320":1,"331":1,"392":1,"495":1}}],["ниша",{"2":{"72":1}}],["нивелирования",{"2":{"41":1}}],["ничем",{"2":{"32":1}}],["ничего",{"2":{"10":1,"158":1,"202":1,"204":1,"364":1,"445":1,"473":1}}],["нибудь",{"2":{"12":1,"158":1,"327":1}}],["ним",{"2":{"9":1,"17":1,"48":1,"50":2,"53":1,"102":1,"134":1,"170":1,"225":1,"300":1,"304":1,"311":1,"330":1,"381":2,"436":1,"446":1,"454":1,"468":1,"472":1,"473":1,"513":1}}],["ними",{"2":{"2":1,"34":1,"43":1,"104":1,"116":1,"134":1,"197":1,"200":2,"203":1,"224":1,"231":1,"238":1,"297":1,"304":1,"306":1,"315":1,"322":1,"323":1,"330":1,"344":1,"347":1,"351":1,"364":1,"366":1,"386":1,"425":1,"436":1}}],["них",{"2":{"6":1,"39":1,"41":1,"68":1,"79":1,"123":2,"134":2,"152":1,"160":1,"162":1,"167":1,"173":1,"181":1,"185":1,"195":2,"199":1,"200":1,"204":2,"205":1,"212":1,"225":2,"227":1,"231":1,"239":1,"246":1,"247":1,"248":1,"249":2,"251":1,"256":1,"263":1,"264":1,"270":1,"276":1,"281":1,"291":1,"292":1,"293":1,"297":1,"300":1,"303":1,"308":2,"311":1,"316":3,"322":2,"343":1,"344":1,"349":2,"364":1,"366":1,"373":1,"376":2,"379":1,"380":1,"385":3,"386":1,"391":1,"408":1,"432":1,"436":1,"441":2,"444":1,"460":1,"461":1,"464":1,"466":1}}],["ночных",{"2":{"395":1}}],["ноут",{"2":{"433":1}}],["ноу",{"2":{"385":1}}],["ное",{"2":{"383":1}}],["нормальный",{"2":{"283":1}}],["нормально",{"2":{"71":1,"472":1}}],["нормальному",{"2":{"38":1}}],["нотации",{"2":{"439":1}}],["нотация",{"2":{"381":1}}],["нотацией",{"2":{"322":1}}],["нотаций",{"2":{"239":1}}],["нотацию",{"2":{"205":1,"230":1,"313":3,"363":1}}],["нотированной",{"2":{"124":1}}],["носят",{"2":{"194":1,"396":1}}],["носит",{"2":{"132":1,"148":1,"197":1}}],["номер",{"2":{"437":1,"472":1}}],["номера",{"2":{"329":1,"330":1}}],["номеров",{"2":{"170":1}}],["номером",{"2":{"170":1}}],["номеру",{"2":{"170":1}}],["новички",{"2":{"402":1}}],["новичка",{"2":{"118":1}}],["новейшим",{"2":{"244":1}}],["нова",{"2":{"227":1}}],["новая",{"2":{"127":1,"170":1,"193":1,"226":1,"256":1,"257":1,"302":1,"308":1,"472":1}}],["новую",{"2":{"226":1,"253":1,"306":1,"308":1,"383":1,"393":1,"447":1,"448":1,"465":1,"545":1}}],["нововведением",{"2":{"462":1}}],["новой",{"2":{"221":1,"223":1,"251":1,"256":1,"295":1,"319":1,"383":1,"421":1,"448":1,"471":1,"539":1,"555":1}}],["новое",{"0":{"311":1,"476":1,"481":1,"484":1,"487":1},"2":{"200":1,"303":1,"331":1,"421":1}}],["новостных",{"2":{"308":1,"462":1}}],["новостные",{"2":{"167":1}}],["новостей",{"2":{"186":1,"462":1}}],["новому",{"2":{"259":1}}],["новом",{"2":{"127":2,"241":1,"255":1,"311":1}}],["нового",{"0":{"256":1,"257":1},"2":{"119":1,"125":1,"204":1,"221":2,"256":1,"310":1,"318":1,"329":1,"330":1,"357":1,"372":1,"437":1,"463":1,"495":1}}],["новыми",{"2":{"332":1}}],["новым",{"2":{"147":1,"204":1,"303":1,"451":1}}],["новые",{"0":{"128":1},"2":{"128":1,"134":1,"170":2,"171":1,"179":1,"199":3,"238":1,"251":1,"252":1,"256":1,"308":1,"311":2,"314":1,"315":1,"319":1,"323":1,"333":1,"358":1,"368":1,"370":1,"384":1,"393":1,"400":1,"433":1,"446":1,"449":1,"463":1,"473":1}}],["новый",{"2":{"105":1,"119":3,"127":1,"130":1,"162":1,"171":1,"187":2,"203":1,"204":1,"212":2,"223":2,"238":2,"246":1,"281":1,"316":2,"320":1,"329":1,"331":1,"350":1,"390":1,"394":1,"401":1,"432":1,"465":1}}],["новых",{"2":{"2":1,"128":1,"165":1,"221":1,"239":1,"256":2,"308":2,"334":1,"363":1,"364":1,"400":1,"421":1,"434":1,"444":1,"447":1,"498":1,"557":1}}],["но",{"2":{"3":1,"9":1,"17":1,"22":3,"23":1,"26":3,"29":1,"39":1,"41":1,"44":1,"59":1,"65":1,"68":1,"85":1,"86":2,"92":1,"93":1,"97":1,"104":1,"105":2,"115":3,"116":3,"118":1,"119":3,"123":1,"125":1,"130":3,"131":1,"134":2,"137":4,"138":1,"140":1,"149":2,"153":1,"154":2,"159":1,"162":1,"163":2,"164":2,"165":2,"167":1,"168":2,"171":2,"173":1,"178":3,"179":1,"181":2,"182":1,"187":1,"190":1,"193":1,"195":1,"196":1,"199":1,"200":6,"201":1,"202":1,"203":3,"204":9,"207":1,"208":1,"210":1,"211":1,"212":2,"213":1,"218":1,"222":2,"223":2,"224":3,"225":2,"227":3,"228":2,"239":1,"246":1,"247":1,"248":2,"249":2,"250":1,"251":1,"255":1,"256":3,"257":2,"258":1,"260":1,"265":2,"266":1,"268":2,"270":2,"286":1,"287":3,"289":2,"292":1,"295":5,"297":3,"299":1,"300":2,"301":2,"302":3,"303":3,"304":1,"308":1,"309":1,"310":1,"311":1,"313":1,"316":1,"317":1,"319":2,"323":1,"324":2,"325":2,"330":4,"331":2,"334":1,"336":6,"338":2,"339":3,"342":1,"343":1,"344":1,"345":1,"349":1,"350":1,"351":2,"353":2,"356":3,"359":1,"360":1,"361":1,"363":3,"364":3,"372":1,"373":2,"374":1,"375":4,"376":2,"380":3,"381":2,"384":1,"385":1,"386":1,"390":1,"392":1,"393":1,"394":2,"402":1,"419":1,"421":1,"425":1,"429":1,"433":1,"434":1,"436":3,"440":2,"443":1,"444":1,"449":1,"460":2,"461":1,"462":4,"463":5,"464":2,"465":2,"472":5,"473":4,"507":1,"512":1,"516":1,"548":1}}],["нахождение",{"2":{"536":1}}],["находят",{"2":{"462":1}}],["находятся",{"2":{"143":1,"154":1,"183":1,"423":1,"473":1,"538":1}}],["находимся",{"2":{"391":1}}],["находим",{"2":{"98":1,"381":1,"444":1}}],["находит",{"2":{"227":1}}],["находить",{"2":{"149":1,"267":1}}],["находиться",{"2":{"17":1,"43":1,"294":1,"310":2,"440":1}}],["находится",{"2":{"48":1,"144":1,"150":1,"162":2,"168":1,"186":1,"212":1,"227":1,"255":1,"303":1,"324":1,"344":1,"356":2,"390":1,"462":1,"473":1,"518":1,"549":1,"556":1}}],["находились",{"2":{"47":1}}],["накладные",{"2":{"357":1}}],["накладывает",{"2":{"270":1,"271":1}}],["наконец",{"2":{"141":1,"199":2,"201":1,"228":1,"231":2,"250":2,"255":1,"292":1,"296":1,"313":1,"317":1,"325":1,"338":1,"366":1,"382":1,"393":1,"443":2,"444":1,"454":1}}],["научиться",{"2":{"385":1,"400":1}}],["научимся",{"2":{"373":1,"386":1}}],["научились",{"2":{"258":1,"347":1,"381":1}}],["научных",{"2":{"199":1}}],["наоборот",{"2":{"204":1,"333":1,"364":1}}],["нажали",{"2":{"381":1}}],["нажав",{"2":{"346":1}}],["нажатию",{"2":{"515":1}}],["нажатии",{"2":{"255":1,"445":1,"546":1,"548":1}}],["нажатием",{"2":{"164":1,"223":1}}],["нажать",{"2":{"152":1,"227":1}}],["нажимая",{"2":{"381":1}}],["нажимать",{"2":{"229":1}}],["нажимает",{"2":{"193":1,"329":1}}],["нажмите",{"2":{"223":3,"346":1,"527":1}}],["нажмет",{"2":{"212":1}}],["нагружает",{"2":{"472":1}}],["нагрузке",{"2":{"325":1,"442":1}}],["нагрузку",{"2":{"325":1,"444":1}}],["нагрузки",{"2":{"140":1,"325":1,"452":1}}],["наглядные",{"2":{"349":1}}],["наглядно",{"2":{"171":1}}],["наглядность",{"2":{"168":1}}],["наглядности",{"2":{"122":1}}],["наглядной",{"2":{"163":1}}],["наглядного",{"2":{"62":1}}],["нанимаемой",{"2":{"134":1}}],["наивная",{"2":{"292":1}}],["наивной",{"2":{"291":1,"292":1,"293":1,"295":1}}],["наивную",{"2":{"287":1}}],["наименьшими",{"2":{"464":1}}],["наименьшей",{"2":{"238":1}}],["наименования",{"2":{"22":1,"508":1}}],["наилучшим",{"2":{"237":1,"241":1}}],["наибольшую",{"2":{"193":1}}],["наиболее",{"2":{"134":2,"137":1,"147":1,"163":1,"181":1,"183":1,"190":1,"197":1,"199":1,"204":1,"205":1,"220":1,"222":2,"224":1,"227":1,"241":1,"269":1,"271":1,"308":2,"319":1,"322":3,"324":1,"328":1,"331":2,"334":1,"338":1,"363":1,"369":1,"374":1,"385":1,"392":1,"394":1,"400":1,"407":1,"415":1,"432":1,"442":1,"449":2,"464":1,"497":1}}],["налету",{"2":{"472":1,"536":1}}],["налево",{"2":{"134":1}}],["наложенный",{"2":{"343":1}}],["налогов",{"2":{"192":1}}],["наличии",{"2":{"322":1}}],["наличия",{"2":{"267":1,"322":1,"338":1,"341":1,"463":1}}],["наличие",{"2":{"12":1,"144":1,"176":1,"228":1,"231":1,"286":1,"303":1,"330":1,"375":1,"377":1,"461":1}}],["навязывающим",{"2":{"507":1}}],["навык",{"2":{"349":1}}],["навыков",{"2":{"221":1}}],["навыки",{"2":{"145":1,"233":1,"306":1,"332":1,"368":1,"370":1,"396":1}}],["навигационная",{"2":{"542":1}}],["навигационное",{"2":{"542":1}}],["навигационного",{"2":{"313":1}}],["навигационной",{"2":{"174":1}}],["навигационных",{"2":{"313":1,"317":1,"324":1,"514":1}}],["навигационные",{"2":{"238":1,"313":1,"319":1}}],["навигационный",{"2":{"183":1}}],["навигацией",{"2":{"172":1,"309":1,"332":1,"339":1}}],["навигацию",{"2":{"170":1,"309":2,"311":1,"315":1,"316":1,"319":1,"322":1,"324":1,"383":1}}],["навигации",{"0":{"172":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1},"2":{"134":1,"167":1,"173":1,"174":2,"176":1,"178":1,"181":2,"251":1,"309":1,"310":2,"317":1,"318":1,"321":1,"322":1,"332":1,"343":1}}],["навигация",{"0":{"317":1},"1":{"318":1,"319":1},"2":{"127":1,"136":1,"144":1,"170":1,"309":1,"313":1,"319":1,"548":1}}],["наведение",{"2":{"164":1}}],["наведем",{"2":{"91":1}}],["наверное",{"2":{"287":1,"443":1,"463":1,"472":1}}],["наверняка",{"2":{"48":1}}],["наверх",{"2":{"30":1}}],["натянуть",{"2":{"464":1}}],["нативная",{"2":{"295":1}}],["нативного",{"2":{"336":1,"463":1,"472":1}}],["нативное",{"2":{"166":1,"334":1}}],["нативно",{"2":{"162":1}}],["нативный",{"2":{"554":1}}],["нативным",{"2":{"472":1}}],["нативными",{"2":{"199":1,"343":1}}],["нативные",{"2":{"125":1,"295":1}}],["нативных",{"2":{"123":1,"251":1,"300":2,"472":1}}],["нативную",{"2":{"123":1}}],["натуры",{"2":{"9":1}}],["набросать",{"2":{"255":1}}],["набросок",{"2":{"237":1}}],["набрать",{"2":{"331":1}}],["набранный",{"2":{"231":1}}],["набрав",{"2":{"224":1}}],["набирает",{"2":{"231":1,"330":1}}],["набирать",{"2":{"228":1}}],["набирают",{"2":{"218":1}}],["набираются",{"2":{"215":1}}],["наберите",{"2":{"223":1}}],["наблюдает",{"2":{"291":1}}],["наблюдающий",{"2":{"171":1}}],["наблюдателю",{"2":{"292":1}}],["наблюдателей",{"2":{"291":4}}],["наблюдатели",{"2":{"291":3}}],["наблюдатель",{"0":{"291":1},"1":{"292":1},"2":{"291":2,"292":2}}],["наблюдателям",{"2":{"291":1,"292":1}}],["наблюдателя",{"2":{"170":1,"291":1,"295":1}}],["наблюдать",{"2":{"157":1,"291":1}}],["наблюдении",{"2":{"105":1}}],["набором",{"2":{"381":1}}],["наборов",{"2":{"373":1}}],["набору",{"2":{"289":1}}],["наборы",{"2":{"200":1,"202":1}}],["наборе",{"2":{"170":1}}],["наборами",{"2":{"376":1}}],["набора",{"2":{"152":1,"170":1,"221":1,"324":1}}],["набор",{"2":{"63":1,"150":1,"170":2,"199":1,"213":1,"264":1,"303":1,"308":1,"338":1,"375":2,"379":1,"394":1,"422":1}}],["назовите",{"2":{"333":1}}],["назвать",{"2":{"198":1,"234":1,"446":1}}],["названную",{"2":{"358":1}}],["названный",{"2":{"204":1,"313":1,"437":1}}],["названа",{"2":{"189":1}}],["названий",{"2":{"191":1}}],["названиемстор",{"2":{"462":1}}],["названием",{"2":{"158":1,"230":1,"251":1,"281":1,"292":1,"343":1,"373":1,"527":1}}],["название",{"2":{"44":1,"89":1,"108":1,"109":1,"164":1,"168":1,"204":1,"308":1,"338":1,"450":1,"473":1,"528":1}}],["названиями",{"2":{"311":1}}],["названия",{"2":{"22":1,"97":1,"168":1,"295":1,"336":1,"339":1}}],["назад",{"2":{"147":1,"167":1,"232":1,"256":1,"322":2,"339":1,"460":1}}],["назначению",{"2":{"455":1}}],["назначение",{"2":{"136":1,"250":1,"300":1,"322":1,"345":1}}],["назначения",{"2":{"133":1,"291":1,"449":1}}],["называть",{"2":{"224":1,"462":2}}],["называют",{"2":{"165":1,"271":1,"291":1,"308":2,"323":1}}],["называются",{"2":{"134":2,"135":1,"176":1,"249":1,"291":1,"331":2}}],["называет",{"2":{"423":1}}],["называется",{"2":{"102":1,"124":1,"137":1,"170":2,"183":1,"189":1,"201":1,"210":1,"247":1,"284":1,"308":1,"385":1,"386":2,"391":1,"395":1,"460":1,"462":1,"527":1,"536":1}}],["называемому",{"2":{"331":1}}],["называемой",{"2":{"134":1,"203":1}}],["называемая",{"2":{"295":1}}],["называемую",{"2":{"281":1,"353":1}}],["называемыми",{"2":{"436":1}}],["называемых",{"2":{"308":1}}],["называемые",{"2":{"205":1,"249":1,"303":1,"331":1,"336":1,"462":1}}],["называемый",{"2":{"204":1,"249":1,"291":1,"440":1}}],["начнут",{"2":{"390":1}}],["начните",{"2":{"372":1}}],["начнем",{"2":{"213":1,"221":1,"231":1,"249":1,"255":1,"303":1,"304":1,"311":1,"313":1,"315":1,"316":1,"317":2,"353":1,"354":1,"358":1,"365":1,"366":1,"375":2,"376":2,"379":1,"386":1,"442":1,"443":1,"444":1}}],["начнется",{"2":{"202":1}}],["начнете",{"2":{"181":1,"400":1}}],["начаться",{"2":{"436":1}}],["начать",{"2":{"115":1,"147":1,"200":1,"222":1,"259":1,"379":1,"390":1,"393":1,"409":1}}],["началу",{"2":{"376":1}}],["начали",{"2":{"233":1,"300":1,"391":1}}],["начальная",{"2":{"238":1}}],["начальный",{"2":{"238":1,"487":1}}],["начальных",{"2":{"224":1,"334":1}}],["начальным",{"2":{"171":1,"221":1,"235":1,"358":1}}],["начального",{"2":{"394":1,"473":1}}],["начальной",{"2":{"224":1}}],["начальное",{"2":{"208":1}}],["начальном",{"2":{"11":1,"226":1}}],["начало",{"2":{"221":1,"386":1,"450":1}}],["началось",{"2":{"168":1}}],["началом",{"2":{"157":1,"473":1}}],["начале",{"2":{"83":1,"144":1,"183":1,"194":1,"201":1,"256":1,"283":1,"436":1,"450":1}}],["начала",{"2":{"22":1,"70":1,"150":1,"213":1,"256":1,"324":1,"344":1,"372":1,"375":1,"378":1,"436":1,"472":1,"507":1,"556":1}}],["начинаниях",{"2":{"405":1}}],["начинаете",{"2":{"350":1}}],["начинает",{"2":{"256":1,"454":1}}],["начинается",{"2":{"216":1,"231":2,"263":1,"319":1,"381":1,"400":1}}],["начинаем",{"2":{"231":1,"250":1,"255":2,"297":1,"303":1,"356":1,"360":1,"361":1,"381":1,"447":1}}],["начинаешь",{"2":{"89":1}}],["начинающим",{"2":{"508":1}}],["начинающий",{"2":{"507":1}}],["начинающих",{"2":{"433":1,"497":1}}],["начинающихся",{"2":{"231":1}}],["начинающему",{"2":{"473":1}}],["начинающемся",{"2":{"231":1}}],["начинающуюся",{"2":{"205":1}}],["начинаются",{"2":{"215":2,"318":1}}],["начинаться",{"2":{"215":1}}],["начинать",{"2":{"118":1,"200":1}}],["начиная",{"2":{"76":2,"145":1,"183":1,"203":1,"224":2,"238":1,"261":1,"263":1,"303":1,"332":1,"356":1,"410":1}}],["найдете",{"2":{"227":1}}],["найдем",{"2":{"95":1,"267":1}}],["найдена",{"2":{"288":1}}],["найдены",{"2":{"286":1}}],["найденные",{"2":{"27":1,"144":1}}],["найдено",{"2":{"10":2,"364":1}}],["найти",{"2":{"71":1,"125":1,"127":1,"129":1,"141":1,"142":1,"144":1,"148":1,"150":1,"152":1,"156":1,"157":1,"158":1,"161":1,"162":1,"211":1,"212":1,"222":2,"225":1,"226":1,"227":1,"228":1,"235":1,"236":1,"251":1,"255":1,"263":1,"307":1,"322":3,"325":1,"329":1,"343":1,"344":1,"362":1,"363":1,"364":1,"371":1,"374":1,"376":1,"380":1,"381":1,"382":1,"383":1,"388":1,"389":1,"447":1}}],["наряду",{"2":{"308":1,"347":1,"461":1}}],["нарезку",{"2":{"238":1}}],["нарушена",{"2":{"447":1}}],["нарушению",{"2":{"62":1}}],["нарушить",{"2":{"370":1}}],["нарушит",{"2":{"265":1}}],["нарушать",{"2":{"436":1}}],["нарушает",{"2":{"178":2,"243":1,"286":1,"291":1}}],["нарушаются",{"2":{"229":1}}],["нарушают",{"2":{"173":1}}],["наращивать",{"2":{"11":1,"199":1}}],["наполнения",{"2":{"506":1,"508":1}}],["напомним",{"2":{"301":1,"354":1}}],["напишите",{"2":{"372":1}}],["напишем",{"2":{"211":1,"377":1,"378":1}}],["написали",{"2":{"141":1}}],["написание",{"2":{"372":1,"461":1}}],["написанию",{"2":{"227":1,"380":1}}],["написании",{"2":{"218":1,"472":1,"473":1}}],["написания",{"2":{"115":1,"171":1,"199":1,"203":3,"212":1,"336":1,"380":1,"390":1}}],["написаны",{"2":{"202":1,"376":1}}],["написано",{"2":{"200":1}}],["написанным",{"2":{"461":1}}],["написанный",{"2":{"10":1,"115":1,"200":1}}],["написанную",{"2":{"56":1}}],["написан",{"2":{"50":1,"89":1,"372":1}}],["написать",{"2":{"12":1,"26":1,"41":1,"89":1,"104":1,"115":2,"231":1,"255":1,"268":1,"373":1,"376":1,"438":1,"472":1,"473":1}}],["напротив",{"2":{"322":1}}],["направленные",{"2":{"197":1}}],["направленную",{"2":{"186":1}}],["направление",{"2":{"381":1}}],["направлением",{"0":{"153":1}}],["направлению",{"2":{"181":1}}],["направлении",{"2":{"156":2,"182":1,"247":1}}],["направлений",{"2":{"156":1}}],["направляя",{"2":{"182":1}}],["направляют",{"2":{"149":1}}],["направляться",{"2":{"139":1}}],["направлять",{"2":{"134":1,"135":1,"137":1}}],["направляется",{"2":{"116":1}}],["направляет",{"2":{"116":1,"293":1,"294":1}}],["направить",{"2":{"151":1,"440":1}}],["напрямую",{"2":{"23":1,"56":1,"196":1,"201":1,"204":1,"231":1,"265":1,"281":1,"286":1,"295":1,"316":1,"344":1,"358":1,"363":1,"364":1,"376":1,"432":1,"436":1,"437":1,"440":1,"460":1,"465":1,"466":1,"472":1}}],["например",{"2":{"3":1,"12":1,"16":1,"18":1,"22":1,"41":2,"47":2,"48":1,"59":1,"91":1,"98":1,"103":1,"115":6,"116":6,"117":1,"124":2,"125":1,"126":1,"128":1,"134":4,"135":1,"136":1,"143":1,"150":2,"152":1,"154":1,"156":1,"157":1,"163":2,"164":2,"167":1,"168":2,"170":2,"173":1,"174":2,"178":3,"179":2,"182":1,"183":1,"184":1,"188":1,"191":1,"200":3,"204":4,"206":1,"207":1,"209":1,"211":1,"212":1,"214":1,"215":4,"216":1,"217":1,"218":1,"224":2,"225":1,"227":2,"228":1,"231":1,"232":1,"239":1,"240":1,"245":3,"247":2,"249":4,"250":1,"263":2,"267":1,"268":1,"271":1,"278":3,"282":1,"284":2,"290":1,"292":1,"293":1,"294":1,"295":3,"296":1,"297":1,"300":1,"301":1,"303":1,"313":1,"319":1,"323":1,"325":2,"327":1,"328":2,"329":1,"330":4,"331":1,"336":3,"340":1,"341":1,"342":1,"343":2,"353":1,"354":1,"362":1,"364":2,"372":1,"373":1,"376":2,"377":2,"378":1,"382":1,"387":1,"391":1,"394":2,"395":1,"419":2,"423":3,"424":2,"425":2,"429":1,"433":2,"436":1,"437":1,"438":1,"441":1,"449":2,"450":1,"462":5,"463":4,"465":1,"466":1,"469":1,"472":2,"504":2,"548":1}}],["намекнули",{"2":{"304":1}}],["намекает",{"2":{"256":1}}],["намеренная",{"0":{"377":1}}],["намеренное",{"2":{"194":1}}],["намеренно",{"2":{"190":1,"229":1}}],["намереваясь",{"2":{"193":1}}],["намечены",{"2":{"36":1}}],["намеченные",{"2":{"10":1}}],["нами",{"2":{"134":1,"178":1,"230":1,"303":1,"313":1,"327":1,"395":1}}],["намного",{"2":{"13":1,"23":1,"47":1,"56":1,"308":1,"433":1,"462":1,"463":2,"466":1,"471":2,"472":3,"473":1}}],["нам",{"2":{"7":1,"39":2,"41":1,"50":1,"51":1,"121":1,"133":2,"134":1,"135":5,"137":4,"140":1,"141":1,"149":1,"158":1,"169":1,"170":1,"199":1,"200":1,"201":1,"202":2,"204":3,"211":1,"212":2,"223":1,"224":3,"227":1,"228":1,"229":1,"230":2,"231":5,"239":1,"240":1,"241":3,"243":1,"244":1,"247":2,"248":1,"249":1,"250":1,"255":3,"257":1,"258":1,"264":1,"287":1,"288":2,"290":1,"295":2,"296":1,"297":1,"298":1,"303":3,"309":1,"316":4,"319":3,"322":1,"323":2,"325":2,"326":1,"327":2,"331":1,"336":1,"343":1,"344":1,"345":2,"354":2,"355":1,"356":2,"358":1,"359":5,"361":2,"363":1,"369":1,"373":3,"374":3,"375":3,"376":1,"378":3,"379":4,"380":2,"381":3,"383":3,"384":1,"385":1,"390":1,"391":1,"434":1,"436":1,"437":2,"439":1,"440":1,"443":1,"453":2,"454":1}}],["нашли",{"2":{"400":1}}],["наша",{"2":{"223":1,"232":2,"250":1,"256":1,"302":1,"311":1,"353":1,"381":1}}],["нашу",{"2":{"171":1,"186":1,"227":1,"230":1,"231":1,"250":1,"256":1,"267":1,"344":1,"352":2,"353":1,"391":1,"394":1,"447":1}}],["нашей",{"2":{"223":1,"224":1,"227":1,"231":4,"232":1,"256":1,"292":1,"296":1,"303":3,"324":2,"328":1,"345":1,"353":1,"355":1,"356":1,"385":2,"386":1,"390":1,"394":1,"434":1,"442":2,"445":1,"454":1}}],["наше",{"2":{"120":1,"134":1,"135":2,"137":3,"201":2,"221":1,"224":1,"225":1,"228":1,"232":2,"233":1,"235":1,"255":1,"257":1,"258":1,"301":1,"306":1,"310":1,"311":1,"313":1,"325":1,"329":1,"330":1,"331":1,"332":1,"343":1,"346":1,"347":1,"354":1,"358":1,"439":1,"440":1,"441":1,"446":1,"449":1}}],["нашего",{"0":{"232":1,"253":1,"256":1,"257":1},"2":{"14":1,"27":1,"82":1,"104":1,"120":2,"131":2,"133":2,"134":1,"135":2,"136":1,"137":3,"139":1,"140":1,"145":4,"146":1,"171":1,"201":1,"202":2,"203":5,"204":1,"221":1,"223":3,"224":5,"225":2,"226":2,"227":1,"230":1,"231":4,"243":2,"244":1,"247":1,"251":1,"255":2,"256":4,"258":1,"287":1,"310":3,"312":1,"316":3,"319":1,"322":1,"324":3,"325":1,"327":3,"328":2,"329":1,"330":4,"331":1,"338":3,"343":4,"344":1,"345":1,"349":1,"353":1,"356":1,"357":1,"364":1,"365":1,"366":2,"367":1,"368":1,"370":2,"375":2,"379":1,"380":2,"381":2,"382":1,"383":3,"384":1,"390":1,"391":3,"396":1,"438":1,"439":2,"442":1,"447":1,"453":1,"455":3}}],["нашему",{"2":{"134":1,"137":1,"141":1,"171":1,"224":1,"230":1,"232":1,"233":1,"243":1,"252":1,"289":1,"313":2,"314":1,"325":1,"328":1,"331":1,"341":1,"344":1,"359":1,"363":1,"386":1,"435":1,"440":1}}],["нашем",{"2":{"5":1,"11":1,"47":1,"85":1,"124":1,"134":1,"136":1,"137":1,"150":1,"171":1,"204":2,"211":1,"223":1,"227":1,"231":1,"232":1,"240":1,"241":3,"244":1,"255":8,"256":4,"287":1,"292":1,"300":1,"303":1,"310":2,"311":1,"315":2,"316":1,"323":1,"325":3,"328":1,"331":3,"338":1,"343":1,"344":1,"353":1,"354":1,"355":1,"358":1,"359":2,"360":1,"361":1,"365":1,"366":1,"372":1,"373":2,"375":2,"379":1,"381":1,"383":3,"393":1,"396":1,"436":1,"438":1,"439":1,"440":1,"442":1,"447":1,"448":1}}],["наш",{"0":{"374":1},"2":{"4":1,"9":1,"12":1,"39":1,"41":2,"100":1,"104":1,"112":1,"136":2,"141":1,"142":1,"143":1,"171":1,"202":1,"203":1,"204":2,"222":1,"223":1,"224":2,"225":1,"227":3,"228":1,"229":2,"230":4,"231":4,"232":3,"233":1,"235":1,"238":1,"241":1,"244":1,"249":1,"254":1,"255":4,"256":3,"303":1,"309":1,"311":1,"313":2,"315":2,"316":2,"319":2,"324":1,"325":2,"328":1,"329":1,"330":2,"343":3,"344":2,"346":1,"353":2,"354":1,"356":1,"358":1,"359":2,"361":1,"363":1,"365":1,"366":3,"374":2,"375":5,"377":1,"380":3,"383":2,"391":1,"394":1,"421":1,"437":2,"438":2,"445":1,"446":2,"449":1,"450":1,"451":2,"452":1}}],["наших",{"2":{"145":1,"150":1,"154":1,"202":1,"223":1,"227":3,"230":1,"231":1,"250":1,"256":1,"281":1,"296":1,"300":1,"303":1,"317":1,"319":2,"323":1,"325":2,"331":2,"332":1,"338":1,"363":1,"364":1,"365":1,"366":1,"368":1,"370":1,"373":1,"375":1,"376":1,"378":1,"380":2,"381":2,"382":3,"383":1,"386":1,"391":1,"397":1,"438":1,"439":2,"440":1}}],["нашими",{"2":{"231":1,"310":1,"311":1,"313":1,"361":1,"368":1,"439":1}}],["нашим",{"2":{"53":1,"125":1,"139":1,"171":1,"201":1,"223":1,"224":1,"231":1,"235":1,"255":2,"257":1,"296":1,"319":2,"324":1,"357":1,"358":1,"370":1,"381":1,"440":1,"445":1}}],["наши",{"0":{"0":1},"2":{"7":1,"137":1,"142":1,"143":2,"202":2,"203":1,"204":2,"221":1,"224":1,"225":1,"232":1,"235":1,"253":1,"256":1,"257":1,"264":1,"310":4,"313":1,"319":1,"324":1,"328":2,"336":1,"349":1,"354":1,"355":1,"361":1,"373":1,"375":1,"378":3,"379":1,"381":1,"434":1}}],["надстройку",{"2":{"507":1}}],["надёжней",{"2":{"433":1}}],["наделите",{"2":{"265":1}}],["наделение",{"2":{"170":1}}],["надеюсь",{"2":{"149":1,"295":1,"336":1}}],["надежного",{"2":{"358":1,"472":1}}],["надежное",{"2":{"241":1,"421":1,"439":1}}],["надежность",{"2":{"17":1}}],["надежные",{"2":{"400":1}}],["надежными",{"2":{"334":1}}],["надежных",{"2":{"235":1,"401":1,"463":1}}],["надежный",{"2":{"116":1,"137":1}}],["надежная",{"2":{"144":1}}],["надобности",{"2":{"539":1}}],["надо",{"2":{"39":1,"41":2,"47":1,"86":1,"89":2,"95":1,"105":1,"112":1,"421":1,"422":1,"425":1,"462":2,"463":3,"464":3,"473":2,"539":1}}],["над",{"0":{"264":1,"466":1},"2":{"4":1,"25":1,"91":1,"105":4,"131":1,"159":1,"164":1,"166":1,"204":2,"222":1,"228":1,"244":1,"255":2,"256":1,"258":1,"264":1,"293":1,"345":2,"376":1,"394":2,"409":1,"443":1,"463":1,"472":1,"496":1}}],["насыщенные",{"2":{"308":1}}],["насыщенного",{"2":{"257":1}}],["наследуют",{"2":{"319":1}}],["наследуемая",{"2":{"264":1}}],["наследованием",{"0":{"264":1},"2":{"264":1,"464":2}}],["наследования",{"2":{"260":1,"264":3,"297":1,"460":1}}],["насколько",{"2":{"200":1,"223":1,"266":1}}],["насчет",{"2":{"23":1,"234":1,"257":1}}],["настал",{"2":{"300":1}}],["настало",{"2":{"223":1,"224":1,"255":1,"343":1,"365":1,"374":1}}],["настоятельно",{"2":{"222":1,"266":1}}],["настоящий",{"2":{"343":1}}],["настоящему",{"2":{"300":1,"336":1}}],["настоящее",{"2":{"134":2,"161":1,"174":1,"177":1,"183":1,"329":1,"331":1,"370":1}}],["настоящую",{"2":{"17":1}}],["настольная",{"2":{"343":1}}],["настольном",{"2":{"338":1}}],["настольному",{"2":{"181":1}}],["настольные",{"2":{"336":1}}],["настольными",{"2":{"199":1,"336":2}}],["настольных",{"2":{"173":2,"181":1,"308":1,"334":1,"336":1,"343":1}}],["настолько",{"2":{"137":1,"181":1,"182":2,"200":1,"251":1,"364":1,"472":1}}],["настройте",{"2":{"473":1}}],["настройку",{"2":{"255":1,"433":1,"460":2}}],["настройкой",{"2":{"255":1}}],["настройке",{"2":{"145":1,"394":1}}],["настройках",{"2":{"327":1}}],["настройками",{"2":{"171":1,"336":1}}],["настройка",{"0":{"140":1,"223":1,"253":1,"433":1,"528":1},"1":{"141":1},"2":{"121":1,"131":1,"187":1,"221":1,"336":1,"394":1,"432":2,"433":1,"507":1}}],["настройки",{"2":{"104":1,"313":1,"384":1,"424":2,"432":1,"553":1}}],["настроили",{"2":{"454":1}}],["настроить",{"2":{"11":1,"134":2,"135":1,"143":1,"395":1,"432":2,"433":1}}],["настроен",{"2":{"421":1}}],["настроена",{"2":{"143":2}}],["настроек",{"2":{"162":1,"231":1,"433":2,"460":1}}],["настраивает",{"2":{"144":1}}],["настраивается",{"2":{"117":1,"336":1}}],["настраиваемой",{"2":{"203":1}}],["настраиваемым",{"2":{"255":1}}],["настраиваемыми",{"2":{"144":1}}],["настраиваемые",{"0":{"246":1},"2":{"78":1}}],["настраиваем",{"2":{"112":1,"394":1}}],["настраивать",{"2":{"72":1,"345":1,"401":1}}],["нас",{"0":{"498":1},"2":{"3":1,"12":1,"16":1,"17":1,"29":1,"36":1,"41":1,"43":1,"48":1,"95":1,"97":1,"102":2,"112":1,"116":1,"123":1,"144":1,"158":1,"171":3,"203":1,"204":2,"218":1,"223":1,"224":1,"231":4,"237":1,"244":1,"246":2,"249":1,"257":1,"264":1,"296":1,"301":1,"303":2,"317":1,"319":3,"324":1,"325":3,"343":1,"344":1,"351":1,"353":1,"356":1,"361":1,"375":2,"378":1,"421":1,"438":1,"442":1,"464":1}}],["на",{"0":{"0":1,"4":1,"81":1,"102":1,"111":1,"143":1,"399":1,"418":1,"526":1},"1":{"82":1,"83":1,"527":1,"528":1},"2":{"2":2,"3":6,"4":1,"6":2,"7":1,"10":2,"11":3,"12":3,"13":2,"16":1,"17":1,"22":5,"23":3,"27":1,"33":1,"34":1,"36":2,"39":5,"40":3,"41":4,"43":1,"44":2,"47":3,"48":1,"50":1,"51":2,"56":3,"58":1,"59":1,"61":1,"62":2,"63":1,"65":1,"66":1,"72":1,"79":1,"85":3,"86":2,"89":3,"91":2,"95":2,"96":1,"97":1,"98":2,"99":1,"102":2,"108":1,"109":3,"111":1,"112":1,"114":4,"115":8,"116":14,"117":5,"118":11,"119":3,"121":1,"123":2,"125":6,"126":2,"130":3,"134":13,"135":4,"136":6,"137":5,"139":1,"140":3,"142":1,"143":9,"144":5,"145":2,"146":1,"147":3,"148":1,"149":4,"150":1,"151":3,"152":2,"153":1,"154":1,"156":4,"157":2,"158":3,"159":2,"162":2,"163":3,"164":1,"165":5,"166":2,"167":4,"168":4,"170":5,"171":8,"173":2,"174":1,"175":1,"176":4,"177":2,"178":3,"181":4,"182":4,"183":5,"184":1,"186":3,"187":2,"190":2,"192":1,"195":9,"197":2,"199":3,"200":10,"201":8,"202":2,"203":3,"204":8,"205":1,"208":1,"209":4,"211":3,"212":6,"215":3,"218":1,"220":1,"221":2,"222":6,"223":7,"224":5,"225":3,"226":4,"227":3,"228":6,"229":3,"230":1,"231":9,"232":1,"236":1,"237":1,"238":2,"239":3,"240":5,"241":2,"244":3,"245":2,"246":3,"247":2,"249":3,"250":3,"251":3,"252":1,"255":7,"256":6,"257":1,"258":1,"259":1,"260":3,"261":2,"263":6,"264":2,"265":5,"266":2,"267":2,"268":1,"269":1,"270":2,"271":6,"272":1,"275":1,"276":1,"278":1,"281":2,"282":1,"284":1,"286":2,"287":4,"290":2,"291":5,"292":1,"293":1,"294":3,"295":3,"296":3,"297":5,"299":1,"300":2,"301":1,"302":2,"303":2,"304":3,"306":3,"307":1,"308":6,"309":1,"311":6,"313":5,"316":10,"317":1,"318":1,"319":3,"323":1,"324":5,"325":6,"326":2,"327":3,"328":5,"329":8,"330":5,"331":6,"334":3,"336":7,"337":1,"338":1,"339":1,"341":3,"342":1,"343":14,"344":3,"346":2,"347":1,"348":1,"349":2,"351":4,"354":3,"356":4,"357":3,"359":1,"360":1,"361":2,"363":2,"364":12,"365":1,"366":2,"367":1,"370":3,"372":7,"373":3,"374":2,"375":4,"376":5,"377":1,"378":3,"379":1,"381":6,"382":1,"383":2,"384":2,"386":2,"387":2,"388":1,"390":4,"392":2,"393":2,"394":5,"395":4,"396":1,"397":1,"402":3,"403":2,"405":1,"408":1,"412":1,"415":1,"416":1,"419":2,"421":12,"422":4,"423":2,"424":3,"429":2,"432":3,"433":5,"436":17,"437":3,"438":2,"439":2,"440":2,"441":1,"442":1,"443":5,"444":1,"445":3,"446":3,"447":3,"448":2,"449":6,"451":1,"452":1,"453":1,"454":2,"455":1,"456":1,"460":7,"461":8,"462":11,"463":11,"464":8,"465":1,"466":2,"468":3,"471":5,"472":16,"473":23,"481":1,"482":1,"496":1,"498":1,"504":2,"508":3,"509":1,"511":2,"514":1,"515":1,"516":1,"519":1,"520":1,"527":2,"529":1,"536":1,"540":1,"542":2,"545":3,"546":1,"548":1,"549":1,"554":2,"555":1,"556":1}}],["пдд",{"2":{"473":1}}],["пк",{"2":{"433":2}}],["пытается",{"2":{"344":1,"382":1,"433":1}}],["пытаются",{"2":{"296":1,"464":1}}],["пытаться",{"2":{"264":1,"265":1,"269":1,"464":1}}],["птицы",{"2":{"149":1}}],["псевдонима",{"2":{"228":1}}],["псевдонимов",{"2":{"228":1}}],["псевдонимы",{"2":{"224":1}}],["псевдоним",{"2":{"134":1,"228":1,"230":1}}],["песочницы",{"2":{"433":1}}],["песочнице",{"2":{"432":1}}],["пешеходного",{"2":{"336":1}}],["пейджера",{"2":{"170":2}}],["пейджером",{"2":{"170":1}}],["пейджер",{"0":{"170":1},"1":{"171":1},"2":{"170":2}}],["печатает",{"2":{"438":1}}],["печати",{"2":{"339":1}}],["печать",{"2":{"158":2}}],["печатными",{"2":{"147":1}}],["печально",{"2":{"131":1}}],["петлю",{"2":{"134":1}}],["пет",{"2":{"72":1,"421":1}}],["периодическая",{"2":{"228":1}}],["периодически",{"2":{"221":1}}],["периода",{"2":{"188":1}}],["первую",{"2":{"256":1,"303":1,"436":1,"440":1}}],["первые",{"2":{"379":1,"436":1}}],["первых",{"2":{"308":1,"434":1,"473":1,"497":1}}],["первым",{"2":{"182":1,"255":1,"257":1,"450":1}}],["первый",{"2":{"102":1,"108":1,"134":1,"178":1,"182":1,"192":1,"204":1,"222":1,"232":1,"267":1,"280":1,"297":1,"303":1,"313":1,"316":2,"318":1,"376":2,"391":1,"454":1}}],["первичный",{"2":{"151":1}}],["первая",{"2":{"123":1,"183":1,"187":1,"329":1,"343":1,"391":2,"436":1}}],["первоклассные",{"2":{"199":1}}],["первоначальном",{"2":{"206":1}}],["первоначальной",{"2":{"192":1}}],["первоначальный",{"2":{"183":1,"238":1,"324":1}}],["первое",{"2":{"164":1,"231":1,"329":1,"337":1}}],["первой",{"2":{"17":1,"171":1,"183":1,"260":1,"313":1,"316":1,"331":1,"376":1,"390":1,"391":1,"436":3,"472":1,"473":1}}],["первого",{"2":{"11":1,"17":1,"147":1,"150":1,"160":1,"176":1,"181":1,"201":1,"245":1,"286":1,"360":1,"363":1,"376":1,"380":1,"381":2,"436":1,"462":1}}],["первом",{"2":{"6":1,"7":1,"11":1,"17":2,"22":1,"47":1,"66":1,"116":2,"231":2,"281":1,"295":1,"304":1,"379":1,"472":1}}],["персонализация",{"0":{"95":1}}],["перспективе",{"2":{"63":1,"271":1}}],["переопределение",{"2":{"557":1}}],["переиспользуемые",{"2":{"508":1}}],["переиспользовать",{"2":{"423":1}}],["переименуем",{"2":{"100":1}}],["переименовывая",{"2":{"467":1}}],["переименовываются",{"2":{"429":1}}],["переименовываем",{"2":{"96":1}}],["переименован",{"2":{"83":1}}],["переутомлению",{"2":{"370":1}}],["переупаковывать",{"2":{"336":1}}],["переадресация",{"2":{"327":1}}],["перезаписывание",{"2":{"501":1}}],["перезаписываем",{"2":{"385":1}}],["перезаписью",{"2":{"313":1}}],["перезагрузка",{"2":{"545":1}}],["перезагрузку",{"2":{"421":1}}],["перезагрузкой",{"2":{"224":1,"308":1}}],["перезагружается",{"2":{"316":1}}],["перечисленные",{"2":{"372":1}}],["перечисленных",{"2":{"330":1}}],["перечислены",{"2":{"319":1}}],["перечислим",{"2":{"308":1}}],["перечень",{"2":{"196":1}}],["перебирать",{"2":{"231":1}}],["перевода",{"2":{"424":1,"536":1}}],["перевод",{"0":{"399":1},"2":{"473":1,"476":1,"536":1}}],["переводчика",{"2":{"222":1}}],["перевыполняет",{"2":{"376":1}}],["перевычеслены",{"2":{"231":1}}],["перевешивают",{"2":{"303":1,"336":1}}],["перевести",{"2":{"62":1,"118":1}}],["перерасти",{"2":{"200":1}}],["перепишите",{"2":{"235":1}}],["переписываете",{"2":{"462":1}}],["переписывание",{"2":{"461":1}}],["переписывать",{"2":{"138":1,"297":1,"385":1}}],["переписать",{"2":{"360":1}}],["переписанный",{"2":{"120":1}}],["переполнение",{"2":{"171":1}}],["перекомпоновать",{"2":{"448":1}}],["перекрывают",{"2":{"336":1}}],["перекрестного",{"2":{"117":1}}],["переключитесь",{"2":{"392":1}}],["переключателя",{"2":{"543":1}}],["переключатель",{"2":{"296":1}}],["переключаться",{"2":{"208":1,"386":1}}],["переключать",{"2":{"173":1}}],["переключения",{"2":{"163":1,"181":1}}],["переключение",{"2":{"162":1,"239":1,"543":1,"557":3}}],["перегружена",{"2":{"306":1}}],["перегруженности",{"2":{"167":1}}],["перегруженных",{"2":{"157":1}}],["перегружать",{"2":{"157":1,"178":1}}],["перехвачен",{"2":{"325":1}}],["перехваченные",{"2":{"297":1}}],["перехвачена",{"2":{"296":1}}],["перехватчиков",{"2":{"511":1}}],["перехватчики",{"2":{"366":1}}],["перехвата",{"2":{"366":2}}],["перехвате",{"2":{"343":1}}],["перехватываем",{"2":{"381":1,"448":1}}],["перехватывает",{"2":{"298":1,"344":1}}],["перехватывается",{"2":{"296":1}}],["перехватывать",{"2":{"295":1}}],["перехватываться",{"2":{"139":1}}],["перехватывая",{"2":{"295":1,"344":1,"381":1}}],["перехватить",{"2":{"246":1,"327":1}}],["перехвату",{"2":{"231":1}}],["переходом",{"2":{"322":1}}],["переходов",{"2":{"212":1}}],["переходят",{"2":{"181":1}}],["переходит",{"2":{"181":1,"264":1}}],["переходить",{"2":{"119":1,"238":1,"256":1}}],["переходим",{"2":{"134":1,"329":1}}],["переход",{"2":{"118":1,"119":1,"130":3,"256":1,"320":1,"363":1,"392":1,"466":1}}],["переходе",{"2":{"86":1,"195":1}}],["перехода",{"2":{"23":1,"173":1,"176":1,"212":1,"309":1,"313":1,"318":1,"320":1,"419":1}}],["пересылает",{"2":{"472":1}}],["пересылаемый",{"2":{"116":1}}],["перестанет",{"2":{"465":1}}],["перестает",{"2":{"291":1,"462":1}}],["пересчитали",{"2":{"463":1}}],["пересчет",{"2":{"231":1}}],["пересчете",{"2":{"134":1}}],["пересмотреть",{"2":{"353":1}}],["пересмотрите",{"2":{"135":1}}],["пересекаться",{"2":{"322":1}}],["пересекаются",{"2":{"185":1}}],["пересечении",{"2":{"170":1}}],["перешло",{"2":{"127":1}}],["перешел",{"2":{"126":1}}],["перемещения",{"2":{"248":1,"339":1,"390":1}}],["перемещая",{"2":{"467":1}}],["перемещать",{"2":{"231":1}}],["перемещаться",{"2":{"170":1}}],["перемещается",{"2":{"181":1,"231":1}}],["перемещает",{"2":{"156":1}}],["переместившись",{"2":{"392":1}}],["переместит",{"2":{"229":1}}],["переместился",{"2":{"126":1,"224":1}}],["переменным",{"2":{"204":2}}],["переменными",{"2":{"204":1}}],["переменные",{"0":{"214":1},"2":{"201":1,"203":1,"204":4,"231":2,"242":1,"247":1,"250":1,"256":1,"267":1,"303":1,"358":1,"452":1,"462":1,"463":2,"557":1}}],["переменных",{"2":{"123":1,"200":1,"204":1,"212":1,"231":1,"343":1,"447":1,"460":1,"557":1}}],["переменную",{"2":{"173":1,"200":1,"204":2,"207":1,"211":1,"231":2,"249":1,"250":1,"251":1,"281":1,"351":2,"352":2,"356":1,"358":1,"462":2,"463":1}}],["переменная",{"2":{"171":1,"200":1,"201":1,"204":1,"206":3,"207":2,"231":1,"239":1,"246":1,"255":1,"256":2,"303":1,"463":2}}],["переменной",{"2":{"102":1,"116":1,"171":2,"200":2,"201":1,"204":3,"206":2,"210":2,"212":2,"231":1,"232":1,"246":2,"255":1,"313":1,"353":1,"356":1,"452":2,"460":2,"462":1,"463":2,"548":1}}],["перелогиниваться",{"2":{"116":1}}],["перелогин",{"2":{"116":1}}],["переделать",{"2":{"306":1}}],["передаю",{"2":{"462":1}}],["передающих",{"2":{"443":1}}],["передают",{"2":{"293":1,"351":1}}],["передаются",{"2":{"245":2,"448":1,"454":1}}],["передаст",{"2":{"329":1}}],["передадим",{"2":{"313":1}}],["переданного",{"2":{"443":1}}],["переданной",{"2":{"376":1}}],["переданное",{"2":{"366":1,"381":1}}],["переданному",{"2":{"302":1}}],["переданную",{"2":{"288":1,"327":1}}],["переданные",{"2":{"437":1,"443":1}}],["переданными",{"2":{"381":1}}],["переданным",{"2":{"208":1,"333":1}}],["переданный",{"2":{"123":1}}],["переданы",{"2":{"255":1}}],["передан",{"2":{"249":1,"313":1,"319":1}}],["передач",{"2":{"473":1}}],["передача",{"2":{"286":1,"287":2,"318":1,"425":1}}],["передаче",{"2":{"224":1}}],["передачи",{"2":{"204":1,"245":1,"247":1,"249":1,"286":1,"325":1,"351":1}}],["передачу",{"2":{"143":1}}],["передаваемых",{"2":{"449":1}}],["передаваемые",{"2":{"299":1,"327":1,"436":1}}],["передаваемой",{"2":{"452":1}}],["передаваемое",{"2":{"443":1}}],["передаваемому",{"2":{"249":1}}],["передавать",{"2":{"228":2,"239":1,"245":1,"247":1,"249":1,"303":1,"319":1,"330":1,"353":2,"354":1,"424":1,"436":1,"440":1,"463":1}}],["передаваться",{"2":{"136":1,"251":1,"351":1,"447":1}}],["передавая",{"2":{"201":1,"228":1,"240":1,"292":1,"295":1,"313":1,"380":1,"424":1,"444":1}}],["передав",{"2":{"135":1,"316":1}}],["передает",{"2":{"249":1,"292":1,"324":1,"374":1}}],["передается",{"2":{"127":1,"196":1,"284":1}}],["передаем",{"2":{"120":1,"136":1,"171":1,"201":1,"302":1,"303":1,"313":2,"319":2,"329":1,"345":1,"352":1,"356":1,"361":1,"380":2,"381":3,"444":1,"448":1,"452":1,"454":2}}],["передаёт",{"2":{"116":1}}],["передать",{"2":{"47":1,"141":1,"171":1,"203":1,"244":2,"246":1,"270":1,"292":1,"316":2,"325":1,"351":2,"381":1,"447":1,"462":2}}],["перед",{"2":{"112":1,"157":1,"158":1,"171":1,"174":1,"175":1,"189":1,"200":2,"204":1,"223":1,"224":1,"244":1,"247":1,"267":2,"285":1,"287":1,"297":1,"303":1,"313":1,"316":1,"322":1,"331":1,"343":1,"393":1,"395":1,"429":1,"439":1,"440":1,"473":1,"507":1}}],["перейдите",{"2":{"527":1}}],["перейдем",{"2":{"86":1,"143":1,"150":1,"152":1,"229":1,"289":1,"353":1,"380":1,"393":1}}],["перейти",{"2":{"38":1,"167":1,"300":1,"319":1,"331":1,"367":1,"442":1,"511":1}}],["переехать",{"2":{"39":1}}],["перенесенного",{"2":{"436":1}}],["перенесена",{"2":{"287":1}}],["перенести",{"2":{"95":1,"142":1}}],["перенаправить",{"2":{"329":1}}],["перенаправит",{"2":{"327":1}}],["перенаправлен",{"2":{"326":1}}],["перенаправления",{"2":{"326":2,"327":1}}],["перенаправлениях",{"2":{"325":1}}],["перенаправление",{"2":{"195":1,"329":1}}],["перенаправляющие",{"2":{"328":1}}],["перенаправляют",{"2":{"195":1}}],["перенаправляем",{"2":{"326":1}}],["перенаправляться",{"2":{"325":1}}],["перенасыщенности",{"2":{"167":1}}],["переноса",{"2":{"235":1}}],["переносить",{"2":{"212":1,"308":1}}],["переносится",{"2":{"30":1,"279":1,"433":1}}],["переносе",{"2":{"199":1}}],["перенос",{"0":{"143":1},"2":{"331":1}}],["перенять",{"2":{"26":1}}],["пятого",{"2":{"61":1}}],["пятью",{"2":{"167":1}}],["пять",{"2":{"36":1,"209":1}}],["плевел",{"2":{"473":1}}],["плечах",{"2":{"154":1}}],["плохая",{"2":{"462":2}}],["плохие",{"2":{"271":1,"471":1}}],["плохую",{"2":{"271":1}}],["плохой",{"2":{"149":1,"268":1,"460":1}}],["плохо",{"2":{"74":1,"460":1,"471":1}}],["плавность",{"2":{"436":1}}],["плавающее",{"2":{"191":1}}],["плавающей",{"2":{"183":1}}],["плавающего",{"2":{"166":1}}],["плавающий",{"2":{"164":1}}],["платежей",{"2":{"464":1}}],["плату",{"2":{"394":1}}],["платформах",{"2":{"397":1}}],["платформа",{"2":{"343":3,"394":1}}],["платформы",{"2":{"336":1,"338":1,"341":1,"343":1,"347":1}}],["платных",{"2":{"328":1}}],["платные",{"2":{"39":1,"473":1}}],["платная",{"2":{"222":2}}],["платить",{"2":{"204":1}}],["плагину",{"2":{"345":1}}],["плагине",{"2":{"251":1,"255":1}}],["плагинами",{"2":{"432":1}}],["плагина",{"2":{"235":1,"247":1,"254":1,"255":3,"256":1,"313":1,"344":1,"347":1,"472":1,"518":1}}],["плагином",{"2":{"228":1,"252":1,"255":1}}],["плагинов",{"0":{"121":1},"2":{"119":1,"121":1,"125":1,"199":1,"203":1,"228":2,"252":1,"345":1,"363":1,"432":1,"433":1,"444":1}}],["плагин",{"0":{"252":1,"345":1},"1":{"253":1,"254":1,"255":1},"2":{"125":2,"222":1,"235":1,"241":1,"252":1,"254":1,"255":4,"256":2,"258":1,"259":1,"309":1,"344":1,"345":6,"454":3,"518":1}}],["плагины",{"2":{"104":1,"119":1,"120":1,"121":1,"130":1,"199":1,"224":1,"252":1,"253":1,"331":1,"334":1,"432":1,"462":1}}],["планшетов",{"2":{"515":1}}],["планшеты",{"2":{"336":1}}],["планирования",{"2":{"441":1,"442":1}}],["планирование",{"2":{"441":1}}],["планироваться",{"2":{"441":1}}],["планируется",{"2":{"73":1,"508":1}}],["планов",{"2":{"190":1}}],["планы",{"2":{"115":2}}],["план",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1},"2":{"370":1,"372":2}}],["планах",{"0":{"545":1}}],["планами",{"2":{"422":1}}],["плана",{"2":{"40":1,"61":1,"373":1,"442":1}}],["плане",{"2":{"9":1,"25":1,"232":1,"460":1,"462":1,"471":1}}],["плюсы",{"2":{"462":1,"471":2}}],["плюсом",{"2":{"231":1}}],["плюс",{"2":{"25":1,"56":1,"86":1,"116":1,"204":1,"229":1,"375":1,"421":1,"448":1,"462":1}}],["пищеварительной",{"2":{"263":1}}],["пишут",{"2":{"270":1}}],["пишутся",{"2":{"214":1,"217":1}}],["пишет",{"2":{"472":1}}],["пишете",{"2":{"267":1,"268":1}}],["пишем",{"2":{"9":1,"203":1}}],["пиши",{"0":{"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"260":1,"268":1}}],["пикселей",{"2":{"181":1}}],["пиктограмму",{"2":{"179":1}}],["пиктограмм",{"2":{"176":1}}],["пиктограммами",{"2":{"173":2}}],["пиктограммой",{"2":{"166":1}}],["пиктограммы",{"2":{"153":1,"154":1,"158":1,"164":1,"165":1}}],["письмо",{"2":{"329":2}}],["письмом",{"2":{"188":1}}],["письмами",{"2":{"196":1}}],["писем",{"2":{"165":1,"329":1}}],["писать",{"2":{"89":1,"204":1,"218":1,"228":1,"375":1,"385":1,"462":1,"463":1,"504":1}}],["писаться",{"2":{"23":1}}],["пуша",{"2":{"421":1}}],["пулей",{"2":{"336":1}}],["пули",{"2":{"241":1}}],["пузырьком",{"2":{"165":1}}],["пузырьки",{"0":{"165":1}}],["пузыря",{"2":{"164":1}}],["публикуются",{"2":{"498":1}}],["публикуем",{"2":{"356":1,"443":1}}],["публиковаться",{"2":{"441":1}}],["публикацию",{"2":{"395":1}}],["публикации",{"2":{"131":1,"133":1,"145":1,"146":1,"291":2,"356":1}}],["публикация",{"0":{"133":1},"1":{"134":1},"2":{"131":1,"133":1}}],["публичным",{"2":{"331":1}}],["публичный",{"2":{"134":2,"224":1}}],["пупкина",{"2":{"116":1}}],["пупкин",{"2":{"116":1}}],["путаница",{"2":{"331":1}}],["путаницу",{"2":{"149":1,"167":1}}],["путешествии",{"2":{"223":1}}],["путешествовать",{"2":{"123":1}}],["путем",{"2":{"117":1,"138":1,"140":1,"152":1,"175":1,"228":1,"255":1,"264":1,"297":1,"319":1,"322":1,"324":1,"325":2,"386":1,"444":1}}],["путей",{"2":{"95":1,"228":1}}],["путях",{"2":{"112":1,"432":1}}],["путями",{"2":{"112":1,"135":1,"318":1}}],["путь",{"0":{"202":2},"2":{"108":1,"127":2,"133":1,"135":3,"136":2,"139":1,"140":1,"141":2,"149":1,"203":1,"219":1,"247":1,"316":1,"319":1,"322":1,"339":1,"344":1,"390":1,"437":1}}],["пути",{"2":{"83":1,"135":2,"174":1,"228":2,"230":1,"313":1,"316":1,"318":1,"322":4,"332":1,"356":1}}],["пункте",{"2":{"527":1}}],["пункту",{"2":{"353":1}}],["пунктирными",{"2":{"238":1}}],["пункт",{"2":{"187":2,"267":1}}],["пункты",{"2":{"133":1,"229":1,"256":2,"316":1,"341":1}}],["пунктов",{"2":{"29":1,"119":1,"176":1,"229":1,"316":1}}],["пунктах",{"2":{"346":1,"442":1}}],["пункта",{"2":{"4":1,"286":1}}],["пуст",{"2":{"231":1}}],["пуста",{"2":{"231":1}}],["пустого",{"2":{"507":1,"556":1}}],["пустом",{"2":{"227":1}}],["пустой",{"2":{"7":1,"288":1,"292":1,"356":1}}],["пустым",{"2":{"134":1,"366":1}}],["пусть",{"2":{"16":1,"318":1,"464":1,"468":1}}],["падает",{"2":{"436":1}}],["пабло",{"2":{"405":1}}],["паттерн",{"2":{"231":1,"316":1,"460":1}}],["паттернов",{"2":{"219":1,"260":1,"306":1,"332":1,"370":1,"401":1,"402":1,"417":1}}],["паттерны",{"2":{"199":2,"225":2,"229":1,"232":2,"306":1,"374":1,"414":1,"471":1}}],["паутина",{"2":{"199":1}}],["пагинации",{"2":{"170":2}}],["пагинация",{"0":{"170":1},"1":{"171":1},"2":{"170":1}}],["памятью",{"2":{"356":2}}],["память",{"2":{"158":1,"267":1}}],["памяти",{"2":{"127":1,"134":1,"158":1,"267":3,"385":1,"433":1,"436":1}}],["папок",{"0":{"224":1},"2":{"137":1,"221":1}}],["папкоподобная",{"2":{"174":1}}],["папке",{"2":{"148":1,"224":1,"227":1,"255":1,"310":2,"329":1,"390":3,"429":1}}],["папка",{"2":{"135":1,"136":1,"140":1,"143":1,"224":4}}],["папки",{"2":{"126":1,"223":1,"227":1,"253":1,"429":2}}],["папку",{"2":{"126":1,"136":1,"143":1,"223":1,"224":1,"225":1,"226":1,"227":1,"253":1,"375":2,"429":3}}],["панацея",{"2":{"93":1}}],["панелей",{"2":{"176":1}}],["панели",{"0":{"168":1},"1":{"169":1},"2":{"31":1,"90":1,"165":1,"173":3,"176":1,"178":1,"183":1,"311":1,"316":1,"383":1,"527":1,"547":1}}],["панелью",{"2":{"178":1}}],["панель",{"2":{"28":1,"79":1,"137":2,"138":1,"154":1,"168":1,"181":3,"183":1,"311":1,"319":1,"384":1,"423":1}}],["палитры",{"2":{"545":1}}],["палитру",{"2":{"151":1}}],["пал",{"2":{"39":1}}],["пару",{"2":{"325":1,"433":1,"460":1,"468":1,"508":1,"536":1}}],["паролей",{"2":{"325":2,"330":1}}],["паролями",{"2":{"324":1,"325":1}}],["пароля",{"2":{"324":2,"330":1,"332":1}}],["паролю",{"0":{"324":1,"329":1},"2":{"324":1}}],["пароль",{"2":{"116":1,"325":1,"330":1,"462":1}}],["парольной",{"2":{"40":1}}],["параграфов",{"2":{"536":1}}],["параграфы",{"2":{"473":1}}],["параграфа",{"2":{"343":1}}],["параллельно",{"2":{"372":1}}],["парами",{"2":{"316":1}}],["параметре",{"2":{"294":1}}],["параметр",{"2":{"287":1,"303":1,"313":1,"319":3,"376":2,"450":1,"454":1,"501":1,"528":1}}],["параметром",{"2":{"244":1,"376":1,"450":1,"536":1}}],["параметров",{"2":{"223":1,"282":1,"301":1,"351":1,"381":1,"443":1,"450":1,"454":1,"501":1}}],["параметрам",{"2":{"333":1}}],["параметрами",{"2":{"317":1,"322":2,"421":1}}],["параметра",{"2":{"127":1,"244":2,"255":1,"284":1,"287":1,"292":1,"302":1,"313":1,"318":1,"320":1,"322":1,"376":1,"437":1,"438":1,"444":1}}],["параметры",{"2":{"104":1,"204":2,"252":1,"266":1,"291":1,"309":1,"313":1,"316":1,"319":2,"321":1,"327":1,"424":1,"508":1,"509":1,"545":1}}],["параметру",{"2":{"48":1,"302":1}}],["парадигм",{"2":{"264":1}}],["парадигму",{"2":{"199":1}}],["парадигмы",{"2":{"199":2,"264":1}}],["пара",{"2":{"11":1,"231":1}}],["паре",{"2":{"3":1}}],["пакетных",{"2":{"222":1}}],["пакетами",{"2":{"432":1}}],["пакета",{"2":{"120":1,"125":1,"127":1,"145":1,"204":1,"223":2,"244":3,"309":1,"310":1,"313":3,"360":1,"370":1,"373":1,"388":1,"457":1,"460":1}}],["пакет",{"2":{"86":3,"224":2,"244":1,"293":1,"313":1,"354":2,"374":2,"375":1,"423":1,"433":1,"465":1,"504":1,"539":1}}],["пакеты",{"2":{"5":1,"308":1,"508":1}}],["пакетов",{"2":{"5":1,"223":2,"375":1,"388":1,"433":1,"504":1}}],["п",{"2":{"4":1,"38":1,"109":1,"166":1,"391":1,"461":1,"464":1,"496":1,"507":1}}],["поиграйте",{"2":{"473":1}}],["поизучайте",{"2":{"473":1}}],["поисковых",{"2":{"472":1}}],["поисковыми",{"2":{"308":1,"336":1}}],["поисковиков",{"2":{"472":1}}],["поисковик",{"2":{"472":1}}],["поисковиками",{"2":{"472":2}}],["поисковая",{"2":{"98":1}}],["поисковой",{"2":{"98":1}}],["поиск",{"0":{"48":1},"2":{"16":1,"17":2,"48":2,"79":1,"154":1,"178":1,"227":1}}],["поисках",{"2":{"444":1}}],["поискать",{"2":{"98":1,"431":1}}],["поиска",{"2":{"4":1,"29":1,"48":2,"182":2,"324":1}}],["побуждает",{"2":{"331":1}}],["побочным",{"2":{"313":1,"351":1}}],["побочных",{"2":{"250":1,"268":1}}],["побочные",{"2":{"167":1}}],["пояснить",{"2":{"297":1}}],["появятся",{"2":{"212":1}}],["появляются",{"2":{"224":1,"341":1,"433":1,"436":1}}],["появляется",{"2":{"33":1,"256":1,"317":1,"319":1,"336":1,"424":1,"534":1}}],["появлении",{"2":{"393":1,"519":1}}],["появление",{"2":{"308":2}}],["появлением",{"2":{"199":1,"308":1}}],["появления",{"2":{"224":1,"308":1,"472":1}}],["появлению",{"2":{"204":1,"381":1}}],["появившаяся",{"2":{"385":1}}],["появиться",{"2":{"171":1,"223":1,"238":1,"255":1,"374":1}}],["появится",{"2":{"117":1,"144":1,"171":1,"207":1,"223":1,"227":1,"343":1,"393":1}}],["появились",{"2":{"128":1,"160":1,"199":1,"260":1,"384":1,"462":1}}],["появился",{"2":{"119":1,"238":1,"246":1,"462":1,"472":1}}],["появилась",{"2":{"102":1,"124":1,"295":1,"308":1,"463":1,"507":1}}],["появилось",{"2":{"71":1,"460":1,"462":1}}],["пошагово",{"2":{"255":1}}],["пожалуйста",{"2":{"287":1,"324":1,"442":1}}],["пожалуй",{"2":{"244":1,"263":1,"336":1,"373":1}}],["погрузимся",{"2":{"349":1,"357":1}}],["поговорим",{"2":{"203":1,"323":1,"391":1}}],["погуглим",{"2":{"22":1}}],["поймать",{"2":{"460":1}}],["поймете",{"2":{"152":1,"181":1,"265":1}}],["поймем",{"2":{"147":1,"200":1}}],["пойдем",{"2":{"133":1,"324":1}}],["пойдет",{"2":{"115":1,"385":1}}],["почта",{"2":{"329":1}}],["почтовые",{"2":{"308":1}}],["почти",{"2":{"227":1,"268":1,"344":1,"376":1,"388":1,"473":1}}],["почты",{"2":{"134":1,"165":1,"323":1,"329":2,"330":1,"331":1}}],["почувствовать",{"2":{"194":1}}],["почву",{"2":{"149":1}}],["почему",{"2":{"39":1,"118":1,"146":1,"150":3,"152":1,"198":1,"220":2,"234":2,"251":1,"305":3,"346":1,"381":1,"397":3,"436":1,"444":1,"463":1,"471":1,"473":1}}],["порекомендовать",{"2":{"218":1}}],["порой",{"2":{"473":1}}],["порог",{"2":{"463":1}}],["породили",{"2":{"308":1}}],["породить",{"2":{"179":1}}],["порождать",{"2":{"436":1}}],["порождающие",{"0":{"273":1}}],["порождают",{"2":{"271":1}}],["порождал",{"2":{"250":1}}],["порождает",{"2":{"202":1}}],["пор",{"2":{"148":1,"175":1,"178":1,"188":1,"200":1,"202":1,"211":1,"212":1,"221":1,"238":1,"241":1,"244":1,"270":1,"284":1,"300":1,"303":1,"308":1,"316":1,"317":1,"319":2,"329":1,"358":1,"386":1,"436":1}}],["порядки",{"2":{"472":1}}],["порядковому",{"2":{"381":1}}],["порядковым",{"2":{"170":1}}],["порядке",{"2":{"170":1,"181":1,"202":1,"223":1,"224":2,"231":1,"255":1,"256":1,"338":1,"444":1}}],["порядка",{"2":{"153":1,"170":1,"176":1,"202":1}}],["порядку",{"2":{"133":1,"388":1}}],["порядок",{"2":{"118":1,"256":1}}],["портфолио",{"2":{"506":1,"507":1,"508":1}}],["порта",{"2":{"364":1}}],["порталов",{"2":{"134":1}}],["портал",{"2":{"116":1}}],["портрет",{"2":{"345":1}}],["портретная",{"2":{"340":1}}],["портретных",{"2":{"181":1}}],["порт",{"2":{"223":1,"454":1}}],["портом",{"2":{"117":1}}],["поработайте",{"2":{"473":2}}],["поработать",{"2":{"443":1}}],["поработаем",{"2":{"255":1,"293":1}}],["пора",{"2":{"85":1,"238":1,"300":1}}],["похудеет",{"2":{"460":1}}],["похвастаться",{"2":{"446":1}}],["похож",{"2":{"364":1}}],["похожем",{"2":{"554":1}}],["похожее",{"2":{"319":1}}],["похоже",{"2":{"286":1,"330":1,"334":1}}],["похожей",{"2":{"267":1,"439":1}}],["похожим",{"2":{"297":1,"361":1}}],["похожий",{"2":{"244":1}}],["похожи",{"2":{"85":1,"208":1,"447":1,"450":1}}],["похожие",{"2":{"4":1,"22":1,"156":1}}],["похакать",{"2":{"115":1}}],["повысит",{"2":{"470":1}}],["повысить",{"2":{"434":1,"464":1,"556":1}}],["повышению",{"2":{"414":1}}],["повышение",{"2":{"368":1,"497":1}}],["повышения",{"2":{"295":1,"308":1,"347":1,"434":1}}],["повышается",{"2":{"464":1,"472":1}}],["повышает",{"2":{"79":1,"394":1,"423":1,"455":1}}],["повсеместно",{"2":{"300":1}}],["повседневном",{"2":{"157":1}}],["повсюду",{"2":{"181":1}}],["поверх",{"2":{"165":1,"200":2,"222":1,"323":1,"324":1,"394":1,"446":1}}],["поведенческие",{"0":{"274":1}}],["поведенческих",{"2":{"63":1}}],["поведением",{"2":{"199":1}}],["поведение",{"2":{"63":1,"103":1,"152":1,"199":1,"205":1,"224":1,"231":1,"265":1,"278":1,"463":1}}],["поведения",{"2":{"62":1,"170":1,"182":1,"189":1,"436":1}}],["поводу",{"2":{"164":1,"168":1}}],["повлиять",{"2":{"456":1}}],["повлияют",{"2":{"448":1}}],["повлияет",{"2":{"156":1,"245":1,"316":1,"436":1}}],["повлияли",{"2":{"126":1}}],["повторно",{"2":{"204":1,"259":1,"311":1}}],["повторного",{"2":{"204":1,"248":1,"250":1,"261":1,"271":1,"284":1,"343":1,"383":1}}],["повторяйтесь",{"2":{"300":1}}],["повторяйся",{"0":{"268":1}}],["повторяющегося",{"2":{"463":1}}],["повторяющееся",{"2":{"152":1,"243":1}}],["повторяющихся",{"2":{"260":1}}],["повторяемому",{"2":{"237":1}}],["повторяется",{"2":{"171":1,"372":1}}],["повторяет",{"2":{"152":1}}],["повторять",{"2":{"228":1,"353":1}}],["повторяться",{"2":{"225":1,"228":1,"260":1,"353":1}}],["повторения",{"2":{"152":2,"153":1,"250":1,"280":1,"450":1}}],["повторение",{"0":{"152":1},"2":{"152":4}}],["покрывается",{"2":{"383":1}}],["покрытии",{"2":{"383":3}}],["покрытия",{"2":{"383":2}}],["покрытие",{"0":{"383":1},"2":{"382":1,"383":1}}],["покидают",{"2":{"330":1}}],["покидать",{"2":{"240":1}}],["покупку",{"2":{"188":1}}],["покупках",{"2":{"192":1}}],["покупка",{"2":{"188":1}}],["покупке",{"2":{"145":1,"192":1}}],["покупки",{"2":{"134":1,"187":2,"403":1}}],["покупать",{"2":{"134":1}}],["покупателей",{"2":{"79":1,"472":1}}],["покупателя",{"2":{"79":1}}],["покупаем",{"2":{"134":1}}],["покупок",{"2":{"79":1,"187":1}}],["показывали",{"2":{"472":1,"473":1}}],["показывания",{"2":{"421":1}}],["показываем",{"2":{"329":1}}],["показывает",{"2":{"119":1,"164":1,"207":1,"385":1,"436":1,"445":1,"462":1}}],["показывается",{"2":{"30":2,"31":1,"83":1}}],["показываются",{"2":{"425":1}}],["показывают",{"2":{"176":1,"208":1}}],["показывающее",{"2":{"367":1}}],["показывающие",{"2":{"342":1}}],["показывающих",{"2":{"174":1}}],["показывающим",{"2":{"102":1}}],["показывающая",{"2":{"102":1,"165":1}}],["показываться",{"2":{"208":1,"460":1}}],["показывать",{"2":{"164":1,"265":1,"425":1,"463":1,"472":1}}],["показывая",{"2":{"153":1,"162":1,"208":1,"229":1}}],["показ",{"2":{"79":1,"464":1}}],["показав",{"2":{"436":1}}],["показателей",{"0":{"346":1}}],["показать",{"0":{"154":1},"2":{"165":1,"168":1,"178":1,"390":1}}],["показаться",{"2":{"26":1,"137":1,"203":3,"224":1,"267":1,"297":1,"303":1,"334":1,"336":1,"381":1,"436":1}}],["показана",{"2":{"381":1}}],["показанном",{"2":{"256":1}}],["показанное",{"2":{"182":1}}],["показаны",{"2":{"170":1,"249":1}}],["показано",{"2":{"134":1,"204":1,"246":1,"293":1,"302":1,"324":1,"350":1,"351":1,"352":1,"356":1,"358":1,"415":1,"442":1}}],["показа",{"2":{"47":1,"208":2,"429":1}}],["показе",{"2":{"30":1,"343":1}}],["пока",{"2":{"25":1,"34":1,"41":1,"56":1,"67":1,"96":1,"97":2,"104":1,"105":1,"134":1,"170":1,"175":1,"188":1,"199":1,"200":1,"203":1,"212":2,"228":1,"238":1,"241":1,"244":1,"255":2,"263":1,"267":1,"270":1,"282":1,"284":1,"298":1,"301":1,"303":1,"311":1,"313":1,"316":1,"323":1,"329":1,"361":1,"391":1,"436":1,"444":1}}],["попробуйте",{"2":{"431":1,"433":1,"473":2}}],["попробует",{"2":{"431":1}}],["попробуем",{"2":{"393":1}}],["попросите",{"2":{"152":1}}],["попап",{"2":{"460":1}}],["попадают",{"2":{"383":1}}],["попадает",{"2":{"168":1,"329":1}}],["попадет",{"2":{"156":1,"228":1}}],["попасть",{"2":{"86":1,"353":1}}],["попытаемся",{"2":{"393":1}}],["попытается",{"2":{"152":1,"379":1}}],["попытаться",{"2":{"141":1,"344":2,"383":1}}],["попытался",{"2":{"71":1}}],["попытка",{"2":{"118":1,"296":1,"373":1}}],["популярности",{"2":{"433":1}}],["популярность",{"2":{"218":1}}],["популярной",{"2":{"386":1}}],["популярном",{"2":{"226":1}}],["популярного",{"2":{"225":1}}],["популярна",{"2":{"195":1,"460":1,"536":1}}],["популярных",{"2":{"199":1,"222":1,"385":1}}],["популярными",{"2":{"331":1,"334":1,"545":1}}],["популярным",{"2":{"176":2,"372":1,"472":1}}],["популярные",{"2":{"173":1,"432":1,"508":1}}],["популярны",{"2":{"167":1,"176":1}}],["популярный",{"2":{"115":1,"222":2,"421":1}}],["популярен",{"2":{"137":1,"140":1,"162":1,"201":1,"290":1,"386":1,"394":1}}],["популяризация",{"2":{"118":2}}],["попутный",{"2":{"74":1}}],["попутно",{"2":{"72":1,"199":1}}],["познавательные",{"2":{"396":1}}],["познакомившись",{"2":{"147":1}}],["познакомились",{"2":{"145":1,"197":1,"434":1,"455":1}}],["познакомился",{"2":{"71":1}}],["познакомимся",{"2":{"131":1,"147":1,"199":1,"224":1,"235":2,"332":1,"334":1}}],["позитивного",{"2":{"377":1}}],["позиционируют",{"2":{"507":1}}],["позицией",{"2":{"331":1}}],["позиции",{"2":{"173":1}}],["позаботится",{"2":{"204":1,"224":1,"231":1,"360":1}}],["позора",{"0":{"194":1}}],["поздно",{"2":{"156":1,"465":1}}],["позже",{"2":{"85":1,"105":1,"134":2,"201":1,"212":1,"222":1,"227":1,"239":1,"247":1,"249":1,"250":1,"255":1,"264":1,"268":1,"311":1,"313":1,"343":2,"363":1,"374":1,"391":1,"443":1,"444":1,"452":1,"472":1}}],["позволили",{"2":{"308":1}}],["позволить",{"2":{"59":1,"286":1}}],["позволит",{"2":{"11":1,"47":1,"86":1,"173":1,"224":1,"247":1,"260":1,"267":1,"304":1,"374":1,"375":1,"400":1}}],["позволял",{"2":{"250":1}}],["позволят",{"2":{"244":1,"394":1,"434":1}}],["позволяя",{"2":{"228":1,"301":1,"419":1}}],["позволяют",{"2":{"162":1,"246":1,"315":1,"322":1,"336":1,"422":1,"432":1,"449":1}}],["позволяющую",{"2":{"313":1}}],["позволяющая",{"2":{"297":1,"332":1,"455":1}}],["позволяющего",{"2":{"385":1}}],["позволяющее",{"2":{"278":1}}],["позволяющему",{"2":{"161":1}}],["позволяющим",{"2":{"329":1}}],["позволяющими",{"2":{"197":1}}],["позволяющих",{"2":{"325":1,"455":1}}],["позволяющие",{"2":{"197":1,"199":1,"267":1,"331":1,"394":1,"507":1}}],["позволяющий",{"2":{"117":1,"128":1,"138":1,"170":1,"252":1,"343":1,"364":1}}],["позволяйте",{"2":{"158":2}}],["позволяет",{"2":{"34":1,"62":1,"63":1,"91":1,"105":1,"125":1,"134":2,"138":1,"168":1,"170":2,"174":1,"175":1,"177":1,"200":1,"203":1,"212":1,"224":3,"244":1,"246":1,"263":1,"271":1,"288":1,"292":2,"303":1,"309":1,"316":1,"319":3,"322":1,"358":1,"375":1,"380":1,"386":2,"391":1,"394":1,"421":1,"423":2,"433":1,"436":1,"437":1,"442":1,"451":1,"462":1,"463":2,"464":1,"472":2,"506":1,"511":1,"513":1,"554":1,"555":1}}],["поняли",{"2":{"223":1,"343":1}}],["поняв",{"2":{"212":1}}],["понятен",{"2":{"182":1,"454":1}}],["понять",{"2":{"159":1,"181":1,"213":1,"232":1,"239":1,"278":1,"304":1,"325":1,"344":1,"359":1,"360":1,"375":1,"425":1,"443":1,"462":1,"473":1}}],["понятий",{"2":{"202":1,"348":1}}],["понятийном",{"2":{"62":1}}],["понятия",{"2":{"200":1,"202":1,"219":1,"268":1,"291":1,"333":1,"354":1,"396":1,"407":1,"417":1,"464":1}}],["понятиями",{"2":{"156":1,"247":1}}],["понятии",{"2":{"200":1}}],["понятие",{"2":{"116":1,"201":1,"249":1,"268":1,"384":1,"394":1,"463":1}}],["понятное",{"2":{"437":1}}],["понятно",{"2":{"247":1,"443":1,"507":1}}],["понятной",{"2":{"166":1}}],["понятна",{"2":{"181":1,"357":1}}],["понятные",{"2":{"432":1}}],["понятными",{"2":{"170":1}}],["понятным",{"2":{"118":1,"270":1,"434":1}}],["понятный",{"2":{"62":1,"77":1,"177":1,"351":1}}],["понятную",{"2":{"97":1,"471":1}}],["понятней",{"2":{"83":1}}],["понадобятся",{"2":{"231":1,"295":1,"335":1}}],["понадобится",{"2":{"36":1,"67":1,"104":1,"105":1,"201":1,"231":2,"255":1,"256":1,"287":1,"432":1}}],["понадобиться",{"2":{"34":1}}],["поначалу",{"2":{"203":1}}],["понимаете",{"2":{"319":1,"394":1}}],["понимается",{"2":{"269":1}}],["понимают",{"2":{"168":1,"232":1,"268":1}}],["понимаются",{"2":{"160":1,"429":1}}],["понимании",{"2":{"349":1,"364":1}}],["пониманием",{"2":{"182":1}}],["понимание",{"0":{"203":1},"2":{"149":1,"154":1,"260":1,"351":1,"400":1,"473":1}}],["понимания",{"2":{"62":1,"74":1,"131":1,"145":1,"149":1,"178":1,"260":1,"293":1,"301":1,"303":1,"350":1,"358":1,"402":1,"416":1,"452":1}}],["понимать",{"2":{"116":1,"200":1,"271":1,"325":1,"374":1,"473":1}}],["поэкспериментируйте",{"2":{"473":1}}],["поэкспериментировать",{"2":{"51":1}}],["поэтапного",{"2":{"347":1}}],["поэтапно",{"2":{"70":1}}],["поэтому",{"2":{"13":1,"23":1,"44":1,"74":2,"95":1,"98":1,"108":1,"124":2,"134":1,"137":1,"143":1,"144":1,"150":2,"158":1,"166":1,"168":2,"175":1,"181":1,"200":1,"201":1,"202":1,"204":2,"212":2,"218":1,"219":1,"223":1,"225":1,"226":1,"227":2,"232":1,"237":1,"245":1,"256":1,"262":1,"264":1,"267":1,"280":1,"287":2,"291":1,"295":1,"317":1,"322":1,"325":2,"326":1,"330":1,"331":3,"338":1,"343":2,"344":1,"353":1,"354":1,"364":3,"366":1,"374":1,"375":1,"377":2,"378":1,"381":2,"382":1,"383":1,"388":1,"390":1,"394":1,"433":2,"435":1,"436":4,"438":2,"439":1,"441":1,"443":1,"446":1,"447":2,"449":1,"454":1,"460":1,"462":1,"463":1,"464":1,"472":1}}],["помечает",{"2":{"393":1}}],["помечаем",{"2":{"171":1}}],["помеченный",{"2":{"256":1}}],["помеченных",{"2":{"231":1}}],["поместили",{"2":{"256":1,"344":1}}],["поместим",{"2":{"224":1,"375":1}}],["поместите",{"2":{"225":1,"226":1,"393":1}}],["поместит",{"2":{"203":1,"223":1}}],["поместить",{"2":{"139":1,"344":1,"423":1}}],["помещен",{"2":{"382":1}}],["помещены",{"2":{"136":1,"391":1}}],["помещаться",{"2":{"429":1}}],["помещаем",{"2":{"316":1}}],["помещается",{"2":{"249":1,"548":1}}],["помещаются",{"2":{"187":1,"224":1,"429":1}}],["поменять",{"2":{"40":1,"41":1,"504":1}}],["помните",{"2":{"287":1,"364":1,"376":1,"393":1}}],["помнить",{"2":{"134":1,"202":1,"203":1,"227":1,"245":1,"267":1,"324":2,"325":1,"378":1,"394":1,"425":1,"447":1,"448":1,"462":1}}],["помним",{"2":{"41":1}}],["помимо",{"2":{"119":1,"168":1,"171":1,"176":1,"192":1,"224":1,"291":1,"300":1,"325":1,"370":1,"400":1,"436":1}}],["помогают",{"2":{"202":1,"471":1,"473":1}}],["помогающая",{"2":{"200":1}}],["помогает",{"2":{"177":1,"212":1,"240":1,"267":1,"443":1,"473":1,"507":1}}],["помогут",{"2":{"154":1,"198":1,"199":1,"213":1,"344":1}}],["поможет",{"2":{"119":1,"149":1,"260":2,"295":1,"372":2,"400":2,"473":1}}],["помочь",{"2":{"117":1,"164":1,"220":1,"304":1,"473":1}}],["помощь",{"2":{"246":1,"249":1,"342":1,"378":1}}],["помощью",{"0":{"144":1,"235":1,"237":1,"247":1,"251":1,"346":1,"354":1,"359":1,"386":1,"410":1,"414":1,"446":1},"1":{"236":1,"237":1,"238":2,"239":2,"240":2,"241":2,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"355":1,"356":1,"360":1,"361":1,"362":1,"363":1,"447":1,"448":1,"449":1,"450":1,"451":1,"452":1},"2":{"35":2,"89":2,"108":1,"115":1,"131":1,"137":1,"143":1,"144":2,"145":1,"147":1,"150":1,"162":1,"163":1,"164":1,"166":1,"167":2,"176":1,"181":2,"203":2,"204":1,"211":2,"212":1,"221":1,"223":2,"224":1,"226":2,"227":1,"229":2,"231":7,"232":1,"234":1,"235":3,"237":1,"238":1,"239":2,"243":1,"244":3,"245":2,"246":1,"247":2,"249":2,"252":1,"254":2,"255":2,"256":2,"259":1,"264":1,"267":1,"289":1,"292":2,"295":2,"300":3,"302":2,"303":1,"304":1,"306":1,"308":1,"309":2,"310":1,"311":1,"315":1,"316":2,"319":2,"323":2,"325":1,"327":1,"328":1,"329":1,"330":2,"331":2,"332":1,"334":1,"336":4,"337":1,"343":1,"344":1,"345":1,"347":2,"349":2,"353":1,"354":1,"356":1,"358":1,"359":2,"360":2,"363":1,"364":2,"365":1,"366":2,"368":1,"370":2,"372":1,"375":1,"376":2,"378":1,"379":1,"380":1,"381":3,"384":3,"390":1,"391":3,"393":2,"395":1,"400":1,"414":1,"416":1,"422":1,"433":1,"434":1,"436":1,"438":2,"444":1,"446":1,"447":1,"449":1,"450":1,"452":2,"454":3,"462":1,"508":1,"509":1,"511":1,"513":1,"516":2,"544":1}}],["помощников",{"2":{"149":1}}],["помощник",{"2":{"89":1,"223":2}}],["помощи",{"2":{"68":1,"222":1}}],["послойное",{"2":{"436":1}}],["послано",{"2":{"381":1}}],["после",{"2":{"39":1,"58":1,"66":1,"79":1,"118":1,"120":1,"121":1,"125":1,"135":1,"136":1,"145":1,"168":1,"178":1,"185":1,"187":1,"188":1,"196":1,"208":1,"211":1,"223":1,"229":1,"230":1,"231":1,"232":1,"238":1,"240":1,"243":2,"246":1,"247":1,"255":1,"256":2,"257":1,"276":1,"280":1,"286":1,"288":1,"292":2,"297":1,"298":1,"301":3,"309":1,"310":1,"313":3,"323":1,"326":2,"330":1,"331":1,"342":1,"343":2,"344":2,"345":1,"346":1,"358":2,"359":1,"370":1,"372":1,"374":2,"375":1,"376":2,"379":2,"384":1,"385":1,"387":1,"390":5,"391":2,"394":1,"419":1,"421":2,"422":1,"436":3,"437":1,"438":1,"443":1,"444":1,"448":1,"453":2,"454":2,"460":1,"462":1,"472":3,"534":1,"540":1,"556":1}}],["последствия",{"2":{"271":1}}],["последующим",{"2":{"376":1}}],["последующих",{"2":{"192":1,"281":2}}],["последующая",{"2":{"310":1}}],["последующей",{"2":{"330":1}}],["последующего",{"2":{"23":1,"334":1,"443":1,"504":1}}],["последующему",{"2":{"144":1}}],["последующем",{"2":{"17":1,"343":1}}],["последовательную",{"2":{"303":1}}],["последовательный",{"2":{"170":1}}],["последовательным",{"0":{"152":1},"2":{"247":1}}],["последовательной",{"2":{"218":1}}],["последовательном",{"2":{"170":1}}],["последовательного",{"2":{"167":1,"436":3}}],["последовательно",{"2":{"157":1,"301":1,"302":1,"364":1,"436":1}}],["последовательности",{"2":{"153":1,"158":1,"240":1}}],["последнего",{"2":{"454":1}}],["последнем",{"2":{"317":1}}],["последней",{"2":{"203":1,"263":1}}],["последнее",{"2":{"164":1,"448":1}}],["последняя",{"2":{"199":1,"388":1,"395":1,"400":1}}],["последним",{"2":{"256":1,"261":1,"303":1,"443":1}}],["последними",{"2":{"86":1}}],["последний",{"2":{"159":1,"286":1,"311":1,"343":1,"381":1,"388":1,"394":1}}],["последних",{"2":{"143":1,"225":1,"421":1}}],["последние",{"2":{"50":1,"76":1,"160":1,"460":1,"536":1}}],["последнюю",{"2":{"25":1,"222":1}}],["посещении",{"2":{"331":1}}],["посвящены",{"2":{"231":1,"271":1}}],["посвящена",{"2":{"221":1,"276":1,"414":1,"436":1}}],["посвященный",{"2":{"154":1}}],["посадочная",{"2":{"167":1}}],["посадочной",{"2":{"167":1}}],["поскольку",{"2":{"134":1,"135":2,"137":1,"148":1,"149":1,"156":1,"162":1,"167":2,"170":1,"171":2,"178":1,"200":1,"201":2,"204":1,"212":1,"213":1,"221":1,"227":2,"231":3,"232":2,"244":1,"256":2,"265":1,"267":1,"286":1,"291":1,"295":1,"296":3,"297":1,"298":1,"300":1,"301":1,"303":1,"311":1,"316":1,"319":2,"322":2,"324":1,"328":2,"329":1,"331":2,"344":1,"345":1,"351":1,"353":1,"354":1,"356":1,"358":2,"360":1,"361":1,"364":3,"365":1,"366":2,"372":3,"373":1,"376":1,"379":1,"381":1,"383":1,"384":1,"390":1,"391":1,"393":1,"394":1,"396":1,"436":2,"439":1,"440":1,"445":1,"446":1,"448":1,"449":1,"454":2}}],["посылать",{"2":{"118":1}}],["посредником",{"2":{"117":1}}],["посредством",{"2":{"40":1}}],["поступившие",{"2":{"395":1}}],["поступления",{"2":{"12":1}}],["пострадать",{"2":{"336":1}}],["построим",{"2":{"359":1,"442":1}}],["построить",{"2":{"83":1,"200":1,"225":1,"232":2,"400":1,"434":1}}],["построчно",{"2":{"292":1,"294":1,"296":1}}],["построено",{"2":{"232":1,"394":1}}],["построен",{"2":{"200":1,"202":1,"229":1}}],["построенные",{"2":{"200":1,"323":1,"394":1,"462":1}}],["построены",{"2":{"135":1,"200":1}}],["построению",{"2":{"235":1,"400":1}}],["построение",{"2":{"76":1}}],["построения",{"2":{"39":1,"200":3,"299":1,"508":1,"542":1}}],["постов",{"2":{"183":1}}],["постоянный",{"2":{"343":1}}],["постоянных",{"2":{"158":1}}],["постоянными",{"2":{"446":1}}],["постоянным",{"2":{"116":1}}],["постоянной",{"2":{"434":1,"455":1}}],["постоянного",{"2":{"343":1,"368":1}}],["постоянно",{"2":{"116":1,"225":1,"243":1,"385":1,"396":1}}],["постсервисное",{"2":{"149":1}}],["постепенной",{"2":{"348":1}}],["постепенно",{"2":{"79":1,"199":1,"200":1,"334":1,"400":1}}],["постепенное",{"2":{"76":1,"336":1}}],["постановка",{"2":{"390":1,"391":1}}],["поставки",{"2":{"389":1}}],["поставляется",{"2":{"346":1}}],["поставляемых",{"2":{"221":1}}],["поставлен",{"2":{"390":1}}],["поставлены",{"2":{"293":1}}],["поставленных",{"2":{"64":1}}],["поставщиков",{"2":{"118":1}}],["поставив",{"2":{"115":1}}],["поставить",{"2":{"112":1,"115":1,"393":1,"433":1,"473":1}}],["постараемся",{"2":{"23":1}}],["посмотрели",{"2":{"368":1}}],["посмотреть",{"2":{"16":1,"109":2,"140":1,"200":1,"223":1,"316":2,"330":1,"343":1,"405":1,"432":1,"433":1,"472":1,"473":1,"508":1}}],["посмотрим",{"2":{"142":1,"159":1,"246":1,"303":1,"314":1,"315":1,"318":1,"325":1,"337":1,"351":2,"352":1,"360":2,"436":1,"444":2,"452":1}}],["посмотрите",{"2":{"22":1,"148":1,"222":1,"236":1,"249":1,"302":1,"307":1,"335":1,"350":1,"371":1,"433":1,"435":1,"473":1}}],["потратьте",{"2":{"433":1,"468":1}}],["потратит",{"2":{"375":1}}],["потребуются",{"2":{"373":1}}],["потребует",{"2":{"38":1,"200":1}}],["потребуется",{"2":{"12":1,"222":1,"228":1,"231":1,"301":1,"306":1,"311":1,"325":1,"376":1}}],["потребностей",{"2":{"304":1,"349":1,"383":1}}],["потребностями",{"2":{"224":1,"231":1}}],["потребностях",{"2":{"137":1}}],["потребляют",{"2":{"301":1}}],["потребительском",{"2":{"147":1}}],["потери",{"2":{"431":1}}],["потеряете",{"2":{"330":1}}],["потеряло",{"2":{"159":1}}],["потерять",{"2":{"116":1}}],["потенциально",{"2":{"436":1}}],["потенциал",{"2":{"308":1,"393":2}}],["потоке",{"2":{"268":1,"301":1,"344":1,"364":1,"436":2,"463":1}}],["потоках",{"2":{"436":1}}],["потоками",{"0":{"349":1,"413":1},"1":{"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1},"2":{"239":1,"249":1,"282":1,"294":1,"334":1,"343":1,"413":1,"441":2}}],["потока",{"0":{"239":1},"2":{"294":1,"301":2,"302":1,"303":1,"325":1,"351":1}}],["поток",{"2":{"159":1,"200":1,"270":1,"301":2,"325":1,"460":1}}],["потоком",{"2":{"127":1,"203":1,"204":1,"276":1,"289":1,"316":1,"349":1,"350":1,"356":1,"363":1,"368":1,"463":1}}],["потоков",{"2":{"11":1,"62":1}}],["поточнее",{"2":{"89":1}}],["потомок",{"2":{"462":1}}],["потомком",{"2":{"462":1}}],["потом",{"2":{"22":1,"26":1,"36":1,"39":1,"40":1,"72":1,"74":1,"99":1,"152":1,"344":1,"462":2,"472":2,"504":1}}],["потому",{"2":{"3":1,"17":1,"48":1,"95":1,"96":1,"116":1,"152":1,"228":1,"280":1,"302":1,"319":1,"421":1,"454":1,"462":1,"472":1}}],["по",{"0":{"48":1,"61":1,"324":1,"329":1,"543":1},"2":{"11":1,"12":1,"13":3,"14":1,"16":1,"17":3,"22":2,"26":2,"41":1,"47":2,"48":4,"63":1,"76":2,"79":2,"86":2,"89":1,"103":1,"105":2,"109":1,"112":1,"115":3,"116":4,"117":3,"123":2,"124":4,"125":1,"129":1,"133":2,"134":2,"135":1,"136":1,"137":2,"140":1,"141":1,"142":1,"143":1,"144":5,"145":2,"148":1,"153":1,"156":1,"158":1,"161":2,"164":2,"166":1,"168":2,"170":4,"171":1,"172":1,"176":1,"178":1,"179":1,"181":2,"182":1,"185":1,"187":1,"199":4,"200":3,"201":1,"202":1,"204":3,"209":1,"211":1,"219":2,"221":3,"222":2,"223":2,"224":2,"226":1,"227":2,"228":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"238":2,"239":3,"241":1,"244":4,"245":3,"246":1,"247":2,"249":9,"250":1,"251":1,"254":1,"255":4,"256":6,"257":3,"259":1,"260":2,"263":2,"264":1,"265":2,"266":1,"267":1,"269":1,"271":1,"272":1,"284":2,"286":1,"287":3,"288":4,"289":1,"291":3,"292":2,"296":1,"301":2,"303":2,"304":1,"307":1,"308":4,"309":3,"310":1,"313":1,"316":4,"318":1,"319":3,"322":5,"324":2,"325":3,"328":1,"329":1,"330":2,"331":5,"332":1,"335":1,"336":4,"337":1,"339":1,"341":1,"343":1,"345":1,"347":1,"349":1,"351":3,"352":1,"353":3,"358":2,"363":5,"364":3,"370":2,"371":2,"372":1,"375":2,"379":1,"381":1,"385":3,"386":1,"388":1,"391":1,"393":1,"394":2,"402":1,"404":1,"418":1,"421":2,"422":1,"423":1,"429":4,"430":1,"432":2,"433":2,"434":1,"436":4,"440":1,"441":1,"442":1,"447":1,"448":2,"450":1,"454":4,"456":1,"460":2,"461":1,"462":6,"464":1,"470":1,"471":1,"472":8,"473":8,"497":1,"504":1,"511":1,"513":1,"515":1,"527":1,"528":1,"536":1,"538":1,"539":1,"540":1}}],["полиморфизмом",{"2":{"464":1}}],["политика",{"2":{"116":1}}],["политиками",{"2":{"59":1}}],["политики",{"2":{"59":2}}],["политик",{"2":{"59":1,"373":1}}],["полтора",{"2":{"462":1}}],["полагаясь",{"2":{"319":1}}],["полагаться",{"2":{"144":1,"329":1}}],["половину",{"2":{"436":1}}],["полосой",{"2":{"436":1}}],["полос",{"2":{"330":1}}],["полоса",{"2":{"171":1}}],["полосу",{"2":{"168":1}}],["поломке",{"2":{"124":1}}],["положить",{"2":{"429":1}}],["положительное",{"2":{"374":1}}],["положительного",{"2":{"79":1,"197":1}}],["положительный",{"2":{"149":1}}],["положительные",{"2":{"130":1,"147":1,"322":1}}],["положено",{"2":{"386":1}}],["положение",{"2":{"120":1,"174":1,"295":1}}],["полгода",{"2":{"86":1}}],["пользуется",{"2":{"462":1}}],["пользу",{"0":{"402":1},"2":{"198":1,"402":1}}],["польза",{"2":{"74":1}}],["пользоваться",{"2":{"89":1,"462":1,"463":1,"471":1,"539":1}}],["пользователем",{"2":{"149":1,"177":1,"178":1,"191":1,"192":1,"231":1,"239":1,"244":1,"250":1,"317":1,"325":1,"329":1,"365":1,"370":1,"463":1,"464":1,"557":1}}],["пользователей",{"2":{"47":1,"59":2,"150":1,"152":1,"186":1,"193":1,"199":1,"222":1,"257":1,"268":1,"323":2,"324":5,"325":2,"328":1,"330":2,"331":1,"333":2,"336":2,"356":1,"372":1,"461":1,"464":1,"472":2}}],["пользователи",{"2":{"116":1,"152":1,"167":1,"168":1,"182":2,"189":1,"222":1,"324":1,"347":1}}],["пользователю",{"2":{"62":1,"116":1,"138":1,"150":1,"152":1,"154":1,"156":1,"157":2,"159":1,"161":1,"162":2,"163":1,"164":2,"167":2,"168":2,"170":3,"172":1,"173":1,"174":1,"175":2,"176":1,"177":1,"179":1,"183":1,"189":1,"190":1,"197":1,"240":1,"244":1,"317":1,"324":1,"325":1,"326":1,"328":1,"329":2,"330":2,"336":1,"343":2,"364":1,"374":1,"393":1,"421":1,"463":1}}],["пользователями",{"2":{"160":1,"197":1,"556":1}}],["пользователям",{"2":{"68":1,"116":1,"177":1,"182":1,"222":1,"381":1}}],["пользователя",{"0":{"324":1},"2":{"47":1,"76":1,"104":1,"116":7,"147":1,"149":2,"150":1,"151":2,"152":2,"157":2,"158":3,"159":4,"161":1,"163":1,"165":2,"166":3,"167":1,"168":4,"170":1,"178":1,"179":1,"185":1,"186":2,"188":1,"189":2,"191":1,"194":1,"195":2,"196":1,"197":1,"231":1,"240":1,"241":1,"256":1,"301":1,"308":2,"324":3,"325":2,"327":2,"329":4,"330":5,"331":9,"332":1,"336":3,"343":3,"344":1,"364":2,"381":1,"421":1,"423":1,"424":2,"436":1,"462":2,"472":3,"496":1}}],["пользовательской",{"0":{"240":1},"2":{"182":1}}],["пользовательского",{"0":{"150":1,"155":1,"235":1,"238":1,"410":1},"1":{"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1},"2":{"124":1,"147":2,"149":2,"150":5,"151":1,"154":3,"156":1,"163":3,"178":1,"183":1,"184":1,"203":2,"210":1,"229":1,"231":1,"237":1,"241":1,"249":1,"250":1,"264":1,"265":1,"267":1,"289":2,"297":2,"298":1,"301":1,"308":1,"309":1,"311":1,"336":1,"339":1,"353":2,"384":1,"417":2,"440":1,"447":1}}],["пользовательские",{"2":{"235":3,"239":1,"308":1}}],["пользовательский",{"2":{"154":1,"184":2,"197":1,"225":1,"231":1,"302":1,"317":1,"343":3,"344":1,"436":1,"472":1,"555":1}}],["пользовательским",{"2":{"149":1,"256":1,"261":1}}],["пользовательских",{"2":{"149":1,"150":2,"200":2,"223":1,"233":1,"246":1,"300":1,"319":1,"400":1,"410":1}}],["пользовательская",{"2":{"62":1}}],["пользователь",{"2":{"11":1,"116":6,"147":1,"156":1,"157":1,"158":2,"159":4,"164":1,"168":1,"170":2,"171":1,"182":1,"187":1,"188":2,"189":2,"190":2,"192":1,"193":2,"194":1,"195":1,"196":1,"210":1,"212":1,"229":2,"231":1,"239":1,"240":1,"241":1,"254":1,"319":1,"324":1,"325":2,"326":1,"329":4,"330":1,"331":1,"336":2,"341":1,"342":1,"343":4,"344":1,"393":1,"436":1,"452":1,"460":1,"462":1,"463":2,"504":1,"508":1,"534":1}}],["пользования",{"2":{"41":1}}],["полутора",{"2":{"537":1}}],["полупрозрачным",{"2":{"255":1}}],["полуготовые",{"2":{"71":1}}],["получены",{"2":{"319":1,"452":1}}],["полученном",{"2":{"454":1}}],["полученное",{"2":{"437":1}}],["полученными",{"2":{"454":1}}],["полученный",{"2":{"328":1}}],["полученные",{"2":{"292":1,"306":1,"325":1,"333":1,"438":1,"443":1,"449":1,"451":1,"454":1}}],["полученных",{"2":{"165":1}}],["полученная",{"2":{"125":1}}],["получению",{"2":{"291":1,"364":1}}],["получения",{"2":{"123":1,"128":1,"161":1,"204":1,"231":1,"241":1,"255":2,"279":1,"287":1,"301":1,"353":1,"366":1,"385":1,"452":1}}],["получении",{"2":{"116":1,"444":1}}],["получение",{"0":{"446":1},"1":{"447":1,"448":1,"449":1,"450":1,"451":1,"452":1},"2":{"68":1,"133":1,"143":1,"322":1}}],["получила",{"2":{"303":1}}],["получилось",{"2":{"223":1}}],["получил",{"2":{"165":1,"204":1}}],["получили",{"2":{"135":1,"251":1,"268":1,"308":1,"328":1,"454":1}}],["получившуюся",{"2":{"354":1}}],["получив",{"2":{"136":2,"227":1,"288":1,"325":1,"331":1,"439":1}}],["получим",{"2":{"91":1,"229":1,"235":1,"311":1,"344":1}}],["получит",{"2":{"206":1,"303":1,"336":1}}],["получите",{"2":{"147":1,"238":1,"376":1,"393":1}}],["получить",{"0":{"402":1},"2":{"62":1,"91":1,"116":1,"130":1,"145":1,"154":1,"178":1,"204":3,"231":1,"249":1,"289":1,"295":1,"303":1,"326":1,"327":1,"333":1,"346":1,"364":2,"376":1,"380":1,"383":1,"419":1,"422":1,"436":1,"449":1,"472":1,"536":1}}],["получится",{"2":{"26":1,"282":1,"390":1,"473":1}}],["получают",{"2":{"351":2}}],["получай",{"2":{"331":1}}],["получат",{"2":{"402":1}}],["получатель",{"2":{"454":1}}],["получателя",{"2":{"294":3,"327":1}}],["получателей",{"2":{"293":1}}],["получателе",{"2":{"247":1}}],["получаться",{"2":{"79":1}}],["получать",{"2":{"11":1,"109":1,"115":1,"186":2,"244":1,"249":1,"308":1,"336":3,"360":1,"381":1,"441":1,"449":1,"452":1,"454":1,"472":1,"473":1}}],["получаем",{"2":{"98":1,"112":1,"124":1,"171":1,"231":1,"247":1,"296":1,"303":1,"308":1,"325":1,"331":1,"366":1,"381":1,"394":1,"443":1}}],["получаете",{"2":{"422":1,"436":1}}],["получается",{"2":{"17":1,"147":1,"204":1,"265":1,"303":1,"421":1,"429":1,"460":1,"464":1,"472":4,"504":1}}],["получает",{"2":{"3":1,"116":1,"117":1,"134":1,"243":1,"244":1,"255":1,"256":1,"296":1,"297":1,"301":1,"303":4,"316":1,"318":1,"319":1,"322":1,"330":1,"356":1,"360":2,"364":1,"374":1,"376":1,"437":2,"438":1,"454":1,"472":1}}],["получая",{"2":{"11":1,"287":1,"382":1}}],["полем",{"2":{"231":1,"294":1}}],["полезную",{"2":{"444":1}}],["полезная",{"2":{"393":1}}],["полезна",{"2":{"338":1,"369":1}}],["полезные",{"0":{"458":1},"1":{"459":1,"460":1},"2":{"433":1,"464":1,"473":1,"479":1,"485":1,"545":1}}],["полезным",{"2":{"232":1,"302":1,"303":1,"313":1}}],["полезных",{"2":{"226":1,"338":1,"433":1}}],["полезный",{"2":{"154":1,"244":1}}],["полезны",{"2":{"149":1,"166":1,"297":1,"299":1,"401":1,"419":1,"436":1,"461":1,"472":1}}],["полезного",{"2":{"433":1,"448":1}}],["полезной",{"2":{"325":2,"421":1,"442":1,"452":1}}],["полезное",{"2":{"221":1,"539":1}}],["полезность",{"2":{"159":1,"461":1}}],["полезно",{"2":{"3":1,"4":1,"22":1,"97":1,"145":1,"295":1,"302":1,"329":1,"350":1,"391":1,"467":1}}],["полезен",{"2":{"134":1,"281":1,"291":1,"293":1,"301":1,"308":1,"358":1,"472":1,"473":1}}],["поле",{"2":{"47":1,"48":2,"204":2,"209":1,"231":1,"313":2,"316":1,"325":2,"329":3,"345":1,"381":1,"437":1,"448":1,"454":1,"462":1,"463":1}}],["полей",{"2":{"44":1,"47":2,"48":1,"151":1,"201":1,"325":1,"338":1,"341":1,"448":1}}],["полях",{"2":{"48":1}}],["полям",{"0":{"48":1},"2":{"338":1,"358":1}}],["полями",{"2":{"17":1,"203":1,"204":1,"231":1,"326":1,"338":1,"444":1,"448":2}}],["поля",{"2":{"16":1,"17":1,"18":1,"44":1,"47":2,"48":1,"161":1,"179":1,"201":1,"204":3,"288":1,"294":1,"313":1,"319":1,"326":1,"341":4,"359":1,"437":1,"448":2,"463":1}}],["полна",{"2":{"149":1}}],["полную",{"2":{"137":1,"228":1,"372":1}}],["полные",{"2":{"228":1}}],["полным",{"2":{"137":1,"276":1,"322":1,"350":1,"353":1,"442":1}}],["полный",{"2":{"129":1,"148":1,"161":1,"211":1,"235":1,"255":1,"271":1,"313":1,"317":1,"322":3,"343":1,"376":1,"380":1,"381":1,"388":1,"462":1}}],["полноты",{"2":{"412":1}}],["полноэкранном",{"2":{"339":1}}],["полного",{"2":{"339":1,"363":1,"367":1,"447":1}}],["полно",{"2":{"115":1,"471":1,"512":1}}],["полному",{"2":{"48":1,"231":1}}],["полное",{"2":{"47":1,"91":1,"134":1,"192":1,"197":1,"336":1,"339":1,"454":1}}],["полностью",{"2":{"26":1,"119":1,"127":1,"147":1,"175":1,"181":1,"200":1,"204":1,"208":1,"225":1,"308":1,"346":1,"370":1,"373":1,"436":1,"454":1,"556":1}}],["полноценную",{"2":{"504":1}}],["полноценного",{"2":{"295":1}}],["полноценное",{"2":{"115":1}}],["полноценной",{"2":{"115":1}}],["полноценным",{"2":{"76":1}}],["полноценный",{"2":{"12":1,"237":1}}],["полноценная",{"2":{"12":1,"364":1}}],["полней",{"2":{"4":1}}],["поделился",{"2":{"433":1}}],["поделиться",{"2":{"183":1,"239":2,"317":1,"336":1,"425":1}}],["подтвердили",{"2":{"381":1}}],["подтверждающих",{"2":{"372":1}}],["подтверждать",{"2":{"331":1}}],["подтверждается",{"2":{"22":1,"144":1}}],["подтвержден",{"2":{"329":1}}],["подтверждение",{"0":{"194":1}}],["подтверждения",{"2":{"158":1,"175":1,"187":1,"194":1,"329":1}}],["подтверждении",{"2":{"134":1}}],["подмаршрутов",{"2":{"317":1}}],["подмаршруты",{"2":{"317":1,"319":1}}],["подмена",{"0":{"193":1}}],["поднимают",{"2":{"351":1}}],["подниматься",{"2":{"247":1}}],["поднабор",{"2":{"170":1}}],["подумайте",{"2":{"381":1}}],["подумаем",{"2":{"238":1}}],["подумав",{"2":{"232":1}}],["подумать",{"2":{"4":1,"168":1,"185":1}}],["подводит",{"2":{"410":1}}],["подвохом",{"0":{"186":1},"2":{"186":1}}],["подвижные",{"2":{"297":1}}],["подвесить",{"2":{"302":1}}],["подвергнуть",{"2":{"232":1}}],["подведут",{"2":{"152":1}}],["подведение",{"0":{"145":1,"197":1,"219":1,"233":1,"258":1,"304":1,"332":1,"347":1,"368":1,"396":1,"455":1}}],["подгружается",{"2":{"472":1}}],["подгруппа",{"2":{"178":2}}],["подгруппе",{"2":{"170":1}}],["подготовиться",{"2":{"349":1}}],["подготовились",{"2":{"228":1}}],["подготовим",{"2":{"221":1}}],["подготовлены",{"2":{"212":1,"224":1}}],["подготовки",{"2":{"133":1,"326":1,"348":1,"473":1}}],["подготовка",{"2":{"74":1}}],["подразумевает",{"2":{"200":1,"225":1,"263":1,"370":1,"385":1}}],["подразумевается",{"2":{"149":1,"472":1,"507":1}}],["подробней",{"2":{"554":1}}],["подробнее",{"2":{"116":1,"134":1,"210":1,"276":1,"282":1,"323":1,"325":1,"432":1}}],["подробны",{"2":{"396":1}}],["подробный",{"2":{"346":1}}],["подробные",{"2":{"316":1}}],["подробную",{"2":{"127":1,"156":1,"157":1,"226":1}}],["подробное",{"2":{"345":1}}],["подробности",{"2":{"331":1,"425":1}}],["подробностями",{"2":{"316":1}}],["подробностей",{"2":{"271":1}}],["подробному",{"2":{"241":1}}],["подробной",{"2":{"128":1}}],["подробно",{"2":{"119":1,"120":1,"124":1,"203":2,"204":1,"223":1,"235":1,"239":1,"246":1,"249":1,"251":1,"256":1,"258":1,"289":1,"297":1,"298":1,"308":1,"322":1,"334":1,"364":1,"368":1,"429":1,"527":1}}],["подробная",{"2":{"51":1,"82":1,"117":1}}],["подпапкой",{"2":{"253":1}}],["подпапка",{"2":{"135":1}}],["подписанных",{"2":{"356":1}}],["подписанным",{"2":{"188":1}}],["подписи",{"2":{"325":3}}],["подпись",{"2":{"325":1}}],["подписчиков",{"2":{"291":1}}],["подписывает",{"2":{"354":1}}],["подписываться",{"2":{"354":1}}],["подписываются",{"2":{"291":1}}],["подписывания",{"2":{"116":1}}],["подписок",{"2":{"188":1}}],["подписки",{"2":{"186":1,"188":1,"356":1}}],["поддиректории",{"2":{"423":1,"429":1}}],["поддиректориями",{"2":{"421":1}}],["подделки",{"2":{"325":1}}],["поддержкой",{"2":{"432":1,"462":1}}],["поддержку",{"2":{"222":1,"265":1}}],["поддержки",{"2":{"188":1,"329":1,"358":1,"460":2,"473":1,"536":1}}],["поддержка",{"0":{"68":1},"2":{"61":1,"68":1,"86":2,"149":2,"363":3,"462":2}}],["поддерживаются",{"2":{"460":1}}],["поддерживают",{"2":{"336":1,"543":1,"557":1}}],["поддерживающих",{"2":{"130":1,"331":1}}],["поддерживая",{"2":{"210":1}}],["поддерживаемость",{"2":{"471":1}}],["поддерживаемый",{"2":{"359":1}}],["поддерживаемых",{"2":{"161":1,"325":1,"341":1}}],["поддерживает",{"2":{"264":1,"446":1}}],["поддерживается",{"2":{"86":1,"203":1,"204":2,"250":1,"431":1,"555":1}}],["поддерживайте",{"2":{"158":1}}],["поддерживаться",{"2":{"462":1,"465":1}}],["поддерживать",{"2":{"63":1,"125":1,"254":1,"265":1,"295":1,"394":1,"436":1,"464":1}}],["поддается",{"2":{"269":1,"472":1}}],["поддавайтесь",{"2":{"264":1}}],["поддомена",{"2":{"144":1}}],["поддомен",{"2":{"134":2,"135":1}}],["поддомены",{"2":{"134":3,"141":1,"144":1,"422":1}}],["поддоменов",{"2":{"134":2,"146":1}}],["подарила",{"2":{"472":1}}],["подарочные",{"2":{"4":1}}],["податлив",{"2":{"446":1}}],["подавляющее",{"2":{"322":1}}],["подавление",{"2":{"167":1}}],["подает",{"2":{"245":1}}],["подальше",{"2":{"96":1}}],["подчиняется",{"2":{"316":1}}],["подчинение",{"2":{"2":1}}],["подчеркнуть",{"2":{"267":1}}],["подчеркивания",{"2":{"214":1}}],["подчеркивании",{"2":{"92":1}}],["подчеркивает",{"2":{"200":1}}],["подчеркивающим",{"2":{"163":1}}],["подзадачи",{"2":{"79":1}}],["подключить",{"2":{"313":1,"422":1}}],["подключена",{"2":{"503":1}}],["подключены",{"2":{"347":1}}],["подключении",{"2":{"331":1}}],["подключения",{"2":{"252":1,"331":1,"394":1,"423":1,"450":1,"508":1,"542":1}}],["подключение",{"2":{"41":1,"112":1,"331":2,"504":3,"538":1}}],["подключенными",{"2":{"423":1}}],["подключенных",{"2":{"134":1}}],["подключенный",{"2":{"134":1}}],["подключаются",{"2":{"429":1}}],["подключаемые",{"2":{"331":1,"543":1}}],["подключаемый",{"2":{"252":1}}],["подключаем",{"2":{"120":1,"137":1}}],["подключать",{"2":{"12":1,"429":1,"462":1,"465":2,"539":1}}],["подскажите",{"0":{"457":1}}],["подсказку",{"2":{"343":2}}],["подсказкой",{"2":{"164":1}}],["подсказка",{"0":{"343":1},"2":{"164":1}}],["подсказками",{"2":{"98":1}}],["подсказки",{"0":{"164":1},"2":{"164":1,"343":1}}],["подсказок",{"2":{"152":1}}],["подсказать",{"2":{"89":1}}],["подсоединение",{"2":{"433":1}}],["подсоединяться",{"2":{"40":1}}],["подстановочные",{"2":{"391":1}}],["подсчет",{"2":{"239":1}}],["подсегмент",{"2":{"134":1}}],["подсвечивать",{"2":{"103":1}}],["подсветкой",{"2":{"86":1}}],["подсистему",{"2":{"3":1,"63":1}}],["подсистем",{"2":{"3":1,"263":1,"300":1,"356":1}}],["подсистемы",{"0":{"4":1},"2":{"2":2,"3":1,"4":1,"7":1,"34":3,"41":2,"263":1}}],["подобранных",{"2":{"433":1}}],["подобную",{"2":{"224":1,"367":1}}],["подобной",{"2":{"316":1}}],["подобно",{"2":{"209":1,"351":1,"391":1,"394":1}}],["подобному",{"2":{"356":1}}],["подобном",{"2":{"204":1}}],["подобное",{"2":{"34":1,"267":1,"282":1,"311":1,"359":1}}],["подобная",{"2":{"195":1}}],["подобные",{"2":{"185":1,"395":1,"447":1,"472":1}}],["подобными",{"2":{"168":1}}],["подобный",{"2":{"115":1,"117":1,"299":1,"471":1}}],["подобных",{"2":{"85":1,"89":1,"231":1,"271":1}}],["подождать",{"2":{"244":1}}],["подождите",{"2":{"204":1}}],["подойдут",{"2":{"446":1}}],["подойдет",{"2":{"137":1}}],["подойти",{"2":{"237":1,"330":1,"375":1}}],["подошли",{"2":{"233":1}}],["подошел",{"2":{"39":1}}],["подозрительные",{"2":{"116":1}}],["подходу",{"2":{"200":1,"237":1,"329":1}}],["подходов",{"2":{"200":1,"241":1,"252":1,"300":1,"329":1,"364":1,"368":1,"372":1,"378":1}}],["подходом",{"2":{"171":1,"181":1,"257":1,"268":1,"425":1,"507":1}}],["подходе",{"2":{"181":1,"235":1,"244":1,"330":1,"374":1}}],["подходы",{"2":{"147":1,"204":1,"316":1,"349":1,"368":1,"370":1,"385":1,"400":1,"463":1}}],["подходят",{"2":{"134":2,"349":1,"462":1}}],["подходящая",{"2":{"423":1}}],["подходящей",{"2":{"444":1}}],["подходящее",{"2":{"238":1,"241":1}}],["подходящем",{"2":{"115":1}}],["подходящую",{"2":{"95":1,"98":1}}],["подходящим",{"2":{"178":1,"234":1}}],["подходящие",{"2":{"98":1}}],["подходящий",{"2":{"27":1,"190":1}}],["подходящих",{"2":{"12":1}}],["подход",{"2":{"127":2,"168":1,"175":1,"181":1,"227":1,"235":1,"238":2,"250":1,"253":1,"258":1,"265":1,"271":1,"283":1,"286":3,"287":2,"289":1,"296":2,"300":1,"303":1,"309":1,"324":1,"356":2,"358":3,"361":2,"363":1,"365":2,"366":1,"376":1,"381":1,"385":1,"400":1,"439":2,"471":1,"472":1}}],["подходах",{"2":{"375":1}}],["подхода",{"2":{"105":1,"200":1,"204":1,"244":2,"273":1,"284":1,"308":1,"330":1,"336":1,"358":1,"365":1,"377":2,"400":1}}],["подходите",{"2":{"260":1}}],["подходит",{"2":{"72":1,"237":1,"238":1,"303":1,"331":1,"358":2,"433":1,"449":1,"459":1,"463":1,"464":1,"472":2}}],["подхедер",{"2":{"29":1}}],["подберем",{"2":{"27":1}}],["подбора",{"2":{"9":1}}],["под",{"2":{"4":1,"119":1,"149":1,"151":1,"158":1,"164":1,"177":1,"193":1,"195":2,"221":1,"222":1,"251":1,"255":1,"265":1,"292":1,"308":1,"336":1,"343":1,"345":1,"364":2,"373":1,"376":1,"383":1,"429":1,"461":1,"463":1,"499":1,"507":1,"508":1,"527":1}}],["прыгания",{"2":{"519":1}}],["пр",{"2":{"432":1}}],["прямая",{"2":{"351":1}}],["прямую",{"2":{"323":1}}],["прямым",{"2":{"181":1,"462":1}}],["прямых",{"2":{"171":1,"290":1,"351":1}}],["прямого",{"2":{"341":1,"351":1}}],["прямоугольниками",{"2":{"238":1}}],["прямое",{"2":{"137":1,"190":1,"287":1}}],["прямо",{"2":{"40":1,"137":1,"193":1,"433":1,"507":1}}],["прямой",{"2":{"23":1,"135":1,"183":1,"227":1,"246":1}}],["прятать",{"2":{"4":1}}],["препроцессора",{"2":{"504":1}}],["преподавательской",{"2":{"74":1}}],["презентационный",{"2":{"471":1}}],["презентационного",{"2":{"440":2}}],["прелоадер",{"2":{"425":2,"544":1}}],["прекрасный",{"2":{"473":1}}],["прекрасно",{"2":{"381":1,"394":1}}],["прекратит",{"2":{"170":1}}],["прервет",{"2":{"448":1}}],["прервана",{"2":{"168":1}}],["прерывая",{"2":{"377":1}}],["прерывать",{"2":{"377":1}}],["прерывается",{"2":{"303":1}}],["прерывании",{"2":{"297":1}}],["преследуете",{"2":{"201":1}}],["преследовали",{"2":{"178":1}}],["претенциозной",{"2":{"460":1}}],["претензий",{"2":{"9":1}}],["претерпела",{"2":{"199":1}}],["преобладающим",{"2":{"183":1}}],["преобразуется",{"2":{"251":1,"316":1}}],["преобразует",{"2":{"123":1,"448":1}}],["преобразовать",{"2":{"447":1}}],["преобразованным",{"2":{"296":1}}],["преобразованы",{"2":{"293":1}}],["преобразовано",{"2":{"230":1}}],["преобразованию",{"2":{"258":1}}],["преобразование",{"2":{"134":2,"324":1}}],["преобразования",{"2":{"44":1,"86":1,"202":1,"296":1}}],["преобразовывать",{"2":{"41":1,"295":1,"296":1}}],["пренебрегали",{"2":{"149":1}}],["превышает",{"2":{"436":1}}],["превзошла",{"2":{"250":1}}],["превзойти",{"2":{"204":1}}],["превосходящие",{"2":{"149":1}}],["превращения",{"2":{"338":1,"344":1}}],["превращает",{"2":{"334":1}}],["превращается",{"2":{"203":1}}],["превращая",{"2":{"221":1}}],["превращать",{"2":{"23":1,"347":1}}],["превратим",{"2":{"301":1}}],["превратилось",{"2":{"297":1}}],["превратился",{"2":{"268":1}}],["превратится",{"2":{"211":1}}],["превратить",{"2":{"29":1,"302":1,"315":1,"336":1,"343":1}}],["превратятся",{"2":{"204":1}}],["прежнему",{"2":{"178":1,"250":1,"257":2,"308":1,"336":1}}],["прежним",{"2":{"118":1,"199":1}}],["прежде",{"2":{"147":1,"149":1,"158":1,"159":2,"200":1,"224":1,"244":1,"303":1,"310":1,"314":1,"315":1,"319":1,"331":1,"361":1,"380":1,"381":1,"391":1,"436":1,"448":1,"452":1}}],["префикса",{"2":{"448":1}}],["префиксом",{"2":{"250":1}}],["префиксируем",{"2":{"249":1}}],["префикс",{"2":{"112":2,"206":1,"246":1}}],["преимуществами",{"2":{"200":2,"462":1}}],["преимущества",{"2":{"123":1,"130":1,"198":1,"265":1,"289":1,"303":1,"308":2,"309":1,"333":1,"336":2,"348":1,"375":1,"382":2,"455":1,"456":1}}],["преимущественно",{"2":{"118":1,"462":1,"463":1}}],["преимуществ",{"2":{"48":1,"200":1,"204":2,"224":1,"227":1,"244":1,"308":1,"336":2,"347":1,"357":1,"358":1,"363":2,"373":2,"440":1}}],["преимуществом",{"2":{"202":1,"203":1}}],["преимущество",{"2":{"17":1,"289":1,"436":1}}],["предназначались",{"2":{"473":1}}],["предназначена",{"2":{"401":1}}],["предназначенная",{"2":{"346":1}}],["предназначенных",{"2":{"199":1}}],["предназначенный",{"2":{"168":1}}],["предназначен",{"2":{"303":1,"308":1}}],["предназначено",{"2":{"159":1}}],["преданность",{"2":{"405":1}}],["предисловие",{"0":{"400":1,"497":1},"1":{"498":1}}],["пределами",{"2":{"364":2,"462":1,"463":1}}],["пределы",{"2":{"171":1,"212":2,"364":1}}],["предшествующий",{"2":{"316":1}}],["предвидеть",{"2":{"232":1}}],["предварительных",{"2":{"395":1}}],["предварительный",{"2":{"224":1,"473":1}}],["предварительное",{"2":{"401":1}}],["предварительного",{"2":{"223":1,"233":1}}],["предварительно",{"2":{"191":1,"472":1,"473":2}}],["предварительной",{"2":{"164":1,"170":1,"313":1}}],["предприятий",{"2":{"308":1}}],["предписаны",{"2":{"218":1}}],["предписано",{"2":{"212":1}}],["предписанный",{"2":{"203":1}}],["предписывает",{"2":{"200":1,"202":1,"204":1,"271":1,"302":1}}],["предписывается",{"2":{"200":1}}],["предписывают",{"2":{"200":1,"224":1}}],["предпочтение",{"2":{"316":1}}],["предпочтительнее",{"2":{"303":1}}],["предпочтительно",{"2":{"96":1,"208":1}}],["предпосылкам",{"2":{"311":1}}],["предположим",{"2":{"282":1,"317":1,"330":1}}],["предполагают",{"2":{"338":1}}],["предполагающая",{"2":{"194":1}}],["предполагает",{"2":{"372":1,"395":1,"402":1}}],["предполагается",{"2":{"329":1,"336":2,"372":1}}],["предполагаемой",{"2":{"195":1}}],["предполагалось",{"2":{"296":1}}],["предполагая",{"2":{"143":1}}],["предотвратить",{"2":{"267":1,"343":1}}],["предотвращает",{"2":{"343":1}}],["предотвращая",{"2":{"203":1}}],["предотвращать",{"2":{"196":1}}],["предотвращение",{"0":{"190":1}}],["предотвращения",{"2":{"168":1,"454":1}}],["предостережений",{"2":{"364":1}}],["предостережение",{"2":{"168":1,"264":1,"269":1}}],["предоставили",{"2":{"247":1}}],["предоставило",{"2":{"228":1}}],["предоставить",{"2":{"247":1,"286":1,"336":1,"345":1,"378":1,"424":1}}],["предоставит",{"2":{"229":1,"241":1,"254":1,"343":1,"354":1,"384":1,"387":1,"453":1}}],["предоставленные",{"2":{"402":1}}],["предоставленного",{"2":{"255":1}}],["предоставленное",{"2":{"249":1}}],["предоставлена",{"2":{"287":1}}],["предоставление",{"2":{"159":1,"440":1}}],["предоставления",{"2":{"117":1,"175":1,"189":1,"196":1,"197":1,"247":1,"252":1,"323":1,"372":1}}],["предоставляйте",{"2":{"424":1}}],["предоставляющая",{"2":{"394":1}}],["предоставляющую",{"2":{"323":1}}],["предоставляющие",{"2":{"328":1}}],["предоставляющий",{"2":{"323":1}}],["предоставляющих",{"2":{"218":1,"300":1}}],["предоставляются",{"2":{"162":1,"205":1,"282":1,"379":1,"394":1}}],["предоставляют",{"2":{"115":1,"134":1,"144":1,"199":1,"200":1,"225":1,"266":1,"275":1,"323":2,"330":1,"364":3,"394":1,"422":1,"440":1,"471":1}}],["предоставляя",{"2":{"137":1,"381":1,"440":1}}],["предоставляемой",{"2":{"396":1,"455":1}}],["предоставляемое",{"2":{"244":1}}],["предоставляемого",{"2":{"170":1,"247":1}}],["предоставляемым",{"2":{"440":1}}],["предоставляемыми",{"2":{"368":1,"415":1}}],["предоставляемых",{"2":{"349":1,"359":1,"364":1,"370":1,"372":1}}],["предоставляемый",{"2":{"226":1,"343":1,"448":1}}],["предоставляемые",{"2":{"225":1,"319":1,"363":1,"373":1,"396":1}}],["предоставляемую",{"2":{"144":1}}],["предоставляем",{"2":{"137":1,"247":1,"255":1,"366":1}}],["предоставляемая",{"2":{"124":1,"144":1}}],["предоставляет",{"2":{"115":4,"117":1,"134":1,"144":1,"199":1,"204":1,"211":2,"212":1,"224":1,"227":1,"247":1,"251":1,"252":1,"290":1,"295":3,"303":2,"314":1,"315":1,"319":3,"322":1,"323":2,"324":1,"345":1,"354":1,"359":2,"364":1,"365":1,"375":1,"379":1,"383":1,"394":1,"436":1,"437":2,"446":1,"449":1}}],["предоставляется",{"2":{"58":1,"117":1,"137":2,"212":1,"364":1,"447":1}}],["предоставляться",{"2":{"254":1}}],["предоставлять",{"2":{"117":1,"122":1,"175":1,"244":1,"247":1,"266":1,"336":2,"343":1,"462":1}}],["предупредить",{"2":{"167":1,"265":1}}],["предусмотреть",{"2":{"324":1}}],["предусмотренный",{"2":{"244":2}}],["предусмотренные",{"2":{"161":1,"417":1}}],["предусмотрены",{"2":{"205":1}}],["предусмотрен",{"2":{"144":1,"162":1,"168":1,"249":1,"364":1}}],["предусмотрена",{"2":{"73":1,"244":1,"311":1}}],["предусматривает",{"2":{"63":1,"232":1}}],["предусматривают",{"2":{"41":1}}],["предстоит",{"2":{"200":1,"257":1}}],["представительное",{"2":{"255":1}}],["представить",{"2":{"178":1,"202":1,"222":1,"237":1,"238":1,"247":1,"254":1,"256":1,"295":1,"300":1,"317":1,"330":1,"354":1,"370":1,"440":1}}],["представим",{"2":{"26":1,"265":1,"297":1,"303":1,"434":2}}],["представьте",{"2":{"134":1,"147":1,"462":1}}],["представлен",{"0":{"399":1},"2":{"313":1,"374":1,"411":1}}],["представлено",{"2":{"265":1,"329":1,"418":1,"436":1}}],["представлены",{"2":{"195":1,"407":1,"412":1,"414":1,"416":1,"417":1}}],["представленная",{"2":{"175":1,"292":1}}],["представленную",{"2":{"159":1}}],["представленные",{"2":{"370":1}}],["представленных",{"2":{"150":1,"325":1,"374":1}}],["представленный",{"2":{"139":1,"171":1,"350":1}}],["представлена",{"2":{"151":1,"301":1,"413":1}}],["представлений",{"2":{"313":1,"317":1,"319":1,"325":1}}],["представлении",{"2":{"176":1,"319":1}}],["представлением",{"2":{"319":1}}],["представление",{"2":{"4":2,"11":2,"62":1,"131":1,"147":1,"149":1,"168":1,"170":1,"197":1,"199":1,"202":2,"224":1,"239":1,"247":1,"251":1,"254":1,"263":1,"265":1,"266":1,"291":1,"293":1,"296":1,"298":1,"302":1,"319":1,"325":1,"329":1,"336":1,"383":1,"436":3,"440":1,"442":1,"452":1}}],["представления",{"0":{"317":1},"1":{"318":1,"319":1},"2":{"3":2,"17":1,"149":1,"174":1,"231":1,"256":1,"333":1,"338":1,"339":1,"343":1,"374":1,"436":1,"463":1}}],["представляем",{"2":{"308":1}}],["представляемых",{"2":{"240":1}}],["представляется",{"2":{"187":1,"453":1}}],["представляет",{"2":{"134":1,"181":1,"186":1,"190":1,"200":1,"203":1,"224":2,"256":1,"308":1,"325":1,"339":1,"364":1,"381":1,"400":1,"407":1,"443":1,"449":1,"453":1,"511":1}}],["представляющая",{"2":{"313":1,"339":1,"340":2}}],["представляющий",{"2":{"224":1,"243":1,"380":1}}],["представляются",{"2":{"157":1,"162":1,"167":1,"170":1}}],["представляют",{"2":{"6":1,"155":1,"161":1,"162":1,"173":1,"197":1,"202":1,"364":1}}],["представлял",{"2":{"199":1}}],["представлять",{"2":{"22":1,"76":1,"231":1,"238":1,"297":1,"462":1}}],["предсказания",{"2":{"155":1}}],["предыдущую",{"2":{"473":1}}],["предыдущая",{"2":{"227":1,"306":1}}],["предыдущее",{"2":{"377":1}}],["предыдущей",{"2":{"256":1,"299":1,"341":1,"345":1,"383":1,"436":1}}],["предыдущего",{"2":{"153":1,"181":1,"319":1,"334":1,"338":1,"359":1}}],["предыдущему",{"2":{"385":1}}],["предыдущем",{"2":{"134":1,"152":1,"170":1,"182":1,"183":1,"249":2,"286":1,"294":1,"316":1,"318":1,"319":1,"322":1,"328":1,"329":2,"343":2,"345":1,"357":1,"436":1}}],["предыдущих",{"2":{"203":1,"221":2,"224":1,"246":1,"306":1,"316":1,"329":1,"330":1,"349":1,"357":1,"363":1,"442":1}}],["предыдущими",{"2":{"224":1,"371":1}}],["предыдущим",{"2":{"134":1}}],["предыдущие",{"2":{"133":1,"211":1,"377":1,"388":1}}],["предыдущий",{"2":{"121":1,"141":1,"211":1,"283":1,"291":1,"297":1,"303":1,"343":1,"344":1,"381":1,"437":1,"446":1}}],["предмет",{"2":{"115":1,"341":1}}],["предмета",{"2":{"74":1,"152":1}}],["предложенное",{"2":{"223":1}}],["предложенных",{"2":{"89":1}}],["предложено",{"2":{"223":1,"393":1}}],["предложений",{"2":{"463":1}}],["предложением",{"2":{"196":1,"247":1,"364":1}}],["предложение",{"2":{"187":1}}],["предложения",{"2":{"167":1,"191":1,"208":1}}],["предложит",{"2":{"343":1}}],["предложить",{"2":{"200":1,"300":1,"315":1,"336":1,"495":1}}],["предложите",{"2":{"152":1}}],["предложил",{"2":{"71":1,"472":1,"473":1}}],["предлагайте",{"2":{"158":2}}],["предлагаемого",{"2":{"200":1}}],["предлагаемый",{"2":{"10":1}}],["предлагается",{"2":{"189":1,"226":1,"364":1}}],["предлагает",{"2":{"39":1,"40":1,"92":1,"179":1,"200":1,"202":1,"223":1,"226":1,"228":1,"247":1,"338":1,"364":1,"383":2,"386":1,"440":1}}],["предлагающий",{"2":{"227":1}}],["предлагающих",{"2":{"115":1,"195":1}}],["предлагают",{"2":{"144":1,"161":1,"172":1,"395":1,"471":1,"473":1}}],["предлагаю",{"2":{"4":1,"118":1,"292":1}}],["предъявляемых",{"2":{"63":1}}],["прагматичный",{"2":{"268":1}}],["прайм",{"2":{"152":1}}],["практичности",{"2":{"449":1}}],["практическое",{"2":{"473":1}}],["практической",{"2":{"221":1,"260":1}}],["практического",{"2":{"158":1}}],["практическим",{"2":{"306":1}}],["практических",{"2":{"221":1,"222":1,"306":1}}],["практически",{"2":{"32":1,"125":1,"137":1,"147":2,"167":1,"188":1,"231":2,"241":1,"363":1,"373":1}}],["практикующие",{"2":{"372":1}}],["практику",{"2":{"227":1,"271":1}}],["практикой",{"2":{"213":1,"235":1,"247":1,"316":1,"318":1,"460":1,"462":1}}],["практиками",{"2":{"473":1}}],["практиках",{"2":{"425":1}}],["практика",{"2":{"189":1,"203":1,"338":1,"393":1,"395":1,"454":1,"462":1}}],["практике",{"2":{"125":1,"167":1,"168":1,"185":1,"200":1,"203":1,"223":1,"261":1,"265":1,"268":1,"271":1,"287":1,"300":1,"301":1,"306":1,"341":1,"346":1,"351":2,"363":1,"364":1,"365":1,"372":1,"374":1,"394":1}}],["практик",{"2":{"77":1,"221":1,"265":1,"270":1,"287":1,"473":1,"496":1,"507":2,"508":1}}],["практики",{"0":{"398":1,"425":1},"1":{"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"426":1,"427":1,"428":1},"2":{"9":1,"76":1,"116":1,"199":1,"232":2,"267":1,"270":1,"271":1,"310":1,"395":1,"471":1,"473":1,"507":1,"508":1}}],["прав",{"2":{"323":1,"390":1}}],["правая",{"2":{"433":1}}],["права",{"2":{"116":1,"134":1,"329":1}}],["правой",{"2":{"164":1,"341":1}}],["правом",{"2":{"150":1,"152":1,"156":1,"346":2}}],["право",{"2":{"116":3}}],["правками",{"2":{"91":1}}],["правительственных",{"2":{"134":1,"178":1}}],["править",{"2":{"86":1}}],["правильных",{"2":{"473":1}}],["правильным",{"2":{"171":1,"230":1,"268":1,"351":1,"381":1}}],["правильное",{"2":{"381":1}}],["правильность",{"2":{"356":1}}],["правильно",{"2":{"189":1,"203":1,"232":1,"301":1,"338":1,"342":2,"376":1,"437":1,"447":1}}],["правильном",{"2":{"178":1,"436":1}}],["правильного",{"2":{"92":1}}],["правил",{"0":{"158":1},"2":{"150":1,"158":2,"336":1}}],["правилах",{"2":{"158":1,"178":1}}],["правила",{"2":{"62":1,"158":2,"199":1,"200":1,"203":1,"225":1,"261":1,"298":1,"463":1}}],["правило",{"2":{"2":1,"23":1,"62":1,"139":1,"151":1,"167":1,"178":2,"224":1,"268":1,"278":1,"322":1,"351":1,"372":1,"402":1}}],["правда",{"2":{"22":1,"301":1,"372":1}}],["проехать",{"2":{"473":1}}],["проекты",{"2":{"311":3,"386":2,"402":1,"473":1}}],["проекту",{"2":{"221":1,"373":1,"386":1}}],["проектов",{"2":{"130":2,"222":1,"250":1,"271":1,"311":2,"363":1,"383":1,"385":2,"386":1,"394":1,"409":1,"432":1,"463":1,"471":1}}],["проектом",{"2":{"79":1,"221":1,"222":1,"394":1,"409":1,"423":1}}],["проекте",{"0":{"499":1},"2":{"71":1,"112":1,"223":1,"227":1,"228":1,"261":2,"319":1,"370":1,"372":1,"373":1,"374":1,"383":1,"386":1,"421":1,"423":1,"432":1,"462":1,"471":1,"496":1,"503":1}}],["проектированию",{"2":{"400":1}}],["проектирование",{"2":{"150":1,"154":1,"297":1}}],["проектирования",{"0":{"150":1,"155":1,"159":1,"241":1,"260":1,"261":1,"262":1,"271":1,"398":1,"408":1},"1":{"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"261":1,"262":1,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1},"2":{"41":1,"103":1,"147":1,"150":1,"151":1,"154":1,"158":1,"178":1,"185":1,"199":2,"219":1,"221":1,"225":2,"229":2,"235":3,"237":1,"238":1,"240":1,"241":1,"243":1,"246":1,"249":1,"250":1,"252":1,"258":1,"260":1,"261":1,"262":1,"270":2,"271":2,"276":1,"289":1,"291":1,"304":1,"305":1,"351":1,"354":1,"365":1,"374":1,"400":3,"401":2,"402":1,"408":1,"413":1,"434":2,"439":1,"440":2,"441":2,"442":1,"455":1,"456":1}}],["проектировании",{"2":{"2":1}}],["проект",{"0":{"70":1,"470":1},"2":{"4":1,"39":1,"58":1,"63":1,"72":2,"76":1,"221":1,"222":1,"223":8,"224":2,"225":1,"227":2,"256":1,"291":1,"304":1,"309":1,"316":1,"350":1,"359":2,"370":1,"374":1,"383":1,"386":2,"409":1,"421":2,"423":1,"432":2,"449":1,"464":1,"468":1,"501":2,"527":1}}],["проектами",{"2":{"252":1,"257":1,"311":1,"499":1}}],["проектах",{"2":{"218":1,"221":2,"227":1,"241":1,"251":1,"271":1,"382":1,"396":1,"421":1,"423":1,"461":1}}],["проекта",{"0":{"4":1,"9":1,"23":1,"58":1,"75":1,"76":1,"80":1,"110":1,"221":1,"223":1,"253":1,"409":1},"1":{"76":1,"77":1,"78":1,"79":1,"111":1,"112":1,"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1},"2":{"10":1,"14":1,"62":3,"70":1,"73":1,"74":1,"76":1,"86":1,"112":1,"115":1,"119":1,"120":1,"126":1,"148":1,"202":1,"203":1,"204":1,"221":1,"223":8,"224":3,"225":1,"226":1,"227":1,"228":1,"235":1,"236":1,"252":1,"253":1,"258":1,"292":1,"310":2,"311":2,"312":1,"316":5,"350":1,"358":1,"359":1,"365":1,"370":1,"372":2,"375":3,"382":1,"383":1,"386":1,"390":1,"391":1,"419":1,"421":2,"422":1,"423":2,"461":1,"470":1,"473":1,"496":1,"507":1}}],["проапгрейдиться",{"2":{"471":1}}],["проанализировав",{"2":{"319":1}}],["проанализировать",{"2":{"249":1}}],["пройден",{"2":{"376":1}}],["пройти",{"2":{"147":1,"326":1,"473":1}}],["процентов",{"2":{"460":1,"536":1}}],["процентные",{"2":{"385":1}}],["процедур",{"2":{"394":1}}],["процедуры",{"2":{"373":1}}],["процессы",{"2":{"271":1,"436":1,"449":1}}],["процессу",{"2":{"237":1,"260":1,"261":1,"438":1,"444":1}}],["процессом",{"2":{"172":1,"241":1,"244":1,"351":1,"436":2}}],["процессор",{"2":{"152":1,"218":1,"433":1}}],["процессора",{"2":{"137":1}}],["процессов",{"2":{"62":1,"197":1,"276":1,"325":1}}],["процессах",{"2":{"191":1}}],["процессами",{"2":{"131":1,"436":2,"440":1}}],["процесса",{"2":{"79":1,"144":1,"166":1,"168":1,"182":1,"201":1,"204":1,"243":1,"260":1,"302":1,"325":3,"328":1,"329":1,"330":2,"344":1,"349":1,"373":1,"377":1,"385":1,"395":1,"421":1,"436":2,"437":2,"442":2,"453":1}}],["процесс",{"2":{"70":1,"126":1,"143":1,"144":1,"168":1,"171":1,"202":1,"232":1,"234":1,"237":1,"240":1,"247":1,"255":1,"268":1,"303":1,"324":1,"325":1,"329":1,"330":4,"331":2,"343":2,"344":1,"364":1,"372":2,"373":1,"385":1,"395":3,"397":1,"419":1,"436":9,"440":2,"441":2,"442":1,"448":1,"461":1}}],["процессе",{"2":{"62":1,"63":1,"126":1,"135":1,"159":1,"200":1,"202":1,"224":1,"232":1,"255":1,"268":1,"324":1,"325":1,"329":1,"345":1,"372":1,"373":1,"423":1,"436":1,"440":1,"449":1}}],["проходит",{"2":{"346":1}}],["прозрачным",{"2":{"425":1}}],["прозрачны",{"2":{"336":1}}],["прозрачный",{"2":{"116":1,"431":1}}],["прозрачное",{"2":{"421":1}}],["прозрачно",{"2":{"297":1,"336":1,"423":1}}],["прояснить",{"2":{"295":1}}],["проясняться",{"2":{"204":1}}],["проявлять",{"2":{"436":1}}],["проявляться",{"2":{"261":1}}],["проявляются",{"2":{"336":1}}],["проявляется",{"2":{"188":1,"296":1,"461":1}}],["проявившиеся",{"2":{"204":1}}],["проникновение",{"0":{"187":1}}],["прокручивается",{"2":{"313":1}}],["прокручиваются",{"2":{"173":1}}],["прокрутить",{"2":{"170":1,"183":1}}],["прокруткой",{"2":{"171":1}}],["прокрутка",{"2":{"170":1,"313":1}}],["прокрутку",{"2":{"170":1}}],["прокрутки",{"2":{"156":1,"170":1,"171":1,"250":2}}],["проксирования",{"2":{"295":1,"296":2}}],["прокси",{"2":{"117":1,"118":1,"140":1,"225":1,"260":1,"271":1,"295":8,"296":6,"297":6,"299":1,"300":2,"344":1,"349":1,"366":2,"440":1,"447":1,"463":1}}],["профессионального",{"2":{"467":1}}],["профессиональной",{"2":{"405":1}}],["профессиональное",{"2":{"270":1}}],["профессиональную",{"2":{"396":1}}],["профессиональные",{"2":{"370":1}}],["профессиональный",{"2":{"154":1}}],["профессор",{"2":{"158":1}}],["профилем",{"2":{"59":1}}],["профиля",{"2":{"4":1}}],["промптировании",{"2":{"343":1}}],["промптов",{"2":{"90":1}}],["промежутках",{"2":{"330":1}}],["промежутка",{"2":{"330":1}}],["промежуток",{"2":{"329":1}}],["промежуточным",{"2":{"450":1}}],["промежуточных",{"2":{"297":1}}],["промежуточный",{"2":{"224":1}}],["промежуточное",{"2":{"295":1}}],["промежуточного",{"2":{"256":1,"463":1}}],["промисная",{"2":{"511":1}}],["промисы",{"2":{"260":1,"378":1}}],["промисов",{"2":{"252":1,"473":1}}],["промис",{"2":{"244":2,"323":1,"331":1}}],["промиса",{"2":{"241":1,"255":1}}],["промышленном",{"2":{"450":1}}],["промышленной",{"2":{"225":1,"345":1}}],["промышленный",{"2":{"150":1}}],["прочтение",{"2":{"405":1}}],["прочную",{"2":{"396":1}}],["прочная",{"2":{"394":1}}],["прочим",{"2":{"464":1}}],["прочие",{"2":{"423":1,"429":1}}],["прочих",{"2":{"224":1,"472":1}}],["прочитаны",{"2":{"364":1}}],["прочитал",{"2":{"165":1}}],["прочитать",{"2":{"147":1,"363":1}}],["прочесть",{"2":{"472":1}}],["прочее",{"2":{"59":1}}],["прочего",{"2":{"36":1}}],["прошла",{"2":{"327":1,"329":1}}],["прошлый",{"2":{"270":1}}],["прошли",{"2":{"219":1,"346":2,"375":1,"376":1}}],["прошлой",{"2":{"89":1}}],["прошел",{"2":{"119":1}}],["пробовать",{"2":{"385":1}}],["пробегаемся",{"2":{"292":1}}],["пробелы",{"2":{"214":1}}],["пробелами",{"2":{"117":1}}],["пробная",{"2":{"222":2}}],["пробного",{"2":{"188":1}}],["проблемой",{"2":{"325":1,"436":2}}],["проблему",{"2":{"133":1,"134":1,"171":1,"271":1,"421":1,"429":1,"436":2,"462":1}}],["проблемы",{"2":{"71":1,"117":2,"199":1,"212":1,"247":1,"260":1,"271":2,"272":1,"325":1,"331":1,"370":1,"385":1,"462":1,"472":1,"473":1}}],["проблемам",{"2":{"263":1}}],["проблема",{"2":{"62":1,"86":1,"122":1,"204":1,"246":1,"247":1,"267":1,"303":1,"364":1}}],["проблем",{"2":{"9":1,"115":1,"171":1,"200":1,"250":1,"260":1,"263":1,"268":1,"302":1,"324":1,"370":1,"386":2,"400":1,"545":1}}],["провайдите",{"2":{"425":1}}],["провайдеры",{"2":{"144":1,"422":2}}],["провайдерами",{"2":{"473":1,"545":1}}],["провайдерах",{"2":{"138":1}}],["провайдера",{"2":{"115":1,"137":1,"464":1}}],["провайдер",{"2":{"115":1,"138":1}}],["провайдеров",{"2":{"115":1,"144":1,"328":1}}],["провизия",{"2":{"247":1}}],["провизию",{"2":{"247":1}}],["проводить",{"2":{"463":1}}],["проводиться",{"2":{"372":2}}],["проводилось",{"2":{"372":1}}],["проводил",{"2":{"171":1}}],["проводнике",{"2":{"224":1}}],["проведения",{"2":{"397":1}}],["проведение",{"2":{"370":1}}],["проведет",{"2":{"346":1}}],["провели",{"2":{"258":1}}],["проверено",{"2":{"472":1}}],["проверена",{"2":{"329":1}}],["проверенная",{"2":{"497":1}}],["проверенное",{"2":{"200":1,"271":1}}],["проверенным",{"2":{"507":1}}],["проверенных",{"2":{"496":1}}],["проверенные",{"2":{"76":1}}],["проверенный",{"2":{"9":1}}],["проверенную",{"2":{"17":1}}],["проверке",{"2":{"376":2}}],["проверку",{"2":{"287":1,"296":1,"325":1,"372":1}}],["проверка",{"2":{"255":1,"295":1,"322":1,"324":1,"330":1,"392":1,"462":3,"545":1}}],["проверки",{"0":{"146":1,"198":1,"220":1,"234":1,"259":1,"305":1,"333":1,"348":1,"369":1,"397":1,"456":1},"2":{"161":1,"324":4,"325":3,"328":2,"330":4,"372":1,"376":1,"378":1}}],["проверили",{"2":{"455":1}}],["проверит",{"2":{"375":1}}],["проверить",{"2":{"134":1,"223":1,"259":1,"302":1,"325":1,"328":1,"334":1,"342":1,"377":1,"378":1,"381":1,"382":1,"390":1,"391":1,"473":1}}],["проверив",{"2":{"116":1}}],["проверьте",{"2":{"125":1,"231":1,"356":1,"472":1}}],["проверок",{"2":{"125":1}}],["проверяются",{"2":{"372":2}}],["проверяем",{"2":{"281":1,"288":1,"292":1,"296":1,"303":1,"344":1,"366":2,"380":1}}],["проверяет",{"2":{"116":2,"231":1,"325":1,"330":1,"421":1,"433":1}}],["проверять",{"2":{"116":1,"324":1,"376":1,"461":1}}],["провести",{"2":{"12":1,"190":1,"200":1,"454":1,"473":1}}],["проталкивает",{"2":{"320":1}}],["протестировали",{"2":{"381":1}}],["протестированы",{"2":{"300":1,"373":1}}],["протестировать",{"2":{"115":1,"373":3,"375":1,"376":1,"378":1,"508":1}}],["протяжении",{"2":{"202":1,"223":1}}],["противоположную",{"2":{"193":1,"271":1}}],["противоположное",{"2":{"186":1}}],["противоположные",{"2":{"167":1}}],["против",{"0":{"149":1},"2":{"153":1}}],["противном",{"2":{"86":1,"231":1,"245":1,"287":1,"437":1,"445":1}}],["прототипа",{"2":{"259":1}}],["прототипов",{"2":{"241":1}}],["прототип",{"2":{"232":1}}],["прототипирования",{"2":{"23":1}}],["протоколе",{"2":{"325":1}}],["протоколирования",{"2":{"297":1}}],["протоколам",{"2":{"199":1}}],["протокола",{"2":{"144":2,"325":2,"364":1}}],["протоколу",{"2":{"143":1,"144":1,"145":1,"422":1,"429":1,"434":1}}],["протокол",{"2":{"134":3,"325":3,"449":2,"512":1}}],["протоколы",{"0":{"118":1},"2":{"118":1,"332":1,"473":1}}],["протоколом",{"2":{"117":1,"325":1,"327":1}}],["прогон",{"2":{"461":1}}],["проговаривание",{"2":{"74":1}}],["програмную",{"2":{"472":1}}],["програмных",{"2":{"400":1}}],["программой",{"2":{"226":1}}],["программ",{"2":{"222":1,"402":1}}],["программистов",{"2":{"463":1,"497":1}}],["программистские",{"2":{"463":1}}],["программистам",{"2":{"463":1}}],["программиста",{"2":{"260":1,"464":1}}],["программист",{"2":{"200":2,"268":1,"460":1,"463":1}}],["программировали",{"2":{"300":1}}],["программированию",{"2":{"473":2}}],["программирование",{"2":{"260":1,"305":1,"405":1,"463":1}}],["программировании",{"2":{"200":3,"265":1}}],["программирования",{"2":{"3":1,"17":1,"115":2,"199":2,"200":1,"247":1,"264":1,"266":1,"344":1,"463":2}}],["программировать",{"2":{"93":1,"464":1}}],["программы",{"2":{"135":1,"200":1,"203":1,"249":1,"310":1,"353":1,"387":1,"422":1,"433":1,"460":1,"463":2}}],["программа",{"2":{"117":1,"200":1}}],["программу",{"2":{"62":1,"200":1,"269":1,"387":1}}],["программный",{"2":{"320":1}}],["программные",{"2":{"149":1}}],["программными",{"2":{"463":1}}],["программным",{"2":{"149":1,"383":1}}],["программно",{"2":{"200":1,"313":2,"330":1,"381":2,"460":1}}],["программном",{"2":{"157":1,"263":1}}],["программному",{"2":{"137":1,"372":1,"455":1}}],["программное",{"2":{"133":1,"137":2,"147":1,"149":2,"195":1,"370":1,"372":2,"385":1,"400":1,"402":1}}],["программной",{"2":{"63":1,"199":1,"200":1,"263":1,"271":1}}],["программного",{"0":{"260":1,"261":1,"271":1,"408":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1},"2":{"61":1,"63":1,"70":1,"76":1,"118":1,"147":1,"149":1,"155":1,"157":1,"195":1,"199":1,"225":1,"229":1,"234":1,"235":1,"239":1,"243":1,"250":1,"260":1,"261":2,"269":1,"270":1,"271":1,"304":1,"354":1,"365":1,"370":3,"372":2,"374":1,"385":2,"395":1,"408":2,"441":1,"461":1}}],["программная",{"0":{"317":1},"1":{"318":1,"319":1},"2":{"2":1,"76":1,"319":1}}],["прогрессивное",{"2":{"343":1}}],["прогрессивному",{"2":{"329":1}}],["прогрессивность",{"2":{"200":1}}],["прогрессивного",{"2":{"131":1,"199":1,"341":1,"345":1,"400":1}}],["прогрессивные",{"0":{"334":1,"412":1},"1":{"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1},"2":{"308":1,"334":1}}],["прогрессивными",{"2":{"332":1}}],["прогрессивным",{"2":{"220":1}}],["прогрессивный",{"0":{"200":1},"2":{"199":1,"200":2,"300":1,"336":1,"407":1}}],["прогрессивных",{"2":{"199":1}}],["прогресса",{"0":{"168":1},"1":{"169":1},"2":{"168":1,"258":1}}],["прогресс",{"2":{"147":1,"168":3}}],["проп",{"2":{"462":1}}],["проприетарных",{"2":{"336":1}}],["пропорционально",{"2":{"302":1}}],["пропустили",{"2":{"296":1}}],["пропустить",{"2":{"227":1}}],["пропускать",{"2":{"59":1}}],["прописать",{"2":{"421":1,"528":1}}],["прописан",{"2":{"539":1}}],["прописано",{"2":{"209":1}}],["прописаны",{"2":{"200":1}}],["прописывать",{"2":{"41":1}}],["пропсом",{"2":{"255":1}}],["пропсов",{"2":{"245":2,"246":2,"249":1,"315":1,"353":1,"424":1,"462":1}}],["пропсу",{"2":{"249":1}}],["пропсами",{"2":{"316":1,"322":1}}],["пропсам",{"2":{"309":1}}],["пропса",{"2":{"246":1,"255":1,"313":1,"319":1}}],["пропс",{"2":{"169":1,"249":1,"255":2,"313":1,"316":1,"319":1,"353":1}}],["пропсы",{"0":{"214":1,"245":1},"2":{"105":1,"245":1,"246":2,"249":2,"256":1,"424":1,"425":1,"462":1}}],["проиграет",{"2":{"472":1}}],["проигнорируем",{"2":{"224":1}}],["проиндексировать",{"2":{"472":1}}],["происхождения",{"2":{"364":1}}],["происхождением",{"2":{"364":1}}],["происходят",{"2":{"336":1}}],["происходящего",{"2":{"168":1}}],["происходящим",{"2":{"159":1}}],["происходить",{"2":{"17":1,"370":1,"421":1,"462":1}}],["происходит",{"2":{"3":1,"130":1,"159":1,"171":1,"231":1,"247":1,"251":1,"254":1,"257":1,"296":2,"302":1,"319":1,"322":1,"324":1,"329":2,"358":1,"364":1,"370":1,"381":1,"395":1,"397":2,"436":4,"444":1,"448":1,"472":1}}],["проиллюстрирован",{"2":{"240":1}}],["проиллюстрировать",{"2":{"181":1}}],["произойти",{"2":{"336":1,"377":1}}],["произойдет",{"2":{"171":1,"223":1,"231":1,"244":1,"301":1,"330":1,"353":1}}],["произошла",{"2":{"309":1,"379":1,"437":1}}],["произошло",{"2":{"165":1,"462":1}}],["произвольные",{"2":{"451":1}}],["произвольный",{"2":{"170":1}}],["произвольное",{"2":{"338":1}}],["производственной",{"2":{"382":1}}],["производственных",{"2":{"227":1}}],["производственные",{"2":{"224":1}}],["производстве",{"2":{"224":1,"292":1}}],["производства",{"2":{"224":2,"228":1}}],["производству",{"2":{"145":1,"224":1}}],["производится",{"2":{"330":1,"388":1}}],["производителен",{"2":{"223":1}}],["производительное",{"2":{"463":1}}],["производительной",{"2":{"436":1}}],["производительности",{"2":{"62":1,"130":1,"140":1,"200":2,"227":1,"295":1,"308":1,"347":1,"368":1,"412":1,"414":1,"436":3,"440":1,"445":1,"449":1,"460":1,"462":1,"472":1}}],["производительностью",{"2":{"436":1}}],["производительность",{"2":{"17":1,"63":2,"77":1,"208":1,"308":1,"336":2,"434":1,"436":2,"455":2,"456":1,"465":1}}],["производительней",{"2":{"433":1}}],["производительнее",{"2":{"125":1}}],["производительных",{"2":{"401":1}}],["производительными",{"2":{"334":1}}],["производительным",{"2":{"123":1}}],["производительная",{"2":{"400":1}}],["производилась",{"2":{"223":1}}],["продвигает",{"2":{"266":1}}],["продвинулись",{"2":{"223":1}}],["продвинутые",{"2":{"242":1}}],["продвинутыми",{"2":{"434":1}}],["продвинутым",{"2":{"232":1}}],["продвинутых",{"2":{"221":1,"316":1}}],["продвинуться",{"2":{"222":1}}],["продвижение",{"2":{"149":1}}],["продвижения",{"2":{"133":1,"199":1,"211":1,"219":1,"232":1,"304":1,"343":1}}],["продуманный",{"2":{"332":1}}],["продуманных",{"2":{"330":1}}],["продуманные",{"2":{"185":1}}],["продуманного",{"2":{"181":1}}],["продуктом",{"2":{"149":1,"159":1}}],["продуктовый",{"2":{"473":1}}],["продуктовое",{"2":{"79":1}}],["продуктов",{"2":{"11":4,"38":1,"39":1}}],["продукте",{"2":{"11":1}}],["продуктами",{"2":{"97":1}}],["продуктах",{"2":{"11":1}}],["продукта",{"2":{"11":1,"13":1,"63":1,"68":1,"70":1,"76":1,"150":1,"183":1,"395":2}}],["продукты",{"2":{"11":1,"149":1}}],["продукт",{"2":{"10":1,"43":1,"74":1,"76":1,"131":1,"149":1,"229":1,"419":1}}],["продолжать",{"2":{"504":1}}],["продолжаться",{"2":{"188":1}}],["продолжаем",{"2":{"306":1}}],["продолжает",{"2":{"302":1,"376":1,"385":1}}],["продолжения",{"2":{"256":1}}],["продолжение",{"2":{"156":2}}],["продолжим",{"2":{"151":1}}],["продолжительность",{"2":{"301":1}}],["продолжить",{"2":{"184":1,"301":1,"391":1}}],["продолжит",{"2":{"125":1}}],["продлевать",{"2":{"144":1}}],["продлить",{"2":{"134":1}}],["продакшен",{"2":{"224":1}}],["продакшне",{"2":{"112":1,"461":1}}],["продает",{"2":{"134":1}}],["продаются",{"2":{"134":1,"189":1}}],["продавалось",{"2":{"147":1}}],["продавать",{"2":{"134":1}}],["продавцам",{"2":{"13":1}}],["продавцов",{"2":{"12":1}}],["проскроллит",{"2":{"534":1}}],["прослойка",{"2":{"472":1}}],["прослушивать",{"2":{"454":2}}],["прослушивание",{"2":{"316":1}}],["прослушивания",{"2":{"267":1}}],["проследим",{"2":{"227":1}}],["просмотр",{"2":{"224":1,"331":1}}],["просмотреть",{"2":{"175":1,"220":1,"227":1,"390":1}}],["просмотра",{"2":{"170":1,"171":2,"173":1,"204":1,"223":1,"233":1,"255":1,"343":1,"367":1,"383":1,"390":1,"446":2}}],["просматривать",{"2":{"11":2,"267":1,"446":1}}],["просишь",{"2":{"116":1}}],["простейший",{"2":{"297":1}}],["пространства",{"2":{"151":1}}],["пространстве",{"2":{"145":1,"167":1,"364":1}}],["пространство",{"2":{"134":1,"364":1,"432":1}}],["простую",{"2":{"133":1,"140":1,"158":1,"186":1,"200":1,"250":1,"302":1,"311":1,"448":1,"449":1}}],["проставить",{"2":{"552":1}}],["проставляем",{"2":{"83":1}}],["проста",{"2":{"181":1,"249":1,"309":1,"310":1,"324":1,"328":1,"353":1,"357":1,"383":1,"443":1,"451":1}}],["простая",{"0":{"324":1},"2":{"119":1,"193":1,"231":1,"324":1,"343":2,"356":1,"386":1,"442":1}}],["прост",{"2":{"119":1,"137":1,"154":1,"247":1,"293":1,"301":2,"330":1,"343":1,"438":1,"450":1}}],["просты",{"2":{"149":1,"472":1}}],["простых",{"2":{"89":1,"123":1,"144":1,"170":1,"198":1,"199":2,"224":1,"235":1,"256":1,"323":1,"332":1,"358":1,"378":1,"391":1,"455":1,"472":1}}],["простым",{"0":{"269":1},"2":{"76":1,"114":1,"159":1,"258":1,"260":1,"269":1,"297":1,"300":1,"311":1,"329":1,"341":1,"358":1,"379":1,"387":1,"425":1,"437":1,"440":1}}],["простыми",{"2":{"11":1,"144":1,"227":1,"444":1}}],["простые",{"2":{"2":1,"22":1,"41":1,"224":1,"225":1,"269":1,"298":1,"299":1,"302":1,"351":1,"445":1,"460":1,"536":1,"553":1}}],["простор",{"2":{"271":1}}],["простого",{"2":{"199":1,"231":1,"249":1,"295":1,"330":1,"364":1,"508":1}}],["простому",{"2":{"233":1,"419":1}}],["простом",{"2":{"169":1,"212":1,"295":1,"298":1,"463":1}}],["простое",{"2":{"123":1,"202":1,"223":1,"228":1,"232":1,"233":1,"246":1,"282":1,"351":1,"437":1,"472":1}}],["простота",{"2":{"39":1,"269":1,"358":1}}],["простоты",{"2":{"7":1,"178":1,"239":1,"319":1,"338":1,"449":1}}],["простой",{"0":{"453":1},"1":{"454":1},"2":{"32":1,"86":1,"116":1,"153":1,"171":1,"181":1,"201":1,"229":1,"231":2,"238":1,"251":2,"252":1,"263":1,"280":1,"288":1,"291":1,"292":1,"296":1,"297":1,"300":1,"303":1,"313":1,"315":1,"324":1,"343":1,"344":1,"347":1,"351":1,"358":1,"364":1,"366":1,"367":1,"376":1,"383":2,"395":1,"400":1,"414":1,"434":2,"436":1,"437":1,"447":1,"451":1,"452":2,"473":1,"531":1,"532":1,"536":1}}],["просто",{"0":{"227":1},"2":{"2":1,"12":1,"86":1,"103":1,"116":1,"121":1,"131":1,"134":2,"137":1,"138":1,"141":1,"158":1,"171":1,"177":1,"193":1,"204":1,"211":1,"223":1,"228":1,"235":1,"249":1,"255":2,"270":1,"282":1,"287":2,"288":1,"292":1,"296":1,"297":1,"302":1,"310":1,"314":1,"316":1,"323":1,"328":1,"350":1,"351":1,"352":2,"354":1,"358":1,"361":1,"364":2,"366":1,"374":1,"388":1,"422":1,"436":1,"437":2,"438":1,"447":1,"448":1,"451":1,"452":1,"454":1,"460":1,"462":3,"464":1,"471":1,"473":1,"504":1,"507":1}}],["проще",{"2":{"2":1,"38":1,"56":1,"115":1,"157":1,"178":1,"265":1,"308":1,"336":1,"359":1,"363":1,"366":1,"460":1,"471":1,"472":1}}],["прирост",{"2":{"436":1,"445":1}}],["природа",{"2":{"370":1}}],["природе",{"2":{"213":1,"303":1}}],["приглашаем",{"2":{"499":1}}],["приглашение",{"2":{"344":1}}],["приглашения",{"2":{"343":2}}],["пригодится",{"2":{"390":1,"473":1}}],["пригодиться",{"2":{"383":1,"433":1}}],["приписываются",{"2":{"331":1}}],["пришли",{"2":{"308":1}}],["пришла",{"2":{"250":1}}],["пришло",{"2":{"143":1,"231":1,"255":1,"256":1,"313":1,"316":1,"322":1,"343":1,"384":1,"442":1,"443":1,"445":1,"448":1}}],["пришлось",{"2":{"51":1,"152":1}}],["признательность",{"2":{"405":1}}],["признаку",{"2":{"256":1}}],["признания",{"2":{"244":1}}],["призывом",{"2":{"183":2}}],["призыв",{"0":{"183":1},"2":{"183":1,"195":1}}],["призывы",{"2":{"166":1}}],["призыва",{"2":{"151":1}}],["придумали",{"2":{"472":1}}],["придумать",{"2":{"305":1}}],["придать",{"2":{"230":1}}],["придерживаться",{"2":{"197":1,"200":1,"301":1,"375":1,"473":1}}],["придерживаются",{"2":{"183":1,"471":1}}],["придется",{"2":{"38":1,"59":1,"200":1,"247":1,"270":1,"281":1,"436":1}}],["приобрела",{"2":{"308":1}}],["приобрести",{"2":{"222":1}}],["приобретают",{"2":{"372":1}}],["приобретаются",{"2":{"134":1}}],["приобретен",{"2":{"134":1,"144":1}}],["приятный",{"2":{"516":1}}],["приятные",{"2":{"224":1}}],["приятней",{"2":{"471":1}}],["приятно",{"2":{"204":1}}],["приятен",{"2":{"150":1}}],["приемник",{"2":{"294":1}}],["приемники",{"2":{"293":1}}],["приемнику",{"2":{"293":1}}],["приемы",{"2":{"197":1}}],["приемов",{"2":{"170":1,"184":1,"227":1}}],["причудливо",{"2":{"200":1}}],["причем",{"2":{"177":1,"295":1,"301":1,"364":1,"378":1,"381":1,"440":1,"473":2}}],["причина",{"2":{"382":1}}],["причинам",{"2":{"379":1}}],["причине",{"2":{"244":1}}],["причин",{"2":{"73":1,"125":1,"173":1,"295":1,"436":1}}],["причины",{"0":{"71":1},"2":{"295":1,"471":1}}],["приборная",{"2":{"384":1}}],["приборной",{"2":{"383":1}}],["прибегая",{"2":{"174":1}}],["приблизить",{"2":{"472":1}}],["приблизительно",{"0":{"79":1}}],["приближении",{"2":{"17":1}}],["приспособленным",{"2":{"400":1}}],["приспособить",{"2":{"145":1}}],["присутствует",{"2":{"462":1}}],["присутствию",{"2":{"134":1}}],["присущей",{"2":{"359":1}}],["присоединить",{"2":{"246":1}}],["присоединяет",{"2":{"293":1}}],["присоединяем",{"2":{"231":1}}],["присоединять",{"2":{"252":1}}],["присоединяться",{"2":{"72":1}}],["присоединении",{"2":{"210":1}}],["присваивать",{"2":{"313":1}}],["присваивание",{"2":{"296":1}}],["присваивая",{"2":{"287":1,"296":1,"319":1}}],["присваиваем",{"2":{"249":1,"286":1,"287":1,"288":1,"296":1,"319":1}}],["присваивает",{"2":{"210":1,"246":1}}],["присваивается",{"2":{"200":1,"210":1,"316":1}}],["присвоено",{"2":{"316":1}}],["присвоение",{"2":{"287":2}}],["присвоения",{"2":{"238":1}}],["присвоении",{"2":{"231":1}}],["присвоить",{"2":{"284":1,"285":1,"296":1}}],["присвоили",{"2":{"249":1}}],["присвоил",{"2":{"171":1}}],["приступать",{"2":{"390":1}}],["приступаем",{"2":{"380":1}}],["приступить",{"2":{"224":1,"227":1,"241":1,"310":1,"314":1,"440":1,"448":1}}],["приступили",{"2":{"221":1}}],["пристыдить",{"2":{"194":1}}],["пристальное",{"2":{"183":1,"402":1}}],["прим",{"2":{"222":1}}],["примитивах",{"2":{"460":1}}],["примитивам",{"2":{"123":2}}],["примитивов",{"2":{"460":1}}],["примитивные",{"2":{"210":1,"245":1,"462":1}}],["примите",{"2":{"204":1,"327":1}}],["приманка",{"0":{"188":1,"193":1}}],["примет",{"2":{"200":1,"241":1}}],["примечание",{"2":{"134":1,"235":1,"245":1}}],["примечателен",{"2":{"32":1}}],["применив",{"2":{"386":1}}],["применительно",{"2":{"336":1}}],["применить",{"2":{"232":1,"237":1,"241":1,"248":1,"298":1,"306":1,"365":1,"367":1,"372":1,"440":1,"442":1}}],["применили",{"2":{"183":1,"230":1,"232":1,"249":1,"258":1,"259":1}}],["применимы",{"2":{"270":1}}],["применим",{"2":{"225":1,"235":1,"251":1,"255":1,"264":1,"287":1,"331":1,"350":1,"447":1}}],["применима",{"2":{"153":1}}],["применимо",{"2":{"147":1}}],["применяют",{"2":{"447":1}}],["применяются",{"2":{"336":1}}],["применять",{"2":{"200":1,"226":1,"232":1,"260":1,"269":1,"278":1,"304":1,"349":1,"373":1,"396":1}}],["применяться",{"2":{"164":1,"224":1,"260":1,"261":1,"548":1}}],["применяя",{"2":{"181":1,"231":1,"374":1,"439":1}}],["применяет",{"2":{"182":1,"301":1}}],["применяется",{"2":{"116":1,"123":2,"181":1,"204":1,"270":1,"296":1,"301":1,"324":1,"340":1}}],["применяемая",{"2":{"249":1}}],["применяемых",{"2":{"225":1,"454":1}}],["применяем",{"2":{"41":1,"361":1,"378":1}}],["применен",{"2":{"440":1,"519":1}}],["применены",{"2":{"380":1}}],["примененными",{"2":{"229":1}}],["применена",{"2":{"179":1,"226":1}}],["применено",{"2":{"151":1}}],["применений",{"2":{"246":1,"449":1}}],["применению",{"2":{"200":1}}],["применения",{"2":{"145":1,"156":1,"158":1,"181":1,"241":1,"244":1,"267":1,"279":1,"340":1,"370":1,"421":1,"455":1}}],["применении",{"2":{"123":1,"225":1,"374":1}}],["применением",{"2":{"235":1,"306":1}}],["применение",{"2":{"118":1,"157":1,"225":1,"227":1,"229":1,"263":1,"270":1,"271":1,"276":1,"304":1,"336":2,"349":1,"504":1}}],["примеру",{"2":{"200":1,"231":1,"282":1,"380":1}}],["примеры",{"2":{"137":1,"142":1,"148":1,"165":1,"168":1,"185":1,"213":1,"225":1,"235":1,"302":1,"304":1,"305":1,"316":1,"320":1,"335":1,"349":2,"374":1,"396":1,"408":1,"415":1,"473":1}}],["примеров",{"0":{"404":1},"2":{"123":1,"132":1,"149":1,"167":1,"195":1,"200":1,"202":1,"204":1,"222":1,"260":1,"266":1,"322":1,"331":1,"335":1,"357":1,"362":1,"371":1,"374":1,"375":1,"400":1,"404":1}}],["примером",{"2":{"76":1,"182":1,"238":1,"323":1,"364":1,"390":1}}],["примере",{"2":{"17":1,"109":1,"121":1,"141":1,"151":1,"152":1,"183":1,"187":1,"194":1,"200":1,"201":1,"204":1,"212":1,"223":1,"225":1,"246":1,"247":2,"249":1,"256":1,"267":1,"287":1,"291":1,"292":1,"295":2,"296":1,"297":1,"310":1,"322":1,"328":2,"331":1,"343":1,"344":1,"345":1,"351":1,"354":1,"355":1,"356":2,"359":2,"360":1,"367":1,"373":1,"383":1,"393":1,"434":1,"438":1,"446":2,"450":1,"455":1}}],["примерное",{"2":{"436":1}}],["примерно",{"2":{"14":1,"17":1,"26":2,"48":1,"97":1,"114":1,"223":2,"249":2,"256":1,"290":1,"324":1,"329":1,"346":1,"357":1,"383":1,"390":1,"391":1,"436":1,"446":1,"462":1,"472":1}}],["примерный",{"2":{"5":1}}],["примерами",{"2":{"212":1,"225":1,"308":1,"313":1,"336":1,"384":1}}],["примерам",{"2":{"134":1,"279":1,"306":1,"402":1,"435":1}}],["примерах",{"2":{"122":1,"156":1,"210":1,"235":1,"246":1,"276":1,"281":1,"300":1,"306":1,"308":1,"313":1,"322":1,"329":1,"338":1,"364":1,"439":1,"508":1}}],["примера",{"2":{"4":1,"135":1,"151":1,"181":1,"186":1,"204":1,"224":1,"229":1,"263":1,"265":1,"296":1,"302":1,"303":1,"313":1,"317":1,"318":1,"331":1,"335":1,"342":1,"344":1,"346":1,"357":1,"359":1,"367":3,"376":1,"383":1,"391":1,"437":1,"445":1,"446":1,"456":1}}],["пример",{"0":{"252":1,"374":1},"1":{"253":1,"254":1,"255":1},"2":{"3":1,"14":1,"17":1,"103":1,"114":2,"117":1,"120":1,"121":2,"122":1,"124":1,"138":1,"140":1,"152":2,"153":2,"162":1,"164":1,"166":1,"167":1,"168":2,"170":1,"174":1,"175":1,"177":1,"181":1,"186":1,"187":1,"193":1,"194":1,"201":1,"204":1,"209":1,"210":1,"211":1,"212":1,"229":1,"235":1,"244":3,"245":2,"249":2,"250":1,"251":1,"255":1,"266":1,"267":1,"284":1,"285":1,"286":1,"288":1,"294":1,"295":1,"296":1,"297":3,"301":2,"303":2,"305":1,"316":1,"319":2,"322":1,"325":1,"341":3,"343":1,"344":1,"345":2,"346":1,"353":1,"356":1,"359":1,"367":1,"374":1,"377":1,"380":1,"381":1,"382":1,"383":1,"392":1,"421":2,"425":1,"438":1,"445":1,"446":3,"462":1,"538":1}}],["прикосновений",{"2":{"516":1}}],["прикосновением",{"2":{"179":1}}],["прикладном",{"2":{"512":1}}],["прикладного",{"2":{"17":1,"247":1,"266":1}}],["прикладную",{"2":{"256":1}}],["прикрыть",{"2":{"255":1}}],["прикрепить",{"2":{"359":1}}],["прикрепив",{"2":{"243":1}}],["прикрепляем",{"2":{"267":1}}],["прикрепляя",{"2":{"121":1}}],["приходила",{"2":{"472":1}}],["приходится",{"2":{"144":1,"204":2,"208":1,"223":1,"247":1,"381":1,"433":1}}],["приходит",{"2":{"137":1,"246":1,"249":1,"342":1}}],["приходите",{"2":{"26":1}}],["приходу",{"2":{"441":1}}],["приходя",{"2":{"464":1}}],["приходятся",{"2":{"462":1,"463":1}}],["приходят",{"2":{"170":1,"378":1}}],["приходящих",{"2":{"118":1}}],["привыкли",{"2":{"361":1}}],["привычный",{"2":{"439":1}}],["привычным",{"2":{"281":1,"394":1}}],["привычными",{"2":{"270":1}}],["привычнее",{"2":{"108":1}}],["привлечь",{"2":{"351":1}}],["привлекает",{"2":{"151":1}}],["приватные",{"2":{"358":1}}],["приватный",{"2":{"137":1}}],["приватному",{"2":{"287":2}}],["привяжем",{"2":{"231":1}}],["привязывайтесь",{"2":{"468":1}}],["привязывание",{"2":{"250":1}}],["привязывается",{"2":{"134":1,"364":1}}],["привязки",{"2":{"315":1}}],["привязку",{"2":{"246":1}}],["привязке",{"2":{"171":1}}],["привязанной",{"2":{"322":1}}],["привязанный",{"2":{"249":1}}],["привязанные",{"2":{"225":1}}],["привязана",{"2":{"232":1,"462":1}}],["приводящую",{"2":{"376":1}}],["приводятся",{"2":{"408":1}}],["приводят",{"2":{"159":1,"237":1,"301":1}}],["приводит",{"2":{"330":1,"376":1,"381":1}}],["приводится",{"2":{"160":1,"271":1}}],["приветствуется",{"2":{"495":1}}],["привет",{"2":{"437":1,"438":1}}],["привел",{"2":{"212":1}}],["привели",{"2":{"204":2,"304":1}}],["привело",{"2":{"199":1,"250":1}}],["приведет",{"2":{"144":1,"156":1,"301":1,"356":1,"364":1,"381":1}}],["приведем",{"2":{"122":1,"124":1,"152":1,"198":1,"244":2,"263":1,"286":1,"341":1}}],["приведена",{"2":{"256":1}}],["приведенной",{"2":{"354":1}}],["приведенном",{"2":{"344":1}}],["приведенного",{"2":{"186":1}}],["приведенным",{"2":{"253":1}}],["приведенные",{"2":{"213":1,"396":1}}],["приведенный",{"2":{"119":1,"284":1,"292":1,"331":1,"353":1,"380":1}}],["приведены",{"2":{"137":1,"165":1,"225":1,"320":1,"392":1}}],["приведен",{"2":{"117":1,"119":1,"137":1,"138":1,"163":1,"267":1,"289":1,"313":1,"322":1,"331":1}}],["привести",{"2":{"62":1,"124":1,"167":1,"204":1,"244":1,"264":1,"265":1,"305":1,"336":1,"351":1,"360":1,"370":2,"377":1}}],["прилагает",{"2":{"436":1}}],["приложить",{"2":{"336":1}}],["приложений",{"0":{"464":1},"1":{"465":1,"466":1,"467":1,"468":1,"469":1,"470":1},"2":{"116":1,"134":1,"144":1,"145":1,"150":1,"189":1,"199":2,"200":5,"202":2,"221":1,"235":2,"260":2,"266":1,"268":1,"304":1,"308":2,"323":1,"324":2,"325":1,"328":1,"330":2,"332":1,"334":1,"336":7,"338":1,"347":1,"349":2,"358":1,"363":1,"368":1,"370":1,"383":1,"391":1,"395":1,"401":2,"402":1,"411":1,"434":1,"472":1}}],["приложению",{"2":{"103":1,"134":1,"141":1,"172":1,"203":1,"224":2,"230":1,"233":1,"243":1,"252":1,"259":1,"309":1,"313":1,"314":1,"325":1,"331":1,"344":1,"358":1,"359":1,"363":1,"423":1,"435":1,"440":1,"442":1,"445":1,"462":1,"542":1}}],["приложениями",{"2":{"137":2,"176":1,"199":1,"271":1,"306":1,"308":1,"331":2,"332":1,"336":3,"343":1,"346":1,"347":2}}],["приложениям",{"2":{"125":1,"306":1,"455":1}}],["приложениях",{"2":{"122":1,"147":2,"154":1,"166":1,"168":1,"173":1,"176":1,"187":1,"226":2,"227":1,"235":1,"272":1,"276":2,"303":1,"323":1,"325":1,"332":1,"373":1,"434":1}}],["приложения",{"0":{"79":1,"120":1,"131":1,"133":1,"135":1,"144":1,"181":1,"232":1,"256":1,"257":1,"306":1,"334":1,"374":1,"411":1,"412":1,"416":1,"429":1,"432":1,"502":1,"541":1},"1":{"132":1,"133":1,"134":2,"135":1,"136":2,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1,"323":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1,"332":1,"333":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"430":1,"431":1,"542":1,"543":1,"544":1,"545":1},"2":{"11":1,"59":1,"83":1,"104":1,"114":1,"118":1,"119":4,"120":5,"121":3,"127":1,"131":6,"133":3,"134":1,"135":4,"136":2,"137":3,"138":1,"139":1,"143":2,"144":1,"145":3,"146":1,"163":1,"166":1,"168":1,"173":2,"175":2,"178":1,"180":1,"181":1,"183":3,"197":1,"199":2,"200":6,"201":5,"202":4,"203":1,"211":1,"212":1,"221":2,"223":1,"224":7,"225":2,"226":1,"228":1,"229":3,"230":1,"231":1,"233":3,"234":2,"237":2,"238":2,"240":1,"241":1,"243":2,"244":2,"247":2,"251":2,"252":2,"255":4,"256":3,"257":1,"258":1,"263":2,"265":1,"267":2,"268":2,"269":1,"274":1,"275":1,"278":1,"287":1,"295":2,"300":1,"304":1,"306":1,"308":8,"310":3,"313":2,"316":2,"323":2,"324":1,"325":1,"326":1,"327":2,"328":2,"329":2,"330":2,"331":6,"332":1,"333":1,"334":2,"336":8,"337":2,"338":3,"339":3,"340":4,"341":4,"342":1,"343":5,"344":3,"345":1,"346":2,"348":1,"349":3,"350":1,"351":1,"356":5,"357":1,"358":2,"359":1,"362":1,"364":5,"368":1,"370":2,"372":2,"373":3,"374":5,"384":1,"395":1,"400":1,"410":1,"414":1,"421":1,"423":2,"424":1,"425":1,"429":2,"432":3,"434":2,"435":1,"436":3,"438":1,"440":1,"442":3,"445":1,"446":1,"450":1,"453":1,"454":1,"455":3,"456":2,"460":1,"461":1,"463":1,"464":2,"465":1,"472":5,"496":1,"504":1,"506":1,"507":3,"508":4,"511":1,"542":5,"544":1,"545":3,"554":1,"555":1,"556":3}}],["приложением",{"2":{"6":1,"131":1,"143":1,"147":1,"149":1,"159":1,"175":1,"201":1,"235":1,"344":1,"400":1,"472":1,"496":2}}],["приложение",{"0":{"119":1,"229":1,"311":1,"418":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"230":1,"231":1,"232":1},"2":{"6":1,"11":1,"50":1,"79":1,"95":1,"115":2,"120":1,"121":1,"125":1,"134":2,"135":4,"136":1,"137":3,"141":1,"143":3,"144":1,"159":2,"165":1,"168":2,"183":1,"196":1,"199":1,"200":4,"201":2,"202":2,"203":2,"221":2,"223":1,"224":4,"225":1,"228":1,"229":4,"231":1,"232":4,"233":2,"234":2,"235":1,"241":1,"256":1,"257":1,"258":1,"263":1,"297":1,"301":1,"306":2,"308":1,"310":1,"311":1,"313":1,"315":1,"319":1,"323":1,"325":1,"329":3,"330":1,"331":1,"332":2,"334":3,"336":9,"338":1,"339":2,"340":1,"342":1,"343":6,"346":1,"347":1,"348":1,"349":1,"354":1,"359":1,"361":1,"364":1,"374":4,"384":1,"416":1,"423":1,"429":1,"436":2,"439":1,"440":1,"442":1,"445":1,"446":2,"449":1,"453":1,"471":1,"472":3,"473":1,"504":2,"508":1,"553":1,"554":1}}],["приложении",{"0":{"201":1},"1":{"202":1},"2":{"5":1,"11":1,"83":1,"102":1,"121":1,"165":1,"200":1,"201":1,"204":1,"225":1,"227":1,"229":1,"230":1,"231":1,"240":1,"241":2,"244":1,"255":3,"256":2,"268":2,"271":1,"277":1,"287":1,"288":1,"294":1,"310":1,"311":1,"315":1,"322":1,"325":2,"328":1,"329":1,"336":1,"351":1,"356":1,"357":1,"359":1,"361":1,"365":1,"379":1,"413":1,"418":1,"425":1,"429":2,"436":1,"438":1,"439":1,"442":1,"450":1,"462":3,"472":1,"513":1,"519":1,"557":1}}],["приличных",{"2":{"74":1}}],["приняли",{"2":{"223":2,"443":1,"444":1}}],["принят",{"2":{"240":1,"255":1}}],["приняты",{"2":{"199":1}}],["принято",{"2":{"170":1,"174":2,"202":1,"224":1,"291":1,"338":1,"385":1}}],["принять",{"2":{"158":1,"189":1,"190":1,"241":2,"255":1,"297":1,"343":1}}],["принятие",{"2":{"157":1}}],["принятия",{"2":{"73":1,"157":1,"175":1,"372":1}}],["принести",{"2":{"198":1,"462":1}}],["принадлежность",{"2":{"329":1}}],["принадлежит",{"2":{"268":1,"328":1}}],["принадлежат",{"2":{"153":1,"462":1}}],["принадлежать",{"2":{"16":1}}],["принадлежт",{"2":{"105":1}}],["принимают",{"2":{"246":1,"249":1,"266":1}}],["принимающей",{"2":{"447":1}}],["принимающую",{"2":{"245":1,"252":1,"354":1}}],["принимающий",{"2":{"117":1,"316":1,"355":1,"454":1}}],["принимаемого",{"2":{"320":1}}],["принимает",{"2":{"244":1,"245":1,"249":1,"251":1,"254":1,"255":1,"256":1,"288":1,"320":1,"321":1,"324":1,"366":2}}],["принимается",{"2":{"124":1,"338":1}}],["принимаешь",{"2":{"89":1}}],["принимать",{"2":{"22":1,"170":1,"251":1,"260":1,"501":1}}],["принципу",{"2":{"266":1,"331":1}}],["принципа",{"2":{"153":1,"225":1,"263":1,"265":1,"267":2,"270":1,"291":1}}],["принципами",{"2":{"151":1,"155":1,"263":1}}],["принципах",{"2":{"147":1,"178":1,"183":1,"401":1}}],["принципом",{"2":{"151":1,"268":1,"305":1}}],["принципов",{"0":{"262":1},"1":{"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1},"2":{"149":1,"219":1,"260":2,"261":1,"270":1,"400":1}}],["принципы",{"0":{"150":1,"159":1,"260":1,"261":1,"408":1,"504":1},"1":{"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1},"2":{"150":2,"154":2,"158":1,"159":1,"225":1,"229":2,"232":1,"235":1,"243":1,"250":1,"260":2,"261":2,"262":2,"270":1,"304":1,"354":1,"365":1,"373":1,"374":1,"408":1,"440":1,"441":1}}],["принципе",{"2":{"105":1,"232":1,"270":1,"463":1}}],["принцип",{"0":{"265":1},"2":{"2":1,"117":1,"151":1,"152":1,"154":1,"158":1,"159":1,"228":1,"243":1,"250":2,"263":3,"264":3,"265":2,"266":2,"267":1,"268":1,"269":3,"270":2,"286":1,"292":1,"351":1}}],["при",{"0":{"393":1,"541":1},"1":{"542":1,"543":1,"544":1,"545":1},"2":{"2":1,"22":1,"30":1,"39":2,"40":1,"41":5,"47":1,"59":2,"63":1,"71":1,"76":1,"83":1,"85":1,"86":1,"92":1,"97":1,"102":2,"105":2,"112":1,"115":1,"116":4,"117":2,"118":1,"122":2,"123":3,"130":1,"134":1,"136":2,"141":1,"143":1,"145":2,"146":1,"149":1,"152":1,"153":2,"154":1,"156":1,"158":1,"163":1,"164":3,"165":1,"167":1,"168":2,"170":2,"171":1,"176":1,"177":1,"178":1,"179":1,"182":1,"183":3,"187":1,"189":1,"192":3,"194":1,"195":2,"199":1,"200":6,"201":1,"202":2,"204":1,"206":1,"208":2,"210":1,"212":3,"218":1,"220":1,"223":2,"224":4,"226":1,"227":4,"228":1,"229":1,"230":1,"231":3,"235":1,"243":1,"244":4,"245":1,"246":1,"247":1,"249":1,"251":1,"254":2,"256":1,"260":1,"261":1,"266":1,"271":2,"281":2,"291":1,"295":1,"297":3,"300":1,"301":1,"302":2,"303":1,"304":1,"309":3,"310":1,"311":2,"313":1,"316":4,"317":3,"322":1,"324":2,"325":3,"327":1,"330":1,"331":4,"333":1,"334":1,"336":2,"338":2,"340":1,"343":3,"344":1,"345":1,"351":2,"356":1,"359":1,"364":3,"365":1,"367":2,"368":1,"372":2,"373":1,"374":2,"375":1,"376":3,"377":1,"379":1,"380":1,"382":2,"383":2,"390":1,"393":2,"394":1,"395":1,"401":1,"421":4,"425":1,"429":2,"433":2,"436":2,"437":1,"438":2,"439":1,"444":1,"445":1,"446":1,"460":1,"461":2,"463":3,"471":1,"472":8,"473":1,"496":2,"501":1,"503":1,"504":1,"507":1,"508":3,"511":1,"513":1,"519":1,"545":1,"546":1,"548":1,"555":1,"556":1}}],["чрезвычайно",{"2":{"281":1,"300":1}}],["чрезмерного",{"2":{"269":1,"425":1}}],["чужих",{"2":{"471":1}}],["чужим",{"2":{"394":1}}],["чужие",{"2":{"300":1}}],["чувствительный",{"2":{"329":1}}],["чувствительна",{"2":{"157":1}}],["чувствует",{"2":{"159":1}}],["чувствовать",{"2":{"158":1,"159":1}}],["чувство",{"2":{"158":1,"168":1}}],["чуть",{"2":{"12":1,"472":1}}],["члену",{"2":{"296":1}}],["членов",{"2":{"204":1}}],["член",{"2":{"204":1,"360":1}}],["члены",{"2":{"122":1,"358":1,"360":1}}],["членами",{"2":{"332":1,"351":1,"360":2}}],["членам",{"2":{"204":1,"358":1,"394":1}}],["члена",{"2":{"102":1,"452":1}}],["чаще",{"2":{"160":1,"187":1,"206":1,"211":1,"260":1,"268":1,"270":1,"272":1,"322":1,"376":1,"395":1}}],["чате",{"2":{"497":1}}],["чата",{"2":{"165":1}}],["чат",{"0":{"90":1},"2":{"90":1}}],["частях",{"2":{"170":1,"260":1,"304":2,"442":1,"447":1}}],["частями",{"2":{"175":1,"241":1,"293":1}}],["частям",{"2":{"26":1}}],["частным",{"2":{"365":1}}],["частных",{"2":{"140":1}}],["частной",{"2":{"137":1}}],["частности",{"2":{"14":1,"155":1,"235":1,"336":1,"349":1,"357":1,"385":1,"449":1,"536":1}}],["части",{"2":{"116":1,"134":1,"152":1,"161":1,"170":1,"171":1,"173":2,"174":1,"181":1,"182":1,"183":1,"223":1,"228":1,"239":1,"249":1,"260":1,"263":4,"269":1,"282":1,"297":2,"325":1,"343":2,"356":1,"391":1,"435":1,"473":1,"511":1}}],["частичной",{"2":{"295":1}}],["частичном",{"2":{"295":1}}],["частичного",{"2":{"235":1}}],["частично",{"2":{"39":1,"181":1,"226":1,"334":1,"462":3,"463":2}}],["часто",{"2":{"50":1,"92":1,"134":5,"149":1,"159":1,"162":3,"166":1,"173":2,"174":1,"177":1,"178":1,"185":2,"187":2,"188":2,"191":2,"194":1,"195":1,"200":2,"204":1,"205":1,"208":2,"212":1,"220":1,"221":1,"223":1,"225":1,"231":1,"260":1,"266":1,"271":5,"279":1,"281":2,"291":1,"293":1,"295":1,"319":1,"322":3,"323":1,"330":1,"338":1,"339":1,"353":1,"370":1,"372":1,"401":1,"429":1,"460":1,"473":1,"497":2,"536":1}}],["частей",{"2":{"28":1,"269":1,"300":1,"360":1,"436":1,"454":1,"455":1,"545":1}}],["частью",{"2":{"96":1,"127":1,"137":1,"152":1,"166":1,"183":1,"201":1,"207":1,"243":1,"255":1,"267":1,"270":1,"271":1,"300":1,"302":1,"331":1,"338":1,"366":1,"391":1,"443":1,"462":1,"473":1}}],["часть",{"2":{"2":1,"6":1,"86":1,"118":2,"125":1,"151":1,"183":1,"200":1,"203":1,"230":1,"231":2,"260":1,"267":1,"308":1,"325":1,"328":1,"352":1,"372":1,"383":1,"395":1,"433":1,"452":1,"460":1,"542":2}}],["чёткого",{"2":{"62":1}}],["чтения",{"2":{"204":2,"267":1,"364":1,"366":1,"446":1}}],["чтению",{"2":{"161":1}}],["чтение",{"2":{"59":1}}],["что",{"0":{"73":1,"133":1,"271":1,"308":1,"372":1,"373":1,"385":1,"406":1},"1":{"134":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"3":3,"6":1,"11":2,"12":1,"17":1,"22":3,"25":1,"26":2,"32":1,"33":2,"35":1,"41":2,"43":1,"44":1,"48":1,"56":1,"62":1,"71":2,"72":1,"85":1,"89":1,"93":1,"95":2,"96":1,"97":1,"102":2,"105":1,"112":1,"115":2,"116":9,"117":1,"118":2,"122":1,"124":1,"125":3,"131":1,"134":4,"135":2,"136":2,"137":3,"143":1,"144":1,"146":5,"147":3,"149":3,"150":3,"151":4,"152":4,"153":2,"154":1,"156":2,"157":1,"158":1,"159":4,"164":2,"165":3,"166":1,"167":2,"168":4,"170":1,"171":2,"176":2,"177":1,"178":1,"181":2,"182":3,"183":1,"185":1,"186":1,"187":1,"188":2,"189":2,"190":1,"194":1,"195":1,"197":1,"198":3,"200":14,"201":3,"202":5,"203":6,"204":12,"207":2,"208":2,"209":1,"210":1,"211":2,"212":1,"220":2,"222":3,"223":6,"224":7,"225":2,"226":1,"227":6,"228":4,"230":3,"231":9,"232":5,"237":1,"239":3,"240":1,"244":2,"245":2,"246":3,"247":1,"249":4,"250":1,"251":1,"255":2,"256":3,"259":2,"260":1,"263":2,"264":1,"265":3,"266":1,"267":4,"268":2,"270":3,"271":2,"276":1,"277":1,"278":1,"280":2,"281":2,"282":3,"284":2,"286":1,"287":4,"289":3,"290":1,"291":1,"292":1,"294":1,"295":8,"296":4,"297":10,"299":2,"300":2,"301":2,"302":3,"303":10,"304":1,"305":1,"306":1,"308":6,"309":2,"310":1,"313":7,"316":4,"318":1,"319":5,"321":1,"322":1,"323":1,"324":5,"325":4,"327":1,"328":2,"329":3,"330":4,"331":2,"334":2,"336":5,"338":3,"342":2,"343":5,"344":1,"346":1,"348":2,"351":4,"353":3,"354":1,"356":1,"357":1,"358":1,"359":2,"360":2,"364":6,"365":1,"366":1,"367":1,"369":3,"370":2,"372":6,"373":2,"374":2,"375":3,"376":8,"377":2,"378":1,"379":2,"380":1,"381":7,"382":2,"383":1,"385":3,"386":2,"390":2,"391":4,"393":4,"394":4,"397":4,"402":1,"407":1,"419":1,"421":3,"423":2,"429":1,"432":2,"436":10,"437":2,"438":1,"441":3,"442":2,"443":1,"444":1,"445":1,"447":4,"448":2,"449":2,"450":2,"454":4,"456":2,"460":1,"461":3,"462":16,"463":3,"464":2,"465":1,"471":3,"472":4,"473":4,"507":3,"527":1,"539":1,"557":1}}],["чтобы",{"0":{"154":1,"402":1},"2":{"2":1,"7":1,"16":1,"21":1,"56":1,"62":1,"83":1,"86":1,"89":1,"103":2,"104":1,"116":1,"126":1,"134":1,"136":1,"138":1,"148":1,"151":2,"152":1,"157":2,"158":1,"162":1,"164":2,"165":2,"169":1,"171":1,"175":1,"178":2,"181":1,"183":3,"186":1,"188":2,"194":1,"201":1,"203":2,"204":4,"207":1,"211":1,"212":1,"218":2,"220":2,"222":1,"223":5,"224":1,"225":1,"226":1,"227":2,"228":3,"229":2,"230":1,"231":4,"232":3,"233":1,"235":1,"236":1,"237":2,"238":1,"241":3,"243":1,"244":1,"246":1,"247":1,"249":1,"251":1,"253":1,"255":6,"257":1,"258":1,"259":1,"264":1,"270":1,"280":1,"281":3,"283":1,"288":2,"292":3,"293":1,"295":1,"296":1,"297":1,"298":1,"300":2,"302":3,"304":1,"306":2,"307":1,"308":1,"310":1,"311":1,"312":1,"313":1,"315":1,"316":3,"317":3,"319":1,"322":1,"324":1,"325":1,"327":1,"329":1,"331":3,"333":1,"334":2,"335":1,"336":3,"342":1,"343":2,"344":2,"346":1,"348":1,"350":1,"351":2,"352":1,"353":2,"357":1,"359":2,"363":1,"364":2,"365":2,"366":1,"371":1,"375":2,"376":1,"377":3,"378":2,"379":2,"381":1,"382":2,"384":2,"386":1,"390":3,"393":1,"396":1,"417":1,"421":1,"422":2,"425":1,"429":1,"432":2,"435":2,"436":4,"440":2,"441":1,"442":1,"443":1,"444":1,"447":1,"448":1,"450":2,"454":3,"456":1,"462":1,"463":2,"472":5,"473":2,"504":1,"507":2,"518":1,"528":1}}],["чипом",{"2":{"330":1}}],["чипы",{"0":{"163":1}}],["читать",{"2":{"473":1}}],["читателя",{"2":{"329":2}}],["читателю",{"2":{"4":1,"345":1}}],["читаемая",{"2":{"473":1}}],["читаемом",{"2":{"460":1}}],["читаем",{"2":{"376":1}}],["читаемым",{"2":{"218":1,"270":1}}],["читается",{"2":{"228":1}}],["читает",{"2":{"186":1}}],["читают",{"2":{"189":1}}],["читабельней",{"2":{"105":1}}],["чище",{"2":{"83":1}}],["чисел",{"2":{"134":2,"161":1,"171":1,"303":2,"377":1,"460":1,"536":1}}],["чистого",{"2":{"504":1}}],["чисто",{"2":{"308":1}}],["чистоте",{"2":{"270":1}}],["чистоту",{"2":{"177":1,"225":1}}],["чистом",{"2":{"256":1,"331":1,"436":1,"437":1,"471":1,"504":1}}],["чистая",{"2":{"210":1,"351":1,"537":1}}],["чистым",{"2":{"260":1,"270":1,"351":1}}],["чистые",{"2":{"160":1}}],["чистый",{"2":{"77":1,"86":1,"264":1,"286":1,"468":1}}],["чистую",{"2":{"133":1}}],["чистим",{"2":{"96":1}}],["числовом",{"2":{"376":1}}],["число",{"2":{"102":1,"108":1,"322":1,"364":1,"374":1,"464":1}}],["числом",{"2":{"47":1,"105":1,"302":1}}],["числа",{"2":{"97":1,"168":1,"171":1,"201":1,"210":1,"301":1,"322":1,"374":1,"545":1}}],["числе",{"2":{"7":1,"13":1,"22":1,"25":1,"125":1,"302":1,"319":1,"508":1}}],["честь",{"2":{"189":1}}],["чекбокс",{"2":{"162":1,"163":1}}],["чекбоксы",{"0":{"162":1},"2":{"162":1}}],["человеческий",{"2":{"263":1}}],["человеческой",{"2":{"134":1}}],["человеку",{"2":{"134":1}}],["человекоемкая",{"2":{"385":1}}],["человекоемкой",{"2":{"260":1}}],["человеком",{"2":{"149":1,"372":1}}],["человеко",{"2":{"97":1,"147":1}}],["человека",{"2":{"76":1}}],["человек",{"2":{"26":1,"262":1,"270":1,"433":1,"473":2}}],["черной",{"2":{"436":1}}],["черные",{"2":{"266":1}}],["черед",{"2":{"300":1}}],["через",{"0":{"501":1},"1":{"502":1},"2":{"2":1,"22":1,"34":2,"35":1,"36":1,"40":1,"41":1,"53":1,"56":2,"59":2,"86":1,"104":1,"105":1,"114":1,"115":1,"116":5,"118":1,"119":1,"134":1,"135":1,"136":1,"137":2,"138":1,"143":1,"144":1,"152":2,"179":1,"222":1,"240":1,"246":1,"247":1,"255":1,"256":2,"268":1,"270":1,"277":1,"278":1,"280":1,"282":1,"290":2,"292":1,"318":1,"322":1,"329":2,"331":1,"336":1,"343":3,"344":1,"345":1,"346":1,"355":1,"358":1,"359":1,"360":2,"374":1,"387":1,"388":1,"421":1,"424":1,"425":2,"429":1,"432":1,"433":1,"438":1,"440":1,"445":2,"446":1,"449":1,"460":2,"462":1,"471":1,"504":1,"509":1,"518":1,"547":1,"557":2}}],["черты",{"2":{"264":1,"318":1}}],["чертой",{"2":{"135":1}}],["чертежа",{"2":{"63":1}}],["чего",{"0":{"74":1},"2":{"40":1,"116":1,"159":1,"171":1,"190":1,"194":1,"310":1,"325":1,"460":1,"462":1,"463":1,"536":1}}],["четкая",{"2":{"425":1}}],["четких",{"2":{"175":1}}],["четкий",{"2":{"161":1}}],["четкую",{"2":{"130":1}}],["четкого",{"2":{"436":1}}],["четкое",{"2":{"199":1,"224":1}}],["четкость",{"2":{"118":1}}],["четко",{"2":{"9":1,"150":1,"151":2,"203":1,"237":1,"266":1,"325":1,"344":1,"359":1}}],["четырех",{"2":{"28":1,"134":1}}],["четыре",{"2":{"23":1,"105":1,"116":1,"134":1,"509":1}}],["чему",{"2":{"178":1,"246":1,"258":1,"356":1}}],["чем",{"2":{"2":1,"47":1,"105":1,"114":1,"146":1,"147":1,"150":1,"156":1,"158":3,"179":1,"192":1,"200":1,"204":1,"211":1,"220":1,"223":1,"224":1,"232":1,"239":1,"244":1,"247":1,"258":1,"269":2,"271":1,"287":1,"302":2,"303":1,"305":1,"306":1,"308":2,"314":1,"315":1,"316":1,"317":1,"319":1,"325":1,"330":1,"331":1,"336":3,"343":1,"348":1,"361":1,"369":1,"372":2,"373":1,"385":1,"391":1,"393":1,"397":1,"422":1,"432":2,"436":4,"448":1,"450":1,"452":1,"460":1,"462":1,"463":1,"468":1,"471":1}}],["кб",{"2":{"540":1}}],["киты",{"2":{"507":1}}],["кстати",{"2":{"285":1}}],["квадрат",{"2":{"263":1}}],["квадратов",{"2":{"176":1}}],["кэша",{"2":{"555":1}}],["кэширующий",{"2":{"462":1}}],["кэшированный",{"2":{"344":1}}],["кэширования",{"2":{"336":1,"343":1,"344":1,"421":1,"555":1}}],["кэшированием",{"2":{"343":1}}],["кэширование",{"2":{"112":1,"308":1,"472":1,"555":1}}],["кэшировать",{"2":{"336":1,"343":1,"344":2}}],["кэшу",{"2":{"344":1}}],["кэш",{"2":{"295":1,"344":8,"555":1}}],["кэшем",{"2":{"545":1}}],["кэше",{"2":{"212":1,"344":1}}],["кем",{"2":{"200":1}}],["кебаба",{"2":{"176":1}}],["книжка",{"2":{"473":1}}],["книга",{"0":{"401":1,"406":1},"1":{"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"331":1,"400":2,"401":1,"402":1,"403":1,"473":2,"497":1}}],["книгами",{"2":{"152":1}}],["книгу",{"0":{"403":1},"2":{"158":1}}],["книг",{"2":{"152":1}}],["книги",{"0":{"399":1,"402":1},"2":{"132":1,"143":1,"148":1,"149":1,"152":1,"178":1,"181":1,"202":1,"205":1,"223":1,"225":1,"227":1,"235":1,"237":1,"255":1,"256":1,"260":2,"267":1,"271":2,"304":2,"322":1,"324":1,"328":1,"331":2,"345":1,"371":1,"394":1,"402":1,"404":1,"405":2,"435":1,"473":2,"476":1}}],["книге",{"0":{"213":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1},"2":{"124":1,"145":1,"148":1,"199":3,"200":1,"204":2,"211":1,"213":2,"219":1,"222":2,"227":1,"247":1,"249":2,"250":1,"266":1,"268":1,"272":1,"290":1,"292":1,"297":2,"316":1,"350":1,"402":3}}],["кнопок",{"2":{"151":1,"194":1,"195":2,"255":1}}],["кнопкой",{"2":{"203":1,"341":1,"356":1}}],["кнопку",{"2":{"179":1,"212":1,"223":1,"231":1,"343":2,"344":1,"351":1,"381":3,"445":1,"464":1}}],["кнопке",{"2":{"174":1,"211":1,"352":1}}],["кнопкам",{"2":{"464":1}}],["кнопками",{"2":{"255":1}}],["кнопка",{"2":{"150":1,"156":2,"193":1,"211":1,"232":1,"343":4}}],["кнопки",{"2":{"85":2,"151":2,"156":1,"162":1,"164":1,"195":2,"255":1,"329":1}}],["кучу",{"2":{"463":1}}],["куча",{"2":{"462":1}}],["кучи",{"2":{"460":1,"536":1}}],["кулер",{"2":{"433":1}}],["кулисами",{"2":{"296":1}}],["куда",{"2":{"152":1,"256":1,"325":1,"326":1,"433":1,"463":1}}],["купить",{"0":{"403":1},"2":{"144":2,"422":1}}],["куку",{"2":{"116":1}}],["курсы",{"2":{"147":1,"473":1}}],["курсор",{"2":{"91":1,"156":1}}],["курсов",{"2":{"73":1,"473":1}}],["курс",{"2":{"2":1,"464":1,"473":1}}],["кто",{"2":{"39":1,"62":1,"149":1,"264":1,"295":1,"385":1,"461":1,"463":1,"472":1}}],["креативности",{"2":{"179":1,"385":1}}],["креативность",{"2":{"159":1}}],["крутятся",{"2":{"433":1}}],["крутится",{"2":{"168":1}}],["кругозор",{"2":{"473":1}}],["круговой",{"2":{"256":2}}],["круга",{"2":{"196":1,"507":1}}],["круглой",{"2":{"163":1}}],["кружок",{"2":{"165":1,"168":1}}],["крупнейший",{"2":{"331":1}}],["крупные",{"2":{"185":1}}],["крупных",{"2":{"115":1,"221":1,"372":1}}],["крупномасштабного",{"2":{"414":1}}],["крупного",{"2":{"165":1,"201":1}}],["крупной",{"2":{"137":1}}],["криптовалюты",{"2":{"331":3}}],["криптографическими",{"2":{"331":1}}],["криптографические",{"2":{"331":1}}],["криптографическую",{"2":{"325":1}}],["криптографии",{"2":{"330":1}}],["криптография",{"2":{"116":1}}],["критериям",{"2":{"343":1,"346":1}}],["критериями",{"2":{"39":1}}],["критике",{"2":{"232":1}}],["критика",{"0":{"232":1,"257":1},"2":{"232":1}}],["критически",{"2":{"233":1,"256":1}}],["критической",{"2":{"166":1}}],["критичных",{"2":{"116":1}}],["кроулером",{"2":{"472":1}}],["кровеносной",{"2":{"263":1}}],["кровлю",{"2":{"26":1}}],["кроссплатформенными",{"2":{"222":1}}],["крошкам",{"2":{"174":1}}],["крошки",{"0":{"174":1},"2":{"174":2}}],["кроче",{"2":{"152":1}}],["кроме",{"2":{"63":1,"102":1,"118":1,"170":1,"178":1,"187":1,"204":3,"211":1,"223":1,"228":1,"258":1,"269":1,"270":1,"286":1,"297":1,"318":1,"323":1,"336":3,"341":1,"343":1,"387":1,"421":3,"423":1,"432":1,"434":1,"439":1,"445":1,"454":1,"462":2,"463":1,"465":1,"472":2,"473":1}}],["кроется",{"2":{"62":1}}],["крайний",{"2":{"251":1}}],["крайние",{"2":{"249":1,"450":1}}],["крайних",{"2":{"235":1,"292":2,"373":1}}],["крайними",{"2":{"228":1,"322":1}}],["крайней",{"2":{"221":1,"284":1,"296":1,"301":1,"402":1}}],["красивую",{"2":{"471":1}}],["красиво",{"2":{"454":1,"472":1}}],["красивые",{"2":{"71":1}}],["красивый",{"2":{"26":1}}],["красное",{"2":{"375":1}}],["красным",{"2":{"346":1,"376":1}}],["красе",{"2":{"325":1}}],["красочный",{"2":{"183":1}}],["края",{"2":{"156":1}}],["кражей",{"2":{"116":1}}],["краткий",{"0":{"272":1},"1":{"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1},"2":{"163":1,"297":1,"363":1}}],["кратким",{"2":{"119":1,"160":1,"341":1}}],["краткосрочной",{"2":{"271":1}}],["краткости",{"2":{"239":1,"246":1,"255":2,"328":1}}],["кратко",{"2":{"201":1,"220":1,"354":1}}],["кратковременной",{"2":{"158":1}}],["кратковременную",{"2":{"158":1}}],["краткого",{"2":{"134":1}}],["краткое",{"0":{"506":1},"2":{"109":1,"229":1,"278":1}}],["краткая",{"0":{"232":1},"2":{"47":1}}],["клон",{"2":{"447":1}}],["клонирования",{"2":{"386":1}}],["клонируемого",{"2":{"447":1}}],["клонируем",{"2":{"111":1,"447":1}}],["клетки",{"2":{"263":1}}],["класть",{"2":{"429":1,"462":1}}],["классе",{"2":{"286":1}}],["классом",{"2":{"230":1,"439":1,"556":1}}],["классов",{"0":{"216":1},"2":{"22":1,"200":2,"212":1,"225":1,"226":1,"250":1,"256":1,"264":1,"266":1,"273":1,"379":1,"462":1,"464":1,"471":1,"508":1}}],["классы",{"2":{"225":1,"226":1,"227":1,"231":1,"249":2,"255":1,"297":1,"462":1}}],["классу",{"2":{"204":1,"287":1}}],["класс",{"2":{"169":1,"231":1,"265":1,"268":1,"281":2,"282":2,"284":1,"287":2,"429":1}}],["классификация",{"2":{"338":1,"339":1,"340":1,"341":1}}],["классификаций",{"2":{"276":1}}],["классификаторов",{"2":{"163":1}}],["классифицируются",{"2":{"272":1}}],["классической",{"2":{"158":1}}],["классический",{"2":{"193":1,"204":1,"250":1,"473":1}}],["классически",{"2":{"61":1}}],["классических",{"2":{"47":1}}],["классическим",{"2":{"6":1}}],["классами",{"2":{"357":1,"464":1}}],["классах",{"2":{"268":1}}],["класса",{"2":{"23":1,"256":1,"281":3,"282":1,"290":1,"293":1,"447":1,"462":1,"509":1}}],["кладем",{"2":{"292":1}}],["кладет",{"2":{"116":1}}],["кладется",{"2":{"102":1}}],["клавиатуры",{"2":{"433":1}}],["клавиатуру",{"2":{"433":1}}],["клавиатурой",{"2":{"170":1}}],["клавиатура",{"2":{"158":1}}],["клавишу",{"2":{"229":1,"231":1}}],["клавиши",{"2":{"162":1,"223":1}}],["клавиш",{"2":{"89":1,"158":1,"223":1}}],["клавишей",{"2":{"89":1}}],["ключу",{"2":{"247":1,"460":1,"536":1}}],["ключ",{"2":{"59":2,"296":1,"316":1,"325":4,"421":1,"446":1}}],["ключом",{"2":{"59":1,"247":1,"296":1,"364":1}}],["ключей",{"2":{"245":1,"331":2}}],["ключевая",{"2":{"330":1,"411":1}}],["ключевую",{"2":{"308":1}}],["ключевое",{"2":{"204":2,"303":1,"360":1}}],["ключевой",{"2":{"200":1}}],["ключевые",{"2":{"306":1,"373":1,"407":1,"442":1}}],["ключевыми",{"2":{"413":1}}],["ключевым",{"2":{"137":1,"295":1,"303":1,"351":1,"441":1}}],["ключевых",{"2":{"73":1,"133":1,"308":1,"364":1,"372":1,"373":1}}],["ключе",{"2":{"58":1}}],["ключа",{"2":{"58":1,"59":1,"247":1,"325":1}}],["климов",{"2":{"473":1}}],["клише",{"2":{"268":1}}],["клиентской",{"2":{"443":1}}],["клиентское",{"2":{"442":1}}],["клиентского",{"2":{"297":1}}],["клиентском",{"2":{"294":1}}],["клиенту",{"2":{"293":1,"324":1,"444":1,"451":1,"454":1}}],["клиенты",{"2":{"293":1,"308":1}}],["клиентов",{"2":{"149":1,"293":2}}],["клиентом",{"2":{"144":1,"296":1,"300":1,"454":1,"472":1}}],["клиентами",{"2":{"443":1}}],["клиентам",{"2":{"117":1,"395":1}}],["клиента",{"2":{"117":3,"295":3,"300":1,"326":1,"440":2,"443":1,"472":1,"511":1,"555":2}}],["клиент",{"0":{"6":1},"2":{"9":1,"62":1,"118":2,"295":2,"297":1,"325":1,"433":2,"444":1}}],["клику",{"2":{"515":1}}],["клике",{"2":{"102":1}}],["клик",{"2":{"3":1,"231":1}}],["капот",{"2":{"473":1}}],["капотом",{"2":{"119":1,"345":1,"376":1,"463":1}}],["казаться",{"2":{"472":1}}],["казалось",{"2":{"168":1}}],["кадров",{"2":{"436":2}}],["кадрами",{"2":{"436":1}}],["калькулятором",{"2":{"374":1}}],["калькулятор",{"2":{"374":1}}],["камне",{"2":{"200":1}}],["каркас",{"2":{"504":1,"506":1,"507":1,"508":1,"545":1}}],["каркаса",{"2":{"221":1,"223":2,"233":1,"508":2}}],["кардинально",{"2":{"455":1}}],["кардинальность",{"2":{"291":1}}],["карьере",{"2":{"405":1}}],["каруселей",{"2":{"167":1}}],["карусели",{"2":{"167":2}}],["каруселью",{"2":{"183":1}}],["карусель",{"0":{"167":1,"459":1},"2":{"167":3}}],["карты",{"2":{"330":1}}],["карточкой",{"2":{"408":1}}],["карточка",{"2":{"152":1}}],["карточках",{"2":{"109":1}}],["карточками",{"2":{"102":1}}],["карточки",{"2":{"108":3,"152":2,"153":1,"256":1}}],["карточке",{"0":{"102":1},"2":{"102":1}}],["картинками",{"2":{"472":1}}],["картинка",{"2":{"431":1}}],["картинки",{"2":{"429":6,"472":2}}],["картинке",{"2":{"206":1,"472":1}}],["картинок",{"2":{"109":1,"431":1}}],["картины",{"2":{"26":1,"263":1}}],["картину",{"2":{"26":1}}],["канал",{"0":{"498":1}}],["канала",{"0":{"113":1},"1":{"114":1},"2":{"316":1}}],["кандидатов",{"2":{"463":1}}],["кануть",{"2":{"149":1}}],["каскадно",{"2":{"330":1}}],["каскадные",{"2":{"199":1}}],["касались",{"2":{"349":1}}],["касается",{"2":{"316":1,"448":1,"462":1}}],["касающиеся",{"2":{"396":1}}],["касающимися",{"2":{"247":1}}],["касаются",{"2":{"62":1,"273":1,"274":1}}],["кастомные",{"2":{"471":1}}],["кастомных",{"2":{"464":1}}],["кастомными",{"2":{"432":1}}],["кастомный",{"2":{"422":1,"528":2}}],["кастомную",{"2":{"115":1}}],["кастомизированный",{"2":{"100":1}}],["кастомизировать",{"2":{"72":1}}],["кастомизацию",{"2":{"99":1,"105":1}}],["кастомизация",{"0":{"94":1},"1":{"95":1,"96":1,"97":1,"98":1,"99":1,"100":1},"2":{"504":1,"508":1,"557":1}}],["кастомизации",{"2":{"76":1,"504":1,"506":1,"545":1}}],["качество",{"2":{"63":1,"455":1,"471":1,"496":2}}],["качества",{"2":{"63":1,"74":1,"370":1,"372":1,"431":1,"473":1}}],["качественные",{"2":{"473":2}}],["качественный",{"2":{"433":1}}],["качественно",{"2":{"473":1}}],["качественного",{"2":{"370":1}}],["качественное",{"2":{"149":1}}],["качестве",{"2":{"17":1,"39":1,"122":1,"123":1,"127":1,"132":1,"134":1,"151":1,"171":1,"181":1,"201":1,"204":1,"222":1,"223":3,"229":1,"230":1,"231":1,"232":1,"244":2,"245":3,"249":1,"250":1,"252":1,"263":1,"265":1,"267":2,"277":1,"282":1,"284":1,"288":3,"289":1,"292":2,"296":2,"301":1,"302":1,"310":1,"313":3,"316":2,"317":1,"318":1,"322":1,"327":1,"328":1,"330":1,"331":2,"332":1,"336":1,"348":1,"352":1,"360":2,"364":1,"374":2,"375":1,"376":2,"380":2,"396":1,"409":1,"424":1,"437":1,"438":1,"440":3,"442":1,"443":1,"444":1,"445":1,"447":1,"448":2,"449":1,"452":2,"454":1,"462":1,"472":1,"497":1,"504":2,"511":1,"528":1}}],["кабинетом",{"2":{"59":1}}],["кабинета",{"2":{"36":1,"423":1}}],["кабинет",{"2":{"29":1,"33":1,"79":1}}],["катастрофы",{"2":{"159":1}}],["каталоги",{"2":{"310":1,"391":1}}],["каталогов",{"0":{"126":1},"2":{"119":1,"126":1,"135":3,"223":1,"224":3,"310":1,"390":1}}],["каталогом",{"2":{"11":1,"29":1,"98":1}}],["каталогу",{"2":{"95":1}}],["каталогах",{"2":{"253":1}}],["каталога",{"2":{"16":1,"79":1,"423":1}}],["каталоге",{"2":{"11":1,"108":1,"137":1,"138":1,"140":1,"223":2,"226":1,"230":1,"253":1,"310":1,"312":1,"359":1,"379":1,"380":1,"390":1,"443":1}}],["каталог",{"2":{"11":3,"33":2,"83":1,"95":2,"140":1,"141":1,"223":3,"224":2,"310":1,"344":1,"375":1,"390":1}}],["категорией",{"2":{"462":1}}],["категорически",{"2":{"250":1}}],["категоризации",{"2":{"178":1}}],["категорию",{"2":{"22":1,"43":1,"97":1,"168":1}}],["категорий",{"2":{"3":2,"4":1,"11":3,"22":1,"38":1,"51":1,"79":1,"99":1,"163":1}}],["категории",{"2":{"3":2,"4":1,"7":1,"11":2,"16":2,"22":1,"30":1,"31":1,"47":1,"51":1,"82":1,"83":1,"97":1,"108":3,"137":1,"185":1,"308":1,"323":1,"346":1}}],["категориям",{"2":{"95":1,"137":1,"172":1,"267":1}}],["категориями",{"2":{"43":1,"98":1,"464":1}}],["категориях",{"2":{"43":1,"347":1}}],["категория",{"0":{"16":1,"107":1},"1":{"108":1,"109":1},"2":{"3":1,"16":1,"83":1,"102":1,"346":1}}],["каждым",{"2":{"223":1,"232":1,"325":1,"331":1,"444":1,"472":1}}],["каждый",{"2":{"9":2,"41":1,"86":1,"116":2,"119":1,"123":2,"133":1,"134":2,"139":1,"144":1,"150":2,"160":1,"170":1,"171":1,"200":1,"204":2,"212":1,"224":1,"231":1,"256":1,"263":1,"265":1,"268":1,"281":1,"292":2,"295":1,"297":2,"308":1,"313":1,"316":1,"323":1,"325":1,"330":1,"331":1,"339":2,"341":1,"346":1,"351":1,"352":1,"354":2,"355":1,"356":2,"359":3,"360":1,"363":1,"364":3,"375":1,"385":1,"423":1,"432":1,"436":4,"444":1,"449":1,"450":1,"462":3,"463":1,"511":1}}],["каждая",{"2":{"143":1,"151":1,"152":1,"174":1,"209":1,"230":1,"250":1,"255":1,"297":1,"303":2,"325":2,"343":1,"344":1,"376":1,"385":1,"454":1,"462":1}}],["каждую",{"2":{"61":1,"203":1,"287":1,"288":1,"292":1,"316":1,"349":1,"376":1}}],["каждой",{"2":{"91":1,"102":1,"137":1,"140":1,"144":1,"149":1,"152":1,"170":1,"174":1,"221":1,"229":1,"230":1,"231":1,"297":1,"303":1,"325":1,"331":1,"336":1,"345":1,"346":1,"370":1,"376":2,"391":1,"443":1,"447":1,"448":1}}],["каждому",{"2":{"48":1,"116":1,"221":1,"249":2,"313":1,"316":1,"318":1,"323":1,"352":1,"421":1}}],["каждом",{"2":{"41":1,"86":2,"116":1,"162":1,"200":1,"225":1,"256":1,"260":2,"261":1,"268":1,"311":1,"319":1,"325":1,"358":1,"364":2,"423":2,"436":1,"450":1,"463":1}}],["каждого",{"2":{"13":1,"22":1,"78":1,"79":1,"119":1,"140":1,"144":3,"147":1,"152":1,"170":1,"171":1,"178":1,"183":1,"200":1,"203":1,"212":1,"228":1,"231":3,"239":3,"243":2,"256":1,"281":1,"316":2,"319":1,"320":1,"341":1,"344":1,"345":1,"352":1,"356":1,"364":3,"368":1,"375":1,"382":1,"386":1,"400":1,"421":2,"432":1,"449":1,"509":1,"555":1}}],["каждое",{"2":{"3":1,"63":1,"204":1,"206":1,"216":1,"256":1,"291":1,"295":1,"364":1,"381":3,"442":1,"449":1}}],["кажется",{"2":{"3":1,"187":1,"204":1,"358":1,"436":1}}],["какая",{"2":{"369":1,"383":2,"433":1}}],["какими",{"2":{"259":1}}],["каким",{"2":{"168":1,"196":1,"294":2,"348":1,"379":1}}],["каких",{"2":{"147":1,"197":1,"200":1,"302":1,"310":1,"360":1,"456":1,"472":1,"504":1,"537":1}}],["какие",{"2":{"4":1,"16":2,"22":1,"62":2,"146":3,"147":1,"199":1,"202":1,"220":1,"237":3,"239":1,"240":2,"241":2,"251":1,"259":1,"291":1,"293":1,"305":1,"314":1,"325":1,"334":2,"344":1,"348":1,"369":1,"425":1,"456":2,"458":1,"460":1,"463":1,"473":2,"501":1}}],["какую",{"2":{"23":1,"198":1,"201":1,"239":1,"397":1,"436":1,"507":1}}],["каковы",{"0":{"261":1},"2":{"147":1,"234":2,"333":3,"348":2,"456":1}}],["каком",{"2":{"115":1,"135":1,"168":1}}],["какого",{"2":{"70":1,"164":1,"176":1,"222":1,"436":1}}],["какое",{"2":{"12":1,"199":1,"358":1}}],["какой",{"2":{"3":1,"23":1,"123":1,"168":1,"200":1,"201":1,"228":1,"238":1,"244":1,"256":1,"263":1,"286":1,"287":1,"296":1,"330":1,"390":2,"431":1,"433":1,"465":1,"466":1}}],["как",{"2":{"2":1,"3":1,"9":2,"10":1,"12":1,"21":1,"22":2,"25":1,"26":1,"39":1,"43":1,"44":1,"50":2,"62":5,"63":1,"72":1,"78":1,"82":1,"83":1,"85":1,"102":1,"103":1,"105":1,"108":1,"109":1,"115":3,"116":5,"117":1,"118":4,"119":1,"121":2,"122":1,"124":3,"127":1,"128":1,"134":4,"135":1,"137":1,"140":1,"141":1,"142":1,"143":2,"145":1,"147":3,"149":7,"150":4,"152":1,"153":2,"154":1,"155":2,"156":2,"157":1,"158":2,"161":1,"163":1,"164":1,"167":4,"168":1,"171":4,"172":1,"176":1,"178":4,"179":1,"181":3,"182":4,"183":2,"184":1,"185":1,"186":1,"187":3,"189":1,"194":1,"196":1,"199":1,"200":8,"201":2,"202":6,"203":4,"204":13,"207":1,"208":2,"210":2,"212":1,"218":1,"221":2,"222":1,"223":5,"224":4,"225":6,"226":1,"227":5,"228":1,"229":1,"230":1,"231":9,"232":5,"233":2,"234":1,"235":3,"236":1,"237":3,"238":3,"239":2,"240":2,"242":1,"243":1,"244":4,"245":4,"246":3,"247":5,"248":1,"249":5,"250":1,"251":1,"254":1,"255":4,"256":9,"257":1,"258":1,"259":3,"260":2,"261":1,"263":3,"264":2,"265":3,"266":2,"267":4,"268":3,"270":2,"271":2,"281":1,"284":1,"285":1,"286":1,"287":2,"288":2,"289":2,"291":1,"292":3,"293":1,"295":5,"296":6,"297":3,"298":1,"300":1,"301":2,"302":6,"303":6,"304":2,"305":1,"306":4,"308":8,"309":1,"310":3,"311":3,"313":9,"315":1,"316":8,"317":1,"318":2,"319":2,"322":4,"323":2,"324":2,"325":10,"328":2,"329":2,"330":5,"331":8,"332":3,"333":2,"334":4,"336":5,"337":2,"338":2,"339":2,"340":1,"341":2,"342":2,"343":6,"344":5,"345":1,"346":1,"347":2,"349":2,"350":1,"351":4,"352":2,"353":1,"356":1,"357":3,"358":9,"359":7,"360":3,"361":2,"363":5,"364":3,"365":1,"366":3,"367":3,"369":2,"370":2,"372":6,"373":1,"374":2,"375":1,"376":4,"377":1,"378":3,"380":1,"381":8,"385":3,"386":1,"390":1,"391":4,"393":2,"394":4,"395":1,"396":2,"400":1,"401":1,"402":4,"409":1,"413":1,"415":1,"416":2,"421":2,"423":3,"425":3,"429":3,"431":1,"432":3,"433":3,"434":4,"436":9,"438":4,"440":6,"442":2,"443":5,"444":2,"445":4,"447":2,"448":2,"449":5,"450":2,"452":3,"454":3,"455":1,"456":2,"460":5,"461":1,"462":8,"463":1,"470":2,"471":4,"472":10,"473":6,"477":1,"479":1,"497":2,"507":2,"508":2,"509":1,"513":1,"534":1,"545":1}}],["коврике",{"2":{"472":1}}],["кошелек",{"2":{"331":3}}],["кошельки",{"2":{"331":2}}],["кошелька",{"2":{"331":6}}],["кошельками",{"2":{"331":1}}],["кошельках",{"2":{"331":1}}],["кошельков",{"2":{"331":2}}],["кошельком",{"2":{"331":2}}],["кошмар",{"2":{"23":1}}],["коем",{"2":{"276":1,"324":1,"364":1}}],["кого",{"0":{"401":1},"2":{"270":3,"295":1}}],["когда",{"0":{"278":1},"2":{"3":1,"30":1,"41":1,"71":1,"102":1,"115":1,"116":4,"117":1,"123":4,"126":1,"134":1,"137":1,"143":1,"145":1,"152":1,"158":1,"159":1,"160":1,"161":1,"162":4,"164":1,"170":2,"171":3,"178":1,"179":1,"182":1,"183":1,"193":1,"199":1,"200":7,"201":1,"204":3,"207":1,"208":1,"210":2,"211":1,"212":4,"224":2,"228":1,"231":2,"234":2,"235":1,"238":1,"240":2,"241":1,"246":4,"247":1,"248":1,"251":2,"254":1,"255":1,"257":1,"260":1,"264":2,"265":3,"267":4,"270":2,"278":4,"283":1,"286":1,"291":1,"292":1,"296":4,"297":1,"301":1,"302":2,"303":1,"304":2,"308":3,"313":1,"315":1,"316":2,"322":1,"323":1,"328":1,"329":2,"333":1,"336":1,"339":1,"341":1,"342":1,"343":6,"349":1,"351":1,"356":1,"358":2,"361":2,"363":1,"364":1,"366":1,"369":1,"372":1,"373":1,"377":1,"381":1,"382":1,"385":2,"390":1,"394":1,"397":1,"423":1,"425":1,"429":1,"436":5,"437":1,"442":1,"444":1,"445":1,"447":2,"450":1,"452":1,"460":2,"462":3,"471":1,"472":3,"473":1}}],["координирует",{"2":{"239":1}}],["координировать",{"2":{"200":1}}],["координация",{"2":{"200":1}}],["координации",{"2":{"200":1}}],["ко",{"2":{"137":2,"157":1,"224":1,"261":1,"270":1,"359":1,"378":1,"462":1,"464":1}}],["косой",{"2":{"135":1,"318":1}}],["коридоре",{"2":{"472":1}}],["коричневый",{"2":{"151":1}}],["корпоративном",{"2":{"386":1}}],["корпоративных",{"2":{"134":1,"147":1}}],["корня",{"2":{"318":1}}],["корневую",{"2":{"126":1}}],["корневом",{"2":{"138":1,"247":2,"359":1,"424":2,"438":1}}],["корневому",{"2":{"121":1}}],["корневого",{"2":{"122":1,"128":1,"238":1}}],["корневой",{"2":{"122":1,"135":1,"224":1,"247":1,"375":1,"390":2}}],["корне",{"2":{"120":1,"135":1,"139":1,"141":1,"224":1,"226":1,"338":1,"344":1,"383":1}}],["корень",{"2":{"224":1,"256":1,"344":1,"421":1}}],["коренится",{"2":{"150":1}}],["коробкой",{"2":{"473":1}}],["коробки",{"2":{"225":1,"345":1,"375":1,"379":1}}],["короче",{"2":{"167":1,"444":1}}],["коротким",{"0":{"269":1}}],["короткий",{"2":{"163":1,"166":1,"228":1,"380":1,"444":1,"473":1}}],["короткое",{"2":{"166":1,"339":1}}],["короткоживущий",{"2":{"116":1}}],["корректировку",{"2":{"495":1}}],["корректировки",{"2":{"61":1}}],["корректно",{"2":{"376":1}}],["корректном",{"2":{"224":1}}],["корректный",{"2":{"141":1,"286":1}}],["корректные",{"2":{"83":1}}],["корзину",{"0":{"187":1},"2":{"187":3}}],["корзины",{"2":{"12":1,"98":1,"184":1,"191":1,"194":1}}],["корзина",{"2":{"4":1,"29":1,"33":1,"79":1}}],["коллеги",{"2":{"473":1}}],["коллекцию",{"2":{"448":2}}],["коллекций",{"2":{"209":1,"227":1,"448":1}}],["коллекция",{"2":{"200":1,"225":1,"250":1}}],["коллекции",{"2":{"16":1,"282":1,"448":1}}],["коллизий",{"2":{"247":1}}],["коллизия",{"2":{"243":1}}],["коллизии",{"2":{"171":1}}],["коллоцированный",{"2":{"137":1}}],["количеством",{"2":{"130":1,"137":1,"308":1,"331":1,"460":1,"461":1}}],["количество",{"2":{"123":1,"146":1,"150":1,"151":1,"157":2,"158":1,"171":1,"178":2,"189":1,"199":1,"225":1,"228":1,"231":2,"238":1,"244":1,"269":1,"292":1,"319":1,"324":1,"325":1,"328":2,"332":1,"364":2,"376":2,"381":1,"436":1}}],["количества",{"2":{"116":1,"157":1,"268":1,"328":1}}],["колоночным",{"2":{"468":1}}],["колоночной",{"2":{"181":1,"471":1}}],["колонок",{"2":{"47":1,"108":1,"181":1}}],["колонки",{"2":{"181":2,"238":1}}],["колонка",{"2":{"108":1}}],["колонками",{"2":{"108":1}}],["колонтитуле",{"2":{"183":1}}],["колонтитул",{"2":{"153":1,"255":1}}],["комфорту",{"2":{"472":1}}],["комфортней",{"2":{"433":1}}],["комфортное",{"2":{"238":1}}],["комфортно",{"2":{"50":1,"63":1,"423":1,"462":1}}],["комиксах",{"2":{"164":1}}],["комбинацию",{"2":{"508":1}}],["комбинация",{"2":{"137":1,"364":1}}],["комбинаций",{"2":{"89":1}}],["коммита",{"2":{"391":1}}],["коммит",{"2":{"390":1,"393":1,"394":1,"395":1}}],["коммиты",{"2":{"143":1}}],["коммуникация",{"2":{"436":1}}],["коммуникациями",{"2":{"336":1}}],["коммуникациях",{"2":{"323":1}}],["коммуникации",{"2":{"303":1,"308":1,"324":1,"330":1,"434":1}}],["коммуникационного",{"2":{"268":1,"442":1}}],["коммуникаций",{"2":{"118":1,"325":1,"434":1}}],["комментирование",{"2":{"496":1}}],["комментарию",{"2":{"288":1}}],["комментарием",{"2":{"256":1}}],["комментариев",{"2":{"174":1,"267":1}}],["комментариями",{"2":{"116":1,"504":1}}],["комментариях",{"2":{"73":1}}],["комментарий",{"2":{"89":1,"381":1}}],["комментарии",{"2":{"86":2,"270":2,"344":1}}],["коммерческий",{"2":{"473":1}}],["коммерческих",{"2":{"134":1,"421":1}}],["коммерческого",{"2":{"144":1}}],["компетентные",{"2":{"473":1}}],["компилирует",{"2":{"395":1}}],["компиляции",{"2":{"394":1,"395":1}}],["компиляция",{"2":{"201":1}}],["комплект",{"2":{"389":1}}],["комплексное",{"2":{"116":1}}],["компромиссов",{"0":{"241":1},"2":{"241":1}}],["компромиссы",{"2":{"200":1,"237":1,"308":2,"382":1,"385":1,"400":1}}],["компромисс",{"2":{"200":2,"227":1}}],["компромиссами",{"2":{"200":1}}],["компаниях",{"2":{"372":1,"473":1}}],["компания",{"2":{"189":1}}],["компаниям",{"2":{"189":1}}],["компанией",{"2":{"154":1}}],["компании",{"2":{"116":1,"149":2,"182":1,"185":1,"186":1,"188":1,"189":1,"191":1}}],["компьютере",{"2":{"402":1,"432":1,"472":1}}],["компьютера",{"2":{"433":1}}],["компьютерах",{"2":{"336":1,"343":1}}],["компьютерам",{"2":{"269":1}}],["компьютером",{"2":{"149":1,"268":1}}],["компьютеров",{"2":{"134":3,"173":1,"181":1,"331":1,"402":1}}],["компьютеры",{"2":{"147":1}}],["компьютерного",{"2":{"147":1}}],["компьютерное",{"2":{"147":1}}],["компьютеру",{"2":{"134":1}}],["компьютер",{"2":{"134":1,"168":1,"222":1}}],["композитных",{"2":{"349":1,"358":1}}],["композитные",{"2":{"264":1}}],["композиции",{"2":{"264":1}}],["композицию",{"2":{"235":1}}],["композиция",{"0":{"235":1,"264":1,"410":1},"1":{"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1},"2":{"124":1,"154":1,"202":1,"203":2,"210":1,"229":1,"260":1,"264":1,"265":1,"267":1,"289":1,"297":1,"298":1,"309":1,"353":1}}],["композаблом",{"2":{"462":1}}],["композабле",{"2":{"103":1,"462":1}}],["композабл",{"0":{"103":1,"250":1},"1":{"251":1},"2":{"250":9,"423":1,"460":1,"462":4,"464":1}}],["композаблы",{"2":{"95":1,"464":1}}],["компонуемый",{"2":{"267":1}}],["компоновкой",{"2":{"180":1}}],["компоновки",{"2":{"126":1,"333":1}}],["компоновка",{"2":{"26":1}}],["компонентно",{"2":{"463":1}}],["компонентного",{"2":{"446":1}}],["компонентом",{"2":{"239":1,"240":1,"249":1,"254":1,"255":1,"256":1,"309":1,"313":1,"351":1,"364":1,"380":1,"381":2,"462":2}}],["компонентов",{"0":{"121":1,"203":1,"216":1,"235":1,"237":1,"351":1,"410":1},"1":{"236":1,"237":1,"238":2,"239":2,"240":2,"241":2,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"352":1,"353":1},"2":{"119":1,"121":2,"122":1,"128":1,"145":1,"154":1,"199":1,"201":1,"202":2,"203":2,"204":2,"211":2,"212":5,"219":1,"225":1,"228":2,"229":2,"232":2,"233":1,"235":4,"237":1,"238":5,"239":1,"241":2,"243":2,"244":1,"247":2,"248":1,"251":1,"252":1,"256":1,"259":1,"264":2,"265":4,"266":1,"267":1,"309":1,"319":1,"345":1,"349":1,"351":1,"353":2,"354":1,"356":2,"357":2,"358":1,"365":1,"370":1,"373":1,"374":1,"379":2,"381":1,"397":1,"410":1,"415":1,"443":1,"455":1,"457":1,"462":1,"545":1}}],["компоненту",{"2":{"120":1,"204":1,"232":1,"239":1,"246":1,"249":1,"251":1,"255":1,"299":1,"313":1,"320":1,"352":1,"380":1}}],["компоненте",{"2":{"41":1,"114":1,"124":1,"169":1,"229":1,"231":1,"232":1,"243":1,"245":2,"246":1,"247":5,"249":3,"250":1,"255":1,"256":2,"268":1,"298":1,"316":2,"318":3,"319":1,"323":1,"329":1,"352":1,"358":1,"367":1,"381":1,"445":1,"448":1,"452":1,"462":3,"538":1}}],["компоненты",{"0":{"28":1,"128":1,"212":1,"242":1,"243":1,"248":1,"251":1,"315":1},"1":{"29":1,"30":1,"31":1,"32":1,"243":1,"244":1,"245":1,"246":1,"247":1,"249":1},"2":{"23":2,"26":1,"41":1,"63":1,"95":1,"120":1,"121":1,"122":2,"128":2,"199":1,"202":2,"203":3,"204":2,"210":1,"212":2,"220":1,"224":3,"227":1,"235":2,"237":2,"238":4,"239":3,"242":1,"243":2,"244":2,"246":1,"249":1,"252":1,"254":2,"256":1,"258":2,"259":1,"264":1,"265":2,"266":3,"297":2,"299":1,"309":1,"310":4,"311":1,"314":2,"315":2,"319":4,"349":1,"351":4,"353":1,"354":1,"355":1,"358":1,"372":1,"373":3,"374":1,"378":3,"379":1,"423":1,"424":2,"425":2,"439":1,"462":2,"463":2,"464":1,"466":2,"467":1,"471":3,"508":1,"543":1,"557":1}}],["компонент",{"2":{"23":1,"36":1,"85":2,"89":1,"98":1,"100":1,"105":4,"108":1,"121":1,"122":1,"128":1,"162":1,"171":2,"201":2,"202":1,"203":3,"204":4,"212":7,"224":3,"229":2,"230":5,"232":1,"238":2,"239":2,"240":4,"243":5,"244":7,"245":2,"247":2,"249":10,"250":1,"251":5,"254":1,"255":6,"256":4,"265":9,"267":2,"268":1,"297":1,"298":1,"311":1,"313":4,"315":2,"316":6,"319":4,"321":1,"327":1,"329":1,"351":7,"353":2,"354":3,"355":1,"356":2,"358":2,"367":1,"372":1,"374":2,"380":3,"424":2,"429":1,"431":1,"451":3,"460":1,"462":7,"463":3,"466":1,"471":2,"503":1,"508":1,"543":2,"545":1,"557":1}}],["компонентам",{"2":{"127":1,"228":1,"238":1,"239":1,"246":1,"256":1,"265":1,"309":1,"319":1,"351":1,"424":1}}],["компонентами",{"0":{"466":1},"2":{"124":1,"154":1,"203":1,"204":2,"210":1,"230":1,"235":1,"239":1,"242":1,"243":2,"246":1,"247":1,"250":2,"251":1,"274":1,"275":1,"289":2,"297":1,"298":1,"309":2,"310":1,"311":1,"316":1,"350":1,"354":1,"357":1,"359":2,"361":2,"363":1,"368":1,"369":1,"375":1,"384":1,"425":1,"443":1,"501":1}}],["компонентах",{"2":{"23":1,"41":1,"114":1,"122":1,"128":1,"154":1,"198":1,"203":1,"204":1,"240":2,"243":1,"250":1,"251":1,"258":1,"259":1,"268":1,"297":1,"316":2,"362":1,"365":1,"366":1,"373":1,"382":1,"396":1,"438":1}}],["компонента",{"2":{"22":1,"122":1,"168":1,"170":1,"202":1,"203":4,"204":7,"212":4,"224":1,"225":2,"226":1,"230":2,"231":3,"234":1,"235":1,"238":1,"239":1,"241":1,"243":4,"244":1,"245":3,"246":7,"248":1,"249":3,"250":1,"251":4,"255":7,"256":1,"263":1,"265":1,"267":4,"289":1,"295":1,"298":3,"299":1,"315":1,"316":2,"319":3,"322":1,"324":1,"343":4,"351":1,"352":1,"356":2,"360":1,"374":1,"375":2,"379":1,"380":3,"381":3,"424":1,"462":4,"464":1,"471":2,"513":1,"516":1}}],["кому",{"2":{"116":1}}],["командную",{"2":{"388":1}}],["командного",{"2":{"293":1}}],["командной",{"2":{"221":1,"223":1,"224":1,"233":1,"375":1,"384":1,"386":1,"387":1,"432":1,"453":1}}],["команд",{"2":{"224":2,"293":1,"294":1,"388":1,"421":1,"463":1}}],["командами",{"2":{"375":1}}],["командах",{"2":{"372":1}}],["команда",{"0":{"293":1},"1":{"294":1},"2":{"218":1,"247":1,"260":1,"293":1,"310":1,"363":1,"386":1,"501":1}}],["командой",{"2":{"154":1,"281":1,"370":1,"372":1,"373":1,"379":1,"393":1,"394":1,"415":1,"472":1}}],["команде",{"2":{"149":1,"154":1,"200":1,"218":1,"247":1,"293":1,"442":1}}],["команды",{"2":{"102":1,"200":1,"224":1,"226":1,"243":1,"245":1,"262":1,"293":2,"294":1,"323":1,"332":1,"345":1,"354":1,"359":1,"375":2,"379":1,"383":2,"388":2,"390":2,"391":2,"392":2,"393":1,"394":1,"397":1,"444":1,"452":1}}],["команду",{"2":{"34":1,"91":1,"136":1,"223":3,"231":1,"294":1,"310":1,"363":1,"374":1,"379":1,"383":2,"389":2,"390":2,"393":1,"445":1,"449":1,"453":2}}],["коп",{"2":{"463":1}}],["копейкой",{"2":{"187":1}}],["копейку",{"2":{"187":1}}],["копируются",{"2":{"436":1}}],["копирование",{"2":{"356":1}}],["копирования",{"2":{"145":1,"432":1}}],["копировать",{"2":{"22":1}}],["копии",{"2":{"351":1,"386":1}}],["копий",{"2":{"209":1,"357":1}}],["копия",{"2":{"163":1,"256":1}}],["копию",{"2":{"163":1,"231":1,"240":2,"356":2,"386":1,"391":1,"447":1}}],["копонент",{"2":{"32":1}}],["кот",{"2":{"18":1}}],["которого",{"2":{"122":1,"204":4,"245":2,"251":1,"255":1,"267":1,"339":1,"360":2,"375":1,"436":1}}],["которое",{"2":{"122":1,"123":1,"124":1,"143":1,"144":1,"150":1,"151":2,"157":1,"171":1,"175":1,"211":1,"222":1,"230":1,"231":1,"232":1,"239":1,"244":1,"247":1,"249":1,"255":1,"296":1,"303":1,"310":2,"316":1,"325":1,"329":1,"356":1,"358":1,"363":1,"364":2,"373":2,"374":1,"380":1,"381":2,"383":1,"393":1,"394":1,"436":1,"437":2,"461":1}}],["которой",{"2":{"92":1,"140":1,"149":1,"152":1,"158":1,"171":1,"181":1,"197":1,"201":1,"224":1,"262":1,"295":1,"300":1,"311":2,"313":1,"328":1,"345":1,"376":2,"395":1,"411":1,"437":1,"440":1,"508":1}}],["котором",{"2":{"59":1,"134":1,"199":2,"203":1,"223":1,"224":1,"231":1,"244":2,"251":1,"256":1,"265":1,"294":1,"296":1,"316":2,"324":1,"325":1,"331":1,"337":1,"344":1,"345":1,"370":1,"378":1,"379":1,"422":1,"436":1,"449":1,"451":1,"460":1,"462":1}}],["которому",{"2":{"48":1,"209":1,"322":1,"361":1,"365":1,"377":1,"380":1,"424":1,"454":1}}],["которая",{"2":{"43":1,"63":1,"71":1,"102":1,"118":1,"125":2,"134":1,"137":1,"143":1,"168":1,"183":1,"200":1,"201":1,"204":1,"207":1,"224":1,"231":4,"239":1,"244":1,"250":3,"251":1,"256":2,"263":1,"287":1,"290":1,"295":1,"301":2,"303":1,"313":1,"316":1,"323":2,"331":1,"356":1,"361":1,"364":5,"366":1,"372":1,"375":2,"376":1,"380":1,"381":2,"383":1,"391":1,"440":1,"444":1,"449":1,"453":1,"462":2,"463":1,"471":1,"472":1,"473":1}}],["которым",{"2":{"16":1,"17":1,"117":1,"150":1,"204":1,"218":1,"224":1,"244":1,"250":1,"254":1,"313":1,"316":1,"364":1,"424":3,"446":1,"471":1}}],["которыми",{"2":{"3":1,"4":1,"132":1,"157":1,"218":1,"224":1,"256":1,"295":1,"434":1,"462":1}}],["которые",{"2":{"16":1,"22":1,"36":1,"47":1,"116":1,"117":1,"119":1,"123":1,"130":1,"141":1,"142":2,"145":1,"146":1,"149":2,"150":1,"154":2,"155":1,"159":3,"162":1,"168":1,"170":1,"171":1,"176":3,"178":1,"184":1,"187":1,"191":1,"197":2,"198":1,"199":5,"201":2,"202":3,"203":1,"204":4,"205":1,"208":1,"211":3,"212":3,"213":1,"221":1,"224":4,"225":3,"226":1,"227":3,"229":1,"232":1,"238":1,"239":1,"240":1,"243":2,"244":3,"245":1,"246":3,"247":1,"249":2,"250":1,"260":2,"261":2,"263":2,"266":1,"267":3,"268":2,"269":1,"271":3,"272":2,"275":1,"292":2,"297":1,"300":1,"304":1,"308":1,"311":1,"314":1,"318":1,"319":2,"322":1,"324":1,"325":1,"326":1,"327":1,"328":1,"331":2,"332":1,"334":2,"336":2,"338":2,"341":1,"343":1,"344":1,"346":1,"351":1,"354":1,"356":1,"358":1,"360":1,"363":2,"364":2,"365":1,"372":1,"373":2,"376":2,"380":1,"381":3,"391":1,"393":1,"400":2,"401":1,"422":1,"423":2,"425":1,"429":1,"434":3,"436":2,"440":1,"442":1,"448":1,"452":1,"453":1,"471":1,"472":2,"473":1,"507":1,"508":1,"557":1}}],["которых",{"2":{"12":1,"40":1,"63":1,"119":1,"130":1,"199":1,"200":1,"202":1,"204":1,"209":1,"227":1,"250":1,"255":1,"271":1,"291":1,"297":2,"310":1,"314":1,"317":1,"319":1,"323":1,"324":1,"328":1,"330":1,"339":1,"366":1,"370":1,"394":1,"462":1,"463":1,"472":1}}],["который",{"2":{"3":1,"10":1,"13":1,"35":1,"41":1,"48":1,"72":1,"91":1,"115":2,"117":2,"119":1,"134":4,"137":1,"144":3,"150":1,"153":1,"168":2,"170":1,"171":1,"173":1,"177":1,"181":2,"182":1,"186":2,"189":1,"191":1,"199":1,"200":2,"201":2,"202":1,"203":4,"204":4,"212":2,"213":1,"221":1,"222":1,"223":1,"224":3,"229":2,"230":1,"231":2,"232":1,"237":1,"239":1,"241":1,"244":5,"248":1,"249":1,"250":1,"251":2,"254":1,"255":3,"256":2,"258":1,"265":2,"270":1,"280":1,"282":1,"290":1,"293":1,"295":2,"296":3,"297":3,"298":1,"299":2,"302":1,"303":1,"308":1,"309":2,"313":5,"316":2,"318":1,"319":3,"324":1,"325":1,"326":1,"327":1,"329":1,"330":1,"331":3,"336":1,"338":1,"342":1,"344":3,"345":1,"349":1,"354":3,"359":3,"361":1,"362":1,"366":2,"372":1,"376":2,"378":1,"380":1,"381":1,"382":2,"386":1,"391":1,"409":1,"424":1,"429":1,"432":1,"437":2,"439":1,"440":1,"441":1,"442":1,"443":2,"448":1,"449":1,"453":1,"454":1,"461":1,"462":3,"463":1,"472":2}}],["которую",{"2":{"2":1,"22":1,"89":1,"154":1,"164":1,"170":1,"192":1,"193":1,"201":1,"224":1,"228":1,"256":1,"272":1,"313":1,"319":1,"323":1,"325":1,"327":1,"328":1,"329":1,"340":1,"342":1,"356":1,"376":1,"421":1,"436":1,"445":1,"447":2,"462":1,"473":1}}],["конвейера",{"0":{"442":1},"1":{"443":1,"444":1,"445":1}}],["конвейеров",{"2":{"300":1}}],["конгруэнтным",{"2":{"258":1}}],["конфликтуют",{"2":{"433":1}}],["конфликта",{"2":{"393":1}}],["конфликт",{"2":{"393":1}}],["конфликты",{"0":{"393":1},"2":{"394":1}}],["конфликтов",{"2":{"230":1,"394":1}}],["конфигом",{"2":{"433":1}}],["конфиге",{"0":{"528":1},"2":{"432":1}}],["конфигурирование",{"2":{"221":1,"542":1}}],["конфигурацией",{"2":{"345":1}}],["конфигурационного",{"2":{"421":1,"501":1}}],["конфигурационному",{"2":{"228":1}}],["конфигурационные",{"2":{"509":1}}],["конфигурационный",{"2":{"224":1,"228":1,"379":2,"518":1}}],["конфигурационных",{"2":{"132":1}}],["конфигураций",{"2":{"142":1}}],["конфигурации",{"0":{"137":1,"228":1},"1":{"138":1,"139":1,"140":1,"141":1,"142":1},"2":{"127":1,"135":1,"137":2,"140":1,"223":1,"224":1,"228":2,"265":1,"313":1,"345":1,"382":2,"424":2}}],["конфигурацию",{"2":{"127":1,"136":1,"137":2,"138":1,"141":1,"145":1,"227":1,"228":2,"375":1}}],["конфигурациях",{"2":{"472":1}}],["конфигурация",{"0":{"138":1},"1":{"139":1},"2":{"23":1,"143":1,"433":1}}],["конфиденциальности",{"2":{"197":1,"323":1}}],["конец",{"2":{"223":1,"382":2}}],["конечная",{"2":{"450":1,"454":1}}],["конечную",{"2":{"324":1,"326":1,"327":1,"330":1}}],["конечных",{"2":{"325":1,"364":1,"453":1}}],["конечными",{"2":{"449":1}}],["конечным",{"2":{"325":1}}],["конечные",{"2":{"224":1,"256":1,"454":1}}],["конечный",{"2":{"131":1,"204":1,"224":1,"229":1,"249":2,"256":2,"315":1}}],["конечном",{"2":{"218":1,"244":1,"395":1}}],["конечному",{"2":{"150":1,"330":1,"343":1}}],["конечной",{"2":{"187":1,"449":1}}],["конечного",{"2":{"63":1,"76":1,"134":1,"308":1,"395":2}}],["конечно",{"2":{"17":1,"118":1,"136":1,"229":1,"297":1,"303":1,"328":1,"331":1,"334":1,"346":1,"351":1,"356":1,"372":1,"464":1,"472":1}}],["консистентности",{"2":{"462":1}}],["консоли",{"2":{"460":1}}],["консоль",{"2":{"222":1,"296":2,"302":1,"438":1}}],["константные",{"2":{"215":1}}],["константе",{"2":{"204":1}}],["константа",{"2":{"204":2}}],["константы",{"0":{"215":1},"2":{"204":2,"231":1}}],["константу",{"2":{"204":2,"250":2,"256":1,"358":2}}],["конструкция",{"0":{"254":1},"2":{"256":1}}],["конструкциями",{"2":{"39":1}}],["конструкции",{"2":{"238":1,"462":1}}],["конструктору",{"2":{"313":1,"437":1}}],["конструктором",{"2":{"313":1}}],["конструкторов",{"2":{"231":1,"313":1,"361":1}}],["конструкторе",{"2":{"281":1,"286":1,"287":1,"292":1}}],["конструктора",{"2":{"204":1,"250":1,"255":1,"303":1,"319":1,"360":1,"366":2,"443":1,"508":2}}],["конструкторы",{"2":{"127":1,"215":1,"319":1,"322":1}}],["конструктор",{"2":{"120":2,"127":1,"136":1,"201":1,"204":3,"256":1,"295":1,"296":1,"303":1,"313":1,"357":1,"358":1,"360":2,"361":1,"363":1,"437":2,"439":1,"448":1,"454":1}}],["кончается",{"2":{"116":2}}],["кончился",{"2":{"116":1}}],["контакты",{"2":{"495":1}}],["контактов",{"2":{"196":1}}],["контактам",{"2":{"196":1}}],["контейнер",{"2":{"315":1}}],["контейнера",{"2":{"171":1}}],["контенту",{"2":{"183":1}}],["контент",{"2":{"181":2,"195":1,"336":1,"472":1}}],["контентом",{"2":{"167":1,"178":1,"183":1,"257":1,"472":2,"506":1,"508":1}}],["контента",{"0":{"180":1},"1":{"181":1,"182":1,"183":1,"184":1},"2":{"151":1,"167":1,"174":1,"199":1,"201":1,"212":1,"238":1,"472":1}}],["контекстов",{"2":{"345":1}}],["контексту",{"2":{"238":1,"323":1}}],["контекст",{"2":{"228":1,"247":1,"379":1}}],["контексте",{"2":{"228":1,"260":1,"308":1}}],["контекстном",{"2":{"341":1}}],["контекстного",{"2":{"164":1,"350":1}}],["контекстные",{"2":{"164":1}}],["контекстным",{"2":{"164":1}}],["контекстных",{"2":{"164":1}}],["контекстах",{"2":{"308":1,"339":1}}],["контекста",{"2":{"89":1,"204":1,"243":1,"262":1,"272":1,"276":1,"294":1,"324":1,"334":1,"341":1,"349":1,"507":1}}],["контрагентами",{"2":{"463":1}}],["контрастно",{"2":{"183":1}}],["контрастах",{"2":{"183":1}}],["контраста",{"2":{"153":1}}],["контраст",{"0":{"151":1},"2":{"151":3}}],["контролируется",{"2":{"556":1}}],["контролирует",{"2":{"460":1,"463":1}}],["контролировать",{"2":{"2":1,"224":1,"289":1,"315":1}}],["контроллеров",{"2":{"246":1}}],["контроллеры",{"0":{"246":1}}],["контроля",{"0":{"370":1},"1":{"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"158":2,"159":1,"168":1,"222":2,"224":1,"232":1,"265":1,"313":1,"386":1,"415":1}}],["контроль",{"0":{"415":1},"2":{"143":1,"159":1,"204":2,"222":1,"224":1,"228":1,"244":1,"302":1,"308":1,"345":1,"384":1}}],["концов",{"2":{"300":1,"344":1}}],["концом",{"2":{"297":1}}],["концу",{"2":{"147":1,"199":1,"306":1,"334":2,"349":1,"434":1,"436":1}}],["концептуально",{"2":{"439":1}}],["концептуального",{"2":{"410":1}}],["концептуальной",{"2":{"241":1}}],["концептуальных",{"2":{"434":1}}],["концептуальный",{"2":{"331":1}}],["концептуальные",{"2":{"261":1}}],["концепций",{"2":{"199":1,"300":1,"400":1,"455":1}}],["концепцией",{"2":{"170":1,"200":1,"359":1,"410":1}}],["концепция",{"2":{"147":1,"153":1,"164":1,"165":1,"170":1,"178":1,"179":2,"181":1,"188":1,"199":1,"200":1,"204":1,"222":1,"227":1,"249":1,"265":1,"266":1,"277":1,"293":1,"296":1,"330":1,"332":1,"370":1,"383":1}}],["концепциями",{"2":{"145":1,"235":1,"413":1,"441":1}}],["концепции",{"2":{"135":1,"150":1,"152":1,"202":1,"221":1,"260":1,"349":1,"350":1,"364":1,"370":1,"395":1,"396":1,"400":1,"416":1,"434":1,"442":1,"455":1,"464":1}}],["концепцию",{"2":{"134":1,"154":1,"179":1,"183":1,"204":1,"241":1,"308":1,"325":1,"334":1,"354":1}}],["конце",{"2":{"183":1,"186":1,"201":1,"224":1,"256":1,"300":1,"344":1,"372":1,"436":1}}],["концентрируемся",{"2":{"41":1}}],["конца",{"2":{"70":1,"170":1,"171":1,"324":1,"454":1}}],["конкатенируются",{"2":{"325":1}}],["конкатенированы",{"2":{"318":1}}],["конкатенировать",{"2":{"121":1}}],["конкатенации",{"2":{"325":1}}],["конкретика",{"2":{"265":1}}],["конкретную",{"2":{"265":1,"508":1}}],["конкретным",{"2":{"271":1}}],["конкретных",{"2":{"256":1,"336":1,"345":1,"366":1,"508":1}}],["конкретные",{"2":{"200":1}}],["конкретный",{"2":{"43":1,"450":1,"504":1}}],["конкретная",{"2":{"179":1}}],["конкретного",{"2":{"119":1,"157":1,"241":1,"330":1,"376":1,"425":1}}],["конкретное",{"2":{"117":1,"204":1}}],["конкретно",{"2":{"41":1}}],["конкретном",{"2":{"11":1,"200":1,"319":1,"440":1}}],["конкурировать",{"2":{"199":1}}],["конкурировали",{"2":{"199":1}}],["конкурируют",{"2":{"163":1}}],["конкурентов",{"0":{"21":1},"2":{"22":1,"149":1}}],["кодироваться",{"2":{"429":1}}],["кодирования",{"2":{"303":1,"325":2,"343":1,"372":1,"400":1}}],["кодирование",{"2":{"258":1,"284":1}}],["кодированию",{"2":{"181":1}}],["кодировке",{"2":{"325":1}}],["кодирует",{"2":{"325":1}}],["кодов",{"2":{"330":1}}],["кодовой",{"2":{"287":1,"391":1,"394":1}}],["кодовая",{"2":{"256":1,"336":1}}],["кодовых",{"2":{"213":1,"219":1,"267":1}}],["кодовые",{"0":{"213":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1},"2":{"218":1}}],["кодом",{"2":{"76":1,"115":1,"219":1,"222":1,"231":2,"250":1,"255":1,"300":1,"314":1,"329":1,"330":1,"331":1,"350":1,"370":1,"375":1,"379":1,"382":1,"385":1,"386":1,"391":1,"393":1,"442":1,"453":1}}],["кодера",{"2":{"433":1}}],["коде",{"2":{"82":1,"204":3,"218":1,"220":1,"228":1,"231":2,"241":1,"247":1,"250":1,"267":2,"283":1,"294":1,"297":1,"299":1,"303":2,"309":1,"316":1,"319":1,"329":1,"343":3,"344":1,"372":1,"375":1,"376":1,"381":1,"382":1,"385":1,"396":2,"447":1,"456":1,"463":1,"464":1,"471":1,"504":1,"509":1,"511":1,"512":1,"539":1}}],["коду",{"2":{"41":1,"229":1,"255":1,"270":1,"316":1,"325":1,"354":1,"385":1,"442":1,"448":1}}],["кода",{"0":{"404":1,"518":1},"2":{"40":1,"73":1,"92":1,"114":2,"115":1,"124":1,"125":1,"143":2,"200":2,"201":1,"202":1,"203":2,"204":6,"218":1,"222":3,"227":1,"228":1,"231":2,"232":1,"235":3,"236":1,"248":1,"250":1,"251":1,"254":1,"255":1,"256":2,"261":1,"265":1,"267":2,"268":2,"269":1,"270":1,"271":1,"286":1,"297":1,"301":2,"306":1,"308":1,"309":1,"318":1,"319":2,"322":1,"323":1,"324":1,"325":2,"327":1,"328":1,"329":3,"330":2,"335":3,"338":2,"343":2,"346":2,"349":1,"359":1,"360":1,"364":1,"367":1,"370":3,"371":1,"372":1,"376":2,"383":2,"384":2,"385":2,"386":2,"387":1,"391":3,"393":2,"396":1,"402":2,"404":1,"415":1,"419":2,"421":1,"433":1,"435":2,"436":5,"440":1,"442":1,"444":1,"445":1,"446":1,"447":1,"452":1,"454":1,"455":1,"462":1,"463":3,"465":1,"467":2,"471":2,"472":2,"473":1,"496":1,"507":1,"508":2,"511":1,"518":2}}],["код",{"0":{"270":1,"378":1,"405":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"9":1,"22":1,"77":1,"83":1,"86":1,"89":1,"103":1,"105":1,"114":2,"117":1,"118":1,"136":1,"137":1,"141":1,"146":1,"148":2,"162":1,"170":1,"175":1,"181":1,"200":1,"201":2,"202":2,"204":5,"213":1,"218":1,"222":1,"223":1,"224":5,"225":1,"227":1,"231":4,"232":1,"233":1,"235":1,"236":1,"244":2,"246":1,"250":1,"255":3,"259":1,"260":1,"267":3,"268":2,"270":6,"271":2,"280":1,"281":2,"283":2,"286":2,"296":1,"297":1,"302":1,"303":2,"307":2,"315":1,"316":3,"319":1,"324":1,"326":1,"327":1,"328":2,"329":5,"330":3,"331":3,"335":1,"343":1,"344":2,"350":2,"356":1,"357":1,"358":1,"368":1,"371":2,"372":5,"374":1,"375":2,"378":1,"380":1,"382":3,"385":2,"391":1,"393":1,"394":2,"395":1,"421":1,"433":1,"435":1,"436":1,"437":1,"442":1,"444":1,"445":1,"460":1,"467":1,"473":2,"529":1,"542":1,"556":1}}],["к",{"0":{"183":1,"343":1,"446":1},"1":{"447":1,"448":1,"449":1,"450":1,"451":1,"452":1},"2":{"2":1,"11":1,"16":1,"23":1,"26":1,"38":1,"40":2,"41":4,"51":1,"53":2,"58":1,"59":2,"62":1,"63":1,"72":1,"83":1,"95":1,"108":1,"112":1,"114":1,"115":7,"116":4,"117":6,"119":1,"120":1,"121":1,"123":6,"124":1,"127":3,"128":1,"131":2,"134":7,"135":1,"136":1,"137":4,"139":1,"141":1,"143":1,"144":4,"145":1,"147":1,"149":2,"150":1,"151":1,"152":2,"153":3,"154":1,"156":1,"157":1,"158":1,"159":2,"161":1,"162":1,"166":1,"167":2,"170":1,"171":2,"172":1,"173":1,"174":2,"181":6,"182":1,"183":5,"185":3,"187":1,"195":1,"196":1,"199":3,"200":1,"204":19,"206":1,"210":1,"212":3,"220":1,"221":1,"222":1,"224":4,"225":2,"226":1,"227":1,"228":1,"229":1,"231":3,"232":1,"233":1,"234":1,"235":1,"236":1,"237":4,"238":2,"239":1,"241":2,"243":2,"244":2,"245":1,"246":1,"249":4,"250":2,"252":3,"255":2,"256":1,"258":1,"259":1,"260":1,"264":1,"265":2,"267":3,"268":1,"270":1,"271":1,"273":1,"277":1,"278":3,"282":1,"289":2,"293":1,"295":1,"296":1,"297":2,"300":5,"301":2,"303":5,"304":1,"306":2,"308":3,"309":3,"310":1,"311":1,"313":2,"314":1,"315":1,"316":4,"317":1,"318":1,"319":1,"320":1,"322":3,"323":1,"324":1,"325":1,"329":3,"330":1,"331":8,"333":1,"334":3,"336":5,"338":2,"339":1,"341":1,"343":5,"344":6,"345":1,"346":1,"347":1,"348":1,"349":2,"350":1,"351":4,"353":2,"354":1,"356":2,"358":2,"359":1,"360":3,"361":1,"363":3,"364":7,"365":1,"366":2,"367":1,"370":3,"372":1,"373":1,"374":1,"375":1,"376":3,"377":1,"378":2,"380":6,"381":5,"385":3,"386":1,"390":1,"392":1,"394":1,"400":4,"402":2,"410":1,"422":2,"424":1,"429":1,"433":5,"434":3,"435":2,"436":7,"437":2,"438":1,"439":1,"440":5,"442":2,"443":2,"444":2,"445":2,"446":1,"447":1,"448":1,"449":1,"450":1,"454":3,"455":3,"460":1,"462":2,"464":1,"468":1,"472":3,"473":3,"498":1,"499":1,"507":1,"511":2,"512":1,"513":1,"542":1}}],["вкратце",{"2":{"349":1}}],["вкладок",{"2":{"364":1}}],["вкладка",{"2":{"193":1}}],["вкладки",{"2":{"153":1,"154":1,"364":2}}],["вклад",{"2":{"147":1,"270":1}}],["вкладывание",{"2":{"86":1}}],["включенные",{"2":{"262":1}}],["включенное",{"2":{"162":1}}],["включением",{"2":{"313":1,"451":1}}],["включение",{"2":{"227":1,"331":1,"375":1}}],["включения",{"2":{"225":1,"310":1,"318":1,"362":1,"370":1,"390":1,"391":1,"439":1,"444":1,"460":1}}],["включен",{"2":{"224":1,"243":1,"313":1,"390":1}}],["включено",{"2":{"162":2}}],["включены",{"2":{"150":1,"319":1}}],["включена",{"2":{"144":1,"181":1}}],["включив",{"2":{"379":1,"382":1}}],["включите",{"2":{"225":1,"361":1}}],["включить",{"2":{"137":1,"138":1,"224":1,"227":3,"265":1,"310":1,"359":1,"383":1,"450":1,"454":1}}],["включили",{"2":{"227":1,"313":1,"319":1,"448":1,"454":1}}],["включил",{"2":{"138":1,"504":1}}],["включим",{"2":{"112":1,"225":1,"444":1,"446":1}}],["включать",{"2":{"199":1,"225":1,"227":1,"246":1,"319":1,"343":1,"382":1,"394":1,"395":1,"433":1,"441":1,"442":1}}],["включающий",{"2":{"125":1}}],["включают",{"2":{"63":1,"244":1,"308":1,"394":1,"545":1}}],["включаем",{"2":{"315":1,"316":1}}],["включаемые",{"2":{"124":1}}],["включается",{"2":{"116":1,"301":1,"433":1}}],["включает",{"0":{"133":1,"406":1},"1":{"134":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"63":1,"64":1,"68":1,"125":1,"131":1,"137":1,"149":3,"163":1,"166":1,"176":1,"267":1,"268":1,"291":1,"372":2,"390":1,"394":1,"440":1,"449":1}}],["включая",{"2":{"47":1,"199":1,"264":1,"357":1,"432":1,"433":1,"460":1,"471":1,"545":1}}],["вмешательства",{"2":{"344":1}}],["вместе",{"2":{"118":1,"123":1,"147":1,"173":1,"194":1,"212":1,"221":1,"260":1,"269":1,"308":1,"315":1,"319":1,"330":1,"346":1,"372":1,"393":1,"434":1,"454":1,"465":1}}],["вместо",{"2":{"23":1,"117":1,"121":1,"124":1,"136":2,"183":1,"202":1,"203":1,"204":1,"227":1,"243":1,"249":1,"250":1,"260":1,"264":1,"292":1,"293":1,"297":1,"302":1,"316":1,"319":1,"333":1,"336":1,"344":1,"353":1,"357":1,"361":1,"363":1,"364":2,"373":1,"375":1,"378":1,"389":1,"432":1,"439":1,"441":1,"460":1,"472":1,"512":2,"556":1}}],["втянуть",{"2":{"185":1}}],["вторых",{"2":{"473":1}}],["вторым",{"2":{"376":1}}],["вторую",{"2":{"454":1}}],["вторично",{"2":{"433":1}}],["вторичным",{"2":{"164":1}}],["вторичный",{"2":{"151":1,"330":1}}],["вторая",{"2":{"123":1,"267":1,"436":1}}],["второго",{"2":{"332":1,"380":1}}],["второе",{"2":{"231":1,"329":1,"330":1}}],["втором",{"2":{"116":2,"295":1,"313":1}}],["второстепенных",{"2":{"17":1}}],["второй",{"2":{"17":1,"51":1,"56":1,"58":1,"61":1,"245":1,"281":1,"313":1,"330":1,"343":1,"370":1,"376":2,"433":3,"450":1,"534":1}}],["впрочем",{"2":{"539":1}}],["впредь",{"2":{"347":1}}],["впечатляющей",{"2":{"446":1}}],["впечатляющее",{"2":{"319":1}}],["впечатление",{"2":{"168":1,"170":1,"496":1,"507":1}}],["впервые",{"2":{"394":1}}],["вперёд",{"2":{"308":1}}],["вперед",{"2":{"211":1,"232":1,"304":1,"322":1,"328":1,"339":1,"344":1,"358":1,"392":1}}],["вплоть",{"2":{"200":1,"249":1,"263":1,"379":1,"384":1}}],["вполне",{"2":{"4":1,"59":1,"116":1,"130":1,"223":1,"323":1,"324":1,"325":1,"356":1,"394":1,"449":1,"462":1,"463":1,"473":1,"507":1}}],["входе",{"2":{"472":1}}],["входящего",{"2":{"374":1,"440":1}}],["входящих",{"2":{"376":1,"443":1,"444":1}}],["входящий",{"2":{"139":1}}],["входящие",{"2":{"138":1,"266":1}}],["входят",{"2":{"341":1}}],["входы",{"2":{"298":1,"373":1}}],["вход",{"2":{"297":1,"327":2}}],["входной",{"2":{"298":1}}],["входного",{"2":{"244":1,"374":1}}],["входных",{"2":{"282":1,"290":1,"372":1}}],["входные",{"2":{"239":1,"295":1}}],["входными",{"2":{"232":1}}],["входным",{"2":{"124":1}}],["входов",{"0":{"240":1},"2":{"372":1}}],["входить",{"2":{"237":1,"297":1}}],["входит",{"2":{"117":1,"143":1,"154":1,"328":1,"389":1,"496":1}}],["входа",{"2":{"29":1,"137":1,"203":1,"265":4,"293":1,"328":1,"440":1,"442":1,"463":1,"472":1}}],["вузах",{"2":{"74":1}}],["вязала",{"2":{"71":1}}],["владельцем",{"2":{"351":1}}],["властвуй",{"2":{"2":1}}],["вложенных",{"0":{"318":1},"2":{"319":1,"425":1}}],["вложенные",{"0":{"317":1},"1":{"318":1,"319":1},"2":{"322":1}}],["вложенном",{"2":{"247":1}}],["вложенному",{"2":{"246":1}}],["вложенного",{"2":{"174":1}}],["вложены",{"2":{"185":1}}],["вложений",{"2":{"71":1}}],["влиять",{"2":{"261":1}}],["влияющий",{"2":{"302":1}}],["влияющее",{"2":{"165":1}}],["влияют",{"2":{"149":1,"267":1,"275":1}}],["влияет",{"2":{"162":1,"205":1,"436":1,"465":1}}],["влияние",{"2":{"63":1,"184":1}}],["вновь",{"2":{"437":1,"471":1}}],["вносит",{"2":{"471":1}}],["вносится",{"2":{"370":1}}],["вносите",{"2":{"270":1}}],["вносить",{"2":{"228":1}}],["вносят",{"2":{"199":1}}],["внуку",{"2":{"353":1}}],["внушительная",{"2":{"250":1}}],["внушительное",{"2":{"178":1}}],["внучатому",{"2":{"246":1}}],["внутрь",{"2":{"319":1,"433":1}}],["внутренняя",{"2":{"297":1}}],["внутреннюю",{"2":{"250":1,"356":1}}],["внутренне",{"2":{"297":1}}],["внутреннего",{"2":{"287":1,"292":1,"366":1,"473":1}}],["внутреннее",{"2":{"254":1,"255":2,"363":1}}],["внутренней",{"2":{"212":1,"223":1,"295":1,"347":1,"356":1}}],["внутреннему",{"2":{"284":1,"287":1,"325":1}}],["внутреннем",{"2":{"204":1,"366":1}}],["внутренний",{"2":{"267":1,"329":1,"366":1,"425":1}}],["внутренним",{"2":{"266":1,"297":1,"331":1,"365":1}}],["внутренними",{"2":{"123":1}}],["внутренних",{"2":{"147":1,"212":1,"245":1,"373":1,"447":1}}],["внутренние",{"2":{"125":1,"358":1,"463":1}}],["внутри",{"2":{"48":1,"128":1,"135":1,"162":1,"163":1,"176":1,"181":2,"200":3,"201":2,"209":1,"224":2,"228":2,"230":1,"231":4,"234":1,"244":1,"246":1,"249":2,"253":1,"263":1,"289":1,"298":1,"302":1,"303":2,"324":1,"327":1,"328":1,"336":1,"343":1,"360":1,"361":1,"366":1,"376":3,"424":1,"429":1,"434":1,"438":1,"460":3,"462":1,"542":1,"549":1}}],["вниз",{"2":{"170":1,"183":1,"301":1,"353":1,"497":1,"534":1}}],["внизу",{"2":{"33":1,"166":1,"171":1}}],["внимательно",{"0":{"153":1}}],["вниманию",{"2":{"166":1}}],["внимания",{"2":{"131":2,"165":1,"166":1,"195":1,"287":1}}],["внимание",{"2":{"105":1,"122":1,"123":1,"136":1,"139":1,"151":2,"153":1,"154":1,"165":1,"178":1,"181":1,"183":2,"186":1,"199":1,"200":1,"201":3,"203":1,"204":1,"224":1,"230":2,"231":3,"246":1,"255":1,"256":3,"281":1,"291":1,"296":2,"301":1,"303":1,"313":2,"316":1,"319":1,"325":1,"329":1,"336":1,"347":1,"351":1,"353":1,"356":1,"360":1,"363":1,"376":1,"378":1,"381":3,"391":1,"402":1,"436":2,"438":1,"447":1,"450":1}}],["внешней",{"2":{"462":1}}],["внешнего",{"2":{"199":1,"225":1,"297":1}}],["внешних",{"2":{"373":1}}],["внешние",{"2":{"265":1}}],["внешний",{"2":{"199":1,"226":1,"315":1,"329":1,"336":1,"425":1}}],["внедрить",{"2":{"313":1,"344":1,"424":1}}],["внедрена",{"2":{"247":1}}],["внедрения",{"2":{"221":1,"334":1,"345":1,"437":1}}],["внедрении",{"2":{"195":1}}],["внедряйте",{"2":{"424":1}}],["внедряют",{"2":{"224":1,"331":1}}],["внедрять",{"2":{"56":1,"171":1,"225":1}}],["внесите",{"0":{"495":1}}],["внесения",{"2":{"495":1}}],["внесение",{"2":{"385":1}}],["внесенных",{"2":{"200":1}}],["внесем",{"2":{"223":1}}],["внесли",{"2":{"147":1,"358":1}}],["внести",{"2":{"40":1,"146":1,"269":1,"370":1}}],["вне",{"2":{"128":1,"222":1,"248":1,"301":1,"336":1}}],["вредными",{"2":{"473":1}}],["вредоносные",{"2":{"185":1}}],["времена",{"2":{"471":1}}],["временами",{"2":{"199":1}}],["временем",{"2":{"204":1,"291":1,"421":1}}],["временно",{"2":{"460":1,"462":1}}],["временной",{"2":{"436":1}}],["временное",{"2":{"117":1}}],["временных",{"2":{"373":1}}],["временным",{"2":{"182":1}}],["временная",{"2":{"325":1}}],["времени",{"2":{"71":1,"93":1,"125":1,"134":1,"157":2,"161":1,"168":2,"204":1,"229":1,"250":1,"296":1,"300":1,"301":1,"302":1,"308":3,"329":6,"330":1,"364":1,"384":1,"436":4,"461":1,"467":1,"471":1,"473":1}}],["время",{"0":{"460":1},"2":{"105":1,"112":1,"122":1,"127":1,"134":3,"137":1,"143":1,"156":1,"157":3,"158":1,"161":1,"166":1,"174":1,"177":1,"183":1,"189":1,"200":2,"201":2,"202":1,"204":1,"212":1,"223":1,"224":3,"227":1,"231":1,"232":1,"238":1,"241":1,"244":3,"249":1,"255":2,"256":1,"258":1,"270":1,"284":1,"295":1,"297":1,"298":1,"302":1,"303":2,"313":1,"316":2,"322":1,"329":1,"331":1,"332":1,"343":3,"354":1,"365":1,"368":2,"370":2,"372":1,"374":1,"375":1,"376":1,"384":1,"385":1,"394":1,"400":1,"433":1,"442":1,"443":1,"445":1,"448":1,"460":1,"461":5,"462":1,"464":1,"465":1,"467":1,"473":1,"507":1,"536":1,"542":1}}],["вращение",{"2":{"169":1}}],["вращающихся",{"2":{"169":1,"433":1}}],["вроде",{"2":{"71":1,"109":1,"462":1,"472":1}}],["вручную",{"2":{"38":1,"144":1,"267":2,"334":1,"344":1,"347":1,"372":1,"379":1}}],["вряд",{"2":{"26":1,"370":1,"473":1}}],["взяли",{"2":{"464":1}}],["взяв",{"2":{"463":1}}],["взята",{"2":{"227":1}}],["взять",{"2":{"4":1,"143":1,"200":1,"238":1,"308":1,"374":1,"431":1,"507":1}}],["взлетевших",{"2":{"463":1}}],["взлететь",{"2":{"433":1}}],["взломают",{"2":{"330":1}}],["взвесить",{"2":{"200":1}}],["взглянув",{"2":{"258":1}}],["взглянуть",{"2":{"27":1,"118":1,"256":1}}],["взгляд",{"2":{"149":1,"178":1,"182":1,"204":1,"271":1,"297":1,"303":1,"318":1}}],["взгляда",{"2":{"147":1,"150":1,"160":1,"176":1}}],["взаимоотношения",{"2":{"275":1}}],["взаимозаменяемые",{"2":{"200":1,"302":1}}],["взаимопониманием",{"2":{"197":1}}],["взаимодействуют",{"2":{"349":1,"425":1,"434":1}}],["взаимодействуем",{"2":{"308":1}}],["взаимодействует",{"2":{"34":1,"149":1,"159":1}}],["взаимодействовать",{"2":{"175":1,"237":1,"239":2,"241":1,"255":1,"258":1,"259":1,"331":1,"347":1,"381":1,"456":1}}],["взаимодействии",{"2":{"351":1,"372":1}}],["взаимодействию",{"2":{"300":1}}],["взаимодействий",{"0":{"239":1},"2":{"159":1,"199":1,"300":1,"308":1,"323":2,"373":2,"453":1}}],["взаимодействие",{"0":{"351":1},"1":{"352":1,"353":1},"2":{"149":1,"231":2,"239":1,"240":2,"244":1,"254":1,"255":1,"278":1,"300":3,"331":1,"372":2,"381":1,"434":1,"441":1,"449":1}}],["взаимодействием",{"2":{"63":1,"172":1,"232":1,"239":1,"240":1,"344":1}}],["взаимодействия",{"0":{"172":1,"442":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"443":1,"444":1,"445":1},"2":{"63":1,"147":2,"149":2,"159":1,"176":1,"182":1,"185":1,"235":1,"239":1,"250":1,"268":1,"271":1,"274":1,"306":1,"323":1,"330":1,"331":1,"351":2,"370":1,"381":1,"383":1,"384":1,"437":1,"441":1,"442":1,"451":1,"464":1}}],["взаимосвязаны",{"2":{"305":1}}],["взаимосвязь",{"2":{"295":1}}],["взаимосвязи",{"2":{"63":1,"370":1}}],["взаимосвязей",{"2":{"62":1,"384":1}}],["вентиляторов",{"2":{"433":1}}],["вело",{"2":{"334":1}}],["велосипед",{"2":{"225":1,"260":1,"292":1,"300":1}}],["великолепным",{"2":{"203":1}}],["ведение",{"2":{"324":1}}],["ведет",{"2":{"211":1,"295":1,"313":1,"400":1}}],["ведется",{"2":{"189":1,"331":1}}],["ведь",{"2":{"316":1,"375":1}}],["ведома",{"2":{"189":1}}],["ведут",{"2":{"163":1,"208":1,"209":1,"249":1,"322":1}}],["ведущие",{"2":{"134":1,"202":1}}],["веток",{"2":{"393":1}}],["ветвью",{"2":{"472":1}}],["ветвей",{"2":{"392":1}}],["ветвями",{"0":{"392":1},"2":{"392":1,"393":1}}],["ветвление",{"2":{"391":1}}],["ветви",{"2":{"130":1}}],["ветки",{"2":{"391":1,"392":4,"393":1,"421":2,"527":1}}],["веткой",{"2":{"391":1,"393":1}}],["ветке",{"2":{"391":2,"392":1,"393":1,"397":1,"527":1}}],["ветку",{"2":{"143":1,"392":3,"393":2,"394":2,"421":2,"527":2}}],["ветках",{"2":{"397":1,"462":1}}],["ветка",{"2":{"112":1,"391":2}}],["вещах",{"2":{"201":1,"436":1}}],["вещи",{"2":{"115":1,"150":1,"380":1,"460":1,"536":1}}],["вещь",{"2":{"25":1,"225":1,"227":1}}],["везде",{"2":{"95":1}}],["веса",{"2":{"471":1}}],["вести",{"2":{"365":1,"472":1}}],["вестись",{"2":{"70":1,"79":1}}],["веских",{"2":{"295":1}}],["весомых",{"2":{"173":1}}],["вес",{"2":{"109":1,"153":1}}],["весьма",{"2":{"98":1,"194":1,"200":1,"331":1,"356":1,"455":1,"539":1}}],["весь",{"2":{"50":1,"123":1,"170":1,"196":1,"202":1,"204":1,"250":1,"268":1,"300":1,"308":2,"344":1,"393":1,"442":1,"555":1}}],["верен",{"2":{"472":1}}],["вероятно",{"2":{"393":1}}],["вероятность",{"2":{"79":1,"200":1,"336":1,"423":1,"461":1}}],["верстку",{"2":{"471":1}}],["верстки",{"2":{"256":1,"504":1}}],["верстать",{"2":{"468":1,"471":1}}],["версионность",{"2":{"423":1,"555":1}}],["версионности",{"2":{"65":1}}],["версией",{"2":{"390":1}}],["версию",{"2":{"222":1,"224":1,"306":1,"387":1,"390":1,"421":1,"448":1,"472":1,"473":1,"545":1}}],["версий",{"0":{"370":1},"1":{"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"35":1,"134":1,"222":2,"395":2,"415":1}}],["версиях",{"2":{"224":1}}],["версиями",{"2":{"86":1,"119":1}}],["версия",{"0":{"33":1},"2":{"80":1,"127":1,"199":1,"222":3,"257":1,"388":1,"400":1,"511":1}}],["версии",{"2":{"29":1,"30":1,"33":2,"47":1,"224":1,"251":1,"295":1,"363":1,"378":1,"421":2,"555":1}}],["вертикали",{"2":{"239":1}}],["вертикальный",{"2":{"250":1}}],["вертикальные",{"2":{"152":1,"176":1}}],["вертикального",{"2":{"181":1}}],["вертикальной",{"2":{"181":1,"250":1}}],["верхняя",{"2":{"542":1}}],["верхний",{"2":{"509":1}}],["верхнее",{"2":{"181":1}}],["верхней",{"2":{"152":1,"170":1,"173":1,"174":1,"181":1,"182":1}}],["верхнем",{"2":{"150":2,"178":1,"182":1,"346":2}}],["верхнего",{"2":{"120":1,"134":3,"146":1,"216":1,"238":1,"249":1,"310":1,"311":1}}],["верха",{"2":{"183":1,"224":1,"313":1}}],["вернулся",{"2":{"471":1}}],["вернуть",{"2":{"204":1,"302":1,"303":1,"331":1,"448":1}}],["вернуться",{"2":{"61":1,"174":1,"311":1,"344":2,"385":2}}],["верно",{"2":{"231":1}}],["верное",{"2":{"200":1}}],["вернемся",{"2":{"255":2,"297":1}}],["вернетесь",{"2":{"270":1}}],["вернет",{"2":{"117":1,"256":1,"361":1,"380":1}}],["вернее",{"2":{"25":1}}],["вебприложения",{"2":{"507":1,"508":1}}],["вебприложение",{"2":{"504":1}}],["веба",{"2":{"471":1}}],["вебсервер",{"2":{"422":1,"433":1,"472":1}}],["вебсервере",{"2":{"422":1}}],["вебсервера",{"2":{"117":1,"433":1}}],["вебсайта",{"2":{"421":1,"496":1,"507":1,"508":1}}],["вебсайт",{"2":{"421":1,"506":1}}],["вебсайты",{"2":{"21":1}}],["веб",{"0":{"133":1,"137":1,"144":1,"201":1,"334":1,"412":1,"442":1,"502":1},"1":{"134":1,"138":1,"139":1,"140":1,"141":1,"142":1,"202":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1,"341":1,"342":1,"343":1,"344":1,"345":1,"346":1,"347":1,"348":1,"443":1,"444":1,"445":1},"2":{"3":1,"11":2,"117":2,"131":5,"133":2,"134":3,"135":3,"136":2,"137":10,"138":1,"139":1,"143":1,"144":5,"145":1,"146":4,"147":2,"149":1,"150":1,"166":1,"168":1,"170":1,"171":1,"174":1,"178":1,"197":1,"199":4,"200":2,"201":2,"202":2,"203":1,"206":1,"209":1,"221":2,"222":2,"223":1,"224":5,"225":1,"227":3,"232":2,"235":3,"237":1,"256":1,"263":2,"265":1,"267":1,"268":2,"269":2,"276":1,"294":1,"300":3,"308":8,"313":1,"320":1,"323":2,"329":1,"331":2,"332":2,"334":3,"336":13,"341":1,"342":1,"343":1,"345":3,"346":1,"347":1,"348":2,"349":1,"363":1,"364":2,"383":1,"384":1,"394":1,"395":1,"401":1,"402":3,"410":1,"411":1,"423":1,"433":1,"434":3,"436":5,"441":1,"445":1,"449":2,"453":1,"455":2,"456":1,"461":1,"464":1,"472":3,"504":1,"506":1,"507":1,"508":2}}],["вдохновения",{"2":{"22":1}}],["вводе",{"2":{"463":1}}],["вводя",{"2":{"381":1}}],["вводом",{"2":{"246":1}}],["вводились",{"2":{"463":1}}],["вводился",{"2":{"353":1}}],["вводим",{"2":{"308":1}}],["вводимых",{"2":{"231":1}}],["вводит",{"2":{"210":1,"329":1}}],["вводить",{"2":{"2":1,"161":1,"227":1,"229":1,"465":1}}],["ввод",{"2":{"231":1,"239":2,"381":1}}],["вводы",{"2":{"163":1}}],["ввода",{"0":{"161":1,"246":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1},"2":{"161":1,"163":1,"210":1,"229":2,"231":7,"232":1,"241":1,"246":3,"251":1,"256":1,"311":1,"329":6,"367":1,"501":1}}],["вверх",{"2":{"247":1,"284":1,"351":1,"353":1}}],["вверху",{"2":{"166":1}}],["ввели",{"2":{"223":2,"241":1,"333":1,"381":1}}],["введи",{"2":{"464":1}}],["введите",{"2":{"223":5,"375":1,"495":1}}],["введём",{"2":{"393":1}}],["введет",{"2":{"329":1}}],["введем",{"2":{"201":1,"453":1}}],["введенный",{"2":{"460":1}}],["введенных",{"2":{"365":1}}],["введенная",{"2":{"154":1}}],["введен",{"2":{"269":1}}],["введении",{"2":{"372":1}}],["введением",{"2":{"370":1}}],["введение",{"0":{"436":1},"1":{"437":1,"438":1,"439":1},"2":{"266":1,"394":1}}],["введения",{"2":{"134":1,"158":1}}],["ввести",{"2":{"16":1,"161":1,"223":1,"229":1,"329":1,"375":1}}],["ввиду",{"2":{"4":1}}],["валидаций",{"2":{"376":1}}],["валидацией",{"2":{"331":1}}],["валидация",{"2":{"295":1,"329":2,"462":1}}],["валиден",{"2":{"116":1}}],["ванильному",{"2":{"204":1}}],["важен",{"2":{"159":1,"224":1,"266":1,"269":1,"270":1,"289":1,"305":1}}],["важнейших",{"2":{"373":1}}],["важнее",{"2":{"179":1,"308":1}}],["важна",{"2":{"149":1}}],["важная",{"2":{"40":1,"130":1,"332":1,"448":1}}],["важный",{"2":{"255":1,"263":1,"277":1,"303":1,"320":1,"349":1}}],["важны",{"2":{"168":1,"220":1,"461":1}}],["важные",{"2":{"145":1,"197":1,"200":1,"304":1,"322":1,"370":1,"396":1,"407":1,"434":1,"470":1}}],["важными",{"2":{"145":1,"156":1,"197":1,"324":1}}],["важных",{"2":{"63":1,"201":1,"224":1,"277":1,"301":1,"319":1,"455":1}}],["важной",{"2":{"170":1,"183":1,"223":1,"385":1,"391":1}}],["важного",{"2":{"166":1}}],["важное",{"2":{"162":1,"255":1}}],["важность",{"2":{"153":1}}],["важно",{"2":{"144":1,"152":2,"171":1,"173":1,"177":1,"183":1,"202":1,"203":1,"204":1,"207":1,"218":2,"231":1,"250":1,"267":1,"270":1,"291":1,"294":1,"301":1,"305":1,"308":1,"324":1,"325":1,"336":1,"343":1,"385":1,"394":1,"397":1,"448":1,"454":1}}],["варьироваться",{"2":{"194":1}}],["варьируются",{"2":{"134":1}}],["вариаций",{"2":{"291":1}}],["вариациями",{"2":{"271":1}}],["вариации",{"2":{"163":1}}],["вариантом",{"2":{"143":1,"174":1,"178":1,"234":1,"323":1}}],["вариантов",{"2":{"116":1,"137":2,"143":2,"157":2,"161":1,"162":1,"174":1,"175":1,"176":1,"178":1,"200":1,"201":1,"222":1,"228":1,"432":1,"508":2,"544":1,"545":2}}],["варианте",{"2":{"108":1,"230":1,"403":1}}],["варианту",{"2":{"105":1}}],["вариантам",{"2":{"418":1}}],["вариантами",{"2":{"223":1,"227":1,"365":1}}],["вариантах",{"2":{"145":1,"162":1,"173":1,"328":1}}],["варианта",{"2":{"59":1,"105":1,"123":1,"144":2,"235":1,"473":1,"508":2}}],["варианты",{"0":{"115":1,"204":1},"2":{"16":1,"116":1,"119":1,"137":1,"146":1,"172":1,"191":1,"199":1,"295":1,"343":1,"358":1,"364":1,"381":1,"422":1,"446":1,"545":1}}],["вариант",{"2":{"4":2,"17":1,"118":1,"162":2,"190":2,"191":1,"200":2,"222":2,"223":1,"224":1,"243":1,"281":1,"313":1,"343":1,"440":1,"460":1,"473":1}}],["вами",{"2":{"223":2,"231":1}}],["вам",{"2":{"119":2,"123":1,"125":3,"131":1,"135":1,"145":1,"150":1,"154":1,"184":1,"197":1,"198":1,"200":4,"201":1,"203":1,"204":2,"213":1,"220":2,"222":1,"223":1,"249":1,"256":2,"260":3,"267":2,"270":2,"295":4,"304":2,"306":1,"335":1,"350":1,"353":1,"364":1,"387":1,"388":1,"390":1,"400":3,"405":2,"422":1,"425":1,"429":1,"432":1,"446":1,"465":1,"471":1,"472":1,"473":1}}],["вас",{"2":{"119":1,"158":1,"182":1,"203":1,"220":1,"251":1,"253":1,"267":1,"270":1,"303":1,"375":1,"376":1,"389":2,"394":1,"450":1,"460":1,"462":1,"528":2}}],["васи",{"2":{"116":1}}],["вася",{"2":{"116":1}}],["ваши",{"2":{"310":1,"462":1}}],["ваших",{"2":{"154":1,"446":1}}],["ваша",{"2":{"218":1}}],["ваше",{"2":{"200":1,"270":1,"400":1,"429":1,"436":1,"465":1,"495":1,"529":1}}],["вашей",{"2":{"134":1,"200":1,"223":1,"281":1,"287":1,"356":1,"391":1}}],["вашего",{"2":{"117":1,"119":2,"124":1,"134":2,"200":1,"212":1,"223":2,"224":1,"225":1,"271":1,"275":1,"304":1,"344":1,"349":2,"364":1,"421":2,"422":1,"424":1,"425":1,"436":1,"465":2,"467":1,"472":1,"527":1,"528":1,"554":1,"556":2}}],["вашему",{"2":{"114":1,"223":1,"331":1,"422":2,"456":1,"462":1}}],["вашем",{"2":{"114":1,"271":1,"394":1,"402":1,"429":1,"472":1}}],["вашу",{"2":{"114":1,"200":1,"387":1,"388":1}}],["ваш",{"2":{"4":1,"115":1,"134":1,"200":1,"201":1,"218":1,"224":1,"225":1,"390":1,"421":2,"429":1,"460":1,"470":1,"472":2,"473":1,"527":1}}],["всплывающем",{"2":{"176":1,"193":1}}],["всплывающего",{"2":{"176":2}}],["всплывающей",{"2":{"164":2}}],["всплывающее",{"2":{"164":1}}],["всплывающая",{"2":{"164":1}}],["вспомним",{"2":{"301":1}}],["вспомнить",{"2":{"225":1}}],["вспомните",{"2":{"149":1,"330":1}}],["вспоминать",{"2":{"281":1}}],["вспомогательный",{"2":{"357":1}}],["вспомогательные",{"2":{"4":1,"296":1}}],["вспомогательная",{"2":{"231":1,"239":1,"256":2}}],["вскоре",{"2":{"154":1,"199":1,"223":1,"309":1,"436":1}}],["всю",{"2":{"143":1,"173":1,"194":1,"227":1,"231":1,"235":1,"255":1,"271":1,"324":1,"331":1,"373":1,"375":1,"436":1}}],["встающих",{"2":{"507":1}}],["вставке",{"2":{"212":1}}],["вставать",{"2":{"4":1}}],["вступает",{"2":{"202":1}}],["встроенную",{"2":{"446":1}}],["встроенная",{"2":{"434":1}}],["встроенным",{"2":{"243":1}}],["встроенный",{"2":{"222":1,"295":1}}],["встроенные",{"0":{"212":1}}],["встроенных",{"0":{"205":1},"1":{"206":1,"207":1,"208":1,"209":1,"210":1,"211":1},"2":{"211":1,"212":1,"325":1}}],["встроенного",{"2":{"199":1}}],["встретит",{"2":{"375":1}}],["встретить",{"2":{"176":1,"195":1,"213":1,"218":1,"265":1,"359":1}}],["встречал",{"2":{"473":1}}],["встречали",{"2":{"317":1}}],["встречающихся",{"2":{"401":1}}],["встречающиеся",{"2":{"134":1,"271":1}}],["встречаются",{"2":{"260":1,"271":1,"272":1}}],["встречается",{"2":{"174":1,"187":1,"188":1,"221":1,"265":1,"300":1}}],["встречавшейся",{"2":{"148":1}}],["всячески",{"2":{"495":1}}],["всяких",{"2":{"472":1}}],["вся",{"2":{"114":1,"136":1,"144":1,"313":1,"330":1,"375":1,"471":1,"503":1,"548":1}}],["всевозможных",{"2":{"473":1}}],["всей",{"2":{"137":1,"194":1,"202":1,"223":1,"247":2,"287":1,"308":1,"325":1,"331":1,"378":1,"556":1}}],["всеми",{"2":{"224":1,"227":1,"231":1,"311":1,"325":1,"359":1,"363":1,"394":1,"472":3}}],["всемирная",{"2":{"199":1}}],["всем",{"2":{"63":1,"117":2,"137":1,"247":1,"268":1,"277":1,"288":1,"344":1,"357":1,"402":1,"460":1,"464":1}}],["всему",{"2":{"41":1,"103":1,"203":1,"224":1,"256":1,"261":1,"267":1,"313":1,"358":1,"359":1,"363":1,"385":1,"423":1,"462":2}}],["всех",{"2":{"38":1,"51":1,"86":1,"117":1,"119":2,"122":1,"152":1,"218":1,"231":2,"243":1,"245":1,"287":1,"300":1,"302":1,"325":1,"328":1,"330":1,"336":1,"344":1,"357":1,"364":1,"375":1,"376":2,"386":1,"388":1,"397":2,"402":1,"431":1,"436":2,"450":1,"454":1,"463":2,"472":1,"499":1,"503":1}}],["все",{"2":{"36":1,"47":1,"59":1,"83":1,"95":1,"100":1,"102":1,"112":1,"116":1,"122":2,"125":1,"131":1,"133":1,"134":2,"135":1,"137":3,"144":2,"150":2,"152":1,"154":1,"156":1,"158":1,"167":1,"171":1,"178":1,"183":1,"185":1,"197":1,"199":3,"200":1,"201":1,"202":1,"203":2,"204":5,"207":1,"211":1,"212":1,"213":1,"218":2,"219":1,"222":3,"227":4,"229":1,"231":6,"232":3,"244":3,"246":1,"256":1,"257":1,"265":1,"269":1,"277":1,"287":1,"289":2,"297":1,"303":1,"308":2,"313":1,"319":1,"324":4,"331":4,"332":1,"336":3,"338":2,"339":1,"343":2,"344":1,"346":1,"351":2,"352":1,"356":1,"359":1,"363":1,"364":4,"366":1,"368":1,"372":1,"373":1,"375":1,"376":2,"377":1,"378":1,"379":1,"381":1,"390":4,"392":1,"393":1,"394":1,"396":2,"400":1,"423":1,"436":3,"440":1,"445":1,"446":1,"448":1,"460":1,"462":2,"463":1,"471":1,"472":1,"473":1,"513":1,"530":1,"543":1,"557":1}}],["всего",{"2":{"29":1,"34":1,"79":1,"82":1,"115":1,"116":1,"121":1,"134":1,"136":1,"137":1,"149":1,"159":2,"160":1,"167":1,"187":1,"206":1,"231":1,"238":1,"255":1,"256":1,"260":1,"267":2,"268":2,"270":2,"272":1,"322":1,"324":1,"336":1,"362":1,"374":1,"376":1,"435":1,"436":2,"443":1,"450":1,"460":2,"462":1,"473":1,"536":2}}],["всегда",{"0":{"122":1},"2":{"25":1,"122":1,"144":1,"181":2,"200":2,"203":1,"214":1,"218":1,"227":1,"230":1,"280":1,"329":1,"336":1,"367":1,"424":2,"429":1,"443":1,"448":1,"450":1,"462":1,"465":1,"515":1}}],["всём",{"2":{"462":1}}],["всё",{"2":{"2":1,"35":1,"40":1,"50":1,"59":1,"86":1,"95":1,"117":1,"145":1,"364":1,"433":1,"463":2,"464":1,"472":1,"473":1,"496":1,"503":1}}],["выезжает",{"2":{"546":1,"548":1}}],["выезжающий",{"2":{"33":1}}],["выучить",{"2":{"473":1}}],["выясним",{"2":{"444":1}}],["выявлении",{"2":{"472":1}}],["выявления",{"2":{"370":1,"372":1}}],["выявление",{"0":{"241":1}}],["выявить",{"2":{"238":1,"240":1,"263":1}}],["выложить",{"2":{"394":1}}],["вылиться",{"2":{"44":1}}],["выигрывает",{"2":{"263":1}}],["выигрыш",{"2":{"200":1,"449":1,"455":1}}],["вычисление",{"2":{"376":1,"377":1}}],["вычислений",{"2":{"308":1}}],["вычисления",{"2":{"301":1,"302":1,"374":1,"463":1,"464":1}}],["вычислять",{"2":{"301":1}}],["вычисляем",{"2":{"296":1}}],["вычисляемыми",{"2":{"358":1,"360":1}}],["вычисляемых",{"2":{"231":2,"256":1,"360":1}}],["вычисляемые",{"2":{"204":1,"231":1,"232":1,"359":2,"361":2}}],["вычисляемое",{"2":{"231":1}}],["вычислительных",{"2":{"436":1}}],["вычислительные",{"2":{"334":1}}],["вычислительноемкие",{"2":{"440":1}}],["вычислительной",{"2":{"301":1,"308":1,"434":1,"445":1}}],["вычислительном",{"2":{"208":1}}],["вычислительная",{"2":{"137":1,"331":1}}],["вытекает",{"2":{"295":1}}],["вытеснены",{"2":{"199":1}}],["выталкивая",{"2":{"171":1}}],["вытащить",{"2":{"59":1}}],["выгоде",{"2":{"472":1}}],["выгодно",{"2":{"382":1}}],["выгодные",{"2":{"191":1}}],["выгоды",{"2":{"336":1}}],["выглядело",{"2":{"450":1}}],["выглядел",{"2":{"255":1,"284":1,"379":1}}],["выглядела",{"2":{"228":1,"375":1}}],["выглядеть",{"2":{"14":1,"114":1,"170":2,"226":1,"229":1,"230":1,"238":2,"249":1,"285":1,"287":1,"288":1,"297":1,"311":1,"313":1,"317":1,"319":1,"324":1,"329":1,"346":1,"354":1,"355":1,"359":1,"383":1,"391":1,"437":1,"446":1,"451":1}}],["выглядящий",{"2":{"223":1}}],["выглядят",{"2":{"21":1,"134":2,"157":1,"457":1,"462":1,"511":1}}],["выглядит",{"2":{"97":1,"105":1,"108":1,"121":1,"204":1,"209":1,"255":1,"302":1,"331":1,"343":1,"367":1,"383":1,"384":1,"393":1,"462":1,"472":2}}],["выключен",{"2":{"162":1}}],["выключено",{"2":{"162":2}}],["выключенное",{"2":{"162":1}}],["выходе",{"2":{"504":1}}],["выходов",{"2":{"372":1}}],["выходом",{"2":{"162":1,"376":1}}],["выходных",{"2":{"372":1}}],["выходные",{"2":{"295":1,"386":1}}],["выходным",{"2":{"124":1}}],["выходят",{"2":{"267":1,"270":1}}],["выходящие",{"2":{"199":1}}],["выход",{"2":{"239":1}}],["выходы",{"2":{"204":1,"298":1,"373":1}}],["выходить",{"2":{"237":1,"240":1,"265":1}}],["выходит",{"2":{"181":1,"225":1,"237":1,"265":1,"268":1,"324":1,"328":1,"331":2,"345":1,"394":2}}],["выхода",{"2":{"178":1}}],["выровнены",{"2":{"153":1}}],["выражаю",{"2":{"405":1}}],["выраженных",{"2":{"325":1}}],["выражения",{"2":{"251":2}}],["выражение",{"2":{"211":1}}],["выражением",{"2":{"208":1}}],["вырастает",{"2":{"364":1}}],["выработайте",{"2":{"204":1}}],["выработаете",{"2":{"147":1}}],["выработки",{"2":{"200":1}}],["выравнивания",{"2":{"153":2}}],["выравниванию",{"2":{"153":1,"154":1}}],["выравнивание",{"2":{"153":2,"154":1}}],["выравниванием",{"0":{"153":1},"2":{"153":1}}],["выведет",{"2":{"302":1}}],["выведена",{"2":{"302":1}}],["выведено",{"2":{"302":3,"303":1}}],["выведены",{"2":{"155":1}}],["выведенных",{"2":{"117":1}}],["вывести",{"2":{"212":1,"334":1,"370":1}}],["выводимый",{"2":{"380":1}}],["выводим",{"2":{"256":1,"296":1}}],["выводится",{"2":{"249":1,"296":1}}],["выводит",{"2":{"182":1,"302":1,"303":1}}],["выводе",{"2":{"251":1,"316":1}}],["вывода",{"2":{"212":1,"302":1}}],["вывод",{"0":{"36":1,"93":1},"2":{"239":1,"373":1,"381":2,"433":1,"472":1}}],["выдаст",{"2":{"447":1}}],["выдать",{"2":{"381":1}}],["выдан",{"2":{"383":1}}],["выдана",{"2":{"331":1}}],["выданный",{"2":{"326":1}}],["выдавать",{"2":{"286":1,"376":1,"377":1}}],["выдает",{"2":{"246":1,"291":2,"376":1}}],["выдачи",{"2":{"4":1}}],["выделяет",{"2":{"463":1}}],["выделять",{"2":{"446":1}}],["выделяют",{"2":{"297":1}}],["выделяются",{"2":{"155":1}}],["выделена",{"2":{"376":1}}],["выделенная",{"2":{"331":1}}],["выделенные",{"2":{"231":1,"361":1}}],["выделенный",{"2":{"186":1,"436":1}}],["выделениями",{"2":{"319":1}}],["выделение",{"2":{"164":1}}],["выделении",{"2":{"163":1,"164":1}}],["выделим",{"2":{"98":1}}],["выделить",{"2":{"85":1,"114":1,"423":1}}],["выдвигающемся",{"2":{"99":1}}],["вышедшая",{"2":{"473":1}}],["вышеперечисленные",{"2":{"364":2}}],["вышеперечисленных",{"2":{"328":1}}],["вышеизложенными",{"2":{"231":1}}],["вышеуказанного",{"2":{"537":1}}],["вышеуказанной",{"2":{"528":1}}],["вышеуказанных",{"2":{"103":1}}],["вышеупомянутой",{"2":{"338":1}}],["вышеупомянутого",{"2":{"245":1}}],["вышеупомянутые",{"2":{"241":1}}],["вышеупомянутымипротоколами",{"2":{"143":1}}],["выше",{"2":{"79":1,"192":1,"326":1,"346":1,"363":1,"447":1,"472":1}}],["выйти",{"2":{"72":1}}],["выпуске",{"2":{"555":1}}],["выпуска",{"2":{"395":1}}],["выпущенного",{"2":{"395":1}}],["выписан",{"2":{"116":2}}],["выпадающих",{"2":{"179":1}}],["выпадающие",{"0":{"179":1},"2":{"179":1}}],["выпадающим",{"2":{"98":1}}],["выпадающее",{"2":{"170":1}}],["выпало",{"2":{"22":1}}],["выполним",{"2":{"226":1,"302":1}}],["выполнить",{"2":{"244":1,"255":1,"287":1,"296":1,"301":1,"303":1,"310":1,"325":1,"337":1,"350":1,"363":1,"374":2,"383":1,"445":1,"449":1,"464":1}}],["выполните",{"2":{"223":1,"310":1,"346":1,"379":1,"388":1,"389":2,"390":3,"393":3,"453":1}}],["выполнит",{"2":{"202":2}}],["выполнив",{"2":{"136":1,"231":1,"299":1,"383":1}}],["выполнено",{"2":{"232":1}}],["выполненные",{"2":{"229":1}}],["выполненных",{"2":{"229":1,"231":3,"376":1}}],["выполнена",{"2":{"163":1,"211":1,"229":1,"231":2,"301":1}}],["выполнении",{"2":{"303":1,"331":1,"336":1,"380":1,"383":1,"446":1}}],["выполнение",{"2":{"293":1,"294":1,"301":1,"302":2,"303":2,"328":1,"372":1,"376":2,"377":3,"436":1,"440":1,"441":1,"448":1}}],["выполнением",{"2":{"158":1,"168":1,"202":1}}],["выполнению",{"2":{"236":1}}],["выполнения",{"2":{"63":1,"144":1,"158":1,"166":1,"168":6,"201":1,"202":3,"211":1,"212":1,"222":1,"235":1,"241":1,"244":1,"249":1,"251":1,"256":1,"271":1,"293":2,"294":1,"297":2,"298":1,"302":1,"303":1,"316":1,"326":1,"331":1,"336":1,"343":1,"370":1,"373":2,"375":2,"376":1,"380":1,"383":1,"387":1,"390":2,"394":2,"396":1,"421":1,"436":4,"441":1,"446":1,"452":1,"455":1,"460":1}}],["выполняющиеся",{"2":{"436":1}}],["выполняющих",{"2":{"373":1}}],["выполняющимся",{"2":{"364":1}}],["выполняющий",{"2":{"265":2,"268":1}}],["выполняют",{"2":{"331":1,"373":1,"462":1,"463":1,"473":1}}],["выполняются",{"2":{"201":1,"301":2,"364":1,"372":1,"378":1,"380":1}}],["выполняемой",{"2":{"436":1}}],["выполняемых",{"2":{"372":1}}],["выполняемая",{"2":{"152":1}}],["выполняем",{"2":{"137":1,"292":1,"296":1,"363":1,"376":1,"444":1}}],["выполняется",{"2":{"115":1,"122":1,"168":1,"204":2,"209":1,"228":1,"244":1,"303":1,"316":1,"324":1,"344":1}}],["выполняет",{"2":{"63":1,"250":1,"291":1,"294":1,"297":2,"324":1,"351":1,"376":1,"436":1,"444":1,"449":1,"472":1}}],["выполняться",{"2":{"378":1,"382":1,"425":1,"436":2,"446":1,"449":1}}],["выполнять",{"2":{"59":1,"62":1,"140":1,"158":1,"208":1,"222":1,"252":1,"255":2,"265":1,"293":2,"302":2,"351":1,"392":1,"436":2,"440":1,"449":2,"508":1}}],["вынужден",{"2":{"190":1}}],["выносить",{"2":{"291":1}}],["вынос",{"2":{"83":1}}],["выносятся",{"2":{"41":1}}],["вынести",{"2":{"3":1,"105":1,"265":1}}],["высмеять",{"2":{"194":1}}],["высоту",{"2":{"173":1}}],["высоким",{"2":{"504":1}}],["высокий",{"2":{"77":1,"151":2}}],["высокая",{"2":{"308":1,"504":1}}],["высокой",{"2":{"199":1,"434":1}}],["высокого",{"2":{"74":1,"261":1,"373":1}}],["высокоуровневыми",{"2":{"39":1}}],["выступать",{"2":{"277":1,"366":1}}],["выступает",{"2":{"249":1,"440":1}}],["выстроить",{"2":{"288":1,"303":1}}],["выстроив",{"2":{"159":1}}],["выстраиваем",{"2":{"303":1}}],["выстраиваемой",{"2":{"40":1}}],["выстраивать",{"2":{"302":1}}],["выстраивания",{"2":{"151":1}}],["выставочную",{"2":{"71":1}}],["вызван",{"2":{"297":1}}],["вызвало",{"2":{"204":1}}],["вызвать",{"2":{"34":1,"115":1,"167":1,"195":2,"296":1,"343":1}}],["вызывая",{"2":{"256":1}}],["вызываем",{"2":{"201":1,"294":3,"316":1,"381":1}}],["вызывается",{"2":{"356":1}}],["вызывает",{"2":{"3":1,"158":1,"193":1,"211":1,"240":1}}],["вызывающих",{"2":{"256":1}}],["вызывающим",{"2":{"173":1}}],["вызывающего",{"2":{"170":1}}],["вызываются",{"2":{"267":1}}],["вызывают",{"2":{"147":1,"391":1}}],["вызывать",{"2":{"152":1,"168":1,"228":1,"237":1,"239":1,"240":1,"281":1,"313":1,"394":1,"442":1}}],["вызываться",{"2":{"115":1}}],["вызову",{"2":{"303":2}}],["вызове",{"2":{"302":1,"450":1}}],["вызовет",{"2":{"118":1,"171":1,"231":2,"319":1,"327":1}}],["вызовом",{"2":{"285":1,"303":1}}],["вызовов",{"2":{"114":1,"288":1,"302":1,"303":1,"344":1,"373":1,"449":1,"450":1}}],["вызовами",{"2":{"303":1,"449":1}}],["вызовах",{"2":{"281":1}}],["вызова",{"2":{"245":1,"297":2,"301":5,"302":2,"303":4,"438":1,"454":1}}],["вызов",{"0":{"301":1},"1":{"302":1},"2":{"41":1,"201":1,"295":1,"297":1,"301":3,"303":3,"324":1,"366":1,"449":2,"511":1}}],["вызовы",{"2":{"41":1,"260":1,"277":1,"297":1,"298":1,"303":1,"308":1,"344":1,"378":1,"440":1,"449":1,"454":2,"511":1,"512":1}}],["вы",{"2":{"26":2,"62":1,"123":2,"125":2,"134":2,"143":2,"147":2,"152":3,"154":3,"158":2,"162":1,"175":1,"181":4,"184":1,"186":1,"198":2,"199":1,"200":7,"201":1,"202":2,"203":4,"204":3,"213":1,"218":3,"220":3,"222":1,"223":9,"224":5,"225":2,"227":1,"231":1,"234":1,"247":1,"259":1,"260":1,"263":1,"265":2,"266":1,"267":5,"268":2,"270":5,"271":1,"280":1,"286":1,"287":3,"295":3,"297":1,"300":3,"302":1,"305":2,"306":1,"310":2,"311":1,"316":1,"317":1,"319":2,"323":1,"330":1,"334":1,"336":3,"342":2,"349":2,"350":2,"364":1,"367":1,"369":1,"376":5,"386":1,"387":1,"389":1,"390":4,"391":2,"392":1,"393":2,"394":2,"395":1,"397":1,"400":1,"401":1,"402":1,"409":1,"422":2,"424":3,"425":1,"429":1,"431":1,"432":1,"434":1,"436":7,"439":1,"445":1,"447":1,"462":4,"466":1,"468":1,"473":1,"495":1}}],["выброшенной",{"2":{"377":1}}],["выбрасывать",{"2":{"376":1}}],["выбрасывает",{"2":{"303":1}}],["выбрасываем",{"2":{"287":1}}],["выбрав",{"2":{"375":1}}],["выбрано",{"2":{"336":1}}],["выбранная",{"2":{"557":1}}],["выбранными",{"2":{"501":1}}],["выбранных",{"2":{"223":1}}],["выбранные",{"2":{"191":1}}],["выбранного",{"2":{"143":1,"313":1,"331":1,"452":1}}],["выбранному",{"2":{"134":1}}],["выбранной",{"2":{"11":1,"31":1}}],["выбрали",{"2":{"310":1}}],["выбрал",{"2":{"187":1}}],["выбрать",{"2":{"134":1,"162":2,"190":1,"191":1,"223":1,"317":1,"363":1,"375":1,"433":1,"451":1,"452":1,"501":1,"514":1,"549":1}}],["выбирает",{"2":{"201":1}}],["выбираешь",{"2":{"89":1}}],["выбирая",{"2":{"200":2}}],["выбирать",{"2":{"190":1}}],["выберите",{"2":{"144":2,"223":3,"346":2,"387":1,"527":2}}],["выбором",{"2":{"344":1}}],["выбору",{"2":{"123":1,"223":1,"421":1}}],["выбор",{"0":{"37":1,"39":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"39":1,"63":1,"137":1,"157":1,"161":1,"289":1,"452":1,"511":1}}],["выборе",{"2":{"22":1,"39":1,"164":2,"177":1,"192":1,"222":1,"311":1,"317":3,"473":1}}],["выборка",{"2":{"13":1,"317":1}}],["выбора",{"2":{"4":1,"163":1,"176":1,"178":1,"179":2,"506":1,"508":1}}],["визитку",{"2":{"507":1}}],["визитной",{"2":{"408":1}}],["визуализацию",{"2":{"462":1,"463":1}}],["визуализация",{"2":{"330":1}}],["визуализации",{"2":{"163":1,"471":1}}],["визуальные",{"2":{"394":1}}],["визуальный",{"2":{"149":1,"298":1}}],["визуальным",{"2":{"149":1}}],["визуальных",{"2":{"149":1,"150":1,"151":1,"152":2,"463":1}}],["визуальной",{"2":{"496":1}}],["визуальное",{"2":{"298":1,"329":1}}],["визуально",{"2":{"11":1,"178":1,"247":1,"354":1}}],["визуального",{"2":{"3":1,"25":1,"149":1,"152":1,"259":1,"410":1}}],["википедии",{"2":{"156":1,"157":1,"158":1,"269":1}}],["виртуальных",{"2":{"138":1}}],["виртуальный",{"2":{"115":1,"422":1,"473":1}}],["виртуального",{"2":{"140":1}}],["виртуальном",{"2":{"137":1,"146":1}}],["виртуальное",{"2":{"48":1}}],["виртуальная",{"2":{"137":1}}],["витрины",{"2":{"39":1,"76":1,"508":1}}],["витрину",{"2":{"22":1,"71":1,"72":1}}],["витрина",{"0":{"11":1},"2":{"9":1,"12":1,"59":1,"70":1,"79":1,"545":1}}],["видов",{"2":{"514":1,"549":1}}],["виды",{"2":{"372":1,"373":1}}],["видны",{"2":{"330":1}}],["видно",{"2":{"83":1,"116":1,"168":1,"181":1,"186":1,"289":1,"291":1,"299":1,"302":1,"311":1,"317":1,"330":1,"354":1,"357":1,"436":1}}],["видимые",{"2":{"436":1}}],["видимое",{"2":{"436":1}}],["видимости",{"2":{"315":1,"331":1,"344":2}}],["видимостью",{"2":{"255":1}}],["видимость",{"2":{"239":1}}],["видимой",{"2":{"183":1,"431":1}}],["видим",{"2":{"183":1,"228":1,"246":1,"271":1,"296":1,"318":1,"342":1,"344":1,"385":1,"449":1}}],["видит",{"2":{"116":1}}],["видите",{"2":{"26":1,"178":1,"244":1,"245":1,"247":1,"249":1,"255":1,"268":1,"284":1,"289":1,"295":1,"300":1,"302":1,"303":1,"308":1,"316":1,"324":1,"325":1,"328":1,"341":1,"343":1}}],["виджеты",{"2":{"161":1}}],["виджетов",{"2":{"26":1,"462":1}}],["виду",{"2":{"151":1,"154":1,"178":1,"181":1,"207":1,"271":1,"323":1,"324":1}}],["видели",{"2":{"154":1,"211":1,"248":1,"300":2,"351":1,"353":1,"441":1}}],["виден",{"2":{"153":1,"231":1,"546":1}}],["видение",{"2":{"62":1}}],["видеть",{"2":{"150":1,"181":1,"286":1}}],["видеоролики",{"2":{"405":1}}],["видеоигры",{"2":{"173":1}}],["видео",{"2":{"148":1,"178":1,"222":1,"236":1,"307":1,"335":1,"350":1,"371":1,"429":1,"435":1,"472":1,"473":4}}],["виде",{"2":{"17":1,"70":1,"85":1,"102":1,"115":2,"164":1,"177":1,"182":1,"183":1,"199":1,"200":2,"203":1,"223":1,"241":1,"245":2,"247":1,"252":1,"256":1,"266":1,"271":1,"282":1,"296":1,"308":1,"311":1,"323":1,"324":1,"351":1,"360":1,"379":1,"383":2,"440":1,"447":1,"448":2,"452":1,"454":2,"460":1}}],["вид",{"2":{"5":1,"18":1,"199":1,"226":1,"263":1,"298":1,"315":1,"330":1,"336":1,"354":1,"436":1}}],["вида",{"2":{"3":1,"4":1,"199":1,"225":1,"297":1,"373":1,"374":1,"378":1}}],["воды",{"2":{"473":1}}],["водителем",{"2":{"473":2}}],["вождению",{"2":{"473":1}}],["вождения",{"2":{"473":3}}],["вовлеченности",{"2":{"385":1}}],["вовсе",{"2":{"263":1}}],["воркер",{"2":{"496":1}}],["воркером",{"2":{"445":1}}],["воркеры",{"2":{"344":1}}],["воровство",{"2":{"26":1}}],["воровством",{"2":{"26":1}}],["военно",{"2":{"269":1}}],["военного",{"2":{"134":1}}],["воплотить",{"2":{"237":1}}],["вопросом",{"2":{"461":1}}],["вопросов",{"2":{"198":1,"224":1,"325":1,"453":1,"473":1,"497":1}}],["вопросительный",{"2":{"391":1}}],["вопроса",{"2":{"241":1,"373":1}}],["вопросах",{"2":{"225":1,"306":1,"497":1}}],["вопросами",{"2":{"220":1}}],["вопросе",{"2":{"174":1,"473":1}}],["вопросу",{"2":{"134":1,"276":1}}],["вопрос",{"2":{"4":2,"186":1,"194":1,"200":2,"238":1,"239":1,"240":1,"241":1,"251":1,"372":1,"383":2,"473":1,"495":1}}],["вопросы",{"0":{"146":1,"186":1,"198":1,"220":1,"234":1,"259":1,"305":1,"333":1,"348":1,"369":1,"397":1,"456":1},"2":{"4":1,"73":1,"131":1,"150":1,"177":1,"220":1,"237":2,"259":1,"333":1,"348":1,"369":1,"497":1}}],["войдите",{"2":{"223":1}}],["волнуйтесь",{"2":{"202":1}}],["волшебству",{"2":{"300":1}}],["волшебства",{"2":{"200":1}}],["волшебство",{"2":{"171":1,"255":1}}],["воссоздающих",{"2":{"446":1}}],["восстановления",{"2":{"330":1,"331":1}}],["восстановлено",{"2":{"212":1}}],["восклицательных",{"2":{"299":1}}],["восемь",{"0":{"158":1},"2":{"158":1}}],["восьми",{"2":{"134":1}}],["воспользуйтесь",{"2":{"527":1}}],["воспользуемся",{"2":{"441":1}}],["воспользоваться",{"2":{"16":1,"220":1,"264":1,"325":1,"384":1,"433":1,"472":1}}],["воспринимается",{"2":{"354":1}}],["воспринимаются",{"2":{"336":1}}],["воспринимайте",{"2":{"200":1}}],["восприятия",{"2":{"303":1,"304":1,"436":1}}],["восприятие",{"2":{"149":1,"159":1,"556":1}}],["восприятии",{"2":{"62":1}}],["воспроизведенные",{"2":{"185":1}}],["вокруг",{"2":{"114":1,"381":1,"462":1}}],["вот",{"2":{"14":1,"16":1,"71":1,"117":1,"118":1,"120":1,"121":2,"123":2,"140":1,"154":1,"158":1,"162":1,"164":1,"166":1,"167":1,"168":2,"170":2,"174":1,"175":1,"176":2,"177":1,"181":1,"186":1,"187":1,"188":1,"194":1,"195":1,"203":1,"204":2,"209":1,"210":1,"222":1,"227":1,"231":1,"232":1,"244":1,"245":2,"249":1,"251":1,"255":1,"272":1,"278":1,"281":1,"285":1,"288":1,"291":1,"293":1,"296":1,"297":1,"300":1,"303":2,"316":1,"317":1,"322":1,"330":1,"331":1,"338":1,"363":1,"367":1,"376":1,"433":1,"436":1,"442":1,"444":1,"457":1,"462":2,"464":1,"473":1,"537":1,"539":1}}],["возлагает",{"2":{"372":1}}],["вознаграждения",{"2":{"331":1}}],["возникшая",{"2":{"381":1}}],["возникла",{"2":{"376":1}}],["возникли",{"2":{"71":1}}],["возникновения",{"2":{"376":1}}],["возникновении",{"2":{"158":1,"377":1,"437":1}}],["возникнет",{"2":{"376":1}}],["возникнуть",{"2":{"117":1,"164":1,"186":1,"251":1,"436":1,"507":1}}],["возникающими",{"2":{"322":1}}],["возникают",{"2":{"62":1}}],["возникает",{"2":{"152":1,"200":1,"246":1,"323":1,"372":1,"385":1}}],["воздействия",{"2":{"300":1}}],["возврат",{"2":{"344":1}}],["возврата",{"2":{"293":1,"301":1,"303":2}}],["возвращайтесь",{"2":{"473":1}}],["возвращают",{"2":{"373":1}}],["возвращающая",{"2":{"360":1,"460":1}}],["возвращающие",{"2":{"303":1}}],["возвращающей",{"2":{"122":1,"204":1,"245":1}}],["возвращающую",{"2":{"122":1,"244":2,"511":1}}],["возвращаемый",{"2":{"381":1}}],["возвращаемся",{"2":{"344":1}}],["возвращаем",{"2":{"250":1,"281":1,"288":2,"296":1,"303":1,"358":1,"366":2}}],["возвращаемое",{"2":{"210":1,"296":1}}],["возвращается",{"2":{"182":1,"322":1,"324":1,"429":1}}],["возвращает",{"2":{"115":1,"116":2,"123":2,"201":2,"204":1,"244":1,"245":1,"250":1,"255":1,"290":1,"293":1,"303":2,"316":1,"322":4,"323":1,"366":1,"377":1,"443":1,"445":1,"448":1}}],["возвращать",{"2":{"182":1,"254":1,"308":1,"377":1,"444":1}}],["возвращаться",{"2":{"170":1,"304":1}}],["возвращения",{"2":{"41":1}}],["возрасти",{"2":{"200":1}}],["возрастающей",{"2":{"181":1}}],["возьмет",{"2":{"143":1,"201":1}}],["возьмем",{"2":{"12":1,"200":1,"229":1,"238":1,"267":1,"282":1,"309":1,"374":1}}],["возможную",{"2":{"330":1}}],["возможна",{"2":{"243":1,"557":1}}],["возможны",{"2":{"245":1}}],["возможными",{"2":{"365":1}}],["возможным",{"2":{"181":1,"308":2,"462":1}}],["возможные",{"2":{"144":1}}],["возможных",{"2":{"56":1,"142":1,"241":1,"247":1,"256":1,"313":1,"372":1,"376":1,"436":1}}],["возможное",{"2":{"329":1}}],["возможной",{"2":{"305":1}}],["возможного",{"2":{"144":1}}],["возможностях",{"2":{"373":1,"472":1}}],["возможностям",{"2":{"161":1,"364":1}}],["возможностями",{"2":{"131":2,"363":1,"394":1}}],["возможности",{"0":{"469":1},"2":{"162":1,"187":1,"199":3,"224":1,"232":2,"242":1,"245":1,"248":1,"249":1,"252":1,"257":1,"258":1,"265":1,"323":1,"331":1,"343":1,"364":1,"373":1,"384":2,"386":1,"421":1,"432":1,"436":1,"446":1,"460":1,"463":1,"508":2}}],["возможностей",{"0":{"123":1},"2":{"154":1,"199":1,"225":1,"282":1,"303":1,"319":1,"323":1,"373":1,"433":1,"457":1,"460":2,"472":1,"536":1}}],["возможностью",{"2":{"12":1,"85":1,"115":1,"384":1,"422":1,"431":1,"506":1,"508":3,"543":1}}],["возможность",{"2":{"2":1,"11":2,"12":1,"17":1,"39":1,"74":1,"103":1,"105":1,"115":3,"116":2,"124":1,"134":2,"159":1,"167":1,"173":1,"176":1,"187":1,"200":1,"204":1,"225":2,"228":1,"241":1,"261":1,"268":1,"308":1,"310":1,"311":1,"325":1,"330":1,"336":1,"343":1,"344":1,"354":1,"365":1,"425":1,"454":1,"461":1,"463":1,"465":1,"508":2,"545":1}}],["возможно",{"2":{"40":1,"48":1,"59":1,"104":1,"108":1,"115":1,"181":1,"204":1,"220":1,"234":1,"247":1,"277":1,"300":1,"317":1,"356":1,"376":1,"383":1,"393":1,"421":1,"423":1,"462":1,"463":3,"501":1}}],["возможен",{"2":{"16":1}}],["во",{"0":{"462":1},"2":{"3":1,"17":1,"112":1,"116":2,"122":1,"147":1,"157":2,"166":1,"176":1,"179":1,"185":1,"187":1,"193":1,"201":3,"202":1,"204":1,"212":1,"218":1,"224":1,"226":1,"227":1,"230":1,"239":1,"244":2,"247":1,"249":2,"250":1,"260":1,"265":1,"268":1,"277":1,"287":1,"288":1,"295":1,"297":1,"298":1,"302":1,"303":1,"313":2,"316":1,"319":1,"325":1,"329":1,"370":1,"372":2,"376":2,"390":1,"394":1,"397":1,"433":2,"434":1,"436":1,"440":1,"460":5,"461":1,"462":7,"463":3,"471":1,"472":1,"473":2,"542":1}}],["вообще",{"2":{"3":1,"35":1,"105":1,"189":1,"344":1,"429":1,"431":1,"433":2,"472":1}}],["в",{"0":{"42":1,"124":1,"126":1,"127":1,"133":1,"187":1,"201":1,"205":1,"213":1,"242":1,"387":1,"388":1,"389":1,"405":1,"406":1,"436":1,"446":1,"495":1,"499":1,"518":1,"528":1,"540":1,"544":1,"545":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"134":1,"202":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"214":1,"215":1,"216":1,"217":1,"218":1,"243":1,"244":1,"245":1,"246":1,"247":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1,"437":1,"438":1,"439":1,"447":1,"448":1,"449":1,"450":1,"451":1,"452":1},"2":{"2":1,"3":4,"4":1,"5":1,"6":1,"7":1,"9":2,"10":1,"11":3,"12":4,"13":2,"14":1,"16":6,"17":9,"18":1,"22":7,"23":7,"25":4,"26":1,"27":1,"29":6,"30":1,"31":1,"32":1,"33":2,"34":3,"39":2,"40":1,"41":7,"43":2,"44":3,"47":7,"48":4,"50":1,"51":2,"58":1,"59":5,"62":4,"63":5,"64":2,"68":1,"70":1,"71":1,"73":3,"74":1,"76":2,"82":2,"83":6,"85":5,"86":9,"87":1,"89":1,"90":1,"91":1,"92":1,"95":11,"96":1,"97":3,"98":2,"99":2,"100":2,"102":7,"103":3,"104":5,"105":6,"106":1,"108":2,"109":2,"112":7,"114":5,"115":9,"116":20,"117":8,"118":1,"119":8,"120":5,"121":5,"122":7,"123":5,"124":7,"125":4,"126":5,"127":9,"128":3,"129":1,"131":4,"132":3,"133":2,"134":20,"135":11,"136":8,"137":9,"138":3,"139":2,"140":6,"141":8,"142":1,"143":5,"144":8,"145":5,"146":4,"147":5,"148":6,"149":7,"150":7,"151":5,"152":3,"153":1,"154":7,"155":3,"156":9,"157":5,"158":7,"159":3,"160":2,"161":4,"162":7,"163":8,"164":8,"165":6,"166":6,"167":4,"168":10,"169":1,"170":6,"171":14,"173":8,"174":7,"175":2,"176":5,"177":4,"178":6,"181":9,"182":5,"183":9,"185":2,"186":1,"187":7,"188":3,"189":5,"190":2,"191":2,"192":2,"193":1,"194":2,"195":1,"196":2,"197":3,"198":2,"199":13,"200":34,"201":13,"202":12,"203":13,"204":37,"205":4,"206":1,"207":1,"208":6,"209":4,"210":5,"211":6,"212":12,"213":3,"214":1,"215":1,"216":1,"217":1,"218":5,"219":2,"220":3,"221":8,"222":13,"223":27,"224":32,"225":26,"226":7,"227":17,"228":10,"229":13,"230":10,"231":40,"232":12,"233":3,"234":1,"235":9,"236":2,"237":1,"238":5,"239":5,"240":6,"241":6,"242":2,"243":7,"244":13,"245":14,"246":9,"247":16,"249":16,"250":14,"251":6,"252":4,"253":3,"254":1,"255":31,"256":23,"258":4,"259":2,"260":4,"261":2,"262":4,"263":8,"264":3,"265":9,"266":6,"267":13,"268":17,"269":5,"270":6,"271":12,"272":4,"276":5,"277":2,"278":1,"279":4,"280":3,"281":6,"282":3,"283":2,"284":3,"285":1,"286":4,"287":10,"288":5,"289":9,"290":2,"291":4,"292":13,"293":5,"294":14,"295":6,"296":14,"297":21,"298":5,"299":5,"300":13,"301":7,"302":6,"303":20,"304":5,"305":1,"306":4,"307":1,"308":19,"309":2,"310":13,"311":5,"312":2,"313":22,"315":5,"316":28,"317":6,"318":7,"319":17,"320":1,"322":16,"323":11,"324":16,"325":22,"326":1,"327":6,"328":11,"329":18,"330":13,"331":19,"332":5,"333":4,"334":5,"335":3,"336":15,"337":1,"338":8,"339":5,"340":3,"341":2,"342":4,"343":20,"344":18,"345":11,"346":8,"347":6,"348":3,"349":5,"350":6,"351":4,"352":4,"353":7,"354":5,"355":1,"356":11,"357":6,"358":4,"359":7,"360":8,"361":7,"362":3,"363":12,"364":24,"365":8,"366":10,"367":6,"368":2,"369":3,"370":10,"371":2,"372":13,"373":6,"374":10,"375":15,"376":18,"377":5,"378":5,"379":5,"380":13,"381":28,"382":13,"383":13,"384":4,"385":9,"386":8,"387":1,"388":6,"389":5,"390":11,"391":9,"392":2,"393":12,"394":9,"395":6,"396":5,"397":3,"400":1,"402":4,"403":1,"405":2,"407":1,"408":1,"409":3,"411":1,"412":1,"413":2,"414":3,"415":2,"416":1,"417":1,"418":1,"419":2,"421":15,"422":3,"423":7,"424":3,"425":4,"429":15,"431":2,"432":14,"433":13,"434":7,"435":2,"436":24,"437":5,"438":6,"439":4,"440":13,"441":2,"442":6,"443":14,"444":8,"445":4,"446":7,"447":11,"448":14,"449":17,"450":7,"451":1,"452":10,"453":1,"454":12,"455":3,"456":2,"457":2,"460":17,"461":5,"462":39,"463":16,"464":5,"465":2,"471":11,"472":22,"473":11,"482":1,"497":3,"498":1,"501":1,"502":1,"503":1,"504":7,"507":5,"508":1,"509":4,"511":4,"512":1,"513":1,"518":2,"519":1,"527":6,"528":2,"532":1,"533":1,"536":4,"537":1,"538":3,"539":3,"542":2,"545":1,"546":4,"548":4,"553":1,"554":2,"555":2,"556":2,"557":4}}],["рисованиями",{"2":{"436":1}}],["рисуйте",{"2":{"470":1}}],["рисует",{"2":{"290":1,"436":1}}],["рисунки",{"2":{"182":1}}],["рисунка",{"2":{"153":1,"181":2,"291":1}}],["рисунке",{"2":{"134":1,"156":1,"170":1,"171":1,"182":1,"256":1,"311":1,"324":1,"351":1}}],["рисунок",{"2":{"134":1,"144":1,"151":1,"152":1,"153":1,"154":1,"162":2,"163":1,"164":2,"166":1,"167":2,"168":2,"170":3,"175":1,"176":1,"177":1,"178":2,"181":1,"182":2,"183":1,"186":1,"187":1,"194":1,"195":1,"202":1,"223":2,"224":1,"226":1,"227":1,"229":1,"238":2,"239":1,"240":1,"247":1,"249":1,"254":1,"256":2,"263":1,"265":1,"291":2,"293":1,"295":1,"297":1,"300":1,"311":2,"317":1,"319":1,"324":1,"325":1,"329":1,"330":1,"342":1,"343":4,"344":1,"346":2,"351":1,"354":1,"357":1,"359":1,"367":2,"374":2,"383":3,"384":1,"387":1,"390":1,"391":2,"393":1,"436":3,"440":1,"442":1,"445":1,"446":1,"451":1}}],["риски",{"2":{"267":1}}],["рывка",{"2":{"200":1}}],["рынке",{"2":{"147":1}}],["рынка",{"0":{"20":1},"1":{"21":1,"22":1},"2":{"39":1,"125":1}}],["ряду",{"2":{"372":1,"376":1}}],["ряда",{"2":{"202":1,"297":1,"301":1}}],["рядами",{"2":{"108":1}}],["ряде",{"2":{"155":1}}],["ряд",{"2":{"144":1,"170":1,"176":1,"204":2,"244":1,"250":1,"324":1,"336":1,"346":1,"363":1,"377":1}}],["рядом",{"2":{"139":1,"154":1,"156":1,"176":1,"231":1,"267":1,"303":1,"336":2,"343":1,"349":1,"375":2,"382":1}}],["рядового",{"2":{"102":1}}],["родился",{"2":{"472":1}}],["родители",{"2":{"351":1}}],["родителей",{"2":{"318":2}}],["родителем",{"2":{"255":1}}],["родителю",{"2":{"245":1,"249":1,"319":1,"353":1}}],["родительским",{"2":{"249":1,"254":1,"351":1,"436":1}}],["родительскими",{"2":{"246":1}}],["родительские",{"2":{"247":1}}],["родительский",{"2":{"240":2,"247":1,"249":5,"256":1,"265":1,"288":1,"351":5,"367":1,"436":2,"440":1,"441":1,"448":1}}],["родительской",{"2":{"246":1,"352":1}}],["родительском",{"2":{"245":2,"247":3,"249":3,"318":1,"440":1,"449":1}}],["родительскому",{"2":{"204":1,"245":1,"249":1,"438":1,"444":1}}],["родительского",{"2":{"203":1,"204":1,"246":5,"255":1,"319":2,"436":1,"437":2}}],["родитель",{"2":{"239":1,"240":1,"246":2,"353":1,"442":2}}],["родителями",{"2":{"349":1}}],["родителя",{"2":{"239":1,"316":1,"351":3,"353":1}}],["родственными",{"2":{"369":1}}],["родного",{"2":{"439":1}}],["родное",{"2":{"166":1,"336":1}}],["родными",{"2":{"336":1,"347":1}}],["рода",{"2":{"176":1,"186":1,"296":1,"351":1}}],["робот",{"2":{"144":1}}],["ростом",{"2":{"386":1}}],["роста",{"2":{"204":1,"370":1,"467":1}}],["рост",{"2":{"130":1}}],["росте",{"2":{"97":1}}],["роли",{"2":{"366":1,"463":1}}],["ролям",{"2":{"116":1}}],["ролью",{"2":{"116":1}}],["роль",{"2":{"63":1,"149":1,"444":1,"462":1,"463":1,"473":1,"508":1}}],["роутами",{"2":{"425":1}}],["роутера",{"2":{"135":1,"309":1,"315":1}}],["роутере",{"0":{"127":1},"2":{"136":1}}],["роутер",{"0":{"309":1},"1":{"310":1,"311":1,"312":1,"313":1,"314":1,"315":1,"316":1,"317":1,"318":1,"319":1,"320":1,"321":1,"322":1},"2":{"119":1,"135":1,"310":1,"315":1}}],["роуты",{"2":{"97":1}}],["роутинг",{"2":{"7":1}}],["русском",{"2":{"473":2}}],["русский",{"0":{"399":1},"2":{"473":1}}],["рутинного",{"2":{"463":1}}],["рутовский",{"2":{"58":1}}],["рука",{"2":{"433":1}}],["руководящие",{"2":{"260":1}}],["руководствуясь",{"2":{"222":1}}],["руководству",{"2":{"200":1}}],["руководствами",{"2":{"147":1}}],["руководство",{"2":{"63":1,"67":1,"123":1,"147":1,"363":1,"418":1}}],["рублей",{"2":{"422":1}}],["ручная",{"2":{"344":1}}],["ручную",{"2":{"336":1}}],["ручном",{"2":{"421":1,"433":1}}],["ручной",{"2":{"344":1}}],["ручного",{"2":{"144":1,"397":1,"501":1}}],["ручное",{"2":{"66":1,"372":1}}],["рефы",{"2":{"462":2}}],["рефакторите",{"2":{"270":1}}],["рефакторить",{"2":{"22":1}}],["рефакторинга",{"2":{"372":1,"376":1,"385":1}}],["рефакторингуйте",{"2":{"372":1}}],["рефакторинг",{"0":{"100":1,"467":1},"2":{"258":1,"467":1}}],["репликацию",{"2":{"446":1}}],["репозиторием",{"2":{"386":1,"394":6}}],["репозиториев",{"2":{"370":1,"386":1}}],["репозиториями",{"0":{"394":1},"2":{"396":1}}],["репозиториях",{"2":{"225":1}}],["репозитория",{"0":{"503":1},"2":{"143":1,"256":1,"316":1,"335":1,"386":1,"390":1,"394":1,"421":4,"442":1,"527":2,"528":1}}],["репозитории",{"2":{"73":1,"143":1,"148":1,"162":1,"231":1,"235":1,"255":1,"316":1,"322":1,"335":1,"343":1,"350":1,"367":1,"371":1,"374":1,"394":2,"395":1,"419":1,"435":1,"527":1}}],["репозиторий",{"0":{"80":1,"111":1},"2":{"70":1,"80":1,"87":1,"100":1,"106":1,"111":1,"132":1,"362":1,"386":1,"388":1,"390":2,"393":1,"394":5,"395":1,"423":1,"433":1,"527":1}}],["ребенок",{"2":{"351":1,"352":1}}],["ребенку",{"2":{"351":1}}],["ребенка",{"2":{"330":1}}],["рендер",{"2":{"249":1}}],["рендерится",{"2":{"248":1}}],["рендеринга",{"2":{"301":1,"313":1,"315":1,"364":1,"436":4}}],["рендеринг",{"2":{"249":1,"322":1,"436":3}}],["рендерингу",{"2":{"212":1}}],["рендеринге",{"2":{"206":1,"436":1}}],["реорганизация",{"2":{"228":1}}],["редакция",{"2":{"393":1}}],["редактировать",{"2":{"392":1,"393":1}}],["редактирование",{"2":{"239":2,"240":1}}],["редактирования",{"2":{"232":1,"256":1}}],["редактируемых",{"2":{"256":1}}],["редактируем",{"2":{"227":1}}],["редакторы",{"2":{"308":1}}],["редактор",{"2":{"222":2,"387":1,"433":1}}],["редакторе",{"2":{"164":1,"433":1}}],["редких",{"2":{"266":1}}],["редкая",{"2":{"251":1}}],["редко",{"2":{"116":1,"244":2,"265":1,"281":1,"364":1}}],["речевого",{"2":{"164":1}}],["речь",{"2":{"10":1,"158":1,"336":1,"373":1,"385":1}}],["резюме",{"2":{"473":1}}],["резервировать",{"2":{"267":1}}],["резервировании",{"2":{"145":1}}],["резервируем",{"2":{"255":1}}],["результирующее",{"2":{"200":1}}],["результатом",{"2":{"256":1,"331":1,"376":1}}],["результатов",{"2":{"231":1,"257":1}}],["результаты",{"2":{"130":1,"182":1,"185":1,"223":1,"241":1,"359":1,"391":2,"436":1}}],["результате",{"2":{"116":1,"144":1,"156":1,"166":1,"171":1,"190":1,"238":1,"297":1,"311":1,"325":2,"336":1,"381":1,"382":1,"383":1,"454":1,"507":1}}],["результат",{"2":{"115":1,"156":1,"159":1,"182":1,"204":1,"223":1,"229":1,"303":1,"323":1,"324":2,"381":1,"444":1,"445":1,"447":1,"448":1,"502":1}}],["результата",{"2":{"62":1,"251":1,"302":2,"311":1,"327":1,"443":1,"448":1}}],["рейтинг",{"2":{"109":1,"346":2}}],["рейтинги",{"2":{"79":1}}],["реагирования",{"2":{"344":1}}],["реагировать",{"2":{"316":1,"354":1,"356":1,"441":1}}],["реакции",{"2":{"123":1}}],["реактивную",{"2":{"199":1,"204":2,"231":2,"250":3,"351":2,"352":2,"356":1,"358":3,"446":1,"462":1,"463":1}}],["реактивная",{"2":{"123":1,"204":1,"206":2,"255":1,"256":2,"358":1,"460":1,"463":1}}],["реактивные",{"2":{"128":1,"201":1,"204":2,"215":1,"231":2,"242":1,"247":1,"250":1,"256":1,"316":1,"358":1,"359":1,"361":3,"452":1,"460":1,"462":3,"463":2}}],["реактивный",{"2":{"123":1,"231":1,"351":1,"357":2,"359":1,"360":1,"363":1,"365":1,"367":1,"462":2,"463":2}}],["реактивных",{"0":{"123":1},"2":{"123":2,"204":1,"231":1,"343":1,"359":1,"363":1,"400":1,"447":1,"460":1,"463":1}}],["реактивным",{"2":{"122":1,"123":1,"204":2,"357":1,"365":1}}],["реактивными",{"2":{"103":1,"122":1,"123":2,"204":1,"229":1,"295":1,"361":1,"364":1,"447":1}}],["реактивно",{"2":{"317":1,"359":1}}],["реактивного",{"0":{"357":1,"359":1},"1":{"358":1,"360":1,"361":1,"362":1,"363":1},"2":{"250":1,"291":1,"349":1,"356":1,"366":1,"367":1,"368":1,"508":1}}],["реактивное",{"2":{"239":1,"254":1,"255":1,"359":1,"366":1,"447":1}}],["реактивному",{"2":{"249":1}}],["реактивном",{"2":{"200":2,"255":1,"359":1,"463":1}}],["реактивностью",{"2":{"349":1,"447":1,"463":2}}],["реактивность",{"2":{"200":1,"223":1,"240":1,"252":1,"256":1,"296":2,"297":1,"305":1,"351":2,"356":1,"463":2}}],["реактивности",{"2":{"119":1,"123":1,"125":1,"199":1,"295":2,"296":1,"357":1,"463":2,"536":1}}],["реактивной",{"2":{"102":1,"123":1,"171":2,"204":1,"206":1,"313":1,"360":1}}],["реально",{"2":{"361":1,"465":1}}],["реальности",{"2":{"271":1,"330":1}}],["реальном",{"2":{"229":1,"296":1,"297":1,"308":1,"319":1,"374":1,"384":1}}],["реальному",{"2":{"221":1}}],["реальное",{"2":{"137":1,"173":1,"186":1}}],["реальные",{"2":{"233":1,"461":1}}],["реальным",{"2":{"219":1}}],["реальными",{"2":{"115":1}}],["реальных",{"2":{"200":1,"372":2,"373":1,"386":1}}],["реальный",{"0":{"252":1},"1":{"253":1,"254":1,"255":1},"2":{"195":1,"372":1,"473":2}}],["реализовывать",{"2":{"254":1,"258":1,"304":1,"331":1,"440":1}}],["реализовывали",{"2":{"175":1}}],["реализовали",{"2":{"256":1,"294":1,"367":2}}],["реализованного",{"2":{"334":1}}],["реализованный",{"2":{"175":1}}],["реализованные",{"2":{"148":1}}],["реализована",{"2":{"324":1,"509":1,"511":1,"516":1}}],["реализовано",{"2":{"296":1,"351":1,"450":1,"557":1}}],["реализованы",{"2":{"199":1,"200":1,"269":1,"331":1,"332":1,"334":1,"358":1}}],["реализован",{"2":{"127":1,"284":1,"289":1,"294":1,"295":1,"366":1,"452":1}}],["реализовать",{"2":{"12":1,"35":1,"36":1,"40":1,"82":1,"105":1,"166":1,"177":1,"241":1,"244":1,"287":2,"291":1,"292":1,"294":1,"295":1,"303":1,"306":1,"308":1,"317":1,"325":2,"328":1,"334":2,"361":1,"369":1,"425":1,"434":2,"436":1,"437":1,"439":1,"453":1}}],["реализуя",{"2":{"349":1}}],["реализует",{"2":{"246":1,"293":1,"297":1,"352":1,"359":1,"512":1}}],["реализуемого",{"2":{"444":1}}],["реализуемая",{"2":{"395":1}}],["реализуемые",{"2":{"297":1}}],["реализуем",{"2":{"170":1,"250":1,"353":1,"434":2,"449":1,"451":1}}],["реализующая",{"2":{"446":2}}],["реализующих",{"2":{"225":1,"442":1,"447":1}}],["реализующий",{"2":{"162":1,"252":1,"296":1,"504":1}}],["реализуют",{"2":{"290":1,"331":1,"363":1}}],["реализуются",{"2":{"167":1}}],["реализацией",{"2":{"158":1,"256":1,"293":1,"296":1,"324":1,"328":1,"329":1,"330":2,"367":1,"539":1}}],["реализациями",{"2":{"371":1}}],["реализациях",{"2":{"316":1}}],["реализация",{"0":{"255":1,"256":1,"279":1,"354":1,"357":1,"359":1,"437":1},"1":{"280":1,"281":1,"355":1,"356":1,"358":1,"360":1,"361":1,"362":1,"363":1,"438":1,"439":1,"443":1,"444":1,"445":1,"447":1,"448":1,"449":1,"450":1,"451":1,"452":1,"454":1},"2":{"125":1,"143":1,"163":1,"168":1,"170":1,"179":1,"256":1,"269":1,"271":1,"279":1,"280":1,"291":1,"292":3,"293":1,"294":1,"295":1,"303":1,"309":1,"319":1,"324":1,"330":1,"343":1,"349":3,"353":1,"354":1,"356":1,"357":1,"364":1,"441":1,"442":1,"443":1,"446":2,"447":1,"449":1,"451":1,"460":1,"537":1}}],["реализаций",{"2":{"123":1,"170":1,"281":1,"282":1,"300":2,"345":1}}],["реализации",{"0":{"517":1},"1":{"518":1,"519":1},"2":{"39":1,"76":1,"118":1,"120":1,"125":1,"154":1,"167":1,"171":1,"179":1,"197":1,"212":1,"219":1,"221":1,"235":1,"237":1,"238":1,"240":1,"241":1,"247":1,"256":3,"259":1,"260":2,"271":1,"276":1,"279":1,"280":1,"284":1,"286":2,"287":1,"288":1,"289":1,"290":1,"291":2,"293":1,"295":1,"317":1,"322":1,"324":1,"325":2,"328":1,"331":1,"338":1,"344":2,"349":2,"351":1,"354":1,"356":1,"358":1,"359":1,"364":2,"368":1,"373":1,"385":1,"395":2,"408":1,"410":1,"414":1,"436":1,"440":2,"442":1,"449":2,"453":1,"455":1,"460":2,"470":1,"555":1}}],["реализацию",{"2":{"16":1,"41":1,"64":1,"123":1,"167":1,"227":1,"247":1,"255":1,"259":1,"268":1,"271":1,"281":1,"287":2,"292":1,"294":1,"304":1,"324":1,"328":1,"352":1,"364":1,"366":1,"439":1,"455":1,"465":1}}],["релевантные",{"2":{"115":1}}],["релиз",{"2":{"95":1,"388":1}}],["реляционных",{"2":{"43":1,"44":1,"47":1,"48":2}}],["реляционные",{"2":{"17":2}}],["реляционную",{"2":{"39":1}}],["ресурсе",{"2":{"498":1}}],["ресурсом",{"2":{"295":1,"436":1}}],["ресурсов",{"2":{"117":2,"197":1,"227":1,"252":1,"423":1,"429":1,"439":1,"472":1,"555":1,"556":1}}],["ресурсу",{"2":{"116":1,"117":2,"278":1}}],["ресурс",{"2":{"116":2,"117":2,"247":1,"252":1,"255":3,"473":1}}],["ресурса",{"0":{"495":1},"2":{"429":1}}],["ресурсам",{"2":{"116":1,"137":2,"277":1,"429":1}}],["ресурсами",{"2":{"115":1,"325":1,"429":1,"436":1,"472":2}}],["ресурсах",{"0":{"0":1}}],["ресурсы",{"0":{"429":1},"1":{"430":1,"431":1},"2":{"95":1,"137":2,"224":2,"267":1,"301":1,"373":1,"379":1,"423":4,"429":4,"432":1,"436":1,"473":1,"539":1}}],["режимы",{"2":{"336":1}}],["режим",{"2":{"127":2,"136":3,"137":1,"141":1,"313":1}}],["режимов",{"2":{"127":1}}],["режима",{"2":{"117":1,"135":1,"136":1,"145":1,"228":1,"509":1}}],["режимах",{"2":{"95":1,"546":3,"548":2}}],["режиме",{"2":{"12":1,"95":1,"127":1,"135":1,"136":2,"139":1,"146":1,"164":1,"168":1,"224":1,"303":1,"339":1,"345":1,"421":1,"433":2,"461":1,"462":2,"554":1}}],["регулярный",{"0":{"467":1}}],["регулярных",{"2":{"322":1}}],["регулировать",{"2":{"425":1}}],["регулирования",{"2":{"331":1}}],["регулируется",{"2":{"59":1,"134":1}}],["регистрируя",{"2":{"291":1}}],["регистрирует",{"2":{"463":1}}],["регистрируется",{"2":{"292":1}}],["регистрируете",{"2":{"267":1}}],["регистрируем",{"2":{"121":1,"255":1,"267":1,"316":1,"343":2,"344":2,"356":1}}],["регистрировать",{"2":{"243":1,"252":2,"297":1}}],["регистре",{"2":{"214":1,"215":1,"230":1}}],["регистра",{"2":{"216":1}}],["регистраторе",{"2":{"134":1}}],["регистратора",{"2":{"134":3}}],["регистраторы",{"2":{"134":2}}],["регистратором",{"2":{"134":1}}],["регистрацию",{"2":{"267":1}}],["регистрация",{"0":{"121":1},"2":{"243":1}}],["регистрации",{"2":{"58":1,"119":1,"131":1,"184":2,"243":1,"255":1,"256":1,"265":4,"267":1,"287":2,"289":1,"291":1,"292":1,"316":1,"344":1,"545":1}}],["регистр",{"2":{"44":1,"230":3}}],["решетку",{"2":{"316":1}}],["решетки",{"2":{"313":1}}],["решен",{"2":{"436":1}}],["решена",{"2":{"12":1,"122":1,"175":1}}],["решении",{"2":{"507":1}}],["решению",{"2":{"358":1,"400":1}}],["решением",{"2":{"76":1,"79":1,"115":1,"329":1,"363":1,"370":1,"378":1,"385":1,"425":1,"433":1}}],["решение",{"2":{"12":2,"13":1,"59":1,"63":1,"71":1,"89":1,"115":1,"117":2,"118":1,"127":1,"150":1,"179":1,"190":1,"200":1,"241":5,"250":1,"271":1,"297":1,"316":1,"329":1,"331":1,"351":1,"373":1,"400":1,"441":1,"463":1,"473":1,"507":1}}],["решений",{"2":{"10":1,"12":1,"22":1,"39":1,"41":1,"63":3,"73":1,"241":1,"421":1,"472":1}}],["решениями",{"2":{"170":1}}],["решениях",{"2":{"16":1}}],["решения",{"0":{"10":1,"423":1},"1":{"424":1,"425":1,"426":1,"427":1,"428":1},"2":{"9":1,"10":1,"14":1,"39":1,"63":1,"71":2,"157":2,"159":1,"171":1,"175":1,"176":1,"212":1,"239":1,"247":1,"248":1,"260":4,"265":1,"271":1,"292":1,"302":1,"325":1,"331":2,"372":1,"385":1,"386":1,"443":1,"444":1,"472":1,"507":2}}],["решит",{"2":{"436":1}}],["решить",{"2":{"135":1,"164":1,"308":1,"322":1,"331":1,"349":1,"421":1,"429":1,"436":1}}],["решил",{"2":{"386":1}}],["решили",{"2":{"244":1,"443":1,"464":3}}],["решётки",{"2":{"201":1}}],["решат",{"2":{"436":1}}],["решать",{"2":{"286":1,"450":1}}],["решают",{"2":{"272":1,"462":1}}],["решали",{"2":{"199":1}}],["решает",{"2":{"116":1,"171":1,"200":1,"265":1,"340":1,"462":1}}],["решаем",{"2":{"12":1,"239":1}}],["реквизите",{"2":{"319":1}}],["реквизиты",{"2":{"124":1}}],["рекламных",{"2":{"465":1}}],["рекламные",{"2":{"4":1,"195":1}}],["рекламодателям",{"2":{"196":1}}],["рекламодателями",{"2":{"193":1}}],["рекламы",{"2":{"195":2}}],["реклама",{"0":{"195":1}}],["рекламируемым",{"2":{"193":1}}],["рекомендовал",{"2":{"341":1}}],["рекомендует",{"2":{"433":1}}],["рекомендуется",{"0":{"340":1},"2":{"123":1,"143":1,"144":1,"167":1,"168":1,"222":1,"224":1,"230":1,"243":1,"250":1,"266":1,"286":3,"325":1,"343":1,"364":1,"390":1,"402":1,"422":1,"432":1,"436":3,"446":1,"449":1,"512":1,"557":1}}],["рекомендуемые",{"2":{"341":1}}],["рекомендуемым",{"2":{"338":1,"387":1}}],["рекомендуемой",{"2":{"222":1}}],["рекомендуются",{"2":{"460":1}}],["рекомендую",{"2":{"184":1,"222":2,"249":1,"322":1,"353":1,"363":1,"366":1,"539":1}}],["рекомендацией",{"2":{"373":1}}],["рекомендациям",{"2":{"226":1,"255":1}}],["рекомендациях",{"2":{"145":1}}],["рекомендации",{"2":{"142":1,"225":1,"233":1,"260":1,"261":1}}],["рекомендаций",{"2":{"4":1,"213":1}}],["реконнект",{"2":{"118":1}}],["равенства",{"2":{"376":1}}],["равным",{"2":{"319":1}}],["равных",{"2":{"197":1}}],["равна",{"2":{"207":1}}],["равно",{"2":{"156":1,"204":1,"207":1,"287":1,"301":1,"339":1,"473":1}}],["рамок",{"2":{"336":1}}],["рамками",{"2":{"203":1,"238":1}}],["рамках",{"2":{"200":1,"205":1,"229":1,"247":1,"252":1,"258":1,"344":1,"373":1,"449":1}}],["рамки",{"2":{"143":1,"163":1,"181":1,"199":1,"200":1,"225":1,"237":1,"265":1,"267":1,"268":1,"270":1,"324":1,"328":1,"331":2,"345":1,"394":2}}],["радужно",{"2":{"227":1,"308":1}}],["радует",{"2":{"178":1}}],["ради",{"2":{"222":1}}],["радиус",{"2":{"169":1}}],["радиокнопки",{"0":{"162":1},"2":{"162":2}}],["ранней",{"2":{"385":1}}],["ранних",{"2":{"372":1}}],["рано",{"2":{"156":1,"465":1}}],["ранее",{"2":{"83":1,"141":1,"203":1,"226":1,"231":1,"256":1,"258":1,"292":1,"297":1,"316":1,"328":1,"330":2,"336":1,"349":2,"351":1,"380":1,"395":1,"421":1,"434":1,"441":1,"442":2,"446":1,"450":1}}],["раньше",{"2":{"12":1,"223":1,"302":3,"303":1,"311":1,"357":1,"372":1,"433":1,"436":1}}],["рабочая",{"2":{"351":1}}],["рабочим",{"0":{"442":1},"1":{"443":1,"444":1,"445":1},"2":{"351":1,"449":1}}],["рабочие",{"2":{"263":1}}],["рабочих",{"2":{"191":1,"197":1,"325":1,"344":1}}],["рабочий",{"2":{"126":1,"136":1,"145":1,"202":1,"255":1,"330":1,"331":2,"343":1,"344":2,"395":1,"397":1,"409":1,"419":2,"441":1,"442":1}}],["рабочей",{"2":{"221":1}}],["рабочему",{"2":{"268":1,"445":1,"452":1}}],["рабочем",{"2":{"166":1,"168":1,"324":1,"325":1,"339":1,"372":1,"373":1,"416":1}}],["рабочего",{"0":{"221":1,"409":1},"1":{"222":1,"223":1,"224":1,"225":1,"226":1,"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1},"2":{"119":1,"120":1,"126":1,"166":1,"168":1,"201":1,"202":1,"203":1,"204":1,"235":1,"236":1,"243":1,"253":1,"292":1,"302":1,"325":2,"328":1,"329":1,"330":1,"344":1,"345":3,"349":1,"350":1,"373":1,"395":2}}],["рабочее",{"2":{"79":1}}],["работник",{"2":{"442":2}}],["работнику",{"2":{"344":1}}],["работника",{"2":{"344":3}}],["работоспособного",{"2":{"507":1}}],["работоспособный",{"2":{"325":1}}],["работоспособен",{"2":{"223":1}}],["работе",{"2":{"41":2,"102":1,"105":1,"123":1,"153":1,"212":1,"220":1,"222":1,"227":1,"256":1,"271":1,"314":1,"325":1,"344":1,"348":1,"356":1,"433":2,"463":2,"507":1}}],["работала",{"2":{"292":1}}],["работало",{"2":{"232":1,"281":1}}],["работали",{"2":{"204":1,"265":1,"267":1}}],["работающую",{"2":{"504":1}}],["работающее",{"2":{"374":1}}],["работающего",{"2":{"335":1,"508":1}}],["работающей",{"2":{"189":1,"234":1}}],["работающими",{"2":{"347":1}}],["работающий",{"2":{"222":1,"225":1,"282":1}}],["работающих",{"2":{"196":1,"269":1,"308":1,"316":1}}],["работают",{"2":{"115":1,"150":1,"203":1,"222":1,"267":1,"269":1,"276":1,"297":1,"301":1,"315":1,"331":1,"332":1,"381":1,"434":1,"436":1,"443":1,"462":1,"553":1}}],["работаем",{"2":{"103":1,"394":1}}],["работаете",{"2":{"154":2,"390":1}}],["работает",{"2":{"50":1,"62":1,"86":1,"92":1,"112":1,"116":2,"130":1,"143":1,"168":1,"223":2,"231":2,"232":1,"251":1,"256":1,"262":1,"280":1,"290":1,"294":1,"295":1,"296":2,"313":1,"325":1,"331":1,"351":2,"354":1,"356":1,"375":1,"376":2,"394":1,"433":1,"444":1,"445":2,"460":3,"463":1,"465":1,"472":2,"473":1,"539":1}}],["работа",{"0":{"50":1,"81":1,"394":1},"1":{"82":1,"83":1},"2":{"38":1,"131":1,"289":1,"390":1,"393":1,"394":2,"449":1}}],["работать",{"2":{"2":1,"25":1,"50":1,"59":1,"102":1,"115":1,"118":1,"200":1,"202":1,"212":1,"224":2,"227":1,"229":1,"242":1,"251":1,"258":1,"290":1,"295":1,"304":1,"311":1,"322":1,"336":3,"343":1,"344":1,"358":1,"364":1,"394":2,"402":1,"423":1,"433":2,"436":1,"446":2,"454":1,"462":1,"472":1}}],["работу",{"2":{"23":1,"47":1,"63":1,"83":1,"222":1,"255":1,"256":1,"331":2,"332":1,"356":2,"358":1,"364":1,"385":1,"391":1,"409":1,"425":1,"434":1,"435":1,"436":1,"439":2,"461":1}}],["работы",{"0":{"60":1,"160":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1},"2":{"12":1,"17":1,"23":1,"50":1,"62":1,"72":1,"102":1,"115":1,"116":1,"117":1,"143":1,"171":1,"197":1,"200":1,"203":1,"211":1,"219":1,"220":1,"222":2,"223":2,"226":1,"229":2,"231":1,"255":1,"256":1,"257":1,"268":1,"270":1,"300":1,"303":2,"306":1,"324":1,"329":1,"330":1,"335":1,"336":1,"344":4,"352":1,"364":1,"375":1,"376":1,"390":1,"394":1,"429":1,"434":1,"436":3,"437":1,"441":1,"447":3,"456":1,"457":1,"458":1,"472":2,"496":3,"556":1}}],["расшаривать",{"2":{"462":1}}],["расшифровывается",{"2":{"240":1,"323":1}}],["расширим",{"2":{"440":1,"446":1}}],["расширили",{"2":{"258":1}}],["расширить",{"2":{"22":1,"257":1,"473":1}}],["расширено",{"2":{"364":1}}],["расширенные",{"2":{"249":1}}],["расширенными",{"2":{"235":1}}],["расширений",{"2":{"433":1}}],["расширении",{"2":{"402":1,"463":1}}],["расширением",{"2":{"203":1,"224":1}}],["расширение",{"2":{"89":1,"105":1,"338":1,"364":2,"375":1,"539":2,"545":1}}],["расширениями",{"2":{"513":1}}],["расширения",{"0":{"539":1},"2":{"85":1,"117":1,"196":1,"264":1,"297":1,"363":1,"433":2,"460":1,"539":1}}],["расширяет",{"2":{"297":1,"417":1}}],["расширяемость",{"2":{"77":1,"471":1}}],["расширять",{"2":{"18":1,"200":1,"252":1,"396":1,"432":1}}],["расхождения",{"2":{"393":1}}],["расходов",{"2":{"192":1}}],["расходы",{"0":{"192":1},"2":{"357":1}}],["расчеты",{"2":{"364":1}}],["расчетом",{"2":{"12":1}}],["растут",{"2":{"385":1}}],["растущая",{"2":{"225":1}}],["растущим",{"2":{"134":1}}],["растет",{"2":{"256":1}}],["раскрывающимся",{"2":{"527":1}}],["раскрывая",{"2":{"380":1}}],["раскрывает",{"2":{"201":1,"295":1,"449":1}}],["раскрывается",{"2":{"192":1,"294":1,"325":1}}],["раскадровки",{"2":{"154":1}}],["рассказывали",{"2":{"450":1}}],["рассказывается",{"2":{"408":1}}],["рассказано",{"2":{"210":1}}],["рассказать",{"2":{"200":1,"225":1}}],["рассуждений",{"2":{"271":1}}],["рассчитывал",{"2":{"192":1}}],["рассчитать",{"2":{"168":1}}],["рассылку",{"2":{"186":3}}],["расстояния",{"2":{"156":1}}],["расстояние",{"0":{"154":1},"2":{"156":2}}],["рассматривали",{"2":{"183":1,"229":1,"354":1,"365":1,"441":1}}],["рассматриваемое",{"2":{"402":1}}],["рассматриваем",{"2":{"287":1,"328":1}}],["рассматриваемый",{"2":{"171":1}}],["рассматривается",{"2":{"400":1,"452":1}}],["рассматривает",{"2":{"263":1,"472":1}}],["рассматриваете",{"2":{"26":1}}],["рассматриваются",{"2":{"122":1,"124":1,"142":1,"148":1,"199":1,"446":1}}],["рассматриваться",{"2":{"201":1}}],["рассматривать",{"2":{"43":1,"140":1,"150":1,"178":1,"179":1,"202":1,"204":1,"238":1,"249":1,"250":1,"256":1,"263":1,"264":1,"266":1,"297":1,"308":1,"322":1,"358":1,"436":1,"440":2,"441":1}}],["рассмотрите",{"2":{"225":1,"425":1}}],["рассмотрим",{"2":{"10":1,"61":1,"119":1,"133":1,"134":1,"135":1,"141":1,"147":1,"150":1,"151":1,"153":1,"159":1,"178":1,"181":1,"185":1,"199":1,"200":1,"201":1,"203":2,"204":1,"205":1,"210":1,"212":2,"223":1,"224":2,"228":1,"232":1,"233":1,"235":2,"239":1,"242":1,"244":1,"246":3,"249":4,"251":1,"256":1,"260":1,"263":1,"267":1,"268":1,"271":2,"276":1,"279":1,"288":1,"289":1,"290":1,"291":1,"292":2,"295":2,"296":1,"297":2,"298":1,"301":1,"302":2,"306":1,"308":2,"310":1,"313":1,"316":2,"319":2,"324":1,"325":4,"329":1,"330":1,"331":2,"337":1,"342":1,"343":3,"344":1,"349":1,"350":1,"357":1,"363":1,"364":1,"368":1,"370":1,"372":1,"373":2,"380":1,"381":1,"382":1,"383":1,"394":1,"434":2,"449":1,"452":1,"455":1}}],["рассмотренные",{"2":{"358":1,"442":1}}],["рассмотренными",{"2":{"303":1}}],["рассмотренных",{"2":{"178":1,"225":1,"395":1,"440":1}}],["рассмотрении",{"2":{"291":1,"344":1}}],["рассмотрению",{"2":{"222":1,"331":1}}],["рассмотрение",{"2":{"150":1,"345":1,"347":1}}],["рассмотрены",{"2":{"39":1,"297":1}}],["рассмотрели",{"2":{"145":2,"197":2,"242":1,"245":1,"252":1,"256":1,"258":2,"292":1,"295":1,"304":1,"333":1,"344":1,"347":2,"363":1,"368":1,"378":1,"396":1,"442":1,"455":1}}],["рассмотреть",{"2":{"142":1,"224":1,"256":1,"322":1,"323":1,"331":1,"342":1,"343":1,"384":1,"440":1}}],["распознаваемых",{"2":{"318":1}}],["расползлись",{"2":{"462":1}}],["располнела",{"2":{"460":1,"536":1}}],["распологаются",{"2":{"224":1}}],["расположены",{"2":{"518":1}}],["расположенные",{"2":{"335":1}}],["расположенных",{"2":{"247":1}}],["расположенное",{"2":{"183":1}}],["расположена",{"2":{"150":1}}],["расположению",{"2":{"173":1}}],["расположении",{"2":{"158":1}}],["расположения",{"2":{"140":1,"141":1,"152":1,"181":1}}],["расположение",{"2":{"36":1,"140":1,"182":1,"226":1}}],["расположить",{"2":{"36":1}}],["располагались",{"2":{"471":1}}],["располагать",{"2":{"382":1}}],["располагаться",{"2":{"135":1,"137":1,"156":1,"338":1}}],["располагает",{"2":{"227":1}}],["располагается",{"2":{"120":1,"140":1,"156":1,"300":1}}],["располагаются",{"2":{"181":1,"256":1}}],["распределение",{"2":{"472":1}}],["распределения",{"2":{"224":1,"288":1}}],["распределенная",{"2":{"386":1,"393":1}}],["распределенности",{"2":{"386":1}}],["распределенными",{"2":{"331":1}}],["распределенные",{"2":{"331":1}}],["распределенных",{"2":{"269":1,"308":1,"331":2}}],["распределяются",{"2":{"116":1}}],["распространяемы",{"2":{"508":1}}],["распространяется",{"2":{"266":1,"358":1}}],["распространяться",{"2":{"359":1}}],["распространять",{"2":{"336":1}}],["распространяющихся",{"2":{"203":1}}],["распространяются",{"2":{"159":1}}],["распространены",{"2":{"473":1}}],["распространенного",{"2":{"471":1}}],["распространенность",{"2":{"463":1}}],["распространенной",{"2":{"329":1,"415":1}}],["распространенными",{"2":{"147":1,"199":1,"324":1,"328":1,"336":1,"344":1}}],["распространенных",{"2":{"137":1,"197":1,"224":1,"338":1,"374":1,"449":2,"508":1}}],["распространенные",{"2":{"134":1,"137":1,"146":1,"147":1,"163":1,"363":1,"392":1,"463":1}}],["распространенный",{"2":{"9":1,"116":1,"277":1,"394":1}}],["распространение",{"2":{"308":1,"336":1,"356":1}}],["распространения",{"2":{"201":1,"351":1}}],["распространен",{"2":{"182":2,"201":1,"299":1}}],["раза",{"2":{"462":1}}],["разумеется",{"2":{"441":1}}],["разумными",{"2":{"345":1}}],["разумным",{"2":{"181":1}}],["разочаровавшись",{"2":{"386":1}}],["разочарованию",{"2":{"330":1}}],["разобщенности",{"2":{"434":1}}],["разобрались",{"2":{"443":1}}],["разобраться",{"2":{"306":1}}],["разобрать",{"2":{"244":1,"448":1}}],["разобран",{"2":{"224":1}}],["разобьем",{"2":{"97":1,"231":1}}],["разграничению",{"2":{"368":1}}],["разгрузки",{"2":{"294":1}}],["разговаривать",{"2":{"197":1}}],["разбора",{"2":{"444":1}}],["разблокировав",{"2":{"324":1}}],["разбрасывать",{"2":{"267":1}}],["разбросаны",{"2":{"256":1}}],["разберет",{"2":{"223":1}}],["разбиения",{"2":{"463":2}}],["разбиение",{"0":{"4":1},"2":{"2":1,"41":1,"79":1,"244":1}}],["разбираться",{"2":{"315":1,"316":1,"472":1}}],["разбили",{"2":{"256":1}}],["разбивается",{"2":{"423":1}}],["разбивает",{"2":{"263":1}}],["разбивайте",{"2":{"157":1}}],["разбивать",{"2":{"2":1,"3":1}}],["разбивка",{"2":{"14":1,"238":1}}],["разбитым",{"2":{"473":1}}],["разбить",{"2":{"4":1}}],["разбита",{"2":{"2":1}}],["размонтированием",{"2":{"267":1,"316":1}}],["размонтировании",{"2":{"212":1}}],["размышления",{"0":{"135":1},"1":{"136":1},"2":{"270":1}}],["разметки",{"2":{"199":1}}],["разместим",{"2":{"203":1,"230":1,"231":1,"375":2}}],["разместили",{"2":{"152":1}}],["разместить",{"2":{"108":1,"267":1,"316":1,"382":1,"422":3}}],["размер",{"2":{"156":1,"204":1,"227":1,"244":1,"309":1,"313":1,"364":1,"429":2,"465":1}}],["размеров",{"2":{"149":1,"250":1}}],["размеру",{"2":{"134":1,"181":1}}],["размерам",{"2":{"336":1}}],["размерами",{"2":{"181":1,"339":1,"341":1}}],["размера",{"2":{"125":1,"130":1,"151":1,"156":1,"170":1,"176":1,"181":1,"200":3,"244":1,"267":2,"363":1,"429":1}}],["размещали",{"2":{"224":1}}],["размещает",{"2":{"195":1}}],["размещается",{"2":{"181":1,"182":1,"183":2,"338":1,"343":1}}],["размещаем",{"2":{"141":2,"231":1,"256":1}}],["размещаемый",{"2":{"137":1}}],["размещаются",{"2":{"173":1,"224":1}}],["размещайте",{"2":{"154":1}}],["размещать",{"2":{"59":1,"128":1,"134":1,"170":1,"174":1,"224":2,"231":1,"253":1,"375":1}}],["размещена",{"2":{"375":1}}],["размещенный",{"2":{"344":1,"383":1}}],["размещенное",{"2":{"173":1}}],["размещены",{"2":{"225":1,"239":1,"310":1}}],["размещению",{"2":{"375":1}}],["размещение",{"0":{"173":1},"2":{"152":1,"173":1,"182":1,"183":1,"195":1,"381":1}}],["размещении",{"2":{"141":1,"183":1}}],["размещения",{"2":{"115":1,"131":1,"138":1,"183":1,"201":1,"223":1,"394":1,"395":1,"422":1,"472":1,"527":1}}],["размещен",{"2":{"136":1,"223":1,"224":1,"343":2,"366":1,"393":1}}],["размещено",{"2":{"134":2,"135":2,"139":1,"201":1}}],["разная",{"2":{"454":1}}],["разнообразные",{"2":{"308":1}}],["разному",{"2":{"244":1,"472":1}}],["разного",{"2":{"176":1,"463":1}}],["разным",{"2":{"386":1,"393":1}}],["разными",{"2":{"294":1,"385":1}}],["разных",{"2":{"117":1,"170":1,"222":1,"268":1,"276":1,"336":1,"382":1,"424":1,"462":1,"464":1,"482":1,"534":1,"555":1}}],["разный",{"2":{"116":1}}],["разные",{"0":{"204":1},"2":{"116":1,"152":1,"182":1,"241":1,"319":1,"345":1,"356":1,"385":2,"386":1,"432":1,"464":1,"472":1,"545":1}}],["разницей",{"2":{"208":1,"297":1}}],["разницу",{"2":{"123":1,"302":1}}],["разницы",{"2":{"116":1}}],["разница",{"2":{"22":1,"200":1,"220":1,"305":1,"348":1,"369":1,"380":1,"454":1,"473":1}}],["раздувать",{"2":{"518":1}}],["раздутому",{"2":{"62":1}}],["раздаются",{"2":{"472":1}}],["раздражения",{"2":{"194":1}}],["разделу",{"2":{"319":1}}],["разделить",{"2":{"244":1,"263":2,"265":1}}],["разделив",{"2":{"200":1}}],["разделяемые",{"2":{"359":1}}],["разделяется",{"2":{"325":1,"359":1}}],["разделяет",{"2":{"240":1,"297":1,"351":1}}],["разделять",{"2":{"258":1,"462":1}}],["разделяй",{"2":{"2":1}}],["разделом",{"2":{"181":1,"256":1}}],["разделов",{"2":{"167":1,"178":1}}],["разделах",{"2":{"185":1,"203":1,"313":1,"482":1}}],["разделами",{"2":{"363":1}}],["разделам",{"2":{"173":1}}],["раздела",{"2":{"151":1,"183":2,"203":1,"255":1,"359":1}}],["раздел",{"2":{"136":1,"181":1,"183":4,"225":1,"227":1,"231":1,"255":1,"338":1,"367":1,"527":1}}],["разделенной",{"2":{"448":1}}],["разделенные",{"2":{"134":1,"230":1,"325":1}}],["разделенных",{"2":{"117":1,"134":2,"135":1}}],["разделена",{"2":{"263":1}}],["разделению",{"2":{"309":1}}],["разделения",{"2":{"174":1,"203":1,"263":2,"269":1}}],["разделение",{"0":{"263":1},"2":{"34":1,"170":1,"260":1,"263":2,"265":1,"291":1,"440":1,"471":1}}],["разделе",{"2":{"117":1,"201":1,"211":1,"223":1,"230":1,"242":1,"246":1,"252":1,"267":1,"316":1,"322":1,"335":1,"344":1,"373":1,"383":1,"460":1,"527":3}}],["разделы",{"2":{"116":1,"167":1,"181":1,"238":1}}],["различающихся",{"2":{"462":1}}],["различаются",{"2":{"262":1}}],["различают",{"2":{"44":1}}],["различать",{"2":{"301":1}}],["различается",{"2":{"249":1}}],["различие",{"0":{"151":1},"2":{"162":1,"199":1,"200":1}}],["различия",{"2":{"147":1,"322":1,"393":1}}],["различный",{"2":{"203":1}}],["различные",{"2":{"170":1,"199":2,"228":1,"302":1,"306":1,"322":1,"331":1,"336":3,"368":1,"370":1,"389":1,"450":1,"545":2}}],["различных",{"2":{"145":1,"167":1,"199":1,"228":1,"241":1,"245":1,"281":1,"295":1,"306":1,"311":1,"324":1,"325":1,"333":1,"336":3,"339":1,"345":1,"364":1,"372":2,"376":1,"385":1,"436":1,"473":1,"544":1,"545":1}}],["различным",{"2":{"35":1,"41":1,"173":1,"270":1,"336":1}}],["различными",{"2":{"30":1,"115":1,"176":1,"181":1,"227":1,"235":1,"256":1,"263":1,"294":1,"306":1,"325":1,"376":1,"463":1}}],["различного",{"2":{"79":1}}],["развертываемого",{"2":{"508":1}}],["развертывании",{"2":{"226":1}}],["развертыванию",{"2":{"136":1}}],["развертывания",{"0":{"135":1,"526":1},"1":{"136":1,"527":1,"528":1},"2":{"76":1,"127":1,"131":1,"145":1,"228":1,"334":1,"419":1,"421":1}}],["развертыванием",{"2":{"224":1,"421":1}}],["развертывание",{"0":{"65":1,"131":1,"416":1},"1":{"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1},"2":{"61":1,"65":1,"228":1,"313":1,"337":1,"395":1}}],["разве",{"2":{"436":1}}],["разветвление",{"2":{"386":1}}],["разветвлять",{"2":{"386":1}}],["разворачивать",{"2":{"267":1}}],["разворачивание",{"2":{"40":1}}],["развитый",{"2":{"308":1}}],["развитии",{"2":{"308":1}}],["развитием",{"2":{"308":1}}],["развитие",{"0":{"495":1},"2":{"270":1,"440":1}}],["развития",{"0":{"79":1},"2":{"10":1,"72":1,"199":1,"336":1,"507":1}}],["развивается",{"2":{"463":1}}],["развиваться",{"2":{"238":1,"265":1}}],["развиваются",{"2":{"221":1}}],["раз",{"0":{"249":1},"2":{"27":1,"116":3,"145":1,"171":1,"192":1,"200":1,"204":1,"206":1,"227":1,"243":1,"269":1,"277":1,"280":1,"281":1,"286":1,"316":1,"343":1,"349":1,"361":1,"376":2,"381":1,"432":2,"462":1,"472":1}}],["разряда",{"2":{"468":1}}],["разрядной",{"2":{"222":1}}],["разрывные",{"2":{"370":1}}],["разрушить",{"2":{"349":1}}],["разрешив",{"2":{"444":1}}],["разрешили",{"2":{"472":1}}],["разрешил",{"2":{"138":1}}],["разрешить",{"2":{"59":1,"324":1,"443":1,"454":1}}],["разрешающийся",{"2":{"323":1}}],["разрешается",{"2":{"244":1,"254":1,"452":1}}],["разрешает",{"2":{"117":1,"318":1}}],["разрешаться",{"2":{"448":1}}],["разрешать",{"2":{"116":1,"394":1}}],["разрешено",{"2":{"303":1,"393":1}}],["разрешен",{"2":{"117":3}}],["разрешений",{"2":{"464":1,"515":1}}],["разрешение",{"2":{"116":2,"166":1,"255":1,"301":1,"331":1,"393":1,"445":1}}],["разрешениях",{"2":{"519":1}}],["разрешениям",{"2":{"181":1}}],["разрешения",{"2":{"23":1,"116":1,"255":2,"331":1,"378":1,"394":1,"443":1,"448":1}}],["разрабатываешь",{"2":{"464":1}}],["разрабатывается",{"2":{"181":1}}],["разрабатываемые",{"2":{"423":1}}],["разрабатываемого",{"2":{"419":1}}],["разрабатываем",{"2":{"6":1}}],["разрабатывать",{"2":{"63":1,"149":1,"423":1,"463":1,"472":1}}],["разработаем",{"2":{"229":1}}],["разработать",{"2":{"229":1}}],["разработанный",{"2":{"375":1}}],["разработанной",{"2":{"370":1}}],["разработан",{"2":{"200":1}}],["разработана",{"2":{"127":1}}],["разработчику",{"2":{"385":1,"471":1,"473":1,"504":1,"507":1}}],["разработчиком",{"2":{"339":1,"417":1,"473":3}}],["разработчиков",{"2":{"2":1,"213":1,"222":1,"227":1,"228":1,"247":1,"281":1,"331":1,"332":1,"385":3,"386":1,"401":1,"418":1,"461":1,"473":1,"497":1}}],["разработчики",{"2":{"270":1,"300":1,"395":1,"402":1,"471":2}}],["разработчик",{"2":{"62":1,"115":1,"184":1,"197":1,"200":1,"260":1,"462":1,"507":1}}],["разработчиками",{"2":{"147":1}}],["разработчикам",{"2":{"62":1,"372":3,"425":1,"508":2}}],["разработчика",{"2":{"23":1,"201":1,"223":1,"224":1,"300":1,"331":1,"342":2,"345":1,"346":3,"358":1,"363":2,"367":1,"370":2,"376":2,"385":1,"396":1,"402":1,"436":2,"462":2,"470":1,"473":1,"496":1,"511":1}}],["разработкой",{"2":{"63":1,"372":1,"392":1,"461":1}}],["разработка",{"0":{"64":1},"2":{"61":2,"64":1,"70":1,"79":1,"228":1,"234":1,"260":1,"324":1,"336":1,"385":1,"461":1,"479":1,"482":1,"484":1,"485":1}}],["разработки",{"0":{"61":1},"2":{"17":1,"63":2,"70":1,"112":1,"126":1,"200":2,"204":1,"221":1,"222":1,"223":4,"224":3,"226":1,"227":1,"228":3,"231":1,"243":1,"260":1,"266":1,"267":1,"269":1,"270":1,"271":1,"300":1,"304":1,"344":1,"370":2,"372":1,"373":1,"375":1,"384":2,"386":1,"410":1,"422":1,"423":1,"433":3,"460":1,"461":1,"462":1,"463":1,"464":1,"473":1,"507":1}}],["разработку",{"2":{"3":1,"63":1,"149":1,"200":1,"260":1,"332":1,"463":1,"471":2}}],["разработке",{"0":{"544":1},"2":{"3":1,"72":1,"76":3,"117":1,"154":1,"220":1,"222":1,"223":1,"227":1,"234":1,"260":1,"261":1,"269":1,"271":1,"308":1,"368":1,"373":1,"401":1,"433":1,"449":1,"472":1}}],["гигантский",{"2":{"358":1}}],["гибче",{"2":{"462":1}}],["гибки",{"2":{"463":1}}],["гибкая",{"2":{"358":1,"364":1}}],["гибкой",{"2":{"354":1}}],["гибкости",{"2":{"140":1,"248":1}}],["гибкость",{"2":{"40":1,"118":1,"200":1,"228":1,"302":1,"462":1}}],["гибридных",{"2":{"313":1,"325":1,"364":1}}],["гибридные",{"2":{"308":1}}],["гипертекста",{"2":{"199":1}}],["геттеров",{"2":{"462":1}}],["геттерами",{"2":{"361":1,"462":1}}],["геймификации",{"2":{"184":1}}],["героической",{"2":{"183":1}}],["героический",{"2":{"183":1}}],["герой",{"2":{"183":1}}],["генерации",{"2":{"171":1,"308":1,"345":1,"428":1,"472":1}}],["генерация",{"2":{"92":1,"432":1,"472":1}}],["генерируется",{"2":{"329":1,"448":1,"472":1}}],["генерируемые",{"2":{"308":1}}],["генерируемыми",{"2":{"308":1}}],["генерируют",{"2":{"224":1}}],["генерировать",{"2":{"170":1,"345":1,"421":1}}],["генерить",{"2":{"472":1}}],["генерит",{"2":{"53":1,"89":2,"116":2}}],["гениальное",{"2":{"2":1}}],["громоздка",{"2":{"449":1}}],["громоздким",{"2":{"212":1,"344":1,"364":1}}],["греется",{"2":{"433":1}}],["грязно",{"2":{"353":1}}],["грубый",{"2":{"237":1}}],["грубое",{"2":{"263":1}}],["грубого",{"2":{"258":1}}],["грубо",{"2":{"116":1,"117":1,"464":1}}],["групповой",{"2":{"270":1}}],["группу",{"2":{"229":1,"376":1}}],["группах",{"2":{"270":1}}],["группами",{"2":{"231":1}}],["группа",{"2":{"177":1,"178":1,"231":1}}],["группировки",{"2":{"177":1,"238":2,"267":1}}],["группе",{"2":{"153":2,"229":1,"334":1,"376":1}}],["группы",{"0":{"154":1},"2":{"134":1,"157":1,"162":1,"231":1,"323":1,"372":1,"376":1,"380":1}}],["групп",{"2":{"134":1,"153":1,"376":1}}],["грузить",{"2":{"115":1,"472":1}}],["грамотная",{"2":{"496":1}}],["грамотно",{"2":{"473":1}}],["грамотному",{"2":{"160":1}}],["грамотной",{"2":{"76":1}}],["градусов",{"2":{"296":1}}],["градусах",{"2":{"296":1}}],["градусы",{"2":{"295":2,"297":1}}],["графическая",{"2":{"293":1}}],["графические",{"2":{"394":1}}],["графически",{"2":{"295":1,"297":1,"324":1}}],["графический",{"2":{"237":1,"387":1}}],["графических",{"2":{"225":1}}],["графическим",{"2":{"153":1}}],["графического",{"2":{"225":1,"308":1,"384":1}}],["графическое",{"2":{"170":1,"263":1,"265":1,"291":1,"293":1}}],["графики",{"2":{"153":1,"336":1}}],["грань",{"2":{"336":1}}],["гранулировано",{"2":{"116":1}}],["границах",{"2":{"200":1,"436":1}}],["границу",{"2":{"170":1,"171":1}}],["границы",{"0":{"9":1},"2":{"62":1,"297":1,"364":1}}],["границ",{"2":{"3":1,"169":1}}],["гуглить",{"2":{"115":2,"473":1}}],["гарагусо",{"2":{"405":1}}],["гарантирует",{"2":{"182":1,"366":1}}],["гамбургера",{"2":{"176":1,"515":1}}],["гамбургер",{"2":{"173":1,"546":1,"548":1}}],["гамме",{"2":{"162":1}}],["гаммы",{"2":{"26":1}}],["галочка",{"2":{"165":1}}],["гаснет",{"2":{"102":1}}],["где",{"2":{"95":1,"115":1,"116":1,"134":1,"136":1,"137":1,"152":1,"157":1,"159":1,"167":1,"173":1,"181":1,"183":2,"195":1,"200":1,"201":1,"203":1,"204":1,"223":1,"231":1,"255":1,"256":3,"269":1,"294":1,"311":1,"315":1,"323":1,"325":2,"331":1,"359":1,"378":1,"381":2,"385":1,"386":1,"395":1,"422":1,"431":1,"434":1,"436":1,"448":1,"451":1,"461":1,"462":1,"463":2,"467":1}}],["готовности",{"2":{"346":1}}],["готовность",{"2":{"334":1}}],["готового",{"2":{"507":1,"508":1}}],["готовое",{"2":{"504":1}}],["готово",{"2":{"445":1}}],["готовом",{"2":{"311":1}}],["готовой",{"2":{"224":1}}],["готова",{"2":{"286":1}}],["готов",{"2":{"231":1,"343":1,"344":1,"366":1,"374":1,"451":1}}],["готовую",{"2":{"224":1}}],["готовый",{"2":{"507":1}}],["готовым",{"2":{"433":1}}],["готовых",{"2":{"145":1,"211":1,"221":1,"508":1}}],["готовы",{"2":{"136":1,"161":1,"212":1,"219":1,"220":1,"222":2,"226":1,"227":1,"241":1,"310":1,"323":1,"324":1,"379":1,"382":1}}],["готовые",{"2":{"71":1,"136":1,"292":1}}],["городов",{"2":{"317":1}}],["город",{"2":{"317":1}}],["города",{"2":{"178":2,"317":1}}],["горизонтальную",{"2":{"181":1}}],["горизонтальному",{"2":{"181":1}}],["горизонтальные",{"2":{"173":2,"176":2,"181":1}}],["гораздо",{"2":{"137":1,"167":1,"221":1,"263":1,"276":1,"302":1,"336":2,"364":1,"394":1,"460":1}}],["гордо",{"2":{"102":1}}],["гостинице",{"2":{"472":1}}],["гостиниц",{"2":{"191":1}}],["гостей",{"2":{"116":1}}],["государство",{"2":{"2":1,"319":1}}],["говорю",{"2":{"296":1,"302":1}}],["говорит",{"2":{"464":1}}],["говорить",{"2":{"58":1,"364":1}}],["говорилось",{"2":{"218":1,"240":1,"322":1,"328":1,"337":1,"372":1,"391":1}}],["говорил",{"2":{"204":1,"292":1}}],["говорили",{"2":{"183":1,"316":2,"345":1}}],["говоря",{"2":{"116":1,"117":1,"152":1,"157":1,"185":1,"265":1,"311":1,"463":1,"464":1,"472":1}}],["года",{"2":{"473":1,"497":1}}],["годах",{"2":{"269":1}}],["годами",{"2":{"260":1}}],["году",{"2":{"158":1}}],["год",{"2":{"86":1,"270":1,"422":1}}],["годы",{"2":{"50":1,"134":1,"160":1,"460":1,"536":1}}],["глоссарий",{"0":{"496":1}}],["глобален",{"2":{"462":1}}],["глобального",{"2":{"508":1}}],["глобальное",{"2":{"462":1}}],["глобальному",{"2":{"278":1}}],["глобально",{"2":{"241":1,"243":1,"254":1}}],["глобальную",{"2":{"224":1,"315":1,"444":1}}],["глобальная",{"2":{"201":1,"243":1}}],["глобальные",{"0":{"243":1},"2":{"224":1,"225":1,"252":1,"424":1,"425":1}}],["глобальный",{"2":{"121":1,"243":1,"255":1,"462":1,"544":1}}],["глобальными",{"2":{"462":1}}],["глобальным",{"2":{"34":1,"364":1,"462":2,"464":1}}],["глобальных",{"0":{"121":1},"2":{"23":1,"119":1,"243":1,"252":1}}],["глючит",{"2":{"433":1}}],["глубокий",{"2":{"363":1}}],["глубоких",{"2":{"317":1}}],["глубоким",{"2":{"185":1}}],["глубокой",{"2":{"545":1}}],["глубокое",{"2":{"251":1}}],["глубоко",{"2":{"78":1,"246":1,"247":1,"349":1}}],["глубокого",{"2":{"74":1,"303":1}}],["глубины",{"2":{"178":1}}],["глазах",{"2":{"296":1}}],["глаза",{"2":{"182":1}}],["глаз",{"2":{"178":1}}],["гласит",{"2":{"151":1,"157":1,"264":1,"265":1,"270":1,"386":1}}],["главой",{"2":{"260":1,"335":1}}],["глав",{"2":{"221":1,"334":1}}],["главу",{"2":{"135":1,"220":1,"243":1,"262":1,"452":1}}],["главах",{"2":{"200":1,"221":1,"300":1,"306":1,"349":1}}],["глава",{"0":{"147":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1},"2":{"132":1,"148":1,"197":1,"221":1,"260":1,"271":1,"304":1,"306":1,"322":1,"329":1,"341":1,"345":1,"371":1,"410":1,"411":1,"413":1,"414":1,"417":1,"435":1}}],["главы",{"2":{"131":1,"147":1,"148":1,"175":1,"199":1,"220":1,"222":1,"223":1,"235":1,"236":2,"250":1,"256":1,"306":1,"307":1,"309":1,"334":1,"346":1,"349":1,"350":1,"364":2,"383":1,"386":1,"394":1,"434":1,"435":1,"440":1}}],["главе",{"2":{"89":1,"120":1,"124":1,"126":1,"127":2,"131":1,"133":1,"135":1,"143":1,"145":1,"147":1,"154":1,"159":1,"162":1,"173":1,"182":1,"183":1,"197":1,"198":1,"199":1,"202":1,"203":3,"204":2,"210":1,"219":2,"222":2,"224":3,"225":1,"228":1,"229":2,"232":1,"233":2,"235":4,"236":1,"239":3,"242":1,"244":1,"247":1,"249":1,"251":1,"253":1,"258":2,"259":1,"260":1,"263":1,"264":1,"267":1,"268":1,"282":1,"289":2,"292":2,"294":1,"295":1,"297":1,"298":1,"300":1,"304":2,"306":1,"308":2,"313":1,"316":1,"323":1,"332":2,"333":1,"334":3,"337":1,"343":1,"345":1,"347":2,"348":1,"349":1,"350":2,"353":1,"354":1,"364":1,"365":2,"368":2,"369":1,"370":3,"374":2,"380":1,"396":1,"407":1,"408":1,"409":1,"412":1,"415":2,"416":1,"434":3,"440":1,"441":1,"450":1,"455":2}}],["главным",{"2":{"267":1,"423":1,"473":1}}],["главных",{"2":{"203":1,"357":1,"373":1}}],["главный",{"2":{"26":1,"182":2,"224":1,"229":1,"243":1}}],["главной",{"2":{"178":1,"183":3}}],["главного",{"2":{"176":1,"183":1,"202":1,"224":1,"294":1,"343":1,"519":1}}],["главном",{"2":{"85":1,"97":1,"102":1,"178":1,"343":2,"440":1}}],["главное",{"2":{"2":1,"174":1,"183":1,"247":1,"325":1}}],["главную",{"2":{"7":1,"96":1,"182":1}}],["главная",{"0":{"183":1},"2":{"7":1,"33":1,"151":1,"182":2,"183":1,"250":1}}],["бюджетных",{"2":{"373":1}}],["бюджету",{"2":{"62":1}}],["бумажном",{"2":{"403":1}}],["булевские",{"2":{"343":1}}],["булево",{"2":{"207":2,"231":1,"255":1}}],["бухгалтерская",{"2":{"331":1}}],["буквы",{"2":{"216":1}}],["буквами",{"2":{"215":1,"218":1}}],["буква",{"2":{"144":1}}],["будто",{"2":{"270":2,"471":1}}],["будь",{"2":{"158":1,"237":1,"336":1}}],["будем",{"2":{"18":1,"22":1,"25":1,"41":1,"56":1,"58":1,"74":1,"86":1,"95":1,"109":1,"140":1,"144":1,"150":1,"171":1,"199":1,"200":1,"201":1,"202":2,"203":2,"204":3,"211":1,"213":1,"218":1,"219":1,"221":3,"222":2,"223":1,"224":1,"226":1,"227":3,"231":1,"232":1,"237":1,"249":1,"250":2,"251":1,"252":1,"254":1,"255":1,"263":1,"271":1,"272":1,"281":1,"292":1,"297":1,"300":3,"301":1,"303":2,"304":3,"310":1,"311":1,"322":2,"323":1,"331":1,"338":4,"344":2,"347":1,"349":1,"353":3,"355":1,"360":1,"364":2,"366":2,"375":1,"376":2,"381":2,"421":2,"439":2,"440":3,"441":1,"442":1,"443":1,"446":1,"447":1}}],["будете",{"2":{"199":1,"225":1,"300":1,"306":1,"334":1,"432":1,"434":1,"473":1}}],["будет",{"0":{"73":1},"2":{"2":1,"3":2,"6":3,"11":2,"12":3,"16":1,"17":2,"22":1,"25":1,"29":5,"34":1,"36":1,"39":1,"40":2,"41":5,"47":1,"59":1,"62":1,"67":1,"70":2,"72":1,"73":1,"74":1,"79":1,"86":1,"92":1,"95":1,"97":1,"104":1,"105":1,"112":1,"114":1,"115":2,"117":1,"118":1,"123":1,"134":5,"135":4,"136":2,"137":4,"139":1,"143":2,"145":1,"150":2,"170":3,"171":3,"175":1,"178":1,"182":1,"188":1,"200":2,"201":3,"202":2,"204":2,"206":2,"207":3,"208":1,"209":1,"210":1,"211":1,"212":1,"221":1,"222":1,"223":5,"224":6,"226":1,"227":2,"228":1,"229":2,"230":3,"231":8,"238":1,"239":5,"243":2,"244":3,"245":1,"246":2,"247":1,"249":3,"251":1,"254":4,"255":3,"265":1,"280":1,"281":1,"285":1,"290":2,"291":1,"293":1,"296":2,"297":2,"301":2,"302":4,"303":3,"304":1,"310":1,"311":4,"313":9,"316":4,"317":1,"318":1,"319":1,"323":1,"324":2,"325":5,"326":1,"329":3,"330":2,"331":4,"336":4,"343":5,"344":2,"345":1,"346":2,"350":1,"351":2,"354":1,"355":1,"356":1,"358":1,"359":5,"363":1,"364":1,"365":1,"366":3,"367":1,"373":1,"374":1,"375":1,"376":2,"380":1,"382":1,"383":2,"390":7,"391":1,"393":1,"394":2,"409":1,"421":1,"429":1,"433":1,"434":1,"436":6,"437":1,"439":1,"440":2,"442":2,"443":3,"444":1,"446":1,"447":2,"448":1,"449":2,"450":1,"451":3,"452":1,"454":3,"461":3,"462":2,"471":1,"473":2,"503":2,"539":1}}],["будучи",{"2":{"295":1,"301":1,"302":1}}],["будущим",{"2":{"400":1}}],["будущими",{"2":{"230":1}}],["будущих",{"2":{"5":1,"409":1}}],["будущего",{"2":{"506":1}}],["будущее",{"2":{"212":1}}],["будущем",{"2":{"22":1,"86":1,"165":1,"200":1}}],["буду",{"2":{"4":1,"222":1}}],["будут",{"2":{"2":1,"4":1,"11":1,"16":2,"44":1,"47":1,"73":1,"95":1,"109":1,"122":1,"136":1,"141":1,"152":1,"157":1,"176":1,"201":1,"204":1,"208":1,"212":1,"215":1,"218":1,"221":1,"224":2,"225":1,"227":2,"231":2,"237":3,"239":2,"240":2,"244":1,"249":1,"251":1,"254":1,"255":1,"261":1,"268":1,"294":1,"297":1,"310":2,"311":2,"313":1,"315":1,"317":1,"318":2,"319":3,"324":1,"327":1,"336":2,"339":1,"343":1,"344":2,"345":1,"355":1,"356":1,"364":1,"370":1,"373":2,"378":1,"379":1,"380":1,"387":1,"391":1,"393":2,"401":1,"421":1,"446":2,"448":2,"460":1,"501":1}}],["бэджем",{"2":{"105":1}}],["бэдж",{"2":{"105":1}}],["бэджик",{"0":{"105":1},"2":{"105":1}}],["бэджиком",{"2":{"102":1}}],["бэкэнд",{"2":{"331":2}}],["бэке",{"2":{"118":1,"463":2}}],["бэкендов",{"2":{"41":1}}],["бэкендом",{"0":{"113":1},"1":{"114":1},"2":{"41":1,"76":1,"114":2,"117":1,"329":1,"479":1,"512":1}}],["бэкенду",{"2":{"11":1,"38":1,"114":1,"511":2}}],["бэкенде",{"2":{"10":1,"44":1,"109":1,"118":1,"329":1,"330":1,"473":2}}],["бэкенд",{"0":{"115":1},"2":{"6":2,"11":1,"12":2,"17":1,"41":2,"47":1,"59":1,"79":1,"115":5,"116":5,"117":2,"324":1,"328":1,"329":1,"330":1,"422":1,"434":1,"461":1,"463":1,"507":1,"512":1,"542":1}}],["бэкенда",{"2":{"3":1,"13":1,"40":1,"41":1,"59":1,"83":1,"115":1,"117":2,"325":1,"330":1,"425":1,"472":1}}],["бэком",{"2":{"118":1}}],["бэкапов",{"2":{"421":1}}],["бэкапить",{"2":{"421":1}}],["бэкапа",{"2":{"65":1}}],["бэка",{"2":{"115":1,"116":1,"463":1}}],["бэк",{"2":{"114":1,"115":1,"116":2,"433":1}}],["боялся",{"2":{"473":1}}],["бояться",{"2":{"125":1}}],["бо́льшая",{"2":{"463":1}}],["бойскаута",{"2":{"270":1}}],["бойлерплейтов",{"2":{"507":1}}],["бойлерплейта",{"2":{"463":1}}],["бойлерплейт",{"2":{"44":1}}],["боковую",{"2":{"181":1,"311":1,"319":1}}],["боковым",{"2":{"423":1,"425":2}}],["боковых",{"2":{"176":1,"177":1}}],["боковые",{"2":{"173":1}}],["боковой",{"2":{"176":1,"178":2,"183":1,"311":1,"316":1,"527":1}}],["бонусная",{"0":{"147":1},"1":{"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1},"2":{"417":1}}],["бонусами",{"2":{"116":1}}],["бороться",{"2":{"116":1}}],["бота",{"2":{"472":2}}],["ботов",{"2":{"472":1}}],["бот",{"0":{"90":1},"2":{"90":1}}],["богатым",{"2":{"56":1}}],["большая",{"2":{"137":1,"151":1,"200":1,"473":1}}],["большом",{"2":{"228":1,"302":1}}],["большому",{"2":{"134":1}}],["большого",{"2":{"200":1,"222":1,"238":1,"328":1}}],["большое",{"2":{"123":1,"124":1,"150":1,"157":1,"158":1,"178":2,"189":1,"264":1,"269":1,"292":1,"328":2,"332":1,"364":1}}],["большой",{"2":{"79":1,"147":1,"204":1,"227":2,"263":1,"271":1,"308":1}}],["большую",{"2":{"63":1,"125":1,"228":1,"269":1,"300":1,"302":1,"308":1,"463":1}}],["больших",{"2":{"204":1,"208":2,"349":1,"383":1,"421":1,"436":1,"461":1,"463":3,"519":1}}],["большинстве",{"2":{"200":1,"225":1,"244":1,"302":2,"323":1,"324":1,"331":1,"336":1,"460":1,"472":1,"536":1}}],["большинства",{"2":{"181":1,"287":1,"300":1}}],["большинством",{"2":{"385":1}}],["большинство",{"2":{"39":1,"47":1,"115":2,"150":2,"152":2,"178":2,"183":1,"186":1,"199":1,"222":1,"251":1,"268":1,"308":1,"322":1,"324":1,"331":1,"378":1,"473":1}}],["больший",{"2":{"144":1,"244":1}}],["большим",{"2":{"137":1,"178":1,"181":1,"203":1,"331":1,"460":1,"461":2}}],["большими",{"2":{"115":1,"167":1,"183":1,"278":1,"463":1}}],["большие",{"2":{"40":1,"116":1}}],["большей",{"2":{"161":1,"200":1,"204":1,"239":1,"260":1}}],["большее",{"2":{"134":1,"325":1}}],["больше",{"0":{"123":1},"2":{"10":1,"47":1,"124":1,"143":1,"149":1,"156":2,"157":1,"158":1,"171":1,"174":1,"176":1,"201":1,"208":1,"212":1,"213":1,"248":1,"263":1,"267":1,"271":1,"276":1,"292":1,"302":2,"306":1,"317":1,"325":1,"330":1,"336":3,"343":1,"349":1,"364":2,"402":1,"433":2,"436":2,"439":1,"441":1,"460":1,"463":2,"472":2,"473":2}}],["более",{"2":{"2":2,"13":1,"14":1,"39":1,"41":1,"62":1,"74":1,"99":1,"105":2,"116":1,"117":2,"118":1,"119":1,"120":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":2,"137":1,"149":2,"152":2,"156":1,"157":2,"161":1,"163":1,"165":1,"178":2,"191":1,"197":1,"200":1,"201":2,"203":1,"204":3,"209":1,"210":1,"218":1,"221":2,"223":2,"224":2,"226":1,"227":1,"228":1,"232":4,"241":2,"242":1,"244":1,"245":1,"246":1,"247":1,"249":1,"251":1,"258":2,"260":1,"263":1,"268":1,"279":1,"281":1,"289":1,"294":1,"295":1,"296":1,"297":2,"300":2,"303":5,"308":4,"316":2,"317":2,"323":2,"330":2,"332":1,"336":2,"344":2,"345":2,"353":1,"358":1,"361":1,"363":1,"364":3,"370":3,"373":2,"376":2,"380":1,"393":1,"394":1,"400":2,"421":1,"423":1,"425":1,"429":1,"432":1,"439":2,"440":1,"445":1,"460":2,"462":1,"463":3,"464":1,"473":2,"527":1}}],["бешено",{"2":{"433":1}}],["бета",{"2":{"395":1}}],["берем",{"2":{"366":1}}],["берет",{"2":{"309":1}}],["бегло",{"2":{"202":1}}],["беглый",{"2":{"182":1}}],["бене",{"2":{"158":1}}],["бен",{"2":{"158":1}}],["бена",{"0":{"158":1}}],["бесконечна",{"2":{"170":1}}],["бесконечного",{"2":{"170":3}}],["бесконечный",{"0":{"170":1},"1":{"171":1},"2":{"170":2,"171":1}}],["бесконечными",{"2":{"156":1}}],["бесполезное",{"2":{"539":1}}],["бесполезно",{"2":{"473":1}}],["бесполезными",{"2":{"473":1}}],["беспокоиться",{"2":{"224":1,"298":1,"390":1,"454":1}}],["беспокойство",{"2":{"168":1}}],["беспарольными",{"2":{"330":1}}],["беспарольный",{"2":{"329":1}}],["беспарольная",{"0":{"329":1},"2":{"329":1}}],["бесплатными",{"2":{"422":1}}],["бесплатных",{"2":{"189":1,"195":1,"328":1}}],["бесплатный",{"2":{"144":1,"222":1,"226":1,"227":1,"337":1}}],["бесплатные",{"2":{"115":3,"422":1,"473":2}}],["бесплатная",{"2":{"89":1,"144":1,"222":2}}],["бесплатно",{"2":{"222":2,"301":1,"473":1}}],["бесплатной",{"2":{"201":1}}],["бесплатное",{"2":{"195":1}}],["бесплатного",{"2":{"40":1,"145":1,"188":1}}],["бесплатность",{"2":{"39":1}}],["белое",{"2":{"151":1}}],["белого",{"2":{"151":1}}],["безвозвратно",{"2":{"457":1,"460":1}}],["безусловно",{"2":{"303":1}}],["безымянном",{"2":{"249":1}}],["безопасен",{"2":{"159":1}}],["безопасные",{"2":{"336":1}}],["безопасны",{"2":{"300":1}}],["безопасным",{"2":{"144":1,"308":1,"330":1}}],["безопасного",{"2":{"325":1}}],["безопасной",{"2":{"244":1}}],["безопасности",{"2":{"59":1,"62":1,"116":2,"133":1,"144":3,"257":1,"267":1,"325":1,"329":1,"330":2,"332":1,"333":1,"449":1,"454":1,"464":1}}],["безопасностью",{"2":{"268":1}}],["безопасность",{"0":{"59":1},"2":{"63":1,"77":1,"116":3,"324":1,"329":1}}],["безопасную",{"2":{"143":1}}],["безболезненного",{"2":{"23":1}}],["без",{"2":{"12":1,"23":2,"71":1,"115":2,"125":1,"134":1,"149":1,"152":1,"158":1,"168":1,"189":1,"200":1,"222":3,"226":1,"228":1,"231":1,"256":1,"263":1,"282":1,"290":1,"297":1,"300":1,"302":1,"308":2,"309":1,"313":1,"319":1,"325":3,"327":1,"335":1,"339":1,"343":1,"344":1,"345":1,"364":1,"393":1,"394":1,"419":1,"424":1,"425":2,"431":1,"433":1,"461":1,"462":1,"463":2,"471":1,"472":1,"473":2,"501":1,"504":2,"507":1,"511":1,"537":1,"548":1,"553":1,"554":1}}],["брейкпойнт",{"2":{"509":1}}],["бремя",{"2":{"345":1,"372":1}}],["брендом",{"2":{"159":1}}],["бренда",{"2":{"149":1,"556":1}}],["бренды",{"2":{"16":1}}],["брали",{"2":{"421":1}}],["брату",{"2":{"353":1}}],["брать",{"2":{"344":1,"463":1}}],["братьями",{"2":{"316":1,"349":1}}],["братья",{"2":{"239":1}}],["браузеру",{"2":{"244":1,"338":1,"432":1,"436":1}}],["браузеры",{"2":{"125":2,"130":1,"161":1,"280":1,"364":3,"422":1,"436":1,"460":1,"472":1}}],["браузерные",{"2":{"308":1,"334":1}}],["браузерных",{"2":{"125":1,"331":1,"434":1}}],["браузерными",{"2":{"104":1}}],["браузере",{"2":{"123":1,"125":1,"183":1,"201":1,"202":1,"223":4,"231":1,"300":1,"308":1,"311":2,"313":1,"325":1,"331":1,"339":1,"342":2,"343":1,"344":1,"346":1,"364":3,"374":1,"378":1,"384":1,"429":1,"436":1,"449":1,"472":3,"502":1,"555":1}}],["браузером",{"2":{"116":1,"421":1,"455":1,"472":1}}],["браузеров",{"2":{"86":1,"125":1,"323":1,"331":1}}],["браузер",{"2":{"116":1,"117":3,"202":4,"203":1,"222":1,"228":1,"244":1,"257":1,"302":1,"308":1,"336":1,"364":2,"402":1,"436":3,"461":1}}],["браузерах",{"2":{"125":1,"223":1,"346":1,"363":1,"364":1}}],["браузерами",{"0":{"125":1},"2":{"86":1,"119":1,"125":2,"161":1,"170":1,"199":1,"336":1,"349":1,"368":1}}],["браузера",{"0":{"364":1},"2":{"50":1,"117":2,"166":1,"174":1,"199":1,"202":1,"222":1,"282":1,"300":1,"301":2,"322":1,"331":1,"334":1,"336":2,"339":2,"343":1,"344":1,"346":1,"364":2,"367":1,"378":1,"379":1,"380":1,"381":1,"434":1,"436":1,"472":1,"545":1,"554":1}}],["бросают",{"2":{"182":1}}],["бригаду",{"2":{"26":1}}],["билдом",{"2":{"461":1}}],["билдер",{"0":{"505":1},"1":{"506":1,"507":1},"2":{"506":1}}],["билде",{"2":{"429":1}}],["билда",{"2":{"65":1,"419":1,"421":2,"422":1,"432":1,"508":1,"540":1,"542":1}}],["бинарные",{"2":{"391":1}}],["битная",{"2":{"387":1}}],["библиотекой",{"2":{"220":1,"225":1,"462":1,"465":1}}],["библиотеками",{"2":{"507":1}}],["библиотекам",{"2":{"277":1}}],["библиотека",{"2":{"200":4,"276":1,"323":2,"446":1,"449":2,"460":1,"462":4,"465":1,"536":1}}],["библиотеках",{"2":{"161":1,"359":1}}],["библиотеку",{"0":{"457":1},"2":{"23":1,"56":2,"114":1,"200":2,"225":1,"323":3,"331":1,"344":1,"401":1,"446":1,"449":1,"462":1,"464":1,"466":1,"471":1,"504":1}}],["библиотеки",{"0":{"471":1},"2":{"23":1,"199":1,"200":3,"202":1,"203":1,"224":1,"225":1,"227":1,"231":1,"233":1,"234":2,"300":2,"331":1,"336":1,"373":2,"380":1,"423":1,"432":1,"434":1,"446":1,"449":1,"450":1,"458":1,"463":1,"466":1,"471":4,"504":2,"555":1}}],["библиотек",{"0":{"466":1},"2":{"23":2,"199":1,"200":2,"219":1,"225":4,"229":1,"233":1,"266":1,"300":1,"327":1,"328":1,"331":1,"364":3,"400":1,"431":1,"446":2,"457":1,"468":1,"471":7,"504":1,"508":1,"544":1}}],["бизнесом",{"2":{"507":1}}],["бизнеса",{"2":{"62":2}}],["бизнес",{"0":{"8":1,"62":1},"1":{"9":1,"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"14":1,"16":1,"61":1,"63":1,"115":1,"232":1,"250":1,"256":3,"268":1,"359":1,"373":1,"436":1,"440":3,"462":5,"463":1,"506":1,"507":1,"508":1,"511":1}}],["бд",{"2":{"17":2,"39":1,"44":1,"56":1,"462":1}}],["бывают",{"2":{"265":1,"267":1,"334":1,"461":1}}],["бывает",{"2":{"50":1,"118":1,"172":1,"185":1,"265":1,"271":1,"462":1}}],["быстр",{"2":{"446":1}}],["быстрей",{"2":{"432":1,"433":1,"463":1,"468":1}}],["быстрее",{"2":{"125":1,"336":1,"432":1}}],["быстрая",{"2":{"170":1,"308":1,"364":1,"446":1}}],["быстрые",{"2":{"336":1}}],["быстрым",{"2":{"178":1,"223":1,"308":1}}],["быстрых",{"2":{"158":1}}],["быстрый",{"2":{"48":1,"137":2,"203":1,"433":1,"436":1}}],["быстрой",{"2":{"166":1,"436":1}}],["быстро",{"2":{"130":2,"158":1,"170":1,"200":1,"220":1,"223":1,"265":2,"267":1,"383":1,"385":1,"464":1,"471":1,"507":3,"508":1}}],["быстрого",{"2":{"17":1,"23":1,"461":1}}],["была",{"2":{"122":1,"125":1,"127":1,"151":1,"224":2,"226":1,"231":1,"253":1,"296":1,"302":1,"306":1,"393":1,"460":1,"471":1,"472":1}}],["были",{"2":{"39":2,"71":1,"126":1,"128":1,"150":1,"155":1,"167":1,"199":3,"240":1,"244":1,"255":1,"319":1,"322":1,"328":1,"343":1,"363":1,"376":1,"377":1}}],["было",{"2":{"9":1,"10":2,"12":2,"47":2,"86":1,"132":1,"134":1,"147":1,"165":1,"169":1,"212":1,"247":1,"263":1,"288":1,"295":1,"296":1,"297":1,"301":4,"304":1,"308":2,"317":1,"330":1,"331":1,"343":1,"358":1,"375":1,"378":2,"381":1,"383":1,"384":1,"385":1,"386":1,"391":1,"393":2,"394":1,"425":1,"460":2,"462":1,"463":3,"504":1}}],["был",{"2":{"9":1,"12":1,"71":1,"89":1,"103":1,"125":1,"127":1,"134":1,"187":1,"200":1,"218":1,"223":1,"224":1,"228":1,"269":1,"280":1,"284":1,"319":1,"329":1,"353":1,"366":1,"386":1,"393":1,"422":2,"445":1,"447":1,"462":2,"472":1,"528":1}}],["бы",{"2":{"9":2,"12":3,"22":1,"83":1,"105":1,"116":1,"131":2,"134":1,"141":1,"145":1,"152":2,"168":1,"196":1,"222":2,"232":1,"235":1,"251":1,"257":1,"259":1,"263":1,"268":3,"284":2,"287":3,"295":1,"296":3,"300":1,"301":4,"309":1,"322":1,"323":1,"330":1,"341":1,"359":1,"363":1,"365":1,"370":1,"374":1,"376":1,"378":3,"381":1,"383":1,"394":1,"436":1,"437":1,"445":1,"462":1,"473":2}}],["быть",{"0":{"152":1},"2":{"2":2,"3":1,"17":1,"44":1,"47":1,"48":1,"61":1,"76":2,"86":1,"95":1,"96":1,"98":1,"105":1,"109":1,"116":1,"119":1,"122":1,"123":2,"124":1,"125":2,"134":3,"144":1,"151":1,"154":1,"156":1,"159":2,"163":1,"165":1,"166":1,"167":2,"168":1,"172":1,"178":2,"179":1,"185":1,"196":1,"200":3,"202":1,"203":1,"204":3,"207":1,"208":1,"211":1,"212":3,"227":1,"228":1,"235":1,"239":1,"241":1,"244":1,"245":2,"246":1,"247":3,"251":1,"256":2,"263":3,"266":2,"268":1,"269":1,"281":1,"289":1,"293":1,"294":2,"295":2,"297":2,"301":1,"303":1,"304":1,"308":1,"310":1,"319":1,"324":1,"325":3,"329":1,"330":1,"331":1,"332":1,"334":1,"335":1,"338":4,"342":1,"343":6,"344":1,"350":1,"354":1,"358":2,"360":1,"361":1,"364":4,"365":1,"366":1,"372":2,"373":1,"375":3,"376":1,"382":1,"385":1,"388":1,"393":1,"400":1,"421":4,"423":1,"425":4,"429":1,"436":5,"437":4,"440":1,"447":1,"452":2,"454":1,"460":1,"461":1,"467":1,"472":3,"473":3,"497":1,"507":1,"508":1,"554":1}}],["блестящих",{"2":{"405":1}}],["ближе",{"2":{"204":1}}],["близка",{"2":{"300":1}}],["близко",{"2":{"154":1,"472":1}}],["близость",{"0":{"154":1}}],["близости",{"2":{"153":1,"154":1}}],["блогов",{"2":{"308":2}}],["блог",{"2":{"116":1,"506":1,"507":1,"508":1}}],["блокчейне",{"2":{"331":1}}],["блокчейном",{"2":{"331":3}}],["блокчейнов",{"2":{"308":1,"331":1}}],["блокчейнами",{"2":{"331":1}}],["блокчейна",{"2":{"331":2}}],["блокчейну",{"2":{"331":2}}],["блокчейны",{"2":{"331":2}}],["блокчейн",{"2":{"331":3}}],["блоков",{"2":{"231":1,"508":1}}],["блоком",{"2":{"141":1}}],["блока",{"2":{"86":1,"231":2,"319":1,"372":1,"377":1,"433":1}}],["блок",{"2":{"86":1,"303":1}}],["блоке",{"2":{"22":1,"231":1,"330":1}}],["блокирующими",{"2":{"436":1}}],["блокируют",{"2":{"301":1}}],["блокировка",{"2":{"364":1}}],["блокировать",{"2":{"364":1}}],["блоки",{"2":{"4":1,"202":1,"242":1,"508":1}}],["благополучия",{"2":{"405":1}}],["благодарю",{"2":{"405":1}}],["благодаря",{"2":{"134":1,"140":1,"158":1,"160":1,"161":1,"176":1,"178":1,"231":1,"246":1,"300":1,"308":1,"448":1,"472":1}}],["благо",{"2":{"102":1}}],["благозвучно",{"2":{"2":1}}],["багов",{"2":{"372":2}}],["баги",{"2":{"2":1,"464":1}}],["байт",{"2":{"364":1}}],["бара",{"2":{"168":1}}],["бары",{"2":{"168":1}}],["балансировщика",{"2":{"140":1}}],["баннер",{"2":{"343":2}}],["баннеры",{"2":{"4":1}}],["банк",{"2":{"330":1}}],["бандла",{"2":{"429":1,"465":1}}],["бандл",{"2":{"115":1,"429":1,"460":1,"471":1,"540":1}}],["бандлер",{"2":{"280":1}}],["бандлеры",{"2":{"280":1}}],["бандле",{"2":{"59":1,"432":1}}],["базой",{"2":{"282":1,"394":1,"434":1,"448":1}}],["базовая",{"2":{"351":1}}],["базовую",{"2":{"225":1,"291":1,"464":1}}],["базового",{"0":{"357":1},"1":{"358":1},"2":{"221":1,"229":1,"349":1,"356":1,"380":1}}],["базовом",{"2":{"200":1,"323":1,"351":1,"359":1,"473":1}}],["базовое",{"2":{"199":1}}],["базовой",{"2":{"161":1,"239":1,"339":1,"409":1}}],["базовые",{"2":{"251":1,"374":1,"401":1}}],["базовым",{"2":{"224":1,"374":1,"444":1}}],["базовый",{"0":{"374":1},"2":{"135":1,"136":1,"223":1,"345":1,"357":1}}],["базовых",{"2":{"85":1,"202":1,"222":1,"246":1,"344":1,"400":1}}],["базе",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1},"2":{"40":1,"59":1,"83":1,"115":3,"125":2,"287":1,"300":1,"324":2,"445":1,"455":1,"462":1}}],["базы",{"2":{"17":2,"39":1,"115":1,"182":1,"319":1,"324":1,"364":3,"391":1,"446":2,"447":1,"448":1}}],["базу",{"2":{"17":2,"40":2,"56":1,"59":1,"115":1,"336":1,"364":2,"446":1,"448":1}}],["баз",{"0":{"17":1},"1":{"18":1,"19":1},"2":{"17":1,"48":2,"364":1,"373":1}}],["базам",{"2":{"433":1}}],["базами",{"2":{"372":1,"434":1}}],["базах",{"2":{"43":1,"44":1,"47":1}}],["база",{"2":{"6":2,"41":1,"79":1,"256":1,"336":1,"364":1,"433":1,"434":1,"442":1,"446":3,"462":1}}],["synctex",{"2":{"433":1}}],["system",{"2":{"385":2}}],["sftp",{"2":{"433":1}}],["sfc",{"2":{"86":2,"203":3,"211":1,"212":1,"224":1,"378":1,"433":2,"463":1}}],["s3",{"2":{"422":1}}],["snickerbockers",{"2":{"421":2}}],["snake",{"2":{"44":1,"215":1}}],["smoothscrolling",{"2":{"433":1}}],["smart",{"2":{"331":1}}],["sms",{"2":{"330":2}}],["smith",{"2":{"123":1}}],["sans",{"2":{"557":1}}],["savenote",{"2":{"447":3}}],["save",{"2":{"345":1,"433":1}}],["saveprompt",{"2":{"343":2}}],["savedposition",{"2":{"313":1}}],["sass",{"2":{"86":1,"433":1}}],["svelte",{"2":{"308":1,"433":3,"463":2}}],["svgo",{"2":{"433":10}}],["svgresources",{"2":{"431":4}}],["svg",{"2":{"224":1,"345":1,"430":2,"431":3,"432":1,"433":2,"513":1}}],["square",{"2":{"290":4}}],["sql",{"2":{"17":3,"39":1,"59":1,"118":1,"421":1,"433":1,"446":1,"462":2,"473":1}}],["slidingheader",{"0":{"534":1}}],["slider",{"2":{"459":1}}],["sln",{"2":{"391":1}}],["slots",{"2":{"249":1}}],["slot=",{"2":{"249":4}}],["slot",{"2":{"249":8}}],["slot>",{"2":{"249":5,"255":2}}],["slug",{"2":{"97":1}}],["skeuomorphism",{"2":{"225":1}}],["ssg",{"0":{"472":1},"2":{"472":3}}],["ssd",{"2":{"433":1}}],["ss06",{"2":{"433":1}}],["ss03",{"2":{"433":1}}],["ss02",{"2":{"433":1}}],["ss01",{"2":{"433":1}}],["ssl",{"2":{"324":1,"337":1,"422":2}}],["ssr",{"0":{"472":1},"2":{"313":1,"391":1,"433":1,"462":2,"472":9}}],["ssh",{"2":{"143":1,"144":2,"421":14,"433":2}}],["sso",{"2":{"116":2}}],["s",{"0":{"144":1},"2":{"131":1,"143":1,"144":4,"145":1,"156":1,"337":1,"416":1,"421":1,"429":1,"432":1,"462":1,"511":1}}],["swagger",{"2":{"473":1}}],["swiper",{"2":{"459":1}}],["switch",{"2":{"162":1,"256":2,"290":1,"294":1,"296":1}}],["sw",{"2":{"112":2,"391":1,"472":1,"496":1}}],["scs",{"2":{"385":1,"386":2}}],["scss",{"0":{"86":1},"2":{"23":1,"86":5,"430":1,"433":1,"504":1,"509":2,"557":1}}],["sc",{"2":{"385":1}}],["scope",{"2":{"326":2,"554":1}}],["scoped",{"2":{"203":2}}],["scoped>",{"2":{"169":1,"203":1,"230":1,"298":1,"363":1,"430":1}}],["scmitem",{"2":{"433":1}}],["scmgroupinline",{"2":{"433":1}}],["scmgroup",{"2":{"433":1}}],["scms",{"2":{"385":1}}],["scm",{"2":{"222":1,"433":2}}],["scaffolding",{"2":{"112":1,"224":1,"501":1}}],["scrollbehavior",{"2":{"313":1}}],["scrolly",{"2":{"250":2}}],["scroll",{"2":{"171":6,"250":2,"460":1}}],["scroller",{"2":{"170":1}}],["screenwidthfactor",{"2":{"509":1}}],["screenshots",{"2":{"341":1}}],["screen",{"0":{"556":1},"2":{"112":2,"181":1,"501":1,"506":2,"508":1,"518":1,"542":1}}],["scripts",{"2":{"224":1,"375":2,"421":1}}],["script>",{"2":{"103":1,"123":1,"169":1,"171":1,"201":3,"203":1,"204":5,"212":1,"230":1,"251":1,"255":1,"267":1,"298":1,"299":1,"316":1,"352":1,"353":1,"356":1,"358":1,"363":1,"367":1,"426":1,"430":1,"447":1,"452":1,"509":1,"513":1,"529":3,"538":1}}],["script",{"0":{"204":1},"2":{"103":1,"122":1,"123":1,"125":1,"130":1,"169":1,"171":1,"201":3,"203":2,"204":4,"212":1,"224":1,"225":3,"229":1,"230":3,"231":2,"243":1,"245":2,"246":1,"250":1,"251":1,"255":2,"267":2,"298":1,"299":1,"316":3,"322":1,"343":1,"352":1,"353":1,"356":1,"358":1,"361":1,"363":1,"367":1,"393":1,"421":2,"426":1,"430":1,"433":1,"447":1,"452":1,"460":1,"504":1,"509":1,"513":1,"529":1,"538":1}}],["src=",{"2":{"201":1,"206":1,"429":3,"430":1,"529":1}}],["src",{"0":{"136":1,"171":1,"313":1,"314":1,"319":1,"376":1,"380":1,"381":1,"447":1,"448":1,"449":1,"452":1},"2":{"95":1,"103":1,"136":1,"206":1,"224":2,"228":2,"230":1,"253":1,"255":5,"256":2,"310":1,"316":1,"339":1,"341":1,"345":3,"374":1,"375":5,"382":1,"429":1,"432":2,"518":1,"538":1}}],["srs",{"2":{"9":1,"63":1}}],["sb",{"2":{"83":3}}],["sdlc",{"2":{"61":1}}],["sdk",{"0":{"53":1},"1":{"54":1,"55":1},"2":{"53":1,"331":1}}],["social",{"2":{"429":1}}],["sockets",{"2":{"324":1}}],["solvery",{"2":{"473":1}}],["solana",{"2":{"331":1}}],["solid",{"2":{"169":1,"227":2,"231":3,"509":1}}],["software",{"0":{"77":1},"2":{"61":1,"63":1}}],["somearr",{"2":{"463":4}}],["someimage",{"2":{"429":1}}],["someid",{"2":{"171":1}}],["somecomponent",{"2":{"250":1}}],["somefunc",{"2":{"115":1}}],["somevalue",{"2":{"55":2,"56":2}}],["some",{"0":{"428":1},"2":{"55":2,"56":2,"244":1,"245":2,"249":2}}],["source",{"0":{"382":1,"385":1},"2":{"12":1,"39":1,"71":1,"300":1,"375":1,"385":3,"397":1,"421":1,"433":3,"499":1,"527":1}}],["seed",{"2":{"512":1}}],["sentry",{"2":{"433":2}}],["senddata",{"2":{"452":2}}],["send",{"2":{"445":1,"452":3}}],["sendrequest",{"2":{"444":4}}],["sendmessage",{"2":{"356":2}}],["sendtoserver",{"2":{"327":1,"328":2}}],["semi",{"2":{"433":1}}],["separate",{"2":{"433":1}}],["separation",{"0":{"263":1},"2":{"260":1}}],["serif",{"2":{"557":1}}],["series",{"2":{"376":3}}],["servers",{"2":{"402":1}}],["server",{"0":{"454":1},"2":{"117":3,"137":1,"141":1,"324":1,"421":3,"433":5,"454":1,"472":1}}],["serviceworker",{"2":{"344":2}}],["services",{"0":{"355":1,"366":1,"443":1,"445":1,"448":1,"450":1},"2":{"114":1,"256":1,"356":1,"358":1,"367":1,"374":1,"376":1,"440":1,"444":4,"445":1,"447":1,"449":2,"450":1,"451":2,"452":1,"511":1}}],["service",{"0":{"344":1,"358":1,"555":1},"2":{"39":1,"79":1,"112":2,"115":1,"218":1,"247":2,"325":1,"334":1,"336":1,"343":1,"344":5,"345":1,"348":1,"366":1,"433":1,"443":8,"444":3,"445":2,"448":2,"450":2,"472":3,"496":1,"501":1,"506":1,"518":1,"542":1,"553":1,"555":2}}],["session",{"0":{"367":1}}],["sessionstorage",{"0":{"366":1},"2":{"364":6,"365":2,"366":4,"367":3,"369":2}}],["sessionstore",{"2":{"364":1}}],["self",{"2":{"344":1,"438":4,"439":1,"444":2}}],["selected=ref",{"2":{"447":1}}],["selected",{"2":{"319":1,"447":4}}],["select",{"2":{"55":2,"59":1,"112":5,"179":1,"210":1,"471":2,"501":5}}],["select=id",{"2":{"51":2,"83":3}}],["select=",{"2":{"51":1,"56":1}}],["search",{"2":{"316":1,"433":1}}],["second",{"2":{"534":1}}],["seconds",{"2":{"329":3}}],["seconds=ref",{"2":{"329":1}}],["security",{"2":{"433":1}}],["secure",{"2":{"143":1,"144":1,"324":1}}],["section>",{"2":{"249":2,"352":2,"447":6,"452":4}}],["section",{"2":{"181":2,"469":1}}],["secrets",{"2":{"421":2}}],["secret",{"2":{"58":1,"325":3}}],["setlocale",{"2":{"538":2}}],["setlogoutcallback",{"2":{"114":1}}],["setoptions",{"2":{"512":1}}],["setsomearr",{"2":{"463":1}}],["settimeout",{"2":{"438":2,"445":1}}],["setting",{"2":{"421":1,"433":1}}],["settings",{"2":{"421":1,"433":1,"527":1}}],["settokencallback",{"2":{"114":1}}],["setvalue",{"2":{"381":2}}],["setimmediate",{"2":{"302":2,"303":1}}],["setitem",{"2":{"104":1,"364":2,"366":1,"421":1}}],["setdbmanager",{"2":{"287":1}}],["setbaseurl",{"2":{"114":1}}],["setup>",{"2":{"123":1,"169":1,"171":1,"203":1,"204":1,"212":1,"230":1,"251":1,"255":1,"267":1,"298":1,"299":1,"316":1,"352":1,"353":1,"356":1,"358":1,"363":1,"367":1,"426":1,"430":1,"447":1,"452":1}}],["setup",{"0":{"204":1},"2":{"103":1,"122":1,"125":1,"130":1,"203":1,"204":5,"229":1,"245":2,"246":1,"250":1,"255":1,"267":1,"316":1,"322":1,"361":1,"421":4,"433":1,"460":1,"462":1,"504":1,"509":1,"513":1,"538":1}}],["set",{"2":{"103":2,"104":2,"114":1,"296":2,"297":1,"366":2,"394":1,"427":1,"431":2}}],["seo",{"0":{"472":1},"2":{"79":1,"97":1,"472":1}}],["sponsors",{"2":{"433":1}}],["sp",{"2":{"325":1}}],["spec",{"2":{"375":1,"433":1}}],["specs",{"2":{"325":1}}],["special",{"2":{"212":1,"251":1}}],["specification",{"2":{"63":1}}],["splide",{"2":{"459":1}}],["splice",{"2":{"292":1}}],["splashscreen",{"2":{"501":1}}],["splash",{"0":{"556":1},"2":{"112":2,"501":1,"506":2,"508":1,"518":1,"542":1,"556":1}}],["spinnercomponent",{"2":{"244":2}}],["spinner",{"0":{"169":1},"2":{"169":2}}],["spree",{"2":{"41":1}}],["span>post",{"2":{"452":1}}],["span>get",{"2":{"452":1}}],["span>",{"2":{"103":1,"169":1,"209":1,"231":2,"352":2,"353":1,"452":2}}],["span",{"2":{"103":1,"163":1,"169":1,"209":2,"231":4,"353":1}}],["spa",{"0":{"136":1,"308":1,"336":1,"337":1,"472":1},"1":{"338":1,"339":1,"340":1,"341":1,"342":1,"343":1},"2":{"6":1,"116":1,"131":2,"135":1,"258":1,"306":3,"308":12,"309":1,"322":1,"323":1,"324":3,"325":2,"328":1,"330":4,"331":2,"332":1,"333":3,"334":3,"336":5,"341":1,"343":1,"344":3,"347":1,"348":1,"412":1,"472":11,"508":1}}],["success=false",{"2":{"444":1}}],["success",{"2":{"443":3,"444":2}}],["sum",{"2":{"433":2}}],["summary",{"2":{"83":4}}],["suggestselection",{"2":{"433":1}}],["suo",{"2":{"391":1}}],["sudo",{"2":{"388":4,"389":1,"421":3}}],["substring",{"2":{"431":2}}],["submodules",{"2":{"421":4,"423":1}}],["submit",{"2":{"329":1}}],["subversion",{"2":{"385":1}}],["sub",{"2":{"291":1,"295":1,"316":2,"317":1,"325":2}}],["sublime",{"2":{"222":1}}],["subtitle",{"2":{"17":1,"18":1}}],["suspense",{"2":{"212":1,"425":1}}],["sue",{"2":{"123":1}}],["surname",{"2":{"123":6}}],["supabase",{"0":{"40":1,"52":1,"53":1,"56":1,"57":1,"82":1},"1":{"53":1,"54":2,"55":2,"56":1,"58":1,"59":1,"83":1},"2":{"39":2,"40":2,"41":4,"51":4,"53":2,"54":2,"55":8,"56":10,"58":1,"59":2,"115":2,"473":1}}],["side",{"2":{"472":1}}],["sidebarlayout",{"2":{"425":2}}],["sidebar>",{"2":{"249":1,"316":2}}],["sidebars",{"2":{"173":1}}],["sidebar",{"0":{"30":1,"99":1},"2":{"28":1,"249":2,"316":8,"319":2}}],["siblings",{"2":{"349":1}}],["size",{"2":{"427":1,"430":5}}],["sizes",{"2":{"339":1,"341":1,"345":3}}],["size=",{"2":{"105":1,"429":1}}],["siri",{"2":{"149":1}}],["sites",{"0":{"141":1},"2":{"140":1}}],["site",{"2":{"117":3,"421":14,"472":1}}],["signinuser",{"2":{"329":2}}],["signature",{"2":{"325":2}}],["sign",{"2":{"116":1}}],["singlequote",{"2":{"433":1}}],["singleclick",{"2":{"433":1}}],["singleton",{"0":{"277":1,"354":1},"1":{"278":1,"279":1,"280":1,"281":1,"355":1,"356":1},"2":{"103":1,"260":1,"273":1,"280":2,"281":6,"287":1,"292":2,"305":1,"349":1,"354":1,"357":1}}],["single",{"0":{"265":1},"2":{"55":1,"116":1,"260":1,"472":1}}],["simplenavbar",{"0":{"550":1}}],["simpleheader",{"0":{"531":1}}],["simplefooter",{"0":{"521":1}}],["simpledrawer",{"0":{"515":1},"2":{"501":2,"516":1}}],["simpledialog",{"2":{"433":1}}],["simplestate",{"0":{"358":1},"2":{"358":1}}],["simple",{"0":{"269":1},"2":{"2":1,"260":1,"358":1,"433":4}}],["shims",{"2":{"433":1}}],["shift+f12",{"2":{"86":1}}],["shrinkwrap",{"2":{"433":2}}],["shnpx",{"2":{"432":1}}],["shpnpm",{"2":{"432":1}}],["shallowref",{"2":{"460":2}}],["shaking",{"2":{"431":1,"465":1}}],["shape2",{"2":{"290":2}}],["shape1",{"2":{"290":2}}],["sha",{"2":{"200":1}}],["shaming",{"0":{"194":1}}],["shared",{"2":{"137":1}}],["sharing",{"2":{"117":1,"454":1}}],["shortcuts",{"2":{"341":1}}],["short",{"0":{"269":1},"2":{"339":1,"341":1,"345":1,"554":1}}],["showdocumentation",{"2":{"433":1}}],["showsuggestionsassnippets",{"2":{"433":1}}],["showmessage",{"2":{"356":3}}],["showmodal",{"2":{"256":1}}],["show=",{"2":{"207":1,"231":2,"343":2}}],["show",{"0":{"207":1},"2":{"156":1,"207":1,"208":3,"212":1,"251":1,"255":6,"329":2}}],["shopping",{"2":{"12":1}}],["shell",{"2":{"143":1,"423":1,"433":1}}],["sheet",{"0":{"488":1},"1":{"489":1,"490":1,"491":1,"492":1,"493":1,"494":1},"2":{"17":1,"489":1,"490":1,"491":1,"492":4}}],["sh$",{"2":{"111":1,"112":2,"136":1,"223":3,"231":1,"310":1,"345":1,"374":2,"375":2,"376":1,"379":2,"383":1,"384":2,"388":2,"390":4,"391":2,"394":4,"446":1,"449":1,"453":2,"501":1,"502":1,"503":1,"506":1}}],["sh",{"2":{"54":1,"354":1,"359":1,"433":2}}],["shcurl",{"2":{"51":1,"56":1}}],["stylus",{"2":{"460":1}}],["stylelint",{"2":{"433":4}}],["styleci",{"2":{"433":2}}],["style=",{"2":{"299":1,"430":2}}],["stylesheet",{"2":{"226":1,"227":3}}],["styles",{"2":{"224":1,"226":1,"314":2}}],["style>",{"2":{"169":1,"203":1,"230":1,"298":1,"363":1,"430":1}}],["style",{"2":{"63":1,"169":1,"203":2,"230":2,"231":1,"298":1,"363":1,"430":1,"433":1,"473":2}}],["stoploading",{"2":{"427":2,"428":2}}],["storage",{"0":{"367":1},"2":{"367":1}}],["story",{"2":{"239":1,"433":1}}],["stores",{"0":{"361":1},"2":{"363":1,"448":1}}],["store",{"0":{"360":1},"2":{"14":1,"135":1,"222":1,"336":4,"349":1,"391":1,"462":4}}],["storefront",{"2":{"10":1,"41":1,"507":1}}],["steps",{"2":{"421":2}}],["study",{"2":{"336":1}}],["studio",{"2":{"222":1,"387":1,"394":1,"402":1}}],["stupid",{"2":{"2":1,"260":1}}],["stickyscroll",{"2":{"433":1}}],["sticky",{"2":{"173":1,"433":1,"531":1,"532":1,"533":1}}],["stackblitz",{"2":{"433":3}}],["stackable",{"2":{"297":1}}],["stash",{"2":{"433":3}}],["staging",{"2":{"391":1,"421":5}}],["staged",{"2":{"433":2}}],["stage",{"2":{"390":1,"391":1,"393":2}}],["standalone",{"2":{"339":2,"341":1,"345":1,"554":1}}],["starbucks",{"2":{"336":1}}],["startloading",{"2":{"427":2,"428":2}}],["startotptimer",{"2":{"329":2}}],["started",{"2":{"256":2}}],["start",{"2":{"150":1,"151":1,"156":1,"339":1,"341":1,"345":1,"374":1,"375":1,"554":1}}],["static",{"2":{"313":1,"429":1,"472":1}}],["status>=200",{"2":{"450":2}}],["status>200",{"2":{"329":1}}],["status",{"2":{"256":2,"324":1,"329":1,"391":1,"450":2}}],["states",{"2":{"317":1,"319":2}}],["stateful",{"2":{"250":1,"462":1}}],["state",{"0":{"127":1,"462":1},"2":{"102":2,"119":1,"317":2,"319":3,"323":1,"326":1,"327":1,"358":2,"360":7,"365":1,"433":1,"449":1,"462":5}}],["string>",{"2":{"427":1}}],["stringhelpers",{"2":{"423":1}}],["strings",{"2":{"320":1}}],["string",{"2":{"243":1,"245":3,"255":2,"326":2,"376":2,"427":1,"429":1,"430":6}}],["stringify",{"2":{"104":1,"364":1,"447":3}}],["strategies",{"2":{"158":1}}],["strong>child",{"2":{"367":1}}],["strong>counter",{"2":{"352":1}}],["strong>state",{"2":{"358":1}}],["strong>received",{"2":{"356":1}}],["strong>",{"2":{"123":4,"352":1,"356":1,"358":1,"367":1,"447":2}}],["strongly",{"2":{"91":1}}],["karma",{"2":{"433":10}}],["known",{"2":{"376":1}}],["komodo",{"2":{"222":1}}],["kobold",{"2":{"183":2}}],["keen",{"2":{"459":1}}],["keepalive",{"2":{"212":2}}],["keep",{"0":{"267":1,"269":1},"2":{"2":1,"260":2,"267":1,"292":1}}],["kebab",{"2":{"230":2}}],["keys",{"2":{"462":1}}],["keyup",{"2":{"231":2}}],["key=",{"2":{"171":1,"209":1,"231":2,"316":1,"319":1,"447":1}}],["keyframes",{"2":{"169":1}}],["key",{"0":{"209":1},"2":{"55":1,"56":6,"209":1,"212":1,"231":1,"247":3,"296":5,"320":2,"325":4,"421":9}}],["kic",{"0":{"267":1},"2":{"260":1,"267":1}}],["kit",{"2":{"23":1}}],["kiss",{"0":{"269":1},"2":{"2":1,"260":1,"269":2}}],["сэкономит",{"2":{"465":1}}],["сэкономить",{"2":{"400":1,"471":1}}],["сдвигает",{"2":{"436":1}}],["сдерживающим",{"2":{"324":1}}],["сделки",{"2":{"194":1}}],["сделав",{"2":{"449":1,"465":1}}],["сделанный",{"2":{"472":1}}],["сделан",{"2":{"447":1}}],["сделана",{"2":{"393":1}}],["сделаны",{"2":{"377":1}}],["сделано",{"2":{"232":1,"343":1,"391":1,"393":1}}],["сделал",{"2":{"270":1,"468":1}}],["сделали",{"2":{"232":2,"235":1,"308":1,"310":1,"390":1,"472":1}}],["сделайте",{"2":{"225":1,"327":1,"466":1,"473":2}}],["сделает",{"2":{"203":1,"218":1,"381":1}}],["сделаем",{"2":{"74":1,"97":1,"147":2,"235":1}}],["сделать",{"2":{"7":1,"11":1,"12":1,"25":1,"35":1,"71":1,"72":1,"82":1,"85":1,"115":3,"116":2,"135":1,"143":1,"145":1,"157":1,"186":1,"194":1,"223":1,"225":1,"227":2,"228":1,"232":3,"241":1,"255":1,"256":1,"257":1,"258":1,"270":2,"300":1,"309":1,"313":1,"316":1,"327":1,"328":1,"331":1,"337":1,"344":1,"349":1,"364":1,"391":1,"393":2,"394":1,"400":1,"422":1,"425":1,"436":3,"445":1,"460":2,"462":1,"463":1,"464":1,"472":1,"555":1}}],["сжатие",{"2":{"431":1}}],["сша",{"2":{"269":1}}],["сформировать",{"2":{"316":1}}],["сформулировал",{"2":{"158":1}}],["сферы",{"2":{"269":1}}],["сцену",{"2":{"240":1}}],["сцены",{"2":{"237":1}}],["сценарием",{"2":{"443":1}}],["сценариев",{"2":{"228":1,"332":1,"400":1}}],["сценариях",{"2":{"316":1,"319":1,"336":1}}],["сценариям",{"2":{"270":1}}],["сценария",{"2":{"121":1,"201":1,"234":1,"237":1,"377":1,"425":1,"437":1}}],["сценарий",{"0":{"526":1},"1":{"527":1,"528":1},"2":{"116":1,"344":1,"542":1}}],["сценарии",{"2":{"62":1,"234":1,"329":1,"336":2,"372":1,"545":1}}],["сюда",{"2":{"224":1,"496":1}}],["сбить",{"2":{"375":1}}],["сбивать",{"2":{"302":1}}],["сбивают",{"2":{"191":1}}],["сброса",{"2":{"231":1}}],["сбоя",{"2":{"344":1}}],["сбоку",{"2":{"164":1}}],["сбор",{"2":{"508":1}}],["сборник",{"2":{"431":1}}],["сборок",{"2":{"227":1,"395":1,"432":1}}],["сбора",{"2":{"149":1,"163":1,"311":1}}],["сборку",{"2":{"243":1,"395":1}}],["сборке",{"2":{"224":1,"225":1,"345":1,"364":1}}],["сборки",{"2":{"135":1,"201":1,"222":1,"228":1,"233":1,"345":1,"382":1}}],["сборка",{"0":{"432":1},"2":{"125":1,"201":1,"228":1,"421":1,"432":1}}],["сборщиков",{"2":{"224":1,"244":1}}],["сборщиком",{"2":{"124":1,"202":1,"203":1,"224":1,"228":1}}],["сборщики",{"2":{"202":1,"244":1}}],["сборщика",{"0":{"202":1},"2":{"127":1,"202":2,"203":1,"204":1,"221":2,"223":1,"345":1,"432":3,"504":1}}],["сборщик",{"2":{"119":1,"126":1,"201":1,"202":2,"203":1,"204":1,"224":2,"267":1,"401":1,"432":3}}],["схожих",{"2":{"373":1}}],["схожи",{"2":{"373":1,"463":1}}],["схожести",{"2":{"154":1}}],["схеме",{"2":{"293":1}}],["схема",{"2":{"109":1,"189":1,"193":1,"194":1,"195":1}}],["схемы",{"2":{"38":1,"183":1,"306":1,"319":1,"364":1}}],["схему",{"2":{"17":1,"140":1,"448":1}}],["сне",{"2":{"460":1}}],["снять",{"2":{"267":1,"292":1,"344":1,"472":1}}],["снятие",{"2":{"287":1}}],["снятии",{"2":{"231":1}}],["снятия",{"2":{"184":1}}],["сняты",{"2":{"128":1}}],["сначала",{"2":{"181":1,"199":1,"201":1,"202":1,"203":1,"204":1,"223":1,"232":1,"297":1,"301":1,"308":1,"312":1,"326":1,"329":1,"344":6,"357":1,"359":1,"374":1,"448":1}}],["снова",{"2":{"171":2,"212":1,"293":1,"296":1,"325":1,"329":1,"379":1}}],["сниппетов",{"2":{"542":1}}],["сниппет",{"2":{"302":2}}],["снизить",{"2":{"300":1,"325":1,"471":1}}],["снизу",{"2":{"29":1,"98":1}}],["снижает",{"2":{"472":1}}],["снижают",{"2":{"461":1}}],["снижаться",{"2":{"125":1}}],["снижением",{"2":{"200":1}}],["снимку",{"2":{"391":1}}],["снимке",{"2":{"151":1,"357":1}}],["снимок",{"2":{"319":1}}],["снимаем",{"2":{"267":1,"316":1,"345":1}}],["снимать",{"2":{"116":1}}],["снимаются",{"2":{"116":1}}],["считывать",{"2":{"462":1}}],["считывателем",{"2":{"330":1}}],["считывает",{"2":{"250":1,"513":1}}],["считаются",{"2":{"338":1}}],["считая",{"2":{"303":1}}],["считает",{"2":{"462":1}}],["считается",{"2":{"117":1,"144":1,"181":1,"183":1,"319":1,"325":1,"330":1,"331":1,"364":1,"473":1}}],["считаем",{"2":{"246":1,"454":1}}],["считаться",{"2":{"348":1}}],["считать",{"2":{"237":1,"338":1,"434":1,"441":1,"464":1}}],["счастливо",{"2":{"227":1}}],["счастью",{"2":{"144":1,"303":1}}],["счетчики",{"2":{"239":1}}],["счетчика",{"2":{"232":1,"351":1}}],["счетчик",{"2":{"223":1,"351":1,"353":1}}],["счет",{"2":{"123":1,"153":1,"200":1,"334":1}}],["сгорания",{"2":{"473":1}}],["сгенеренные",{"2":{"472":1}}],["сгенерировавшего",{"2":{"437":1}}],["сгенерированные",{"2":{"345":1}}],["сгенерированный",{"2":{"224":1}}],["сгенерировать",{"2":{"344":1,"422":1}}],["сгенерился",{"2":{"91":1}}],["сгенерить",{"2":{"89":1}}],["сгруппированы",{"2":{"293":1}}],["сгруппированные",{"2":{"263":1}}],["сгруппированных",{"2":{"263":1}}],["сгруппировать",{"2":{"123":1}}],["сгиба",{"2":{"183":1}}],["ссылаясь",{"2":{"381":1}}],["ссылается",{"2":{"366":1,"438":1}}],["ссылаемся",{"2":{"316":1}}],["ссылаемой",{"2":{"210":1}}],["ссылаются",{"2":{"296":1}}],["ссылающийся",{"2":{"225":1}}],["ссылаться",{"2":{"121":1,"204":2,"209":1,"224":2,"228":1,"231":1,"246":1,"292":1,"304":1,"381":1}}],["ссылок",{"2":{"174":1,"183":2,"267":2,"287":1,"316":1,"319":1}}],["ссылкой",{"2":{"182":1,"183":1}}],["ссылки",{"2":{"182":1,"183":1,"215":3,"221":1,"245":1,"247":1,"255":1,"264":1,"277":1,"316":1,"319":1,"322":1,"336":1,"360":1,"432":1,"436":1,"443":2}}],["ссылке",{"2":{"142":1,"204":1,"351":1,"436":1,"528":1}}],["ссылку",{"2":{"97":1,"136":1,"142":1,"171":3,"226":1,"281":2,"292":1,"316":1,"343":1,"364":1,"443":1}}],["ссылками",{"2":{"29":1,"33":1,"183":1,"247":1}}],["ссылка",{"0":{"182":1},"2":{"22":1,"97":1,"102":1,"123":1,"174":1,"182":2,"183":2,"245":1,"311":1,"443":1}}],["смартфоне",{"2":{"472":1}}],["смартфона",{"2":{"472":1}}],["смарт",{"2":{"331":1}}],["смог",{"2":{"382":1}}],["смогли",{"2":{"131":1,"152":1,"158":1}}],["смогло",{"2":{"71":1}}],["сможет",{"2":{"303":1,"436":1,"508":1}}],["сможете",{"2":{"222":1,"349":2,"468":1}}],["сможем",{"2":{"227":1,"263":1,"303":1,"361":1,"387":1,"448":1}}],["смонтируем",{"2":{"225":1}}],["смонтирован",{"2":{"204":1}}],["смонтировать",{"2":{"201":1,"380":1}}],["смесь",{"2":{"308":1}}],["смешивает",{"2":{"271":1,"463":1}}],["смешиваясь",{"2":{"154":1}}],["смена",{"2":{"536":1,"547":1}}],["смену",{"2":{"250":1,"463":1}}],["смене",{"2":{"41":1}}],["см",{"2":{"125":1,"173":1,"212":1,"239":1,"243":1,"256":1,"292":1,"326":1,"338":1,"354":1,"364":1,"393":1}}],["смысле",{"2":{"208":1,"269":1,"330":1,"462":1}}],["смысл",{"2":{"124":1,"168":1,"316":1,"472":1}}],["смысла",{"2":{"38":1,"187":1}}],["смыслом",{"2":{"16":1}}],["сродни",{"2":{"441":1}}],["срочным",{"2":{"165":2}}],["срока",{"2":{"134":1,"144":1}}],["срок",{"2":{"116":3,"144":1}}],["сроком",{"2":{"116":1}}],["сроков",{"2":{"62":1}}],["средних",{"2":{"358":1}}],["средним",{"2":{"291":1}}],["средний",{"2":{"291":3}}],["среднем",{"2":{"473":1}}],["средней",{"2":{"269":1}}],["среднего",{"2":{"200":2,"363":1,"473":1}}],["среда",{"2":{"223":1,"433":1}}],["средам",{"2":{"149":1,"269":1}}],["среде",{"2":{"197":1,"380":1}}],["среды",{"2":{"162":1,"176":1,"221":2,"250":1,"267":1,"301":1}}],["средствами",{"2":{"460":1,"471":1}}],["средствах",{"2":{"394":1}}],["средства",{"2":{"353":1,"394":3,"460":1,"461":1,"471":1}}],["средство",{"2":{"325":1,"432":1,"507":1}}],["средством",{"2":{"196":1}}],["средств",{"2":{"71":1,"137":1,"150":1,"188":1,"245":1,"330":1,"372":1}}],["среди",{"2":{"39":1,"222":2,"336":1,"360":1,"446":1,"461":1}}],["сработает",{"2":{"377":2}}],["срабатывание",{"2":{"376":1}}],["срабатывания",{"2":{"343":1}}],["срабатывают",{"2":{"313":1}}],["срабатывает",{"2":{"255":1,"303":1,"343":1,"437":2}}],["сравнится",{"2":{"472":1}}],["сравниваются",{"2":{"471":1}}],["сравним",{"2":{"120":1,"204":2}}],["сравнений",{"2":{"376":1}}],["сравнении",{"2":{"200":1}}],["сравнения",{"0":{"190":1},"2":{"255":1}}],["сравнению",{"2":{"124":1,"187":1,"199":1,"224":1,"256":1,"257":1,"308":1,"347":1,"363":1,"371":1,"540":1}}],["сравнение",{"2":{"4":1,"123":1,"190":1}}],["сразу",{"2":{"33":1,"71":1,"74":1,"82":1,"98":1,"116":1,"210":1,"211":1,"293":1,"303":1,"354":1,"429":1,"434":1,"472":2,"508":1,"553":1}}],["скилл",{"2":{"473":1}}],["скидка",{"2":{"109":1}}],["склонений",{"2":{"460":1,"536":1}}],["сквозные",{"2":{"381":1}}],["сквозном",{"2":{"381":1}}],["скажется",{"2":{"227":1}}],["скажем",{"2":{"59":1}}],["скачивает",{"2":{"421":1}}],["скачивания",{"2":{"195":1}}],["скачок",{"2":{"358":1}}],["скачайте",{"2":{"226":1,"227":1}}],["скачает",{"2":{"223":1}}],["скачать",{"0":{"404":1},"2":{"195":2,"227":1,"473":1}}],["сканируют",{"2":{"182":1}}],["сказать",{"2":{"152":1,"239":1,"322":1,"436":1,"463":1}}],["сказано",{"2":{"134":1,"331":1,"358":1}}],["скриншоты",{"2":{"436":1}}],["скриншота",{"2":{"317":1}}],["скриншот",{"2":{"311":1,"367":1}}],["скриншоте",{"2":{"195":1,"436":1}}],["скриптов",{"2":{"383":1}}],["скриптом",{"2":{"364":1}}],["скрипту",{"2":{"364":1}}],["скрипты",{"2":{"308":1,"436":1,"438":1,"439":1}}],["скрипте",{"2":{"255":2}}],["скриптами",{"2":{"472":1}}],["скриптам",{"2":{"461":1}}],["скрипта",{"2":{"224":1,"231":1,"255":1,"327":1,"345":2,"376":1,"437":1,"438":1,"472":1}}],["скрипт",{"2":{"115":2,"345":1,"437":1,"438":1}}],["скрываем",{"2":{"329":1}}],["скрывается",{"2":{"546":1}}],["скрывает",{"2":{"190":1,"207":1,"351":1}}],["скрывать",{"2":{"265":1}}],["скрываться",{"2":{"208":1}}],["скрывая",{"2":{"208":1}}],["скрывают",{"2":{"191":1,"208":1}}],["скрываются",{"2":{"176":1}}],["скрытых",{"2":{"390":1}}],["скрытый",{"2":{"390":1}}],["скрытым",{"2":{"351":1}}],["скрытые",{"0":{"192":1},"2":{"390":1}}],["скрытие",{"2":{"300":1}}],["скрытия",{"2":{"179":1,"208":1}}],["скрыто",{"2":{"208":1}}],["скрыта",{"2":{"190":1}}],["скрыть",{"2":{"178":1,"300":1,"440":1}}],["скролбара",{"2":{"519":1}}],["скролл",{"2":{"250":1}}],["скроллера",{"2":{"170":3}}],["скроллер",{"0":{"170":1},"1":{"171":1},"2":{"170":2,"171":1}}],["скромный",{"2":{"297":1}}],["скромного",{"2":{"297":1}}],["скромное",{"2":{"201":1,"386":1}}],["скроем",{"2":{"95":1}}],["скомпрометирован",{"2":{"325":1}}],["скомпоновать",{"2":{"232":1}}],["скомпилированным",{"2":{"143":1}}],["скомпилировать",{"2":{"143":1}}],["скобок",{"2":{"231":1}}],["скобки",{"2":{"201":1}}],["скопировано",{"2":{"246":1}}],["скопированы",{"2":{"224":1}}],["скопировать",{"2":{"227":1,"316":1}}],["скопируйте",{"2":{"227":1,"465":1}}],["сколько",{"2":{"134":1,"168":2,"209":1,"229":1,"301":1,"319":1,"329":1,"330":1,"364":1,"376":2,"432":1}}],["скоро",{"2":{"385":1}}],["скоростью",{"2":{"200":1,"446":1}}],["скорость",{"2":{"125":1,"429":1}}],["скорости",{"2":{"125":2,"308":1,"472":1}}],["скорее",{"2":{"134":1,"137":1,"436":1}}],["скорей",{"2":{"34":1,"462":1}}],["скоуп",{"2":{"62":1}}],["скелета",{"2":{"112":1}}],["скелет",{"2":{"11":1,"223":1,"507":1}}],["супротив",{"2":{"537":1}}],["суффиксальной",{"2":{"439":1}}],["суффикса",{"2":{"438":1,"443":1}}],["субд",{"2":{"386":1,"393":1}}],["субъективное",{"2":{"497":1}}],["субъекту",{"2":{"292":1}}],["субъекта",{"2":{"291":1,"325":1}}],["субъект",{"2":{"291":5,"292":2}}],["суть",{"2":{"297":1,"359":1}}],["сути",{"2":{"13":1,"105":1,"115":1,"116":1,"181":1,"260":1,"264":1,"287":1,"308":1,"460":1,"462":1}}],["сумме",{"2":{"187":1}}],["суммарный",{"2":{"239":1}}],["сумма",{"2":{"187":1,"192":1}}],["сумму",{"2":{"187":1}}],["существенные",{"2":{"463":1}}],["существенный",{"2":{"270":1,"356":1}}],["существенное",{"2":{"445":1}}],["существенно",{"2":{"302":1}}],["существовало",{"2":{"385":1}}],["существовать",{"2":{"268":1,"277":1,"372":1,"385":1}}],["существование",{"2":{"239":1}}],["существовавшие",{"2":{"128":1}}],["существует",{"2":{"122":1,"125":2,"134":3,"142":1,"143":1,"144":1,"146":1,"150":1,"174":1,"176":1,"199":1,"200":2,"201":1,"204":2,"225":1,"232":1,"239":1,"241":1,"249":1,"256":1,"264":1,"272":1,"276":2,"279":1,"281":2,"292":1,"297":1,"302":1,"310":1,"317":1,"325":3,"328":2,"331":3,"343":1,"344":1,"364":3,"372":1,"375":1,"436":1,"437":1,"449":1,"457":1,"507":1}}],["существующей",{"2":{"501":1}}],["существующего",{"2":{"473":1}}],["существующем",{"2":{"370":1}}],["существующих",{"2":{"12":1,"235":1}}],["существующие",{"0":{"10":1},"2":{"288":1}}],["существуют",{"2":{"62":1,"130":1,"134":1,"146":1,"167":1,"181":2,"200":2,"212":1,"227":1,"239":1,"249":1,"279":1,"300":1,"302":1,"328":1,"331":2,"364":1,"372":1,"373":1,"389":1,"391":1,"463":1}}],["сущность",{"2":{"295":2,"440":2,"462":1}}],["сущностей",{"2":{"16":1,"62":1}}],["сущности",{"0":{"43":1},"2":{"16":1,"23":1,"43":1,"295":2,"300":1,"325":1,"357":1,"440":1,"463":1}}],["сущностями",{"2":{"3":1,"62":2}}],["сабмодулями",{"2":{"423":1}}],["сабхедер",{"2":{"29":1}}],["сахара",{"2":{"361":1}}],["санитизации",{"2":{"232":1}}],["сайд",{"2":{"72":1}}],["сайдбара",{"2":{"548":1}}],["сайдбаром",{"2":{"546":1}}],["сайдбаре",{"2":{"99":1}}],["сайдбар",{"2":{"30":1,"33":2,"35":1,"95":1,"546":1,"548":1}}],["сайтом",{"2":{"193":1,"473":1,"496":1}}],["сайтов",{"2":{"134":3,"183":1,"306":1,"308":1,"472":1}}],["сайту",{"2":{"116":1,"134":1,"309":1,"331":1,"344":1,"422":2}}],["сайте",{"2":{"48":1,"56":1,"115":1,"116":1,"140":1,"173":1,"178":1,"195":2,"226":2,"227":2,"250":1,"325":1,"363":1,"403":1,"405":1,"432":1,"439":1,"460":1,"462":1,"472":1,"473":1,"536":1}}],["сайт",{"0":{"80":1},"2":{"26":1,"80":1,"112":2,"116":1,"144":1,"178":1,"190":1,"195":1,"222":5,"223":6,"224":2,"227":2,"229":1,"308":3,"325":1,"383":2,"394":1,"419":1,"421":1,"422":4,"423":1,"436":1,"464":1,"472":2,"473":2,"507":1,"527":1,"528":1}}],["сайты",{"0":{"22":1},"2":{"22":1,"115":1,"167":1,"364":1,"434":1}}],["сайтами",{"2":{"325":1,"472":1}}],["сайтах",{"2":{"85":1,"98":1,"176":1,"178":1,"195":1,"265":1}}],["сайта",{"0":{"25":1},"2":{"9":1,"25":2,"26":1,"27":1,"39":1,"116":4,"131":1,"133":2,"140":1,"145":1,"147":1,"152":1,"153":1,"167":1,"174":1,"176":1,"177":1,"180":1,"181":1,"183":1,"195":1,"222":1,"226":2,"227":1,"325":1,"374":1,"387":1,"421":2,"460":1,"461":1,"463":1,"464":1,"472":3,"506":1,"508":2,"527":1,"536":2}}],["сама",{"2":{"158":1,"168":1,"340":1,"370":1}}],["самая",{"2":{"130":1,"388":1,"423":1,"436":1}}],["самых",{"2":{"170":1,"256":1,"277":1,"332":1}}],["самыми",{"2":{"344":1}}],["самым",{"2":{"168":1,"181":1,"185":1,"200":1,"203":1,"210":1,"379":1,"387":1,"393":1,"462":1,"472":1}}],["самые",{"2":{"154":1,"303":1,"432":1,"446":1,"463":1}}],["самый",{"2":{"17":1,"22":1,"32":1,"116":1,"244":1,"263":1,"277":1,"280":1,"292":1,"303":1,"313":1,"320":1,"324":1,"326":1,"353":1,"421":1,"461":1,"473":1}}],["сами",{"2":{"137":1,"147":1,"270":1,"422":1,"423":1,"432":1,"473":1,"518":1}}],["самим",{"2":{"11":1,"95":1,"472":1}}],["самую",{"2":{"25":1}}],["самоучитель",{"2":{"473":1}}],["самоуправляемые",{"2":{"331":1}}],["самописный",{"2":{"471":1}}],["само",{"2":{"385":1}}],["самообновляющийся",{"2":{"223":1}}],["самостоятельные",{"2":{"373":1}}],["самостоятельный",{"2":{"115":1,"250":1}}],["самостоятельной",{"2":{"376":1}}],["самостоятельно",{"2":{"133":1,"137":1,"265":1,"329":1,"422":2}}],["самой",{"2":{"34":1,"56":1,"108":1,"223":1,"386":1,"461":1,"472":1}}],["самого",{"2":{"3":1,"150":1,"183":1,"213":1,"224":1,"238":2,"249":1,"313":1,"381":1,"421":1,"507":1}}],["самому",{"2":{"4":1,"26":1,"270":1,"286":1,"463":1,"471":1}}],["самом",{"2":{"3":1,"83":1,"133":1,"137":1,"143":1,"144":1,"200":1,"218":1,"271":1,"308":1,"319":1,"323":1,"351":1,"436":1,"460":1}}],["самое",{"2":{"2":1,"3":1,"33":1,"35":1,"48":1,"85":1,"97":1,"105":1,"116":2,"149":1,"152":1,"224":1,"231":1,"232":1,"247":1,"287":2,"296":1,"325":1,"336":1,"423":1,"433":1,"463":1,"466":1}}],["сам",{"2":{"3":1,"103":1,"112":1,"200":1,"281":1,"291":1,"336":1,"372":1,"400":1,"438":1,"460":1,"462":2,"467":1}}],["сенсорных",{"2":{"516":1}}],["сенсорное",{"2":{"150":1,"167":1}}],["сеансов",{"2":{"364":1}}],["сессий",{"2":{"368":1}}],["сессионного",{"2":{"367":1}}],["сессионное",{"2":{"367":1}}],["сессионные",{"0":{"364":1}}],["сессиях",{"2":{"170":1}}],["сессиями",{"0":{"104":1},"2":{"104":1}}],["сестры",{"2":{"239":1}}],["секретного",{"2":{"325":1}}],["секретный",{"2":{"325":4}}],["секунды",{"2":{"438":1,"445":2}}],["секунду",{"2":{"436":2}}],["секундах",{"2":{"329":1}}],["секунд",{"2":{"167":1,"329":1,"330":1,"433":1}}],["секцию",{"2":{"230":1,"367":1}}],["секцией",{"2":{"183":1}}],["секций",{"2":{"167":1}}],["секции",{"2":{"153":1,"178":1,"181":2,"203":1,"204":1,"225":2,"230":2,"231":4,"243":1,"325":1,"338":1,"343":1,"375":1}}],["секция",{"0":{"183":1},"2":{"4":1,"11":1,"224":1,"325":2,"375":1,"436":1}}],["сегодняшний",{"2":{"147":1,"384":1,"386":1}}],["сегодня",{"2":{"147":1,"158":1,"161":1,"176":2,"199":2,"265":1,"308":2,"332":1,"344":1,"385":1,"449":1}}],["сегментировать",{"2":{"332":1}}],["сегмент",{"2":{"239":1}}],["сегмента",{"2":{"231":1}}],["сегментах",{"2":{"135":1}}],["сегментом",{"2":{"134":1}}],["сегменты",{"2":{"134":1,"231":1}}],["сеттерами",{"2":{"462":1}}],["сеть",{"2":{"331":2,"344":4}}],["сетью",{"2":{"331":1}}],["сетям",{"2":{"331":2}}],["сетями",{"2":{"200":1}}],["сетях",{"2":{"189":1,"338":1}}],["сетке",{"2":{"176":1}}],["сетевое",{"2":{"434":1}}],["сетевой",{"2":{"301":1,"324":1,"449":2,"454":1}}],["сетевым",{"2":{"455":1}}],["сетевыми",{"2":{"336":1}}],["сетевые",{"2":{"303":1,"372":1,"378":1,"434":1,"449":1,"454":1}}],["сетевых",{"2":{"134":1,"308":1,"323":3,"344":1,"373":1,"434":1,"449":2,"450":1,"453":1}}],["сетей",{"0":{"183":1},"2":{"134":1,"183":2}}],["сети",{"2":{"11":1,"109":1,"134":5,"196":1,"201":1,"308":1,"331":6,"344":4,"394":1,"436":1,"445":1,"449":1}}],["семантические",{"2":{"469":1}}],["семантически",{"2":{"96":1}}],["селекторы",{"2":{"201":1}}],["селектору",{"2":{"86":1}}],["селекторов",{"2":{"86":1}}],["сейчас",{"2":{"40":1,"86":1,"159":1,"202":1,"219":1,"297":1,"314":1,"328":1,"329":1,"393":1,"422":1,"447":1,"473":1}}],["себя",{"0":{"133":1,"406":1},"1":{"134":1,"407":1,"408":1,"409":1,"410":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"417":1,"418":1},"2":{"39":1,"63":2,"64":1,"68":1,"76":1,"131":1,"137":1,"143":1,"149":2,"163":2,"165":1,"166":1,"199":2,"200":1,"202":1,"208":1,"209":1,"211":1,"228":1,"249":1,"267":1,"268":1,"270":1,"291":1,"295":1,"308":1,"309":1,"313":1,"334":1,"344":1,"365":1,"372":2,"390":1,"394":2,"395":1,"429":1,"440":1,"449":1,"462":1,"463":2,"473":1,"507":1,"511":1,"545":1}}],["себе",{"2":{"26":2,"137":1,"147":1,"168":1,"202":1,"222":1,"265":1,"271":1,"308":1,"370":1,"385":1,"463":1}}],["серьезной",{"2":{"436":1}}],["серьезная",{"2":{"364":1}}],["серьезных",{"2":{"10":1,"109":1,"158":1}}],["сериализуя",{"2":{"448":1}}],["сериализуемой",{"2":{"447":1}}],["сериализуемыми",{"2":{"436":1}}],["сериализуемые",{"2":{"436":1,"440":1}}],["сериализован",{"2":{"437":1}}],["сериализованы",{"2":{"293":1}}],["сериализовать",{"2":{"364":1}}],["сериализовываться",{"2":{"294":1}}],["серию",{"2":{"374":1}}],["серия",{"2":{"325":1}}],["серебряной",{"2":{"241":1,"336":1}}],["середине",{"2":{"29":1}}],["серая",{"2":{"200":1}}],["серой",{"2":{"162":1}}],["сертификация",{"2":{"473":1}}],["сертификации",{"2":{"144":1,"473":1}}],["сертификатов",{"2":{"144":1}}],["сертификат",{"2":{"144":5,"337":1,"422":3}}],["сертификата",{"2":{"133":1,"144":7,"145":1}}],["сертификаты",{"2":{"4":1,"422":1}}],["сертифицированных",{"2":{"144":1}}],["сертифицирующим",{"2":{"144":1}}],["сердечка",{"2":{"102":1,"103":1}}],["сервиcа",{"2":{"115":1}}],["сервису",{"2":{"440":1}}],["сервисный",{"2":{"511":1}}],["сервисных",{"2":{"250":1,"256":1}}],["сервисного",{"2":{"344":3}}],["сервисом",{"2":{"325":1,"444":1}}],["сервисов",{"2":{"39":1,"115":3,"143":1,"189":2,"308":1,"323":1,"325":1,"328":1,"394":1,"444":2,"450":1,"455":1}}],["сервисе",{"2":{"323":1,"329":1,"376":1,"445":1}}],["сервисах",{"2":{"187":1,"373":1,"438":1}}],["сервиса",{"2":{"115":2,"118":1,"247":2,"256":2,"324":1,"344":1,"345":2,"354":1,"365":1,"375":2,"376":1,"395":1,"442":1,"443":1,"447":1,"472":1}}],["сервисами",{"2":{"134":1,"271":1,"363":1,"368":1,"375":1,"384":1,"440":1,"443":1,"508":1}}],["сервисам",{"2":{"41":1,"436":1,"440":2,"455":1}}],["сервисы",{"0":{"40":1},"2":{"115":1,"116":1,"137":1,"218":1,"323":1,"373":1,"394":2,"396":1,"423":1,"433":1,"434":1,"440":1,"462":1,"473":1,"545":1}}],["сервис",{"0":{"114":1},"2":{"10":1,"39":1,"40":2,"41":1,"59":1,"83":1,"114":1,"115":1,"247":1,"288":1,"289":1,"329":2,"331":1,"344":4,"354":2,"357":1,"374":2,"375":1,"382":1,"443":1,"445":2,"450":2,"452":1,"463":1,"473":1,"496":1,"545":1}}],["серверу",{"2":{"144":2,"308":1,"325":3,"328":1,"454":2}}],["серверов",{"2":{"137":1,"140":1,"142":2}}],["сервером",{"2":{"11":1,"115":1,"137":1,"144":1,"224":1,"268":3,"296":1,"300":1,"308":1,"323":1,"324":1,"326":2,"331":1,"376":1,"440":1,"449":1,"454":2,"472":1}}],["серверы",{"0":{"134":1,"142":1},"1":{"136":1},"2":{"134":2,"146":1,"331":1}}],["серверами",{"2":{"446":1,"454":1}}],["серверам",{"2":{"269":1}}],["серверах",{"2":{"144":1,"222":1,"331":1}}],["сервера",{"0":{"137":1,"138":1,"140":1},"1":{"138":1,"139":2,"140":1,"141":2,"142":1},"2":{"117":1,"131":2,"133":1,"134":2,"135":1,"137":3,"140":4,"144":2,"223":1,"268":1,"295":1,"301":1,"313":1,"324":2,"328":1,"330":2,"336":2,"384":1,"394":1,"429":1,"452":1,"453":1,"454":1,"460":1,"472":6,"536":1}}],["сервере",{"2":{"40":1,"65":1,"115":1,"117":2,"134":1,"137":2,"143":3,"144":1,"294":1,"308":2,"324":3,"325":1,"326":1,"337":1,"344":1,"416":1,"419":1,"421":2,"422":1,"449":2,"472":1,"481":1,"482":1}}],["серверному",{"2":{"472":1}}],["серверного",{"2":{"313":1,"454":1}}],["серверной",{"2":{"137":1,"378":1}}],["серверный",{"2":{"324":1}}],["серверным",{"2":{"141":1}}],["серверных",{"2":{"118":1}}],["серверные",{"2":{"40":1,"308":1,"336":1}}],["серверная",{"0":{"6":1}}],["сервер",{"0":{"143":1,"453":1},"1":{"454":1},"2":{"39":1,"56":1,"114":1,"115":2,"117":2,"118":2,"134":1,"135":2,"136":1,"137":9,"138":1,"140":1,"142":1,"143":3,"145":2,"146":1,"223":3,"224":1,"226":1,"231":1,"308":1,"323":1,"324":1,"325":2,"327":2,"328":1,"329":2,"330":3,"364":1,"374":1,"384":2,"395":1,"421":2,"422":1,"433":1,"434":2,"449":2,"451":2,"452":3,"453":1,"454":4,"472":3,"473":1}}],["спуститься",{"2":{"317":1}}],["спальни",{"2":{"472":1}}],["спать",{"2":{"472":1}}],["спагетти",{"2":{"270":2}}],["спам",{"0":{"196":1}}],["спланировать",{"2":{"259":1}}],["спиннера",{"2":{"168":3}}],["спиннер",{"2":{"168":1}}],["спиннеры",{"0":{"168":1},"1":{"169":1},"2":{"168":1}}],["списание",{"2":{"188":1}}],["список",{"0":{"262":1,"272":1},"1":{"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1},"2":{"31":1,"51":2,"104":2,"117":2,"119":3,"129":1,"137":1,"144":1,"160":1,"161":1,"163":3,"167":1,"170":2,"171":1,"174":1,"179":2,"196":1,"204":1,"211":1,"228":1,"229":1,"231":7,"232":2,"235":1,"239":5,"240":1,"257":1,"260":1,"271":1,"272":1,"276":1,"308":1,"311":2,"313":1,"316":1,"317":2,"322":3,"338":1,"346":1,"363":1,"364":1,"376":1,"380":1,"388":1}}],["списков",{"2":{"170":1,"179":1,"208":1,"311":1,"536":1}}],["списком",{"2":{"11":1,"41":1,"134":1,"232":1,"256":2,"311":1,"316":1}}],["списках",{"2":{"163":1,"229":1}}],["спискам",{"2":{"154":1}}],["списка",{"2":{"152":1,"162":1,"163":1,"170":2,"171":3,"176":1,"212":1,"221":1,"231":4,"239":1,"256":4,"311":1,"334":1,"436":1,"447":1}}],["списке",{"2":{"3":1,"171":1,"176":1,"256":1,"286":1,"300":1,"447":1}}],["спроектированного",{"2":{"455":1}}],["спросить",{"2":{"316":1}}],["спровоцировать",{"2":{"167":1}}],["спрайтовых",{"2":{"227":1}}],["справедливо",{"2":{"364":1}}],["справочную",{"2":{"473":1}}],["справочник",{"2":{"304":1,"473":1}}],["справочником",{"2":{"119":1}}],["справочного",{"2":{"289":1}}],["справочный",{"0":{"272":1},"1":{"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1}}],["справку",{"2":{"228":1}}],["справки",{"2":{"164":1}}],["справиться",{"2":{"147":1,"168":1,"322":1}}],["справа",{"2":{"29":1,"98":1,"134":1,"162":2,"166":2}}],["спрятана",{"2":{"114":1}}],["спектру",{"2":{"359":1}}],["спектр",{"2":{"225":1,"282":1}}],["сперва",{"2":{"74":1,"89":1,"431":1,"462":1,"472":1,"473":1}}],["специфичных",{"2":{"507":1}}],["специфичной",{"2":{"143":1}}],["специфичное",{"2":{"118":1}}],["специфической",{"2":{"330":1}}],["специфического",{"2":{"243":1}}],["специфические",{"2":{"228":1,"450":1}}],["спецификаций",{"2":{"472":1}}],["спецификацию",{"2":{"341":1,"512":1}}],["спецификациях",{"2":{"364":1}}],["спецификация",{"2":{"338":1,"473":1}}],["спецификациями",{"2":{"455":1}}],["спецификациям",{"2":{"225":1}}],["спецификации",{"2":{"63":1,"64":1,"200":1,"323":1,"338":3}}],["специализированном",{"2":{"147":1}}],["специализированным",{"2":{"117":1,"147":1}}],["специальную",{"2":{"205":1}}],["специальным",{"2":{"251":1}}],["специальные",{"0":{"248":1},"1":{"249":1},"2":{"134":1,"205":1,"235":1,"249":1,"331":1}}],["специальный",{"0":{"377":1,"378":1},"2":{"128":1,"138":1,"212":1,"250":1,"251":2,"303":1,"390":1}}],["специальных",{"2":{"117":1,"247":1,"258":1,"336":1,"372":1}}],["специальная",{"2":{"124":1,"125":1,"391":1}}],["специальной",{"2":{"313":2,"358":1}}],["специально",{"2":{"168":1,"232":1,"237":1,"308":1,"336":1,"346":1,"393":1}}],["специального",{"2":{"118":1,"443":1}}],["специальному",{"2":{"13":1,"246":1}}],["спецпредложений",{"2":{"4":1}}],["спорным",{"2":{"507":1}}],["спонсировать",{"2":{"363":1}}],["способами",{"2":{"235":1,"259":1,"294":1}}],["способа",{"2":{"231":1,"351":1,"472":1}}],["способов",{"2":{"227":1,"239":1,"256":1,"279":1,"284":1,"300":1,"317":1,"324":1,"331":1}}],["способом",{"2":{"167":1,"170":1,"201":1,"203":1,"232":1,"269":1,"284":1,"303":2,"351":2,"358":1,"380":1,"383":1,"387":1}}],["способе",{"2":{"204":1,"501":1,"503":1}}],["способный",{"2":{"137":1}}],["способности",{"0":{"26":1}}],["способы",{"2":{"63":1,"181":1,"279":1,"302":1,"324":1,"389":1}}],["способ",{"0":{"120":1},"2":{"56":1,"116":1,"119":1,"120":1,"204":3,"249":1,"259":1,"280":1,"290":1,"292":1,"302":1,"315":1,"316":1,"317":1,"324":2,"328":1,"339":1,"344":1,"351":1,"353":1,"356":1,"360":1,"383":1,"392":1,"395":1,"421":2,"432":1,"436":1,"438":1,"447":1,"472":1}}],["спойлер",{"2":{"4":1}}],["сигнатура",{"2":{"450":1}}],["сигнал",{"2":{"376":1}}],["сигнализирует",{"2":{"303":1}}],["сигналы",{"2":{"245":1}}],["сигнальные",{"2":{"239":1}}],["симулированный",{"2":{"378":1}}],["симуляции",{"2":{"370":1}}],["символов",{"2":{"227":1,"364":1}}],["символом",{"2":{"163":1}}],["символ",{"2":{"150":1,"174":1,"364":1}}],["сиблингу",{"2":{"239":1}}],["ситуацией",{"2":{"462":1}}],["ситуаций",{"2":{"313":1,"324":1}}],["ситуациях",{"2":{"464":1}}],["ситуация",{"2":{"251":1,"316":1,"463":1}}],["ситуациями",{"2":{"168":1}}],["ситуации",{"2":{"157":1,"200":1,"358":1,"385":1}}],["ситуацию",{"2":{"147":1,"247":1}}],["сих",{"2":{"148":1,"178":1,"202":1,"211":1,"221":1,"244":1,"300":1,"308":1,"317":1,"319":2,"358":1}}],["синтез",{"2":{"462":1}}],["синтаксического",{"2":{"361":1}}],["синтаксисов",{"2":{"245":1}}],["синтаксисом",{"2":{"56":1,"204":1,"212":1,"244":1,"303":2,"381":1}}],["синтаксису",{"2":{"244":1,"303":1}}],["синтаксисы",{"2":{"203":1}}],["синтаксис",{"2":{"125":1,"203":2,"204":6,"244":3,"246":2,"247":1,"249":3,"303":3,"363":1,"376":1,"378":1,"439":2,"504":1}}],["синтаксисе",{"2":{"123":1,"229":1,"245":2,"298":1,"361":1}}],["синтаксиса",{"2":{"121":1,"122":1,"130":1,"199":1,"203":1,"244":1,"249":2,"303":1,"360":1}}],["синдицированных",{"2":{"328":1}}],["синхронного",{"2":{"370":1}}],["синхронность",{"2":{"302":1}}],["синхронной",{"2":{"301":3,"302":1}}],["синхронный",{"0":{"302":1}}],["синхронные",{"2":{"301":1,"373":1}}],["синхронизирует",{"2":{"386":2}}],["синхронизируется",{"2":{"367":1}}],["синхронизированном",{"2":{"394":1}}],["синхронизирован",{"2":{"366":2}}],["синхронизировано",{"2":{"363":1,"367":1}}],["синхронизироваться",{"2":{"394":1}}],["синхронизировать",{"2":{"297":1,"358":1,"365":1,"394":2}}],["синхронизация",{"2":{"449":1}}],["синхронизации",{"2":{"316":1}}],["синхронизацию",{"2":{"143":1,"210":1,"394":1,"446":1}}],["синглтоном",{"2":{"443":1}}],["синглтоны",{"2":{"281":1}}],["синглтонами",{"2":{"280":1}}],["синглтона",{"2":{"279":1,"285":1,"287":1}}],["синглтон",{"2":{"225":1,"256":1,"260":1,"271":1,"277":1,"281":2,"288":2,"292":1,"316":1,"355":1,"359":1,"365":1,"366":1,"462":1}}],["синоним",{"2":{"134":1}}],["силами",{"2":{"269":1}}],["сила",{"2":{"251":1,"323":1}}],["сильный",{"2":{"249":1}}],["сильные",{"2":{"245":1}}],["сильное",{"2":{"431":1}}],["сильно",{"2":{"3":1,"22":1,"26":1,"29":1,"47":1,"50":1,"79":1,"83":1,"85":1,"112":1,"118":1,"133":1,"134":1,"204":2,"267":1,"380":1,"432":1,"460":1,"461":1,"463":2,"466":1,"471":1,"472":1,"473":2,"536":1,"555":1}}],["силу",{"2":{"12":1}}],["системные",{"2":{"388":1}}],["системным",{"2":{"166":1}}],["системой",{"2":{"300":1,"336":2,"341":1,"364":1,"387":1,"415":1}}],["системе",{"2":{"63":1,"140":1,"336":2,"338":1,"367":1,"370":1,"386":1,"390":2,"402":1,"463":1}}],["систему",{"2":{"3":1,"116":1,"137":1,"175":1,"263":2,"265":1,"269":1,"327":2,"328":1,"329":1,"351":1,"364":1,"370":1,"387":1,"388":1,"436":1}}],["систематическое",{"2":{"336":1}}],["системах",{"0":{"387":1,"388":1,"389":1},"2":{"222":1,"336":1,"343":1,"388":2,"389":1}}],["система",{"2":{"2":1,"63":1,"76":1,"116":2,"137":1,"149":1,"168":2,"191":1,"229":1,"263":2,"268":1,"269":1,"300":1,"336":1,"358":1,"437":1,"511":1}}],["системами",{"2":{"2":1,"308":1,"334":1,"336":2,"463":1}}],["системы",{"0":{"370":1},"1":{"371":1,"372":1,"373":1,"374":1,"375":1,"376":1,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1},"2":{"2":1,"12":1,"41":2,"63":3,"116":2,"144":1,"149":1,"162":1,"247":1,"252":1,"263":1,"272":1,"295":1,"324":1,"329":1,"336":2,"370":1,"372":1,"387":1,"454":1,"463":1,"464":1,"471":1}}],["систем",{"2":{"2":1,"385":1,"400":1,"455":1,"463":1}}],["слышат",{"2":{"394":1}}],["слышали",{"2":{"181":1}}],["слияний",{"2":{"393":1,"394":1}}],["слияния",{"2":{"393":1,"395":1}}],["слияниями",{"0":{"392":1}}],["слиянии",{"0":{"393":1},"2":{"393":1}}],["слияние",{"2":{"386":1,"392":1,"393":4}}],["слишком",{"2":{"157":1,"158":1,"159":1,"204":1,"228":1,"265":1,"269":1,"331":1,"436":3}}],["сладко",{"2":{"308":1}}],["слайдер",{"0":{"459":1}}],["слайдеров",{"2":{"167":1}}],["слайдеры",{"0":{"167":1},"2":{"167":3}}],["слабо",{"2":{"265":1,"423":1}}],["слабом",{"2":{"116":1}}],["слабосвязные",{"2":{"41":1}}],["слабосвязанными",{"2":{"7":1}}],["слабосвязанные",{"2":{"3":1,"4":1}}],["слабую",{"2":{"34":1}}],["слабая",{"0":{"34":1},"2":{"423":1}}],["слушатель",{"2":{"441":1}}],["слушателей",{"2":{"364":1,"463":1}}],["слушателями",{"2":{"291":1}}],["слушателя",{"2":{"250":1,"343":2}}],["служат",{"2":{"463":1}}],["служебный",{"2":{"374":1}}],["службе",{"2":{"325":1,"454":1}}],["службу",{"2":{"188":1,"330":1,"448":1,"449":1}}],["службы",{"2":{"135":1,"440":1}}],["служб",{"2":{"134":1,"344":1}}],["служит",{"2":{"117":1,"454":1}}],["служить",{"2":{"67":1,"373":1}}],["случаи",{"2":{"248":1,"249":1,"265":1,"267":1,"356":1,"450":1}}],["случаям",{"2":{"322":1}}],["случаями",{"2":{"228":1,"322":1}}],["случая",{"2":{"201":1,"241":1,"243":1,"270":1,"356":1,"372":2,"376":1,"436":1}}],["случаях",{"2":{"4":1,"123":1,"147":1,"149":1,"161":1,"163":1,"168":1,"178":1,"187":1,"195":1,"212":1,"223":1,"225":1,"241":1,"279":1,"281":1,"301":1,"308":1,"325":1,"331":1,"339":1,"351":1,"377":1,"382":1,"425":1,"436":1,"456":1,"462":2,"548":1}}],["случается",{"2":{"325":1}}],["случаен",{"2":{"289":1}}],["случаев",{"2":{"116":1,"225":1,"231":2,"235":1,"266":1,"292":3,"301":1,"302":2,"303":1,"336":1,"345":1,"373":1,"374":1,"425":1,"457":1,"460":2,"472":2,"536":1}}],["случае",{"2":{"12":1,"22":1,"41":1,"47":1,"85":1,"86":1,"115":1,"116":3,"117":1,"133":1,"135":1,"137":2,"140":2,"143":1,"144":2,"150":1,"155":1,"159":1,"163":1,"164":1,"170":2,"183":1,"190":1,"192":1,"200":2,"201":1,"203":1,"204":1,"218":1,"225":1,"231":3,"232":1,"244":1,"245":1,"246":2,"249":1,"250":1,"256":2,"263":1,"270":1,"276":1,"285":1,"287":2,"291":1,"293":1,"294":1,"295":1,"297":1,"303":5,"309":1,"316":3,"317":2,"319":2,"323":2,"324":3,"329":1,"330":2,"331":3,"343":1,"344":1,"345":1,"354":1,"356":1,"357":1,"358":1,"360":1,"361":1,"364":2,"372":1,"373":2,"375":1,"376":4,"378":1,"380":2,"381":2,"383":1,"388":1,"391":1,"393":1,"421":1,"422":1,"423":1,"432":1,"436":1,"437":1,"440":2,"445":1,"448":1,"454":1,"460":2,"462":1,"463":1}}],["случайно",{"2":{"182":1}}],["случай",{"0":{"377":1,"378":1},"2":{"9":1,"102":1,"251":1,"376":1,"378":1,"394":1,"421":1,"473":1}}],["слою",{"2":{"440":1}}],["сложен",{"2":{"300":2}}],["сложнее",{"2":{"263":1,"269":1,"303":1,"372":2}}],["сложную",{"2":{"186":1,"269":1}}],["сложны",{"2":{"304":1}}],["сложный",{"2":{"296":1,"462":1}}],["сложные",{"2":{"157":1,"210":1,"245":1,"247":1,"308":1,"319":1,"351":1}}],["сложных",{"2":{"123":1,"161":1,"178":1,"199":1,"245":1,"295":1,"317":1,"344":1,"349":1,"400":1,"434":1,"471":1}}],["сложным",{"2":{"3":1,"137":1,"300":1,"364":1,"366":1,"372":1,"472":1}}],["сложными",{"2":{"2":1,"123":1,"463":1}}],["сложная",{"2":{"118":1}}],["сложно",{"2":{"446":1,"473":1}}],["сложному",{"2":{"300":1,"380":1}}],["сложное",{"2":{"264":1}}],["сложностей",{"2":{"455":1}}],["сложностям",{"2":{"264":1}}],["сложность",{"2":{"114":1,"178":2,"269":1,"300":2,"349":1,"385":1,"440":1}}],["сложности",{"2":{"2":1,"157":1,"199":1,"204":1,"263":1,"300":1,"308":1,"330":1,"336":1,"370":2,"386":1,"463":2,"497":1}}],["сложной",{"2":{"41":1,"309":1,"344":1,"437":1}}],["сложного",{"0":{"2":1}}],["слоев",{"2":{"297":1,"436":1}}],["слоте",{"2":{"249":1}}],["слотом",{"2":{"249":2}}],["слотов",{"2":{"249":4,"254":1}}],["слотам",{"2":{"380":1}}],["слотами",{"2":{"249":1}}],["слота",{"2":{"249":3,"424":1}}],["слоту",{"2":{"249":1}}],["слот",{"2":{"249":4,"255":1}}],["слоты",{"0":{"249":3},"2":{"249":5}}],["сломает",{"2":{"232":1}}],["сломать",{"2":{"116":1}}],["слово",{"2":{"201":1,"204":3,"216":1,"218":1,"295":1,"303":1,"360":1,"438":1,"495":1}}],["словом",{"2":{"130":1,"303":1}}],["слов",{"2":{"186":1,"230":1,"394":1}}],["словарь",{"2":{"443":1}}],["словаря",{"2":{"288":1,"292":1}}],["словами",{"2":{"419":1,"462":1,"472":1,"507":1}}],["слова",{"2":{"164":1,"230":1}}],["слой",{"2":{"59":1,"291":1,"471":1,"511":1,"542":1}}],["слоями",{"2":{"440":1}}],["слоя",{"2":{"40":1,"440":3}}],["следам",{"2":{"385":1}}],["следит",{"2":{"463":1}}],["следить",{"2":{"292":1,"316":1,"391":1,"463":1}}],["следите",{"0":{"153":1}}],["следовало",{"2":{"358":1,"361":1,"363":1}}],["следовать",{"2":{"226":1,"266":1,"313":1,"402":1}}],["следовательно",{"2":{"201":1}}],["следование",{"2":{"173":1}}],["следствия",{"2":{"157":1}}],["следствием",{"2":{"156":1}}],["следуйте",{"2":{"253":1,"350":1}}],["следуя",{"2":{"225":2,"255":2,"263":1,"279":1,"311":1,"329":1,"341":1,"387":1,"442":1}}],["следуют",{"2":{"150":1,"185":1,"246":1,"351":1}}],["следующую",{"2":{"136":1,"200":1,"223":3,"231":1,"302":1,"310":1,"374":1,"376":1,"379":1,"383":1,"384":1,"390":2,"449":1,"453":1,"473":1}}],["следующем",{"2":{"211":1,"223":2,"229":1,"231":1,"246":2,"247":1,"255":1,"327":1,"344":1,"373":1,"382":1}}],["следующему",{"2":{"134":1,"152":1,"238":1,"289":1,"300":1,"319":1,"353":1}}],["следующего",{"0":{"270":1},"1":{"273":1,"274":1,"275":1,"276":1},"2":{"153":1,"181":1,"225":1,"231":1,"246":1,"249":1,"255":1,"260":1,"302":1,"319":1,"323":1,"327":1,"344":1,"372":1,"374":1,"378":1}}],["следующее",{"2":{"91":1,"122":1,"133":1,"147":1,"148":1,"211":1,"222":2,"223":1,"227":1,"229":1,"230":1,"231":1,"235":1,"236":1,"249":2,"255":2,"256":1,"287":1,"306":1,"307":1,"309":1,"324":1,"325":1,"334":1,"335":1,"344":1,"350":1,"364":2,"371":1,"373":1,"382":2,"390":3,"393":3,"402":1,"435":1,"438":1,"464":1}}],["следующей",{"2":{"89":1,"143":1,"219":1,"232":1,"233":1,"243":1,"258":1,"292":1,"304":1,"308":1,"316":1,"323":1,"325":1,"331":1,"332":1,"345":1,"354":1,"359":1,"368":1,"375":1,"379":1,"385":1,"390":1,"391":1,"394":1,"440":1,"455":1}}],["следующий",{"2":{"211":1,"228":1,"231":1,"232":1,"246":1,"249":1,"256":1,"267":1,"322":1,"379":1,"380":1,"436":1,"443":1,"445":1}}],["следующим",{"2":{"131":1,"134":2,"135":1,"157":1,"170":2,"183":1,"202":1,"209":1,"223":1,"226":3,"228":2,"229":1,"230":2,"231":1,"238":2,"240":1,"247":2,"249":1,"254":1,"255":3,"256":1,"284":1,"287":1,"289":1,"295":1,"297":1,"300":1,"302":1,"303":1,"311":1,"312":1,"313":1,"317":1,"319":2,"326":1,"329":1,"331":1,"334":1,"336":1,"343":1,"345":1,"354":1,"355":1,"375":1,"379":1,"383":1,"384":2,"388":1,"390":1,"393":1,"437":2,"446":1,"450":1,"451":1,"453":1,"511":1}}],["следующими",{"2":{"112":1,"159":1,"220":1,"231":1,"292":1,"296":1,"344":1,"360":1}}],["следующие",{"2":{"62":1,"125":1,"134":1,"155":1,"180":1,"184":1,"199":1,"203":1,"204":1,"221":1,"223":1,"226":1,"231":2,"237":1,"250":1,"252":1,"255":3,"259":1,"280":1,"295":1,"297":1,"298":1,"301":1,"310":2,"313":1,"315":1,"326":1,"333":1,"341":1,"343":1,"344":1,"346":1,"348":1,"349":1,"358":1,"359":1,"361":1,"372":2,"374":1,"375":2,"376":1,"386":1,"388":1,"390":1,"391":1,"393":1,"394":1,"434":1,"437":1,"440":1,"446":1,"448":1,"520":1}}],["следующих",{"2":{"61":1,"144":1,"200":1,"245":1,"271":1,"300":1,"313":1,"542":1}}],["следующая",{"2":{"17":1,"231":1,"448":1}}],["следует",{"2":{"119":1,"123":1,"130":1,"135":1,"139":1,"160":1,"162":1,"164":1,"173":1,"176":1,"178":1,"197":1,"198":1,"200":1,"218":1,"227":2,"238":1,"241":1,"250":1,"251":1,"256":2,"260":1,"265":1,"271":1,"278":1,"308":1,"313":1,"316":1,"324":2,"331":1,"336":1,"341":1,"344":1,"345":1,"351":1,"378":1,"384":1,"435":1,"436":1,"450":1,"462":1,"472":1}}],["слева",{"2":{"28":1,"29":1,"30":2,"33":1,"35":1,"99":1,"162":2,"183":1,"546":1}}],["ступенькой",{"2":{"444":1}}],["студенты",{"2":{"402":1}}],["стирают",{"2":{"336":1}}],["стимулировать",{"0":{"152":1}}],["стиля",{"2":{"255":1,"496":1,"508":1}}],["стилями",{"2":{"229":1,"231":2,"343":1}}],["стилях",{"2":{"23":1,"235":1}}],["стиль",{"2":{"207":1,"208":1,"218":1,"230":1,"471":1}}],["стиле",{"2":{"532":1,"533":1}}],["стилем",{"2":{"161":1,"199":1}}],["стилей",{"2":{"86":1,"149":1,"152":1,"163":1,"199":1,"203":2,"224":2,"225":1,"226":2,"227":2,"229":1,"230":1,"231":1,"235":1,"315":1,"316":1,"340":1,"447":1}}],["стилизованной",{"2":{"471":1}}],["стилизовать",{"2":{"162":1}}],["стилизации",{"2":{"160":1,"168":1,"508":2}}],["стилизацию",{"2":{"98":1,"162":1,"463":1,"466":1}}],["стилизацией",{"2":{"25":1}}],["стили",{"2":{"105":1,"195":1,"203":2,"231":1,"235":1,"249":1,"255":1,"266":1,"315":1,"471":4}}],["стилю",{"2":{"63":1,"153":1}}],["стоящих",{"2":{"507":1}}],["сторы",{"2":{"462":2,"482":1,"484":1}}],["стором",{"2":{"462":1}}],["сторов",{"2":{"360":1,"462":1}}],["стороной",{"2":{"325":1}}],["сторонами",{"2":{"325":1}}],["сторона",{"2":{"184":1,"188":1}}],["стороне",{"2":{"147":1,"370":1,"443":1,"447":1,"472":2,"555":1}}],["стороны",{"2":{"117":1,"158":1,"168":1,"200":1,"239":1,"260":1,"507":1}}],["стороннюю",{"2":{"504":1}}],["сторонняя",{"0":{"325":1},"2":{"465":1}}],["сторонней",{"2":{"462":1}}],["стороннего",{"2":{"117":1,"472":1}}],["стороннее",{"2":{"13":1}}],["сторонние",{"2":{"224":2,"233":1,"234":1,"504":1,"555":1}}],["сторонних",{"0":{"466":1},"2":{"117":1,"118":1,"229":1,"300":1,"327":1,"331":1}}],["сторонний",{"2":{"116":1,"195":1}}],["сторонним",{"2":{"12":1,"76":1,"117":3,"189":1,"196":1}}],["сторон",{"2":{"9":1}}],["сторе",{"2":{"360":1,"366":1,"462":1}}],["стор",{"2":{"359":6,"360":1,"361":3,"362":1,"363":2,"462":4}}],["сторами",{"2":{"462":1}}],["сторам",{"2":{"363":1}}],["стора",{"0":{"359":1},"1":{"360":1,"361":1,"362":1,"363":1},"2":{"360":6,"363":1,"364":1,"366":1}}],["столкнетесь",{"2":{"436":1}}],["столкнулась",{"2":{"386":1}}],["столкнуться",{"2":{"200":1,"295":1,"313":1}}],["стола",{"2":{"395":1}}],["столбце",{"2":{"317":1}}],["столько",{"2":{"209":1,"319":1,"330":1,"364":1,"376":2}}],["столе",{"2":{"166":1,"339":1}}],["стоимость",{"2":{"109":1}}],["стоит",{"2":{"105":1,"125":1,"130":1,"143":1,"158":1,"167":1,"220":1,"247":1,"250":1,"256":1,"270":1,"276":1,"298":1,"323":1,"357":1,"425":1}}],["степенью",{"2":{"434":1}}],["степени",{"2":{"126":1,"150":1,"154":1,"199":1,"204":1,"260":1,"301":1,"376":1,"381":1,"385":1}}],["стейты",{"2":{"462":1}}],["стейт",{"2":{"462":2,"463":1}}],["стейта",{"2":{"250":2,"460":1,"462":3}}],["стейтом",{"2":{"34":1,"462":5}}],["стековые",{"2":{"176":1}}],["стек",{"0":{"23":1}}],["стрелку",{"2":{"361":1}}],["стрелками",{"2":{"223":2}}],["стрелочную",{"2":{"302":1}}],["стремитесь",{"2":{"158":1}}],["стремимся",{"2":{"137":1,"354":1}}],["стремящихся",{"2":{"130":1}}],["страшном",{"2":{"460":1}}],["стратегия",{"2":{"555":1}}],["стратегиями",{"2":{"306":1,"344":1}}],["стратегий",{"2":{"344":2,"345":1,"473":1}}],["стратегией",{"2":{"344":1,"345":2}}],["стратегию",{"2":{"313":1,"344":2}}],["стратегии",{"2":{"74":1,"344":1,"348":1}}],["страдает",{"2":{"204":1}}],["страну",{"2":{"319":1}}],["страны",{"2":{"317":1,"319":1}}],["страна",{"2":{"317":1}}],["странным",{"2":{"203":1,"313":1}}],["странно",{"2":{"202":1}}],["странички",{"2":{"472":1}}],["страничной",{"2":{"251":1}}],["страничным",{"2":{"170":1}}],["страничный",{"2":{"158":1}}],["страниц",{"2":{"36":1,"158":1,"170":2,"181":1,"199":2,"308":4,"331":1,"344":1,"346":1,"364":1,"471":1}}],["страницей",{"2":{"170":1,"173":1}}],["странице",{"2":{"22":1,"36":1,"47":1,"117":1,"167":1,"182":1,"195":1,"199":1,"200":1,"201":2,"209":1,"212":2,"257":1,"316":1,"364":2,"429":1,"436":2,"461":1}}],["страницах",{"2":{"177":1,"271":1}}],["страницами",{"2":{"170":1,"309":1,"311":1,"313":1}}],["страницам",{"2":{"117":3}}],["страница",{"2":{"4":1,"7":2,"30":1,"102":1,"108":1,"117":2,"151":1,"167":1,"182":2,"199":1,"202":1,"203":1,"227":1,"311":7,"472":1}}],["страницы",{"0":{"28":1,"237":1},"1":{"29":1,"30":1,"31":1,"32":1,"238":1,"239":1,"240":1,"241":1},"2":{"4":1,"22":1,"30":1,"36":1,"108":1,"117":2,"136":1,"151":2,"170":2,"174":3,"178":1,"182":2,"183":3,"201":2,"202":2,"224":1,"232":1,"238":1,"300":1,"308":3,"325":1,"331":1,"346":1,"364":3,"400":1,"425":1,"436":5,"472":4}}],["страницу",{"2":{"3":1,"7":1,"96":1,"134":1,"144":1,"151":1,"170":1,"171":2,"182":2,"183":1,"195":2,"202":2,"224":1,"235":1,"238":1,"308":2,"311":1,"316":3,"343":2,"364":1,"367":1,"436":2,"472":3,"534":1}}],["строчек",{"2":{"537":1}}],["строчкой",{"2":{"270":1}}],["строчками",{"2":{"104":1}}],["строя",{"2":{"370":1}}],["строятся",{"2":{"211":1}}],["строим",{"2":{"359":1}}],["строится",{"2":{"395":1}}],["строить",{"2":{"235":2,"349":1}}],["строительные",{"2":{"202":1,"242":1}}],["строительную",{"2":{"26":1}}],["строгость",{"2":{"118":1}}],["строковые",{"2":{"364":2}}],["строковых",{"2":{"325":1}}],["строковому",{"2":{"288":1}}],["строкой",{"2":{"47":1,"98":1,"316":1,"322":1,"356":1,"364":1,"445":1}}],["строк",{"2":{"245":2,"265":1,"316":1,"331":1,"391":1,"454":1,"465":1,"472":1}}],["строки",{"2":{"201":1,"204":1,"210":1,"221":1,"223":1,"224":1,"231":1,"233":1,"256":1,"292":1,"303":2,"316":2,"318":1,"325":2,"326":1,"356":2,"360":1,"361":1,"364":1,"375":3,"376":2,"381":1,"384":1,"386":1,"387":1,"393":1,"432":1,"437":1,"444":1,"445":1,"447":1,"448":3,"453":1,"454":1}}],["строке",{"2":{"89":1,"141":4,"171":2,"231":9,"255":12,"292":2,"296":4,"298":2,"299":4,"303":3,"313":7,"331":1,"333":1,"340":1,"352":1,"353":4,"356":3,"358":1,"360":1,"361":3,"363":4,"366":2,"376":2,"380":4,"381":9,"391":1,"436":1,"443":7,"444":3,"447":2,"448":4,"452":1,"454":1}}],["строку",{"2":{"82":1,"116":1,"117":1,"139":1,"239":1,"251":1,"288":1,"297":1,"303":1,"320":1,"322":1,"325":1,"327":1,"328":2,"381":1,"383":1,"384":1,"388":1,"393":2,"438":1,"447":1,"448":1,"460":1}}],["строках",{"2":{"228":1,"231":2,"344":1,"381":1}}],["строками",{"2":{"117":1,"292":1,"322":1,"344":1}}],["строка",{"2":{"29":1,"98":1,"117":1,"227":1,"231":1,"239":2,"249":1,"251":1,"294":1,"303":2,"313":2,"325":2,"326":1,"331":1,"339":2,"340":3,"341":2,"352":3,"358":5,"360":4,"361":3,"364":1,"366":4,"393":1,"436":1,"437":1,"443":3,"444":3,"448":1,"454":9}}],["стройматериалы",{"2":{"26":1}}],["структурируя",{"2":{"467":1}}],["структурированное",{"2":{"63":1}}],["структурированность",{"2":{"17":1}}],["структур",{"2":{"273":1,"295":1}}],["структурные",{"0":{"275":1},"2":{"199":1}}],["структурных",{"2":{"63":2}}],["структура",{"0":{"224":1},"2":{"174":1,"200":1,"224":1,"287":1,"317":1}}],["структурой",{"2":{"135":1,"196":1,"199":1}}],["структуры",{"2":{"126":1,"174":1,"200":1,"221":1,"224":1,"293":1,"354":1,"443":1}}],["структуре",{"2":{"120":1,"135":1,"174":1,"224":1,"225":1,"472":1}}],["структуру",{"2":{"17":1,"22":1,"26":1,"223":2,"224":4,"225":1,"271":1,"354":1}}],["стакан",{"2":{"473":1}}],["стационарности",{"2":{"455":1}}],["стабильного",{"2":{"391":1}}],["стабильной",{"2":{"390":1}}],["стабильный",{"2":{"388":1}}],["стабильных",{"2":{"373":1}}],["стабилен",{"2":{"137":1}}],["ставшее",{"2":{"394":1}}],["ставший",{"2":{"176":1}}],["ставится",{"2":{"313":1}}],["ставиться",{"2":{"294":1}}],["ставить",{"2":{"116":1,"222":1}}],["ставим",{"2":{"87":1,"95":1,"100":1,"106":1,"112":1}}],["сталкивались",{"2":{"256":1}}],["сталкиваемся",{"2":{"137":1}}],["стал",{"2":{"162":1,"173":1,"176":1,"188":1,"222":1,"256":1,"372":1,"386":1,"444":1}}],["стала",{"2":{"154":1,"181":1,"297":1,"309":1,"462":1}}],["стало",{"2":{"152":1,"308":1,"310":1,"462":1,"463":1}}],["стали",{"2":{"2":1,"160":1,"199":1,"460":1,"462":1,"471":1}}],["станут",{"2":{"204":1,"270":1,"360":1,"361":2}}],["станет",{"2":{"201":1,"313":1,"385":1,"447":1}}],["становиться",{"2":{"336":1}}],["становится",{"2":{"125":1,"183":1,"204":1,"243":1,"251":1,"316":1,"323":1,"344":1,"462":1}}],["становились",{"2":{"149":1}}],["становятся",{"2":{"117":1}}],["стандартизации",{"2":{"199":1}}],["стандартизирован",{"2":{"173":1}}],["стандартов",{"2":{"197":1,"325":1,"332":1,"449":1}}],["стандартом",{"2":{"154":1,"162":1,"181":1,"222":1,"247":1,"310":1,"325":1,"329":1,"344":1,"417":1,"512":1}}],["стандарты",{"0":{"469":1},"2":{"173":1,"199":1,"200":1,"323":1,"471":1}}],["стандартная",{"2":{"454":1}}],["стандартную",{"2":{"341":1}}],["стандартного",{"2":{"364":1,"457":1,"460":2}}],["стандартной",{"2":{"323":1}}],["стандартному",{"2":{"173":1}}],["стандартный",{"2":{"253":1,"290":1,"328":1,"546":1}}],["стандартных",{"2":{"176":1,"198":1,"332":1,"336":2,"347":1,"434":1}}],["стандартные",{"2":{"161":1,"332":1,"333":1}}],["стандартными",{"2":{"160":1}}],["стандартным",{"2":{"152":1,"173":1,"366":1}}],["стандарту",{"2":{"136":1,"137":1}}],["стандарте",{"2":{"117":1,"168":1,"325":1}}],["стандартами",{"2":{"150":1,"199":1,"218":1}}],["стандарта",{"2":{"116":1}}],["стандарт",{"2":{"116":1,"117":1,"118":1,"150":1}}],["старайтесь",{"2":{"468":1,"473":1}}],["старается",{"2":{"436":1}}],["старой",{"2":{"421":1}}],["старого",{"2":{"125":1,"225":1}}],["старте",{"2":{"545":1,"556":1}}],["стартер",{"2":{"507":1}}],["старт",{"2":{"374":1}}],["стартовый",{"2":{"343":1}}],["стартовать",{"2":{"339":1}}],["стартовом",{"2":{"230":1}}],["стартового",{"2":{"200":1,"223":1}}],["стартапе",{"2":{"461":1}}],["старта",{"2":{"83":1,"542":1}}],["старых",{"2":{"125":2}}],["старыми",{"0":{"125":1},"2":{"125":2}}],["старый",{"2":{"71":1}}],["старший",{"2":{"116":1}}],["стадию",{"2":{"61":1}}],["стадии",{"0":{"61":1},"2":{"62":1,"79":1,"212":1}}],["статистики",{"2":{"432":1,"449":1,"542":1}}],["статистика",{"2":{"385":1}}],["статичен",{"2":{"316":1}}],["статическое",{"2":{"224":1}}],["статических",{"2":{"308":1,"319":1}}],["статическими",{"2":{"308":1}}],["статическим",{"2":{"280":1}}],["статически",{"2":{"244":1}}],["статический",{"0":{"244":1},"2":{"137":1,"308":1,"313":1,"383":1}}],["статические",{"2":{"137":1,"225":1,"308":1,"317":1}}],["статичной",{"2":{"199":1}}],["статичный",{"2":{"472":2}}],["статичных",{"2":{"422":1}}],["статичным",{"2":{"76":1,"464":1}}],["статичные",{"2":{"6":1}}],["статуса",{"2":{"323":1}}],["статус",{"2":{"256":1,"324":1}}],["статей",{"2":{"183":1,"471":1}}],["стать",{"2":{"178":1,"252":1,"271":1,"436":1,"444":1,"473":2}}],["статья",{"2":{"117":1,"461":1}}],["статье",{"2":{"116":1,"457":1,"460":1,"471":1}}],["статьи",{"0":{"0":1},"2":{"118":1,"183":1,"212":1,"336":1,"390":1}}],["сваливает",{"2":{"463":1}}],["светлой",{"2":{"557":1}}],["светлый",{"2":{"336":1}}],["свете",{"2":{"365":1}}],["сведем",{"2":{"354":1,"434":1}}],["сведите",{"2":{"157":1}}],["сверху",{"2":{"29":2,"35":1,"108":1,"301":1,"343":1,"497":1}}],["свыше",{"2":{"47":1}}],["связали",{"2":{"342":1}}],["связать",{"2":{"310":1}}],["связана",{"2":{"267":1,"296":1}}],["связан",{"2":{"158":1,"196":1,"338":1}}],["связано",{"2":{"136":1,"182":1,"223":1,"373":1,"393":1,"447":1,"448":1}}],["связанную",{"2":{"325":1,"441":1}}],["связанная",{"2":{"184":1,"342":1}}],["связанными",{"2":{"204":1}}],["связанные",{"2":{"131":1,"158":1,"423":1,"424":1}}],["связанный",{"2":{"114":1,"313":1}}],["связанных",{"2":{"63":1,"199":1,"231":1,"381":1}}],["связанного",{"2":{"268":1}}],["связанное",{"2":{"50":1,"249":1}}],["связанность",{"0":{"34":1},"2":{"34":1,"423":1}}],["связаны",{"2":{"2":1,"3":2,"116":1,"141":1,"154":1,"180":1,"237":1,"240":1,"373":1,"464":1}}],["связывание",{"2":{"443":1}}],["связыванием",{"2":{"210":1}}],["связываем",{"2":{"352":1}}],["связывает",{"2":{"206":1,"211":1}}],["связью",{"2":{"350":1}}],["связь",{"2":{"118":1,"158":1,"159":1,"268":2,"289":1,"351":1,"354":1,"440":1,"447":1}}],["связей",{"0":{"239":1},"2":{"62":1}}],["связями",{"2":{"17":1}}],["связи",{"0":{"113":1},"1":{"114":1},"2":{"6":1,"43":1,"68":1,"114":2,"119":1,"144":1,"151":1,"168":1,"204":1,"231":1,"235":1,"238":1,"256":1,"298":1,"306":1,"308":1,"336":1,"370":1,"372":2,"385":1,"422":1,"425":1,"434":1,"436":1,"512":1,"542":1}}],["своя",{"2":{"421":1,"460":1}}],["сворачивать",{"2":{"267":1}}],["сводка",{"2":{"256":1}}],["сводки",{"2":{"256":1}}],["сводные",{"2":{"256":1}}],["свою",{"2":{"151":1,"158":1,"201":1,"203":1,"263":2,"303":1,"308":1,"318":1,"331":1,"344":1,"352":1,"376":1,"386":1,"423":1,"462":2,"464":1,"465":1,"545":1}}],["свободный",{"2":{"325":1}}],["свободного",{"2":{"325":1}}],["свободно",{"2":{"162":1,"224":1,"446":1}}],["свободна",{"2":{"72":1}}],["свободу",{"2":{"137":1,"204":1}}],["свое",{"2":{"189":1,"208":1,"224":1,"303":1,"323":1,"330":1,"358":1,"400":1,"473":1}}],["своей",{"2":{"102":1,"115":1,"140":1,"158":1,"218":1,"260":1,"264":1,"303":1,"472":1}}],["своего",{"2":{"40":1,"115":2,"118":1,"134":1,"186":1,"291":1,"296":1,"346":1,"351":1,"402":1,"454":1,"472":1}}],["своему",{"2":{"224":1,"364":1,"393":1,"432":2,"436":1,"455":1}}],["своем",{"2":{"40":1,"225":1,"323":1,"331":1,"436":1,"471":1}}],["своё",{"2":{"26":1,"47":2}}],["свойству",{"2":{"284":1,"296":1}}],["свойств",{"2":{"123":2,"231":2,"256":1,"282":1,"296":1,"322":1,"360":1,"372":1}}],["свойством",{"2":{"123":1,"365":1}}],["свойство",{"0":{"122":1},"2":{"122":1,"231":2,"255":2,"265":1,"286":1,"296":1,"366":1,"380":1}}],["свойстве",{"2":{"119":1,"255":1,"285":1}}],["свойствах",{"2":{"284":1}}],["свойствами",{"2":{"122":1,"123":1,"231":1,"295":1,"360":1,"361":1,"380":1,"472":1}}],["свойствам",{"2":{"83":1,"380":1,"381":1}}],["свойства",{"2":{"16":1,"122":1,"124":1,"204":1,"231":5,"232":1,"252":1,"296":1,"316":1,"359":1,"361":5,"366":1,"443":1}}],["свой",{"0":{"115":1},"2":{"4":1,"12":1,"23":1,"39":1,"41":1,"59":2,"115":2,"143":1,"150":1,"203":1,"204":2,"225":1,"267":1,"270":4,"343":1,"372":1,"394":1,"421":1,"422":2,"473":3}}],["своих",{"2":{"144":1,"149":1,"154":1,"226":1,"285":1,"318":1,"353":1,"354":1,"434":1,"436":1,"472":1}}],["своими",{"2":{"224":1,"421":1,"436":1}}],["своим",{"2":{"41":1,"59":1,"112":1,"161":1,"239":1,"351":1,"385":1,"391":1,"433":1,"462":1}}],["свои",{"2":{"3":1,"23":2,"123":1,"159":1,"218":1,"233":1,"248":1,"259":1,"292":1,"293":1,"300":1,"306":1,"308":1,"324":1,"347":1,"356":1,"375":1,"385":1,"395":1,"396":1,"423":1,"432":2,"462":2,"463":1,"466":1,"471":2}}],["соцсетями",{"2":{"542":1}}],["социальными",{"2":{"200":1}}],["социальных",{"0":{"183":1},"2":{"183":3,"189":1,"338":1}}],["сорс",{"2":{"473":1}}],["сортировки",{"2":{"176":1}}],["соединяться",{"2":{"331":1}}],["соединению",{"2":{"337":1}}],["соединений",{"2":{"137":1}}],["соединение",{"2":{"137":1,"336":1,"439":1}}],["соединения",{"2":{"118":1,"137":1,"364":1}}],["солидно",{"2":{"457":1}}],["солидных",{"2":{"97":1}}],["соли",{"2":{"200":1}}],["сопутствующей",{"2":{"462":2}}],["сопутствующие",{"2":{"462":1}}],["сопутствующих",{"2":{"192":1}}],["сопоставимое",{"2":{"461":1}}],["сопоставимости",{"2":{"351":1}}],["сопоставить",{"2":{"365":1}}],["сопоставлены",{"2":{"322":1}}],["сопоставленный",{"2":{"228":1}}],["сопоставляет",{"2":{"309":1}}],["сопровождение",{"2":{"332":1}}],["сопровождения",{"2":{"218":1}}],["сопровождаемым",{"2":{"188":1}}],["сопровождаемость",{"2":{"63":1,"261":1}}],["сопровождать",{"2":{"168":1}}],["сопровождаться",{"2":{"163":1}}],["соглашению",{"2":{"246":1,"250":1}}],["соглашений",{"2":{"213":1,"218":1,"219":1,"225":1,"267":1}}],["соглашениям",{"2":{"316":1}}],["соглашения",{"0":{"213":1},"1":{"214":1,"215":1,"216":1,"217":1,"218":1},"2":{"218":3,"220":1,"224":1,"247":1,"270":1}}],["соглашением",{"2":{"247":1}}],["соглашение",{"2":{"189":1,"204":1,"247":1,"310":1,"375":2}}],["соглашается",{"2":{"196":1,"336":1,"343":1}}],["согласия",{"2":{"343":2}}],["согласиться",{"2":{"343":1}}],["согласие",{"2":{"189":1,"364":2}}],["согласовать",{"2":{"281":1}}],["согласования",{"2":{"336":1}}],["согласование",{"2":{"63":1}}],["согласованность",{"2":{"227":1}}],["согласованности",{"2":{"152":1}}],["согласны",{"2":{"218":1}}],["согласно",{"2":{"134":1,"136":1,"152":1,"181":1,"269":1,"338":1,"377":1}}],["сотен",{"2":{"269":1}}],["сотрудничества",{"2":{"197":1}}],["сотрудничестве",{"2":{"149":1}}],["сотни",{"2":{"184":1,"372":1}}],["сослаться",{"2":{"317":1}}],["сосредоточен",{"2":{"231":1}}],["сосредоточились",{"2":{"287":1,"349":1}}],["сосредоточимся",{"2":{"201":1,"228":1,"250":1,"256":1,"306":1,"331":1,"334":1,"349":1,"364":1,"370":1}}],["сосредоточиться",{"2":{"177":1,"372":1,"373":2,"436":1,"447":1}}],["составному",{"2":{"536":1}}],["составной",{"2":{"250":1}}],["составными",{"2":{"349":1}}],["состав",{"2":{"328":1}}],["составление",{"0":{"237":1},"1":{"238":1,"239":1,"240":1,"241":1}}],["составлять",{"2":{"239":1}}],["составляющая",{"2":{"308":1}}],["составляющие",{"2":{"134":1,"330":1,"361":1}}],["составляют",{"2":{"149":1,"308":1}}],["составляет",{"2":{"134":1,"364":1}}],["составителя",{"2":{"497":1}}],["составит",{"2":{"59":1}}],["состоящую",{"2":{"263":1}}],["состоящее",{"2":{"134":1}}],["состоять",{"2":{"462":1}}],["состоят",{"2":{"134":1,"263":1,"269":1,"443":2}}],["состоянию",{"2":{"239":1,"278":1,"360":2}}],["состояний",{"2":{"218":1,"232":1,"256":4,"365":1}}],["состояние",{"2":{"163":1,"168":1,"173":1,"208":2,"212":1,"239":3,"254":1,"255":1,"256":3,"326":1,"357":2,"358":2,"359":2,"360":1,"363":1,"462":2}}],["состоянием",{"2":{"119":1,"127":2,"239":1,"249":1,"316":1,"357":2,"358":1,"359":3,"369":1,"401":1,"464":1}}],["состоянии",{"2":{"162":2,"168":1,"255":1,"256":1,"267":1,"303":2,"324":1,"350":1,"394":1}}],["состояния",{"0":{"357":1},"1":{"358":1},"2":{"162":2,"210":1,"212":1,"231":1,"232":1,"237":1,"239":2,"240":2,"254":1,"255":1,"256":2,"344":1,"349":1,"356":2,"358":1,"363":1,"368":1,"391":1}}],["состояниями",{"2":{"119":1,"256":2,"258":1,"363":1,"413":1}}],["состоит",{"2":{"28":1,"61":1,"63":1,"144":1,"199":1,"202":1,"203":1,"300":1,"360":1,"440":1,"513":1}}],["сочетании",{"2":{"166":1,"209":1,"278":1,"290":1}}],["сокращения",{"0":{"496":1}}],["сокращение",{"0":{"206":1,"211":1},"2":{"211":1,"372":1}}],["сокращенное",{"2":{"249":1}}],["сокращенный",{"2":{"206":1}}],["сокращенайте",{"2":{"158":1}}],["сокращайте",{"2":{"158":1}}],["сократить",{"2":{"134":1}}],["содержимым",{"2":{"212":1,"255":1,"312":1}}],["содержимого",{"2":{"158":2,"167":1,"170":1,"171":1,"177":1,"249":1,"501":1,"547":1}}],["содержимое",{"2":{"153":1,"181":1,"183":1,"201":2,"203":1,"223":1,"224":1,"230":1,"249":6,"254":1,"436":1,"472":1}}],["содержится",{"2":{"325":1,"437":1}}],["содержите",{"2":{"270":1}}],["содержит",{"2":{"117":2,"203":1,"204":1,"206":1,"224":1,"239":1,"250":1,"256":2,"295":1,"325":2,"328":1,"380":1,"381":1,"437":1}}],["содержатся",{"2":{"454":1}}],["содержат",{"2":{"267":1,"441":1,"454":1,"471":1}}],["содержать",{"2":{"202":1,"204":1,"231":2,"244":1,"316":1,"325":2,"326":1,"329":1,"331":1,"341":1,"359":2,"364":1,"437":1,"534":1}}],["содержащая",{"2":{"325":1,"437":1,"462":1}}],["содержащиеся",{"2":{"376":1}}],["содержащим",{"2":{"313":1}}],["содержащимся",{"2":{"294":1}}],["содержащий",{"2":{"203":1,"204":1,"256":1,"341":1,"360":1}}],["содержащих",{"2":{"144":1,"394":1}}],["содержащее",{"2":{"178":1}}],["содержанием",{"2":{"174":1}}],["содержание",{"2":{"149":1,"220":1,"255":1}}],["соблюсти",{"2":{"264":1}}],["соблюдения",{"2":{"336":1}}],["соблюдение",{"2":{"247":1}}],["соблюдаем",{"2":{"353":1}}],["соблюдаться",{"2":{"261":1}}],["соблюдая",{"2":{"225":1}}],["соблюдали",{"2":{"218":1}}],["соблазн",{"2":{"186":1}}],["событии",{"2":{"267":1}}],["событий",{"0":{"239":1,"354":1},"1":{"355":1,"356":1},"2":{"231":1,"244":1,"245":1,"246":2,"250":1,"291":4,"292":2,"300":1,"309":1,"316":2,"355":1,"357":1,"369":1,"379":1,"381":1,"394":1,"441":1}}],["событию",{"2":{"231":1,"255":1,"267":1,"352":1}}],["событиях",{"2":{"441":1}}],["событиям",{"2":{"250":1,"380":1}}],["событиями",{"2":{"247":1,"276":1,"291":1}}],["события",{"0":{"217":1,"245":1},"2":{"204":1,"237":1,"239":2,"240":2,"245":2,"246":3,"250":1,"256":1,"267":3,"291":1,"292":1,"313":1,"316":2,"319":1,"343":2,"344":1,"351":2,"353":1,"354":2,"356":3,"381":5,"391":1,"441":1,"444":1}}],["событием",{"2":{"267":2,"352":1,"441":1}}],["событие",{"2":{"124":1,"163":1,"165":1,"170":1,"211":4,"240":2,"246":2,"267":1,"291":4,"292":3,"296":1,"316":1,"319":1,"343":5,"344":1,"354":2,"356":2,"374":1,"381":8,"390":1,"437":3,"442":1}}],["собеседованию",{"2":{"473":1}}],["собеседник",{"2":{"165":1}}],["соберет",{"2":{"201":1}}],["собирают",{"2":{"447":1}}],["собираются",{"2":{"189":1,"212":1,"270":1}}],["собирать",{"2":{"330":2}}],["собирались",{"2":{"268":1}}],["собирает",{"2":{"239":1,"324":1,"386":1,"432":1}}],["собираемся",{"2":{"223":1}}],["собираемого",{"2":{"127":1}}],["собственная",{"2":{"446":1}}],["собственную",{"2":{"364":1,"366":1,"376":2,"386":1}}],["собственными",{"2":{"436":1}}],["собственные",{"2":{"161":1,"205":1,"218":1,"231":1,"300":1,"373":1}}],["собственный",{"2":{"150":1,"203":1,"325":1,"343":1,"372":1,"382":1,"443":1}}],["собственных",{"2":{"137":1,"396":1}}],["собственной",{"2":{"324":2,"328":1,"375":1,"376":1,"449":1}}],["собственно",{"2":{"185":1,"311":1}}],["собственного",{"2":{"170":1,"333":1,"366":1,"454":1}}],["собственное",{"2":{"166":1,"179":1,"224":1,"300":1,"331":1}}],["собственном",{"2":{"145":1,"312":1,"336":1,"436":1}}],["собственному",{"2":{"134":1}}],["собственности",{"2":{"134":1}}],["собрана",{"2":{"250":1}}],["собранных",{"2":{"324":1}}],["собранные",{"2":{"136":1}}],["собранной",{"2":{"239":1}}],["собранную",{"2":{"224":1}}],["собрано",{"2":{"203":1}}],["собрать",{"2":{"136":1,"224":1,"329":1,"432":1}}],["собой",{"2":{"3":1,"6":1,"17":1,"134":1,"155":1,"161":1,"173":1,"181":1,"186":1,"197":1,"199":2,"200":1,"202":1,"203":1,"224":2,"231":1,"237":1,"238":1,"243":1,"256":1,"267":1,"297":1,"305":1,"308":1,"325":1,"339":1,"340":1,"351":1,"364":2,"381":1,"407":1,"433":1,"443":1,"449":1,"453":1}}],["соображения",{"0":{"425":1},"1":{"426":1,"427":1,"428":1},"2":{"287":1,"333":1}}],["сообщает",{"2":{"391":1}}],["сообществе",{"2":{"386":1}}],["сообщество",{"2":{"228":1}}],["сообщением",{"2":{"393":1}}],["сообщение",{"2":{"165":1,"295":1,"344":1,"375":1,"393":2,"437":4,"438":1,"441":1,"442":1,"443":2,"444":1,"445":1,"449":1,"495":1}}],["сообщений",{"2":{"118":2,"329":1,"349":1,"353":1,"354":4,"355":1,"357":1,"369":1,"376":1,"436":1,"443":1,"444":1}}],["сообщениями",{"2":{"394":1,"437":1,"443":1}}],["сообщения",{"2":{"118":1,"166":1,"329":1,"355":1,"436":1,"441":2,"443":2,"454":1}}],["сообщить",{"2":{"168":1,"244":1,"329":1}}],["соотношения",{"2":{"385":1}}],["соотноситься",{"2":{"239":1}}],["соответствовал",{"2":{"223":1}}],["соответствовать",{"2":{"135":1,"303":1,"313":1,"336":1,"348":1}}],["соответствует",{"2":{"137":1,"200":1,"231":1,"284":1,"309":1,"319":1,"346":2,"421":1}}],["соответствуют",{"2":{"135":1,"160":1,"376":1,"449":1}}],["соответствующую",{"2":{"136":1,"229":1,"359":1,"375":1,"384":1,"421":1}}],["соответствующим",{"2":{"267":1,"324":1,"380":1}}],["соответствующих",{"2":{"225":1,"263":1,"410":1,"450":1,"507":1}}],["соответствующий",{"2":{"112":1,"249":1,"256":1,"294":1,"316":1,"325":1,"441":1,"444":1,"449":1,"460":1}}],["соответствующие",{"2":{"51":1,"310":1,"316":1,"319":1,"323":1,"372":1,"435":1}}],["соответствующему",{"2":{"293":2,"320":1,"440":1}}],["соответствующем",{"2":{"267":1}}],["соответствующее",{"2":{"209":1}}],["соответствующей",{"2":{"59":1,"449":1,"504":1}}],["соответствующего",{"2":{"17":1,"330":1,"349":1,"374":1}}],["соответствия",{"2":{"255":1,"323":1,"370":1,"372":1}}],["соответствии",{"2":{"135":1,"162":1,"200":1,"224":1,"231":2,"238":1,"268":1,"293":1,"294":2,"324":1,"329":1,"336":1,"344":1,"345":1,"372":1,"387":1,"455":1,"473":1,"554":1}}],["соответствие",{"2":{"63":1,"319":1,"372":1,"381":1,"455":1}}],["соответственно",{"2":{"47":1,"59":2,"117":1,"127":1,"131":1,"228":1,"255":1,"324":1,"436":1,"471":1,"472":1}}],["сохраненные",{"2":{"446":1}}],["сохранения",{"2":{"204":1,"212":1,"376":1}}],["сохранением",{"2":{"250":2,"536":1}}],["сохранение",{"0":{"104":1},"2":{"364":1,"365":1}}],["сохранил",{"2":{"421":1}}],["сохранили",{"2":{"299":1}}],["сохранив",{"2":{"300":1}}],["сохранится",{"2":{"367":1}}],["сохраните",{"2":{"231":1,"393":2}}],["сохранить",{"2":{"34":1,"116":1,"177":1,"295":1,"324":1,"331":1,"343":1,"393":1,"436":1,"472":1}}],["сохраним",{"2":{"223":1,"255":1,"267":1}}],["сохраняющий",{"2":{"297":1}}],["сохраняются",{"2":{"250":1,"364":1}}],["сохраняем",{"2":{"281":1,"299":1,"343":1,"443":1,"452":2}}],["сохраняется",{"2":{"200":1,"364":1}}],["сохраняет",{"2":{"116":1,"212":1,"281":1,"296":1,"421":1,"432":1}}],["сохраняя",{"2":{"227":1,"297":1}}],["сохраняться",{"2":{"311":1}}],["сохранять",{"2":{"104":2,"115":1,"225":1,"385":1}}],["сохранялся",{"2":{"104":1}}],["софт",{"2":{"72":1}}],["сожалению",{"2":{"51":1,"159":1,"185":1,"268":1,"433":1,"473":1}}],["создаётся",{"2":{"555":1}}],["создателем",{"2":{"386":1}}],["создать",{"2":{"26":1,"58":1,"72":1,"74":1,"95":1,"134":2,"146":1,"149":2,"154":1,"159":1,"197":1,"224":1,"228":1,"229":1,"231":1,"233":1,"235":2,"241":2,"255":1,"259":1,"263":1,"269":1,"298":2,"309":1,"310":1,"312":1,"313":1,"314":1,"316":1,"319":1,"329":1,"354":1,"359":1,"365":1,"376":3,"386":1,"390":1,"392":1,"394":1,"429":1,"433":1,"437":1,"441":1,"447":1,"452":1,"462":1,"464":1,"506":1,"507":1}}],["создающим",{"2":{"507":1}}],["создающий",{"2":{"370":1}}],["создающего",{"2":{"507":1}}],["создают",{"2":{"209":1,"225":1,"271":1,"334":1,"364":1,"449":1}}],["создаются",{"2":{"134":1,"197":1,"300":1,"412":1}}],["создайте",{"2":{"253":1,"255":1,"310":1,"312":1,"375":1,"379":1,"380":1,"392":1,"393":1,"443":1,"453":1,"527":1}}],["создав",{"2":{"238":1,"357":1,"366":1,"393":1}}],["создаваемый",{"2":{"364":1}}],["создаваемой",{"2":{"345":1}}],["создавали",{"2":{"317":1}}],["создавалось",{"2":{"353":1}}],["создавало",{"2":{"122":1}}],["создавая",{"2":{"168":1,"170":1,"227":1,"308":1,"425":1,"436":1}}],["создавать",{"2":{"59":2,"199":2,"205":1,"231":1,"233":1,"246":2,"252":1,"264":1,"269":1,"297":1,"304":1,"306":1,"309":1,"311":2,"317":1,"319":1,"334":1,"364":1,"379":1,"381":1,"415":1,"442":1,"446":1,"471":1,"507":1,"508":1}}],["создаст",{"2":{"204":1,"223":1,"313":1,"501":2}}],["создастся",{"2":{"112":1}}],["созданы",{"2":{"390":1,"472":1}}],["создано",{"2":{"374":1,"446":1}}],["создана",{"2":{"224":2,"421":1}}],["созданном",{"2":{"372":1,"472":1}}],["созданному",{"2":{"204":1}}],["созданного",{"2":{"344":1,"375":1}}],["созданные",{"2":{"436":1}}],["созданными",{"2":{"366":1}}],["созданных",{"2":{"231":1}}],["созданный",{"2":{"223":1,"386":1,"437":1}}],["создан",{"2":{"125":1,"171":1,"237":1,"383":1,"390":1,"497":1}}],["созданию",{"2":{"204":1,"224":1,"250":1,"273":1}}],["создания",{"2":{"70":1,"112":1,"120":1,"121":1,"123":1,"134":2,"145":1,"150":1,"157":1,"158":1,"181":1,"200":4,"201":2,"202":2,"204":1,"212":1,"221":1,"223":2,"224":2,"231":1,"232":1,"233":2,"235":1,"237":2,"247":1,"249":1,"251":1,"252":1,"256":1,"266":1,"267":1,"290":2,"295":1,"300":2,"308":1,"309":1,"310":1,"311":1,"316":1,"317":1,"319":1,"325":2,"326":1,"334":1,"335":1,"336":1,"345":1,"347":1,"349":1,"354":1,"357":1,"360":1,"365":1,"368":1,"374":1,"375":1,"376":1,"380":1,"381":1,"384":1,"390":2,"400":1,"401":1,"411":1,"414":1,"438":2,"442":1,"443":1,"445":1,"446":1,"447":3,"453":2,"454":4,"461":1,"463":1,"507":2}}],["созданием",{"2":{"59":1,"131":1}}],["создание",{"0":{"58":1,"110":1,"409":1,"432":1},"1":{"111":1,"112":1},"2":{"221":1,"224":1,"234":1,"246":1,"278":1,"309":1,"324":1,"336":1,"341":1,"370":2,"385":1,"395":1,"432":2,"433":1,"437":1,"472":1,"504":1,"507":1,"508":2,"557":1}}],["создании",{"0":{"135":1,"541":1},"1":{"136":1,"542":1,"543":1,"544":1,"545":1},"2":{"41":1,"85":1,"117":1,"122":1,"200":3,"293":1,"297":1,"316":1,"349":1,"365":1,"375":1,"508":2}}],["создаем",{"2":{"105":1,"108":1,"111":1,"171":1,"201":1,"211":1,"231":2,"246":1,"247":1,"250":2,"255":2,"288":1,"292":1,"313":2,"316":1,"326":1,"353":1,"358":1,"363":1,"366":2,"409":1,"437":1,"443":1,"448":1,"454":1}}],["создается",{"2":{"201":1,"241":1,"325":1,"343":1,"391":1}}],["создает",{"2":{"48":1,"116":1,"134":1,"153":1,"224":1,"231":1,"232":1,"240":1,"281":1,"289":1,"330":1,"336":1,"358":1,"386":1,"460":1,"511":1}}],["создадим",{"2":{"51":1,"109":1,"133":1,"221":1,"223":2,"230":2,"252":1,"258":1,"267":1,"287":1,"300":1,"306":1,"366":1,"374":1,"376":1,"391":1,"442":1,"444":1,"446":2,"447":1,"449":1}}],["создали",{"2":{"17":1,"232":1,"233":1,"238":1,"255":1,"256":1,"258":1,"311":1,"316":1,"332":1,"342":1,"448":1}}],["совпадении",{"2":{"472":1}}],["совпадения",{"2":{"391":1}}],["совпадать",{"2":{"319":1}}],["совпадают",{"2":{"289":1,"325":1,"421":1}}],["совпадает",{"2":{"249":1}}],["совокупность",{"2":{"364":1,"373":1}}],["совсем",{"2":{"299":1,"311":1,"463":1,"472":1}}],["совместим",{"2":{"376":1}}],["совместимости",{"2":{"204":1,"250":1}}],["совместимость",{"0":{"125":1},"2":{"119":1,"125":3,"295":1}}],["совместимых",{"2":{"144":1}}],["совместимым",{"2":{"119":1}}],["совместному",{"2":{"252":1}}],["совместного",{"2":{"246":1,"248":1,"356":1,"365":1}}],["совместно",{"2":{"137":1,"204":1,"357":1,"382":1,"386":1,"394":1,"436":1}}],["совместное",{"2":{"117":1,"250":1}}],["совместную",{"2":{"63":1}}],["совершенствования",{"2":{"234":1}}],["совершенствование",{"2":{"232":1}}],["совершенствовать",{"2":{"232":1,"306":1,"442":1}}],["совершенно",{"2":{"203":1,"212":1,"364":1}}],["совершается",{"2":{"188":1}}],["совершать",{"2":{"91":1}}],["совершить",{"2":{"185":1,"255":1}}],["советуется",{"2":{"421":1,"460":1}}],["советы",{"0":{"458":1},"1":{"459":1,"460":1},"2":{"73":1,"464":1,"479":1,"485":1}}],["совет",{"2":{"22":1,"204":1,"208":1,"218":1,"265":1,"270":1,"287":1,"331":1,"473":1,"512":1}}],["современная",{"2":{"199":1}}],["современный",{"2":{"222":1,"402":1,"431":1,"432":1,"460":1,"473":1}}],["современных",{"2":{"222":1,"300":1,"332":1,"363":1,"368":1,"402":1,"455":2}}],["современным",{"2":{"203":1,"504":1}}],["современными",{"2":{"161":1,"368":1}}],["современные",{"0":{"469":1},"2":{"44":1,"71":1,"269":1,"323":1,"334":1,"394":1,"422":1,"432":1}}],["современной",{"2":{"222":1,"266":1,"396":1}}],["современном",{"2":{"202":1,"436":1}}],["современного",{"2":{"86":1,"125":1,"508":1}}],["современное",{"2":{"2":1}}],["со",{"0":{"125":1},"2":{"11":1,"12":1,"17":1,"25":1,"41":1,"59":1,"76":1,"85":1,"112":2,"117":2,"123":2,"125":2,"131":1,"135":1,"147":1,"153":1,"158":1,"168":1,"173":1,"183":2,"204":1,"206":1,"215":1,"223":2,"224":2,"227":1,"231":4,"245":1,"251":1,"255":1,"256":1,"287":1,"291":1,"296":1,"300":1,"303":1,"311":2,"312":1,"313":1,"316":2,"319":1,"325":2,"334":1,"343":1,"344":1,"345":1,"351":1,"356":2,"360":1,"363":1,"366":1,"380":2,"421":1,"431":1,"436":1,"444":1,"445":1,"453":1,"455":1,"460":1,"462":1,"472":4}}],["с",{"0":{"50":1,"81":1,"113":1,"119":1,"144":1,"160":1,"186":1,"225":1,"235":1,"237":1,"247":1,"251":1,"346":1,"354":1,"359":1,"365":1,"386":1,"394":1,"410":1,"414":1,"418":1,"434":1,"442":1,"446":1},"1":{"82":1,"83":1,"114":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"226":1,"236":1,"237":1,"238":2,"239":2,"240":2,"241":2,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1,"355":1,"356":1,"360":1,"361":1,"362":1,"363":1,"366":1,"367":1,"435":1,"436":1,"437":1,"438":1,"439":1,"440":1,"441":1,"442":1,"443":2,"444":2,"445":2,"446":1,"447":2,"448":2,"449":2,"450":2,"451":2,"452":2,"453":1,"454":1,"455":1,"456":1},"2":{"2":2,"3":5,"6":1,"9":3,"11":3,"12":2,"17":3,"22":1,"23":1,"29":2,"30":1,"33":1,"34":2,"35":4,"38":2,"39":2,"40":1,"41":3,"43":1,"47":1,"48":1,"50":3,"56":1,"59":1,"61":1,"62":1,"63":3,"68":1,"71":1,"72":1,"76":4,"79":1,"85":2,"86":4,"89":2,"91":1,"92":1,"95":1,"97":1,"98":4,"102":3,"103":3,"104":1,"105":3,"108":1,"114":3,"115":10,"116":13,"117":3,"118":4,"119":4,"120":1,"123":3,"124":4,"125":1,"130":2,"131":5,"132":1,"134":5,"135":1,"136":1,"137":7,"139":1,"140":4,"141":2,"143":4,"144":4,"145":4,"147":7,"149":5,"150":4,"151":3,"152":2,"153":1,"154":4,"155":1,"156":1,"157":1,"158":4,"159":3,"160":2,"161":1,"162":3,"163":2,"164":3,"165":1,"166":3,"167":4,"168":2,"170":2,"171":3,"173":2,"175":1,"176":4,"177":1,"178":2,"180":1,"181":5,"182":2,"183":2,"184":2,"185":2,"186":1,"187":1,"188":2,"191":2,"193":1,"194":1,"195":2,"196":3,"197":4,"199":4,"200":9,"201":3,"202":3,"203":8,"204":5,"205":1,"208":2,"209":1,"210":1,"211":4,"212":1,"213":1,"215":2,"216":1,"218":1,"219":1,"221":6,"222":6,"223":10,"224":11,"226":4,"227":7,"228":2,"229":5,"230":4,"231":20,"232":4,"234":3,"235":9,"237":3,"238":5,"239":6,"240":3,"241":2,"242":1,"243":3,"244":5,"245":3,"246":2,"247":8,"249":10,"250":7,"251":3,"252":1,"253":1,"254":2,"255":14,"256":8,"257":1,"258":2,"259":3,"260":3,"261":1,"263":3,"264":2,"265":2,"266":2,"267":8,"268":6,"270":1,"271":3,"276":3,"278":1,"279":1,"281":2,"282":2,"284":1,"287":1,"289":3,"290":1,"292":3,"293":3,"294":3,"295":6,"296":1,"297":7,"298":3,"300":9,"301":1,"302":5,"303":15,"304":3,"306":8,"308":8,"309":5,"310":3,"311":4,"313":8,"314":1,"315":3,"316":8,"317":4,"318":3,"319":7,"320":2,"322":8,"323":4,"324":2,"325":3,"326":1,"327":1,"328":4,"329":4,"330":9,"331":11,"332":3,"334":3,"335":1,"336":14,"337":1,"338":2,"339":4,"341":3,"342":2,"343":5,"344":7,"345":4,"346":2,"347":6,"349":6,"350":1,"351":3,"352":2,"353":3,"354":3,"356":6,"357":2,"358":5,"359":2,"360":3,"361":3,"363":3,"364":8,"365":4,"366":7,"367":3,"368":2,"370":4,"371":1,"372":11,"373":4,"374":3,"375":8,"376":10,"377":1,"378":1,"379":4,"380":2,"381":14,"382":1,"383":2,"384":4,"385":3,"386":5,"387":2,"388":1,"390":4,"391":4,"392":1,"393":9,"394":10,"395":1,"400":3,"402":1,"404":1,"410":2,"413":1,"414":2,"415":2,"416":1,"421":4,"422":4,"423":4,"425":4,"429":3,"431":2,"432":3,"433":4,"434":5,"435":1,"436":6,"438":3,"439":3,"440":7,"441":3,"442":5,"443":5,"444":3,"445":2,"446":5,"447":8,"448":5,"449":3,"450":2,"451":1,"452":3,"454":7,"455":3,"456":2,"457":1,"458":1,"460":4,"461":4,"462":11,"463":3,"464":5,"465":1,"466":1,"468":1,"472":11,"473":12,"479":1,"496":3,"501":3,"504":2,"506":1,"507":5,"508":6,"509":1,"511":1,"512":1,"513":3,"516":2,"527":1,"533":1,"536":3,"539":1,"540":1,"542":1,"543":1,"544":1,"545":2,"546":1,"554":1}}],["дня",{"2":{"473":1}}],["дней",{"2":{"468":1,"473":1}}],["дни",{"2":{"264":1,"328":1}}],["дюймов",{"2":{"433":1}}],["дэвиду",{"2":{"268":1}}],["думать",{"2":{"400":1}}],["думаю",{"2":{"265":1}}],["дубликаты",{"2":{"292":1}}],["дубликата",{"2":{"256":1}}],["дублированию",{"2":{"364":1}}],["дублирование",{"2":{"232":1,"268":1,"276":1,"364":1}}],["дублировать",{"2":{"116":1,"382":1}}],["дыхательной",{"2":{"263":1}}],["длительных",{"2":{"303":1,"364":1}}],["длительному",{"2":{"370":1}}],["длительное",{"2":{"168":1}}],["длительного",{"2":{"168":2}}],["длиной",{"2":{"265":1}}],["длину",{"2":{"231":1}}],["длинных",{"2":{"235":1,"303":1}}],["длинными",{"2":{"228":1}}],["длинный",{"2":{"170":1}}],["для",{"0":{"74":1,"115":1,"135":1,"146":1,"160":1,"172":1,"180":1,"188":1,"198":1,"220":1,"234":1,"259":1,"270":1,"305":1,"333":1,"348":1,"369":1,"397":1,"401":1,"453":1,"456":1,"526":1},"1":{"136":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"181":1,"182":1,"183":1,"184":1,"273":1,"274":1,"275":1,"276":1,"454":1,"527":1,"528":1},"2":{"2":1,"3":1,"4":1,"7":2,"9":2,"10":1,"12":2,"13":1,"17":5,"18":1,"22":4,"23":3,"27":2,"35":1,"36":1,"39":2,"40":2,"41":3,"47":3,"48":1,"50":1,"53":1,"56":1,"58":1,"59":4,"61":1,"62":2,"63":2,"65":1,"71":1,"72":3,"76":3,"78":1,"79":2,"82":1,"86":1,"89":2,"90":1,"95":3,"97":3,"98":1,"102":1,"103":1,"104":2,"108":1,"109":1,"112":1,"114":1,"115":3,"116":4,"117":3,"118":6,"119":2,"120":1,"121":5,"122":1,"123":5,"125":5,"127":2,"128":1,"130":3,"131":4,"133":3,"134":20,"135":1,"136":2,"137":5,"140":2,"141":2,"142":2,"143":3,"144":10,"145":1,"146":1,"147":3,"149":4,"150":4,"151":2,"152":3,"153":2,"154":2,"155":1,"156":1,"157":3,"158":3,"159":5,"161":2,"162":2,"163":6,"164":4,"165":1,"166":3,"167":4,"168":3,"169":3,"170":3,"171":2,"173":4,"174":2,"175":1,"176":5,"177":3,"178":5,"179":1,"181":6,"183":1,"186":1,"187":1,"188":1,"191":2,"194":1,"195":1,"197":3,"199":4,"200":8,"201":5,"202":5,"203":9,"204":11,"208":2,"209":2,"211":3,"212":6,"213":1,"215":1,"218":4,"219":1,"220":2,"221":3,"222":7,"223":8,"224":8,"225":2,"227":8,"228":13,"229":2,"230":3,"231":22,"233":2,"235":2,"237":2,"238":1,"239":7,"241":7,"243":3,"244":3,"245":2,"246":3,"247":5,"248":2,"249":5,"250":3,"251":2,"252":3,"254":1,"255":14,"256":11,"258":1,"260":4,"263":2,"264":3,"265":1,"266":1,"267":4,"268":1,"269":1,"270":3,"271":7,"277":1,"279":1,"281":3,"282":2,"284":1,"286":3,"287":6,"288":5,"289":2,"291":1,"292":5,"293":5,"294":2,"295":6,"296":7,"297":4,"298":1,"299":1,"300":10,"301":7,"303":15,"304":2,"306":1,"308":6,"309":2,"310":4,"311":3,"312":1,"313":3,"316":6,"317":1,"318":2,"319":5,"320":2,"322":3,"323":8,"324":3,"325":13,"326":3,"327":1,"328":3,"329":9,"330":6,"331":14,"332":2,"333":2,"334":5,"335":2,"336":12,"338":3,"339":3,"340":1,"341":2,"343":6,"344":12,"345":4,"346":1,"347":2,"348":2,"349":6,"350":3,"351":4,"352":1,"353":3,"355":1,"356":5,"357":4,"358":4,"360":2,"361":1,"362":2,"363":7,"364":15,"365":1,"366":4,"367":2,"368":2,"369":2,"370":5,"372":5,"373":5,"374":6,"375":7,"376":5,"377":1,"378":3,"379":3,"380":4,"381":3,"382":2,"383":6,"384":6,"385":4,"386":5,"387":2,"388":1,"390":1,"391":3,"392":2,"393":1,"394":6,"395":2,"396":4,"397":2,"400":3,"401":3,"402":2,"403":1,"405":1,"408":1,"409":1,"411":1,"412":1,"413":1,"414":1,"415":1,"416":1,"418":1,"419":1,"421":12,"422":3,"423":4,"425":2,"428":1,"429":2,"430":1,"431":2,"432":8,"433":9,"434":4,"435":1,"436":7,"437":2,"438":1,"439":4,"440":3,"441":2,"442":3,"443":2,"444":1,"445":3,"446":3,"447":7,"448":3,"449":7,"450":4,"451":1,"452":5,"453":5,"454":10,"455":2,"456":1,"457":2,"458":1,"459":1,"460":8,"461":3,"462":6,"463":8,"464":1,"466":1,"467":2,"468":1,"470":1,"471":2,"472":18,"473":6,"497":1,"503":1,"504":5,"506":1,"507":6,"509":2,"511":1,"512":3,"513":1,"515":2,"519":1,"527":1,"529":1,"536":4,"539":2,"542":6,"545":5,"552":1,"555":4,"556":1}}],["дриллинг",{"2":{"462":1}}],["др",{"2":{"222":1,"336":1,"545":1}}],["драйверами",{"2":{"176":1}}],["древовидной",{"2":{"174":1,"354":1}}],["древней",{"2":{"147":1}}],["дружелюбие",{"2":{"155":1}}],["дружественный",{"0":{"196":1}}],["дружественные",{"2":{"134":1}}],["дружественного",{"2":{"134":1}}],["другую",{"2":{"193":1,"244":1,"297":1,"316":1,"324":1,"358":1,"364":1,"366":1,"377":1,"392":1,"466":1}}],["другу",{"2":{"154":1,"239":1,"441":1}}],["другая",{"2":{"295":1,"297":1,"498":1}}],["друга",{"2":{"86":1,"151":1,"178":1,"185":1,"239":1,"297":1,"331":1,"351":1,"375":1,"382":1}}],["другого",{"2":{"96":1,"128":1,"133":1,"178":1,"187":2,"204":1,"235":1,"268":1,"270":2,"287":1,"295":1,"296":1,"300":1,"310":1,"373":1,"454":1,"462":2}}],["другой",{"0":{"120":1},"2":{"34":1,"39":1,"41":2,"117":1,"153":1,"200":1,"202":1,"231":1,"244":1,"256":1,"259":1,"260":1,"287":1,"291":1,"294":1,"302":1,"308":1,"316":1,"323":1,"329":1,"343":2,"356":1,"363":1,"421":1,"425":1,"462":4,"464":1,"473":1,"507":1,"511":1}}],["другое",{"2":{"26":1,"36":1,"89":1,"140":1,"200":1,"204":1,"212":1,"223":1,"239":1,"242":1,"255":1,"303":1,"331":1,"343":1,"394":1,"462":1}}],["другому",{"2":{"246":1,"256":1,"270":1,"293":1}}],["другом",{"2":{"2":1,"3":1,"63":1,"115":1,"154":2,"156":1,"181":1,"204":1,"225":1,"235":1,"237":1,"239":1,"243":1,"259":1,"267":1,"301":1,"349":2,"360":1,"364":1,"423":1,"431":1,"508":1}}],["другими",{"2":{"105":1,"137":2,"147":1,"149":1,"151":1,"170":1,"194":1,"224":1,"241":1,"263":1,"267":1,"274":1,"278":1,"290":1,"300":1,"303":1,"308":1,"309":1,"316":1,"336":1,"343":1,"376":1,"419":1,"434":1,"436":1,"443":1,"462":1,"464":1,"472":1,"507":1}}],["другим",{"2":{"74":1,"105":1,"134":1,"149":1,"156":1,"172":1,"174":1,"200":1,"204":1,"224":1,"239":1,"329":1,"331":1,"358":1,"364":1,"383":1,"393":1,"439":1}}],["другие",{"0":{"128":1,"129":1,"142":1,"184":1},"2":{"4":1,"59":1,"104":1,"109":1,"115":1,"118":1,"119":3,"126":1,"137":1,"150":1,"160":1,"168":1,"184":1,"199":3,"200":1,"202":1,"203":3,"204":2,"211":1,"227":1,"230":1,"239":1,"243":1,"244":1,"248":1,"249":1,"258":1,"266":1,"280":1,"287":1,"291":1,"295":1,"296":1,"303":1,"310":1,"313":1,"316":1,"317":1,"318":1,"331":1,"336":1,"337":1,"349":1,"358":1,"364":2,"373":2,"376":1,"382":2,"384":1,"389":1,"392":1,"394":1,"401":1,"407":1,"417":1,"422":1,"425":1,"429":1,"433":1,"438":1,"446":1,"447":1,"463":1,"470":1,"472":1,"545":2}}],["других",{"0":{"0":1},"2":{"16":1,"21":1,"41":1,"89":1,"95":1,"130":1,"134":3,"142":2,"151":1,"163":1,"178":4,"190":1,"200":2,"212":2,"221":1,"224":1,"225":1,"227":1,"233":1,"238":1,"250":1,"251":1,"264":1,"265":1,"270":1,"279":1,"281":2,"282":1,"323":1,"338":1,"356":2,"359":1,"394":1,"400":1,"422":1,"436":1,"438":1,"447":1,"449":1,"450":1,"454":2,"463":2,"507":1,"545":1}}],["друг",{"2":{"2":1,"3":1,"63":1,"86":1,"151":1,"154":3,"156":1,"178":1,"181":1,"185":1,"235":1,"237":1,"239":3,"259":1,"267":1,"297":1,"301":1,"331":1,"349":2,"351":1,"375":1,"382":1,"423":1,"441":1,"508":1}}],["д",{"0":{"240":1},"2":{"62":2,"115":1,"119":1,"120":1,"124":1,"149":5,"153":2,"158":2,"162":1,"164":1,"165":1,"166":1,"170":2,"200":1,"201":1,"203":1,"204":2,"210":1,"212":1,"222":1,"224":3,"227":1,"249":1,"250":1,"257":2,"263":1,"288":1,"291":1,"295":1,"298":1,"303":1,"308":3,"313":1,"322":1,"323":1,"324":1,"328":1,"329":1,"330":2,"336":3,"338":1,"339":1,"340":1,"351":1,"370":1,"372":3,"373":1,"376":3,"378":1,"379":1,"392":1,"395":1,"436":1,"437":1,"449":1,"469":1,"472":1,"506":2,"508":4}}],["динамичного",{"2":{"543":1,"545":1}}],["динамично",{"2":{"429":1,"463":1,"508":1,"509":1}}],["динамичным",{"2":{"265":1,"513":1}}],["динамичными",{"2":{"38":1}}],["динамичных",{"2":{"237":1}}],["динамическая",{"2":{"309":1}}],["динамической",{"2":{"472":1}}],["динамическому",{"2":{"251":1}}],["динамического",{"2":{"244":2,"251":1,"313":1}}],["динамическое",{"2":{"205":1,"244":1,"322":1}}],["динамических",{"2":{"308":1,"319":1,"324":1}}],["динамически",{"2":{"251":1,"308":1,"316":1,"472":1}}],["динамические",{"0":{"251":1},"2":{"237":1,"240":1,"309":1,"317":1,"363":1}}],["динамический",{"0":{"244":1},"2":{"224":1,"244":1}}],["диспетчере",{"2":{"292":1}}],["диспетчером",{"2":{"291":1}}],["диспетчера",{"2":{"291":2,"292":1,"355":1,"444":1}}],["дисплее",{"2":{"150":1}}],["дистрибутивов",{"2":{"388":1}}],["дистрибутивах",{"2":{"388":2}}],["дистрибутива",{"2":{"136":1,"143":1,"145":1,"388":1}}],["дистрибуция",{"2":{"149":1}}],["дисциплине",{"2":{"405":1}}],["дисциплину",{"2":{"372":1,"374":1}}],["дисциплина",{"2":{"372":1,"385":2}}],["дисциплинах",{"2":{"265":1}}],["дисциплинами",{"2":{"149":2}}],["дисциплиной",{"2":{"260":1}}],["дисциплины",{"2":{"147":1,"149":1,"372":1,"374":1}}],["диске",{"2":{"402":1}}],["дисковое",{"2":{"364":1,"432":1}}],["дискуссия",{"2":{"164":1}}],["диска",{"2":{"141":1}}],["диск",{"2":{"116":1,"433":1}}],["диалога",{"2":{"254":2,"255":2,"256":1}}],["диалоге",{"2":{"175":1,"176":1}}],["диалог",{"2":{"175":2,"194":1,"240":2,"241":3,"254":2,"255":4}}],["диалоги",{"0":{"175":1},"2":{"158":1,"175":1,"239":1,"241":1,"252":1,"311":1}}],["диалоговые",{"2":{"238":1}}],["диалоговое",{"2":{"193":1}}],["диалогов",{"0":{"240":1},"2":{"158":1,"175":1,"239":1,"240":1,"241":1,"247":1,"258":1}}],["диапазоны",{"2":{"170":1}}],["диапазон",{"2":{"134":1}}],["диаграмме",{"2":{"240":2,"263":1}}],["диаграмму",{"2":{"202":1}}],["диаграмма",{"0":{"14":1},"2":{"14":2}}],["диаграммы",{"2":{"5":1,"14":2,"62":1,"239":1,"354":1,"436":1,"440":1,"470":1}}],["директивой",{"2":{"249":1}}],["директиве",{"2":{"231":1,"246":1}}],["директивы",{"2":{"203":1,"205":2,"208":1,"211":2,"220":1,"224":1,"231":2,"246":1,"249":1,"252":1}}],["директиву",{"2":{"171":1,"246":2,"249":1}}],["директив",{"0":{"205":1},"1":{"206":1,"207":1,"208":1,"209":1,"210":1,"211":1},"2":{"121":1,"211":1,"212":2,"219":1,"251":1}}],["директивами",{"2":{"205":1}}],["директива",{"0":{"245":1},"2":{"105":2,"205":1,"206":1,"207":1,"210":1,"211":1,"249":1}}],["директорий",{"2":{"430":1}}],["директория",{"2":{"421":2}}],["директориях",{"2":{"310":1}}],["директории",{"2":{"109":1,"135":2,"227":1,"256":1,"375":1,"383":1,"391":1,"453":1,"501":2,"513":1,"518":1}}],["директорию",{"2":{"96":1,"421":1}}],["дирректорию",{"2":{"95":1}}],["дизайна",{"0":{"149":1},"2":{"150":2,"151":1,"152":1,"155":1,"156":1,"177":1,"181":1,"183":1,"225":1,"238":1,"259":1,"308":1,"324":1,"410":1,"463":1,"506":1,"508":1}}],["дизайну",{"2":{"22":1,"343":1}}],["дизайнерское",{"2":{"316":1}}],["дизайнером",{"2":{"225":1,"417":1}}],["дизайнер",{"2":{"150":2,"151":1,"152":1,"154":1}}],["дизайнеру",{"2":{"150":1}}],["дизайнерами",{"2":{"147":1,"197":1}}],["дизайне",{"2":{"22":2,"150":1,"256":1,"372":1}}],["дизайн",{"0":{"1":1,"24":1,"25":1,"63":1,"149":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"25":1,"26":1},"2":{"25":2,"26":1,"61":1,"63":2,"149":4,"158":1,"159":1,"181":1,"232":1,"237":3,"238":3,"255":1,"256":1,"275":1,"372":2,"496":1}}],["дойти",{"2":{"472":1}}],["дойдем",{"2":{"171":1}}],["доскролил",{"2":{"460":1}}],["дословно",{"2":{"344":1}}],["достойны",{"2":{"473":1}}],["достоинствами",{"2":{"264":1}}],["достигается",{"2":{"325":1,"334":1}}],["достигнем",{"2":{"263":1}}],["достигнет",{"2":{"156":1}}],["достижений",{"2":{"203":1}}],["достижению",{"2":{"156":1}}],["достижения",{"2":{"76":1,"178":1,"231":1,"263":1,"311":1}}],["достичь",{"2":{"74":1,"181":1}}],["доступе",{"2":{"473":1}}],["доступен",{"2":{"134":1,"364":1,"386":1,"422":1,"528":1}}],["доступной",{"2":{"462":1}}],["доступное",{"2":{"364":1}}],["доступном",{"2":{"364":1}}],["доступно",{"0":{"543":1},"2":{"255":1,"364":1,"542":1}}],["доступный",{"2":{"364":1,"527":1}}],["доступные",{"0":{"542":1},"2":{"227":1,"313":1,"336":1,"363":1,"440":1,"508":1}}],["доступными",{"2":{"363":1}}],["доступным",{"2":{"170":1,"232":1,"243":1,"249":1,"350":1,"357":1}}],["доступных",{"2":{"157":1,"161":1,"322":1,"344":1,"400":1,"446":1,"503":1}}],["доступны",{"2":{"150":1,"204":1,"246":1,"247":1,"251":1,"322":2,"369":1,"429":1,"520":1}}],["доступна",{"2":{"143":1,"364":1,"403":1,"462":1}}],["доступом",{"2":{"137":1}}],["доступ",{"0":{"59":1},"2":{"56":1,"59":1,"114":1,"115":3,"116":3,"117":8,"137":1,"144":3,"170":1,"178":1,"183":1,"196":1,"204":4,"231":1,"249":1,"278":1,"295":1,"306":1,"324":1,"329":1,"333":1,"346":1,"359":1,"360":2,"364":2,"380":1,"381":1,"422":1,"424":1,"429":1,"436":2,"445":1,"449":1,"462":2}}],["доступа",{"0":{"446":1},"1":{"447":1,"448":1,"449":1,"450":1,"451":1,"452":1},"2":{"17":1,"40":1,"53":1,"58":1,"115":1,"116":5,"117":1,"123":1,"134":2,"137":1,"204":1,"241":1,"249":1,"277":1,"278":1,"281":1,"325":1,"351":1,"421":1,"433":1,"434":1,"436":1,"440":3,"442":1,"454":1,"455":1}}],["доставка",{"0":{"395":1},"2":{"394":1,"395":2,"419":1}}],["доставки",{"2":{"4":1,"65":1,"79":1,"143":1,"201":1,"395":1}}],["достаточным",{"2":{"374":1}}],["достаточный",{"0":{"151":1}}],["достаточную",{"2":{"175":1}}],["достаточная",{"2":{"86":1}}],["достаточное",{"2":{"225":1,"228":1}}],["достаточно",{"2":{"40":1,"58":1,"59":1,"89":1,"140":2,"163":1,"168":1,"224":1,"228":1,"231":1,"239":1,"249":1,"250":1,"255":1,"268":1,"280":1,"289":1,"297":1,"302":1,"310":1,"314":1,"324":1,"328":2,"336":1,"343":2,"351":1,"352":1,"353":1,"356":1,"364":2,"366":1,"383":1,"384":1,"393":1,"396":1,"423":1,"433":1,"437":1,"439":1,"442":1,"450":1,"451":1,"457":1,"460":1,"463":1,"472":1,"507":1}}],["дождаться",{"2":{"343":1}}],["допускает",{"2":{"381":1}}],["допускают",{"2":{"336":1}}],["допустимы",{"2":{"323":1}}],["допустим",{"2":{"249":1,"324":1,"464":1}}],["дополненного",{"2":{"454":1}}],["дополнением",{"2":{"341":1}}],["дополнение",{"2":{"289":1}}],["дополнениями",{"2":{"228":1}}],["дополнили",{"2":{"300":1}}],["дополнительную",{"2":{"325":1}}],["дополнительных",{"2":{"204":1,"223":1,"227":1,"231":1,"240":1,"323":1,"331":1,"341":2,"371":1,"372":1,"375":1,"419":1,"435":1,"455":1}}],["дополнительным",{"2":{"202":1,"257":1,"356":1}}],["дополнительными",{"2":{"176":1,"224":1,"308":1,"440":1}}],["дополнительные",{"2":{"199":1,"200":1,"228":1,"293":1,"297":1,"323":1,"379":1,"394":1,"414":1,"440":1,"472":1}}],["дополнительный",{"2":{"29":1,"187":1,"225":1,"303":1}}],["дополнительная",{"2":{"109":1}}],["дополнительного",{"2":{"332":1,"335":1,"385":1}}],["дополнительной",{"2":{"200":2,"297":1}}],["дополнительное",{"2":{"48":1,"223":1,"313":1,"325":1}}],["дополнительно",{"2":{"16":1}}],["дополняем",{"2":{"299":1}}],["дополнять",{"2":{"298":1}}],["дополняющего",{"2":{"297":1}}],["дорогой",{"2":{"373":1}}],["дорогостоящим",{"2":{"370":1}}],["дорогостоящей",{"2":{"330":1}}],["дорогим",{"2":{"295":1}}],["дороги",{"2":{"208":1}}],["доработаем",{"2":{"255":1}}],["доработки",{"2":{"232":1}}],["дорабатывать",{"2":{"221":1}}],["дочерняя",{"2":{"246":1,"353":1}}],["дочернему",{"2":{"246":1,"352":1}}],["дочернем",{"2":{"245":1,"247":2,"319":1,"367":1}}],["дочернего",{"2":{"204":1,"246":2,"352":1}}],["дочерний",{"2":{"240":1,"245":1,"265":2,"353":1}}],["дочерними",{"2":{"246":1}}],["дочерним",{"2":{"239":1,"246":1,"256":1,"351":2}}],["дочерних",{"2":{"231":1,"240":1,"247":1,"249":1,"351":1,"353":1,"357":1}}],["дочерние",{"2":{"212":1,"318":2,"319":1,"351":3}}],["договаривается",{"2":{"364":1}}],["договоре",{"2":{"189":1}}],["догадались",{"2":{"203":1,"223":1,"287":1}}],["доходит",{"2":{"170":1,"328":1}}],["додо",{"2":{"149":1}}],["доведем",{"2":{"229":1}}],["доверенных",{"2":{"117":2}}],["доводить",{"2":{"219":1}}],["довольно",{"2":{"3":1,"9":1,"25":1,"39":1,"89":1,"115":2,"118":1,"131":1,"137":1,"177":1,"187":1,"188":1,"189":1,"223":1,"227":2,"228":1,"255":1,"271":1,"281":1,"290":1,"295":2,"296":1,"303":1,"309":1,"328":1,"343":1,"351":1,"353":1,"390":1,"393":1,"433":1,"436":1,"437":1,"441":1,"446":1,"472":1,"473":2,"507":3,"539":1}}],["доброжелательные",{"2":{"473":1}}],["добрый",{"2":{"71":1}}],["добились",{"2":{"257":1,"258":1}}],["добиться",{"2":{"181":1,"310":1,"346":1}}],["добавятся",{"2":{"393":1}}],["добавьте",{"2":{"228":1,"231":1,"393":1,"421":1,"438":1,"448":1}}],["добавив",{"2":{"226":1,"376":1,"393":1}}],["добавили",{"2":{"204":1,"256":1}}],["добавились",{"2":{"91":1}}],["добавит",{"2":{"117":1,"375":1,"390":1}}],["добавить",{"2":{"29":1,"227":1,"297":1,"336":1,"382":1,"384":1,"388":1,"390":2,"433":1,"464":2,"471":1}}],["добавим",{"2":{"36":1,"85":1,"231":1,"375":1,"445":1,"450":1}}],["добавленные",{"2":{"393":1}}],["добавления",{"2":{"200":1,"231":1,"264":1,"294":1,"295":1,"297":3}}],["добавление",{"2":{"12":1,"79":1,"226":1,"322":1,"338":1,"444":1,"460":1,"463":1,"495":1,"504":1,"542":1}}],["добавлен",{"2":{"187":2}}],["добавляются",{"2":{"472":1}}],["добавляют",{"2":{"397":1}}],["добавляя",{"2":{"291":1,"299":1}}],["добавлялись",{"2":{"199":1}}],["добавляется",{"2":{"429":1}}],["добавляет",{"2":{"117":1,"124":1,"297":1,"435":1,"448":1,"464":1,"471":1,"516":1,"529":1,"552":1}}],["добавляем",{"2":{"86":1,"97":1,"98":1,"250":1,"256":1,"316":1,"394":1}}],["добавлять",{"2":{"18":1,"187":1,"257":1,"300":1,"358":1}}],["документ",{"2":{"471":1}}],["документов",{"2":{"446":2}}],["документом",{"2":{"188":1}}],["документной",{"2":{"436":1}}],["документирован",{"2":{"446":1}}],["документированная",{"2":{"446":1}}],["документирования",{"2":{"239":1,"470":1}}],["документирование",{"0":{"67":1},"2":{"61":1}}],["документируйте",{"0":{"470":1},"2":{"425":1}}],["документа",{"2":{"120":1,"207":1,"250":2}}],["документаций",{"2":{"472":1}}],["документацию",{"2":{"140":1,"200":1,"212":1,"221":1,"270":1,"363":1,"507":1}}],["документации",{"2":{"119":1,"128":1,"129":1,"137":1,"138":1,"142":1,"150":1,"211":1,"212":1,"222":1,"249":1,"251":1,"303":1,"313":1,"322":2,"344":1,"345":1,"364":1,"376":2,"380":1,"388":1,"389":1,"421":1,"425":1,"429":1,"439":1,"450":1,"473":1,"496":1}}],["документацией",{"2":{"67":1,"222":1,"331":1,"366":1,"394":1}}],["документация",{"2":{"51":1,"62":1,"239":1,"425":1,"462":1,"473":4,"497":1}}],["долларов",{"2":{"134":1}}],["доля",{"2":{"125":1}}],["дольше",{"2":{"116":1,"436":1}}],["долгосрочной",{"2":{"63":1}}],["долгого",{"2":{"39":1}}],["должна",{"2":{"76":1,"86":1,"152":1,"168":1,"197":1,"200":1,"203":1,"204":1,"212":1,"247":1,"263":3,"301":1,"326":1,"331":1,"351":1,"381":1,"421":1,"452":1,"473":1}}],["должны",{"2":{"22":1,"41":1,"76":1,"122":1,"123":1,"151":2,"154":1,"156":2,"158":1,"159":1,"166":1,"171":1,"175":1,"184":1,"200":1,"202":2,"225":1,"227":1,"231":2,"232":1,"239":1,"246":1,"247":1,"249":1,"255":1,"260":1,"261":2,"265":1,"266":3,"268":1,"269":1,"270":1,"271":1,"292":1,"303":1,"310":1,"319":1,"324":3,"325":1,"329":1,"336":1,"342":1,"346":1,"350":1,"353":1,"356":1,"358":1,"360":1,"376":1,"382":1,"423":1,"429":1,"436":1,"441":1,"449":1,"460":1,"467":1}}],["должном",{"2":{"471":1}}],["должно",{"2":{"11":1,"44":1,"79":1,"115":1,"116":1,"159":1,"182":1,"211":1,"229":1,"246":2,"319":1,"336":3,"338":1,"339":1,"340":1,"348":1,"360":1,"372":1,"374":1,"375":1,"376":1,"377":4,"436":1,"461":1,"508":1}}],["должен",{"2":{"11":1,"23":2,"48":1,"76":1,"95":1,"116":1,"122":1,"134":1,"144":1,"159":2,"162":1,"182":1,"189":1,"197":1,"200":2,"209":1,"223":1,"226":1,"229":1,"244":1,"245":1,"246":1,"255":2,"264":1,"265":1,"267":1,"268":1,"277":1,"285":1,"287":2,"291":1,"294":1,"295":1,"298":3,"324":1,"325":2,"328":1,"329":1,"331":1,"336":1,"338":2,"341":1,"343":1,"344":1,"351":1,"356":1,"372":1,"375":1,"382":1,"383":1,"402":1,"421":2,"436":2,"437":1,"444":1,"462":1,"472":1,"554":1}}],["домашний",{"2":{"183":1,"472":1,"554":1}}],["домашняя",{"0":{"182":1},"2":{"182":1}}],["домашнюю",{"2":{"151":1}}],["домашнего",{"2":{"134":1}}],["домашней",{"2":{"134":1}}],["домене",{"2":{"134":2}}],["домену",{"2":{"134":1}}],["доменным",{"2":{"140":1}}],["доменные",{"2":{"134":1}}],["доменных",{"0":{"134":1},"1":{"136":1},"2":{"134":1}}],["доменное",{"2":{"133":1,"134":2}}],["домены",{"0":{"134":1},"1":{"136":1},"2":{"134":3,"141":1,"144":1}}],["доменов",{"2":{"117":1,"134":1,"263":1}}],["доменом",{"2":{"112":1,"117":1,"135":1}}],["домен",{"2":{"117":1,"134":9,"135":1,"143":1,"144":1,"146":1,"187":1,"422":3,"450":1,"473":1,"528":2}}],["доменами",{"2":{"134":1}}],["домена",{"2":{"117":4,"131":1,"134":4,"135":1,"139":1,"144":1,"145":1,"146":2,"364":1,"422":1,"446":1,"454":2}}],["дом",{"2":{"26":1}}],["до",{"0":{"337":1},"1":{"338":1,"339":1,"340":1,"341":1,"342":1,"343":1},"2":{"22":1,"70":1,"102":1,"121":1,"125":1,"134":2,"144":1,"148":1,"156":1,"161":1,"170":1,"171":1,"175":1,"178":1,"183":1,"187":1,"188":1,"194":1,"199":2,"200":2,"202":1,"204":1,"211":1,"212":1,"219":2,"221":1,"225":4,"229":1,"233":1,"238":1,"241":1,"244":2,"249":1,"263":1,"270":1,"284":1,"295":1,"297":1,"298":1,"300":1,"303":1,"308":1,"309":1,"313":2,"316":1,"317":1,"319":2,"324":1,"328":1,"329":2,"340":1,"344":1,"358":2,"366":1,"372":2,"379":1,"384":1,"394":1,"395":1,"410":1,"429":1,"436":4,"460":1,"472":3,"508":1}}],["декларируемое",{"2":{"462":1}}],["декомпозиции",{"2":{"463":1}}],["декодирован",{"2":{"325":1}}],["декодированной",{"2":{"322":1}}],["декодирует",{"2":{"325":1}}],["декораторов",{"2":{"297":2}}],["декораторы",{"2":{"297":3,"299":1}}],["декораторами",{"2":{"300":1}}],["декораторам",{"2":{"297":1}}],["декоратора",{"2":{"271":1,"297":2,"299":1,"300":1,"366":1}}],["декоратор",{"0":{"297":1},"1":{"298":1,"299":1},"2":{"225":1,"260":1,"296":1,"297":3,"298":2,"366":2}}],["дебаге",{"2":{"460":1}}],["дебажить",{"2":{"56":1}}],["девопс",{"2":{"419":1}}],["девичестве",{"2":{"50":1}}],["детей",{"2":{"473":1}}],["детьми",{"2":{"349":1}}],["детали",{"0":{"517":1},"1":{"518":1,"519":1},"2":{"316":1,"470":1}}],["детализирована",{"2":{"263":1}}],["детализации",{"2":{"178":1}}],["деталей",{"2":{"269":1}}],["деталях",{"0":{"242":1},"1":{"243":1,"244":1,"245":1,"246":1,"247":1},"2":{"210":1,"325":1}}],["деталям",{"2":{"131":2,"317":1}}],["детальную",{"2":{"464":1}}],["детального",{"2":{"258":1}}],["детально",{"2":{"51":1,"150":1}}],["детальный",{"2":{"14":1}}],["децентрализованные",{"2":{"331":2}}],["децентрализованных",{"2":{"308":1,"331":1}}],["дефисами",{"2":{"230":1}}],["деятельность",{"2":{"165":1}}],["деятельностью",{"2":{"74":1}}],["деактивации",{"2":{"162":2}}],["демонстрации",{"2":{"154":1,"400":1}}],["демонстрирующий",{"2":{"263":1,"359":1}}],["демонстрируют",{"2":{"148":1}}],["демонстрирует",{"2":{"153":1,"171":1,"283":1,"385":1,"462":1}}],["деньги",{"2":{"433":1}}],["день",{"2":{"134":1,"147":1,"158":1,"384":1,"386":1}}],["денег",{"2":{"72":1}}],["держи",{"0":{"269":1},"2":{"260":2}}],["держим",{"2":{"22":1}}],["держателем",{"2":{"251":1}}],["держать",{"2":{"223":1,"473":1}}],["деревьев",{"2":{"317":1}}],["дереву",{"2":{"247":1,"284":1,"351":1,"353":2,"462":1}}],["дереве",{"2":{"239":1,"246":1,"356":1}}],["дерево",{"2":{"202":1,"264":1}}],["дерева",{"2":{"128":1,"212":1,"225":1,"239":1,"353":1}}],["де",{"2":{"118":1,"310":1,"512":1}}],["деплое",{"2":{"421":1}}],["деплоится",{"2":{"421":1}}],["деплоить",{"2":{"421":1}}],["деплой",{"2":{"421":1,"481":1,"482":1}}],["деплоя",{"2":{"65":1,"394":1,"421":4,"473":1,"508":1,"542":1,"545":1}}],["депозитами",{"2":{"116":1}}],["действовало",{"2":{"334":1}}],["действовать",{"2":{"298":1,"324":1}}],["действительному",{"2":{"328":1}}],["действительно",{"2":{"195":1,"289":1,"297":1,"425":1,"431":1,"461":1}}],["действительная",{"2":{"116":1}}],["действию",{"0":{"183":1},"2":{"151":1,"183":3,"195":1}}],["действии",{"0":{"405":1},"2":{"148":1,"175":1,"202":1,"222":1,"223":1,"231":1,"236":1,"266":2,"300":1,"307":1,"335":1,"349":1,"350":1,"371":1,"405":1,"435":1}}],["действием",{"2":{"163":1,"164":1}}],["действие",{"2":{"116":2,"163":1,"164":1,"186":1,"195":1,"202":1,"241":1,"243":1,"294":1,"297":1,"392":1}}],["действиями",{"2":{"176":1}}],["действиях",{"2":{"151":1,"158":1}}],["действия",{"2":{"91":1,"116":1,"144":1,"158":2,"164":1,"168":1,"176":1,"185":2,"246":1,"250":1,"252":1,"255":2,"291":1,"310":1,"346":1,"374":1,"394":2,"436":2,"449":1,"461":1}}],["действий",{"2":{"73":1,"152":1,"158":1,"168":2,"194":2,"195":1,"356":1,"419":1,"442":1}}],["действуя",{"2":{"344":1}}],["действующего",{"2":{"300":1}}],["действуют",{"2":{"3":1}}],["действует",{"2":{"23":1,"144":1,"271":1,"295":1,"325":1,"331":1,"344":1}}],["дестабилизируют",{"2":{"271":1}}],["десктоп",{"2":{"472":1}}],["десктопными",{"2":{"308":1}}],["десктопных",{"2":{"227":1}}],["десктопе",{"2":{"33":1}}],["десятилетнем",{"2":{"431":1}}],["десятилетиям",{"2":{"17":1}}],["десяток",{"2":{"158":1}}],["десятками",{"2":{"48":1}}],["десятки",{"2":{"47":1,"432":1,"433":1}}],["делиться",{"2":{"250":1,"300":1,"462":1}}],["делится",{"2":{"170":1}}],["делсостояние",{"2":{"239":1}}],["делсобытия",{"2":{"239":1}}],["дело",{"2":{"238":1,"265":1,"295":1,"328":2}}],["дел",{"2":{"221":1,"229":1,"231":7,"232":1,"235":2,"239":5,"240":1,"256":2,"311":2,"316":1}}],["делайте",{"2":{"465":1,"467":1}}],["делающее",{"2":{"462":1}}],["делаются",{"2":{"43":1,"518":1}}],["делают",{"2":{"41":1,"227":1,"305":1,"364":1,"373":2}}],["делая",{"2":{"297":1,"334":1}}],["делали",{"2":{"231":1,"308":1,"349":1,"380":1,"429":1,"450":1}}],["дела",{"2":{"134":1,"317":1,"464":1}}],["делать",{"2":{"35":1,"38":1,"41":1,"47":1,"50":1,"85":1,"95":1,"103":1,"105":1,"115":1,"117":1,"141":1,"159":2,"164":1,"167":1,"229":1,"263":1,"265":1,"271":1,"317":1,"336":1,"360":1,"372":1,"376":1,"391":1,"433":1,"436":1,"460":1,"462":1,"472":2,"557":1}}],["делаться",{"2":{"34":1,"182":1}}],["делается",{"2":{"59":1,"104":1,"116":1,"134":1,"204":1,"266":1,"296":1,"324":1,"400":1,"425":1,"504":1}}],["делает",{"2":{"48":1,"83":1,"116":1,"118":1,"123":1,"146":1,"158":1,"159":1,"178":1,"201":1,"203":1,"222":1,"230":1,"244":1,"255":1,"284":1,"287":1,"303":1,"308":2,"329":1,"332":1,"354":1,"356":1,"361":1,"372":1,"376":1,"393":1,"394":1,"432":1,"433":1,"439":1,"445":1,"462":1,"463":1,"527":1}}],["делаете",{"2":{"26":1}}],["делаем",{"2":{"22":1,"59":1,"74":1,"98":1,"204":1,"267":1,"303":1,"328":1,"438":1,"454":1}}],["делегатора",{"2":{"444":1}}],["делегировать",{"2":{"268":1,"287":1}}],["делегируется",{"2":{"293":1}}],["делегирует",{"2":{"256":1}}],["деле",{"2":{"3":1,"137":1,"218":1,"271":1,"436":1}}],["даны",{"2":{"221":1}}],["данную",{"2":{"262":1}}],["данная",{"2":{"171":1,"221":1,"292":1,"393":1,"448":1,"463":1,"472":1}}],["данном",{"2":{"121":1,"135":1,"141":1,"144":2,"151":2,"159":1,"170":1,"187":1,"190":1,"192":1,"200":1,"201":1,"203":1,"204":1,"223":1,"231":2,"232":1,"241":1,"244":1,"247":1,"249":1,"256":1,"287":2,"308":1,"317":1,"319":1,"328":1,"329":1,"331":1,"351":1,"356":1,"357":1,"376":1,"380":2,"381":2,"421":1,"423":1,"444":1,"446":2,"448":1,"450":1,"454":1,"462":1,"463":1,"498":1,"501":1,"503":1}}],["данного",{"0":{"76":1,"495":1},"2":{"74":1,"163":1,"176":1,"229":1,"237":1,"295":1,"344":1,"357":2,"421":1,"436":1,"437":1,"445":1,"460":1,"462":1,"464":1}}],["данное",{"2":{"67":1,"374":1,"508":1}}],["данной",{"2":{"62":1,"116":1,"143":1,"157":1,"181":1,"182":1,"205":1,"225":1,"237":1,"240":1,"260":1,"265":1,"267":1,"271":1,"324":1,"328":1,"331":2,"345":1,"394":1,"473":1,"555":1}}],["данным",{"2":{"117":1,"170":1,"277":1,"330":1,"351":1,"434":1,"473":1}}],["данными",{"0":{"160":1},"1":{"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1},"2":{"17":1,"38":1,"39":1,"41":1,"47":1,"103":1,"115":3,"144":1,"232":1,"239":1,"246":1,"247":1,"250":1,"297":1,"308":1,"324":1,"325":1,"351":1,"356":1,"357":1,"358":1,"369":1,"425":1,"441":1,"454":1,"554":1}}],["данный",{"2":{"11":1,"16":1,"36":1,"43":1,"56":1,"134":1,"178":1,"204":1,"224":1,"228":1,"255":1,"262":1,"265":1,"284":1,"291":1,"294":1,"296":1,"316":1,"379":1,"471":1,"497":1,"501":1,"504":1,"514":1,"520":1,"536":1,"542":1,"549":1}}],["данные",{"0":{"44":1,"109":1},"1":{"45":1,"46":1,"47":1},"2":{"3":1,"11":2,"17":2,"47":2,"103":1,"109":1,"115":3,"116":2,"117":1,"189":1,"215":1,"230":1,"239":2,"244":1,"246":2,"247":4,"249":1,"256":1,"266":2,"292":3,"293":2,"295":1,"297":1,"299":1,"319":2,"324":4,"325":1,"326":1,"327":1,"330":2,"331":2,"351":2,"353":3,"354":1,"356":1,"364":7,"365":1,"424":4,"425":1,"436":3,"437":1,"438":1,"440":1,"441":1,"442":1,"443":2,"448":1,"449":5,"450":1,"451":2,"452":2,"454":2,"460":2,"462":3,"463":4,"472":3,"473":1}}],["данных",{"0":{"15":1,"17":1,"42":2,"239":1,"349":1,"364":1,"413":1},"1":{"16":1,"17":1,"18":2,"19":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"350":1,"351":1,"352":1,"353":1,"354":1,"355":1,"356":1,"357":1,"358":1,"359":1,"360":1,"361":1,"362":1,"363":1,"364":1,"365":1,"366":1,"367":1,"368":1,"369":1},"2":{"3":1,"6":2,"11":1,"16":1,"17":8,"39":3,"40":2,"41":1,"43":1,"44":1,"47":1,"48":3,"56":1,"59":2,"62":1,"71":1,"79":1,"83":1,"115":7,"117":1,"118":1,"123":2,"127":1,"149":1,"163":1,"170":5,"200":2,"204":3,"209":1,"210":1,"231":1,"239":1,"240":1,"245":3,"247":1,"249":1,"252":1,"267":1,"273":1,"276":1,"282":3,"289":1,"290":1,"293":1,"300":1,"308":2,"313":1,"316":1,"317":1,"319":2,"324":8,"325":2,"329":1,"330":2,"334":1,"343":1,"344":1,"349":1,"351":3,"356":4,"357":1,"358":1,"363":1,"364":13,"365":2,"368":1,"372":2,"373":1,"413":1,"425":1,"433":2,"434":3,"437":2,"445":1,"446":6,"447":2,"448":3,"449":1,"452":1,"454":1,"455":1,"462":4,"463":2,"464":1,"472":1,"473":1}}],["дат",{"2":{"460":1,"536":1}}],["дата",{"0":{"460":1}}],["датами",{"2":{"457":1}}],["датой",{"2":{"421":1,"460":1}}],["дату",{"2":{"395":2,"421":1}}],["датчики",{"2":{"250":1}}],["даты",{"2":{"161":2}}],["дать",{"2":{"116":1,"131":1,"158":1,"197":1,"241":1,"364":1,"383":1,"508":2}}],["даст",{"2":{"119":1,"355":1,"359":1,"463":1}}],["дал",{"2":{"189":1,"224":1,"462":1}}],["дальше",{"2":{"116":1,"164":1,"200":1,"223":1,"228":1,"391":1,"468":1}}],["дальнейшего",{"2":{"159":1,"331":1,"394":1,"507":1}}],["дальнейшей",{"2":{"63":1,"178":1,"212":1,"220":1,"506":1,"508":1}}],["дальнейшем",{"2":{"11":1,"16":1,"18":1,"29":1,"34":1,"40":1,"58":1,"59":1,"97":1,"104":1,"171":1,"202":1,"211":1,"271":1,"327":1,"471":1,"509":1,"511":1}}],["дальнейшая",{"2":{"38":1,"394":1}}],["дальнейших",{"2":{"9":1,"12":1,"405":1}}],["дальнейшую",{"2":{"3":1}}],["далеко",{"2":{"115":1,"179":1,"222":1,"223":1,"268":1,"331":1,"461":1,"465":1}}],["далее",{"0":{"121":1},"2":{"95":2,"112":1,"116":1,"143":1,"156":1,"159":1,"173":1,"200":1,"204":1,"218":1,"223":2,"224":1,"230":2,"231":1,"250":1,"263":2,"279":1,"302":1,"316":1,"324":1,"327":1,"330":1,"331":1,"334":1,"336":2,"342":1,"363":1,"365":1,"372":1,"381":1,"383":1,"394":1,"449":1,"454":1}}],["дала",{"2":{"103":1}}],["дает",{"2":{"91":1,"116":1,"118":2,"168":1,"204":1,"207":1,"228":1,"260":1,"271":1,"296":1,"309":1,"351":1,"359":1,"374":1,"380":1,"436":1,"456":1,"460":1}}],["даёт",{"2":{"74":1,"91":1,"433":1,"463":1,"473":1}}],["давид",{"2":{"405":1}}],["давным",{"2":{"147":1}}],["давно",{"2":{"39":1,"147":1,"168":1}}],["давайте",{"2":{"119":1,"120":1,"133":1,"142":1,"150":1,"159":1,"185":1,"200":2,"201":1,"203":1,"204":2,"213":1,"221":1,"225":1,"226":1,"227":1,"237":1,"244":1,"246":1,"249":1,"251":1,"255":4,"271":1,"276":1,"283":1,"289":1,"291":1,"292":1,"295":1,"296":1,"301":1,"308":1,"309":1,"310":1,"311":1,"314":1,"315":1,"325":3,"336":1,"337":1,"351":1,"352":1,"353":1,"354":1,"357":1,"360":1,"373":1,"375":1,"382":1,"386":1,"391":1,"393":1,"436":1,"444":2,"445":1,"446":1,"452":1}}],["давать",{"2":{"116":1}}],["давая",{"2":{"2":1,"336":1}}],["дают",{"2":{"17":2,"133":1,"396":1}}],["даже",{"2":{"12":1,"40":1,"48":1,"62":1,"116":1,"117":1,"144":1,"149":2,"152":1,"154":1,"167":1,"182":1,"185":2,"199":2,"200":2,"212":1,"219":1,"227":2,"232":1,"243":1,"247":1,"248":1,"249":1,"262":1,"268":1,"271":1,"286":1,"294":1,"295":1,"300":1,"308":2,"316":1,"317":2,"319":1,"325":1,"330":2,"331":1,"336":1,"344":1,"347":1,"353":1,"358":1,"367":1,"370":1,"372":1,"373":1,"375":1,"381":1,"384":1,"385":1,"394":1,"436":2,"446":1,"460":1,"462":2,"463":1,"471":1,"473":3,"536":1}}],["да",{"2":{"10":1,"204":2,"223":1,"228":1,"234":1,"281":1,"297":1,"303":1,"366":1}}],["двинемся",{"2":{"391":1}}],["двигателя",{"2":{"473":1}}],["двигаться",{"2":{"228":1,"392":1}}],["двигаясь",{"2":{"308":1}}],["движок",{"2":{"446":1}}],["движущихся",{"2":{"300":1,"436":1}}],["движению",{"2":{"300":1}}],["движение",{"2":{"250":1}}],["движения",{"2":{"156":1}}],["движки",{"2":{"334":1}}],["движке",{"2":{"222":1,"336":1,"364":1}}],["движка",{"2":{"125":1,"362":1,"448":1}}],["двоеточия",{"2":{"211":1,"319":1}}],["двоеточие",{"2":{"206":1,"313":1}}],["двойной",{"2":{"448":1}}],["двойных",{"2":{"231":1}}],["двойные",{"2":{"201":1}}],["двойная",{"2":{"165":1}}],["двум",{"2":{"228":1,"267":1}}],["двумя",{"2":{"104":1,"224":1,"227":1,"296":1,"311":1,"448":1,"455":1}}],["двусмысленное",{"2":{"462":1}}],["двусторонним",{"2":{"210":1}}],["двуслешные",{"2":{"86":1}}],["двунаправленную",{"2":{"118":1}}],["двухдневный",{"2":{"473":1}}],["двухфакторная",{"0":{"330":1},"2":{"329":1}}],["двух",{"2":{"105":1,"137":1,"143":1,"151":1,"200":1,"247":1,"251":1,"313":1,"330":1,"336":1,"381":1,"454":1,"514":1,"549":1}}],["двадцатилетней",{"2":{"473":1}}],["дважды",{"2":{"268":1}}],["два",{"2":{"3":2,"17":2,"47":1,"58":1,"116":1,"123":1,"125":1,"134":1,"144":1,"149":1,"162":2,"170":1,"204":1,"209":1,"212":1,"231":4,"232":1,"243":1,"244":1,"255":3,"270":1,"290":1,"291":1,"296":1,"301":1,"303":1,"315":1,"319":1,"325":1,"330":1,"339":1,"343":3,"360":1,"366":1,"376":1,"382":1,"423":1,"425":1,"434":1,"439":1,"449":1,"450":1,"464":1,"472":2,"473":2,"534":1}}],["двери",{"2":{"268":1}}],["две",{"2":{"2":1,"16":1,"116":1,"118":1,"135":1,"151":1,"204":1,"231":1,"256":1,"303":2,"319":1,"329":1,"366":1,"376":1,"434":1,"454":1}}],["иллюстрации",{"2":{"504":1}}],["илья",{"2":{"473":1}}],["или",{"0":{"37":1,"118":1,"151":1,"163":1,"165":1,"167":1,"329":1,"336":1,"459":1},"1":{"38":1,"39":1,"40":1,"41":1},"2":{"3":1,"16":1,"17":1,"22":1,"40":1,"41":2,"48":1,"50":1,"61":1,"71":1,"72":1,"73":1,"98":1,"102":2,"104":1,"105":1,"109":1,"114":2,"115":1,"116":2,"117":4,"118":2,"121":1,"123":2,"124":1,"125":1,"131":2,"134":7,"135":2,"137":2,"138":1,"140":1,"143":3,"147":1,"149":6,"150":4,"151":2,"152":2,"153":3,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"161":1,"162":7,"163":4,"164":3,"166":1,"167":1,"168":2,"170":3,"172":1,"173":2,"176":2,"178":3,"179":2,"180":1,"181":5,"182":1,"183":3,"185":3,"186":1,"187":1,"188":1,"189":2,"190":3,"191":1,"192":2,"193":1,"194":1,"195":1,"196":3,"200":9,"201":2,"202":1,"203":1,"204":6,"205":1,"207":4,"208":3,"209":1,"210":1,"211":1,"212":3,"221":1,"222":5,"223":4,"224":1,"225":7,"227":1,"228":2,"229":2,"230":2,"231":5,"232":5,"234":1,"235":1,"237":2,"238":2,"239":1,"240":2,"241":3,"243":2,"244":2,"245":2,"246":1,"247":3,"248":3,"249":3,"250":2,"252":2,"255":2,"256":3,"257":2,"258":1,"259":1,"263":2,"264":3,"265":3,"266":1,"267":1,"268":4,"269":2,"270":3,"271":3,"272":1,"278":2,"280":1,"282":3,"287":3,"288":1,"289":1,"290":1,"291":2,"293":2,"294":2,"295":6,"296":2,"297":4,"298":2,"300":5,"301":3,"302":2,"303":5,"304":1,"308":1,"310":3,"311":1,"313":2,"316":2,"317":1,"318":1,"319":1,"323":4,"324":5,"325":2,"326":1,"329":2,"330":7,"331":4,"334":1,"336":5,"338":4,"343":6,"344":3,"346":3,"349":1,"353":1,"354":2,"356":2,"357":1,"358":1,"361":1,"363":2,"364":4,"366":4,"367":1,"369":1,"370":4,"372":3,"373":6,"375":3,"376":4,"378":1,"381":1,"382":1,"383":2,"385":2,"387":1,"388":1,"390":2,"393":1,"394":1,"395":1,"397":1,"402":2,"422":1,"423":1,"424":3,"429":1,"431":1,"432":2,"436":6,"438":2,"440":6,"441":2,"442":1,"443":1,"444":1,"446":2,"447":1,"451":1,"452":1,"460":3,"462":11,"463":2,"464":1,"465":1,"466":2,"471":3,"472":3,"473":5,"495":3,"504":1,"507":4,"511":1,"536":1}}],["иерарxичную",{"2":{"471":1}}],["иерархия",{"2":{"238":1,"248":1}}],["иерархии",{"2":{"203":1,"224":1,"235":1,"238":2,"239":1,"246":1,"248":1,"287":1,"289":1,"462":2}}],["иерархические",{"2":{"256":1}}],["иерархический",{"2":{"174":1}}],["иерархическому",{"2":{"247":1}}],["иерархичных",{"2":{"17":1}}],["иерархичного",{"2":{"17":1,"463":1}}],["иерархичное",{"2":{"2":1}}],["иерархию",{"2":{"151":1,"233":1,"238":1}}],["ивент",{"2":{"462":1}}],["ивенты",{"2":{"462":1}}],["ивентов",{"2":{"462":1}}],["ищутся",{"2":{"372":1}}],["играет",{"2":{"463":1}}],["играй",{"2":{"331":1}}],["игры",{"2":{"331":1}}],["игру",{"2":{"186":1}}],["игрушек",{"2":{"72":1}}],["игрушки",{"2":{"19":1,"71":2}}],["игрушка",{"2":{"18":1}}],["игнорировать",{"2":{"280":1}}],["игнорируют",{"2":{"239":1}}],["игнорируйте",{"2":{"224":1}}],["иконографическое",{"2":{"239":1}}],["иконографических",{"2":{"229":1}}],["иконографию",{"2":{"225":1}}],["иконография",{"2":{"154":1}}],["иконок",{"2":{"176":1,"183":1,"225":1,"227":7,"233":1,"235":1,"336":1,"341":1,"513":1}}],["иконке",{"2":{"105":1}}],["иконкой",{"2":{"105":2,"231":1,"343":1}}],["иконкам",{"2":{"112":1}}],["иконками",{"2":{"85":1,"98":1,"227":1,"429":1}}],["иконка",{"0":{"102":1},"2":{"102":2,"168":1,"176":5,"472":1}}],["иконки",{"0":{"176":1,"183":1},"2":{"98":1,"176":1,"183":1,"224":1,"227":1,"235":1,"429":2,"431":1,"432":1,"513":1,"543":1}}],["иконку",{"2":{"95":1,"103":1,"105":1,"339":1,"429":2,"515":1,"546":1,"548":1}}],["идущими",{"2":{"247":1}}],["идущие",{"2":{"108":1}}],["идею",{"2":{"440":1,"472":1}}],["идеально",{"2":{"375":1,"449":1,"463":1}}],["идеале",{"2":{"23":1,"462":1}}],["идее",{"2":{"263":1}}],["идеей",{"2":{"234":1,"382":1}}],["идентифицировал",{"2":{"454":1}}],["идентифицировать",{"2":{"309":1,"331":1}}],["идентифицирует",{"2":{"364":1}}],["идентифицирующее",{"2":{"255":1}}],["идентификацией",{"2":{"331":1}}],["идентификационных",{"2":{"330":1}}],["идентификационный",{"2":{"134":1}}],["идентификационная",{"2":{"325":1}}],["идентификацию",{"2":{"319":1,"331":1}}],["идентификации",{"2":{"223":1,"255":1,"323":1,"331":1,"375":1,"443":1}}],["идентификаторы",{"2":{"513":1}}],["идентификатора",{"2":{"331":1,"360":1,"443":1}}],["идентификатору",{"2":{"331":1}}],["идентификатор",{"2":{"204":1,"313":1,"316":2,"325":1,"326":1,"331":2}}],["идентификатором",{"2":{"201":1,"443":1}}],["идентификаторов",{"2":{"171":1}}],["идея",{"2":{"212":1,"268":1,"269":1,"297":1,"329":1,"334":1,"462":1,"507":1}}],["идет",{"2":{"158":1,"183":1,"336":1,"373":1,"433":1,"497":1}}],["идете",{"2":{"26":1}}],["имитировать",{"2":{"381":1}}],["имитирует",{"2":{"461":1}}],["имитируют",{"2":{"446":1}}],["имитирующая",{"2":{"446":1}}],["имитирующей",{"2":{"380":1}}],["имитирующих",{"2":{"372":1}}],["имитирующую",{"2":{"372":1}}],["имитируя",{"2":{"195":1}}],["имитацией",{"2":{"373":1}}],["имитации",{"2":{"251":1}}],["ими",{"2":{"134":1,"239":1,"246":1,"252":1,"309":1,"336":1,"396":1,"425":1,"440":1,"539":1}}],["импорты",{"2":{"329":1}}],["импорт",{"0":{"244":1},"2":{"225":1,"228":2,"244":1,"462":1}}],["импорта",{"2":{"200":1,"231":1,"244":1,"250":1,"255":2,"280":1,"292":1,"313":2,"358":1,"360":1,"361":1,"366":1,"381":1,"430":1,"438":1,"439":1,"443":1,"444":2,"447":1}}],["импортирую",{"2":{"462":1}}],["импортируя",{"2":{"212":1,"356":1}}],["импортируется",{"2":{"204":1}}],["импортирует",{"2":{"202":1}}],["импортируем",{"2":{"120":1,"201":1,"204":2,"229":1,"247":2,"256":3,"283":1,"313":2,"319":1,"331":1,"356":1,"358":1,"363":1,"376":2,"380":2,"445":1,"448":1,"450":1,"452":1,"454":1}}],["импортировав",{"2":{"250":1}}],["импортировали",{"2":{"230":1,"244":1,"299":1}}],["импортированы",{"2":{"429":1}}],["импортированными",{"2":{"243":1}}],["импортированным",{"2":{"243":1}}],["импортированных",{"2":{"230":1}}],["импортирование",{"2":{"228":1}}],["импортирован",{"2":{"200":1,"224":1,"280":1}}],["импортировать",{"2":{"120":1,"200":1,"201":1,"202":1,"204":2,"224":1,"228":1,"230":1,"243":2,"250":1,"255":1,"280":1,"288":1,"289":1,"313":1,"323":1,"362":1,"376":1,"429":2,"431":1,"438":1}}],["импорте",{"2":{"71":1,"224":1,"228":1}}],["имя",{"2":{"95":1,"133":1,"134":3,"204":2,"218":1,"223":6,"224":1,"230":2,"246":2,"249":6,"255":2,"288":2,"292":1,"316":2,"319":2,"322":1,"330":1,"338":3,"339":2,"341":1,"360":1,"366":1,"375":1,"388":1,"421":1,"437":1,"495":1}}],["им",{"2":{"89":1,"116":1,"247":1,"250":1,"319":1,"372":1,"471":1,"472":1,"507":1}}],["имейте",{"2":{"323":1}}],["имели",{"2":{"149":1,"202":1}}],["имея",{"2":{"149":1,"222":1,"336":1}}],["имеющую",{"2":{"454":1}}],["имеющих",{"2":{"134":1}}],["имеются",{"2":{"322":1}}],["имеют",{"2":{"124":1,"150":1,"151":1,"153":1,"173":1,"187":1,"203":1,"204":2,"205":1,"256":1,"265":2,"268":1,"297":1,"303":1,"336":1,"344":1,"351":3,"364":1,"396":1,"436":2,"443":1,"460":1,"462":1,"471":1}}],["именованного",{"2":{"313":1}}],["именованных",{"2":{"317":1}}],["именованными",{"2":{"249":1}}],["именованные",{"0":{"317":1},"1":{"318":1,"319":1},"2":{"249":2,"317":2}}],["именование",{"2":{"247":1}}],["именовании",{"2":{"246":1,"247":2,"250":1,"270":1}}],["именования",{"2":{"176":1}}],["именовать",{"2":{"44":1}}],["имени",{"0":{"324":1},"2":{"134":1,"223":1,"245":1,"247":2,"249":1,"255":4,"287":1,"288":2,"289":1,"292":1,"295":1,"298":1,"300":1,"309":1,"319":1,"324":3,"330":1,"332":1,"339":1,"364":1,"429":1,"445":1,"513":1,"543":1}}],["именам",{"2":{"288":1,"316":1,"448":1}}],["именами",{"2":{"231":1,"303":2,"319":1,"324":1,"325":1,"385":1,"429":1}}],["имена",{"0":{"216":1,"217":1},"2":{"117":1,"134":2,"201":1,"288":1,"303":1,"319":1,"345":1,"513":1}}],["именем",{"2":{"117":1,"124":1,"226":1,"230":1,"231":1,"247":2,"249":2,"251":1,"255":2,"297":1,"298":1,"313":3,"319":1,"343":1,"364":1,"366":1,"381":1,"431":1,"438":1,"448":1}}],["имен",{"0":{"134":1},"1":{"136":1},"2":{"44":1,"134":1,"238":1,"243":1,"245":1,"289":1,"296":1,"318":1,"325":1}}],["именно",{"2":{"2":1,"39":1,"116":1,"134":1,"136":1,"139":1,"144":1,"185":1,"199":2,"202":1,"203":1,"204":1,"221":1,"224":2,"227":1,"240":1,"246":1,"291":1,"296":1,"301":1,"311":1,"316":1,"319":1,"330":1,"336":1,"351":1,"356":1,"360":1,"372":1,"380":1,"438":1,"439":2,"462":1,"463":1,"473":2}}],["имеем",{"2":{"41":1,"137":1,"144":1,"204":1,"224":1,"256":1,"328":1}}],["имеет",{"2":{"38":1,"41":1,"50":1,"115":1,"116":4,"118":1,"122":1,"123":2,"125":1,"130":1,"136":1,"137":1,"140":1,"150":1,"159":1,"161":1,"162":1,"187":1,"191":1,"201":1,"204":1,"207":1,"209":1,"227":1,"238":1,"239":1,"244":3,"245":1,"248":1,"255":1,"263":1,"267":1,"281":1,"289":1,"292":1,"295":1,"296":1,"313":1,"324":1,"325":2,"336":1,"338":1,"339":1,"343":2,"351":1,"354":1,"356":2,"358":1,"364":1,"371":1,"373":1,"375":1,"381":1,"385":1,"437":1,"440":1,"449":1,"463":2}}],["имеется",{"2":{"4":1,"173":1,"225":1,"356":1}}],["иметь",{"2":{"11":1,"18":1,"23":1,"124":1,"128":1,"134":3,"137":1,"151":2,"154":1,"159":1,"171":1,"178":1,"199":1,"204":1,"207":1,"218":1,"228":1,"231":1,"232":1,"237":1,"241":1,"246":2,"257":1,"265":1,"271":1,"280":1,"287":1,"291":1,"318":1,"322":1,"324":2,"330":1,"338":1,"344":1,"356":1,"375":2,"386":1,"393":1,"402":1,"424":1,"433":1,"434":1,"462":1}}],["итерируйте",{"2":{"238":1}}],["итерацией",{"2":{"331":1}}],["итераций",{"2":{"61":1}}],["итеративный",{"2":{"232":1,"234":1}}],["итераторе",{"2":{"209":1}}],["итак",{"2":{"86":1,"200":1,"237":1,"286":1,"295":1,"300":1,"325":1,"359":1,"375":1}}],["итог",{"0":{"130":1}}],["итоговый",{"2":{"471":1}}],["итогов",{"0":{"145":1,"197":1,"219":1,"233":1,"258":1,"304":1,"332":1,"347":1,"368":1,"396":1,"455":1}}],["итогового",{"2":{"79":1}}],["итого",{"2":{"116":1}}],["итоге",{"0":{"540":1},"2":{"47":1,"99":1,"104":1,"218":1,"244":1,"265":1,"268":1,"330":1,"433":1,"462":1}}],["изнутри",{"2":{"438":1}}],["изначально",{"2":{"29":1,"423":1,"446":1,"472":1}}],["изложенные",{"2":{"434":1}}],["излишняя",{"2":{"265":1}}],["издателя",{"2":{"291":1}}],["издревле",{"2":{"2":1}}],["изощренных",{"2":{"433":1}}],["изоляции",{"2":{"281":1,"330":1}}],["изолированные",{"2":{"202":1}}],["изобретено",{"2":{"463":1}}],["изобретайте",{"2":{"300":1}}],["изобретать",{"2":{"225":1,"260":1,"292":1}}],["изобразить",{"2":{"202":1}}],["изображению",{"2":{"339":1}}],["изображение",{"2":{"238":1}}],["изображений",{"0":{"167":1},"2":{"161":1,"167":4,"257":1}}],["изображениями",{"2":{"167":1,"183":1}}],["изображения",{"2":{"16":1,"151":1,"153":1,"224":1,"339":1,"341":3,"391":1,"429":2}}],["извлеченного",{"2":{"447":1}}],["извлечения",{"2":{"364":1,"446":1,"447":1}}],["извлекать",{"2":{"381":1}}],["извлекает",{"2":{"381":1}}],["извлекаем",{"2":{"201":1,"448":1}}],["известен",{"2":{"268":1}}],["известную",{"2":{"449":1}}],["известно",{"2":{"325":1}}],["известной",{"2":{"189":1,"222":1}}],["известны",{"2":{"329":1}}],["известных",{"2":{"309":1,"331":1,"343":1}}],["известный",{"2":{"137":1,"313":1,"325":1,"459":1,"460":1}}],["известными",{"2":{"331":1,"338":1}}],["известным",{"2":{"134":1}}],["известные",{"2":{"9":1,"359":2}}],["измерения",{"2":{"372":1}}],["измерить",{"2":{"347":1}}],["измеримые",{"2":{"155":1}}],["изменено",{"0":{"477":1,"479":1,"482":1,"485":1},"2":{"200":1}}],["изменении",{"2":{"181":1,"200":1,"231":1,"365":1,"367":1,"463":2}}],["изменений",{"0":{"474":1},"1":{"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1},"2":{"119":3,"123":2,"129":1,"130":1,"200":1,"209":1,"222":1,"240":1,"308":1,"316":2,"363":1,"370":1,"376":1,"379":1,"382":1,"384":1,"385":2,"386":1,"390":2,"419":1,"449":1,"460":1,"495":1}}],["изменениям",{"2":{"400":1,"418":1}}],["изменениями",{"2":{"291":1,"316":1,"367":1,"379":1,"433":1,"446":1,"463":2}}],["изменениях",{"2":{"166":1,"256":1,"291":1,"462":1}}],["изменения",{"0":{"124":1,"126":1,"127":1,"128":1,"129":1},"2":{"40":1,"41":1,"119":7,"120":1,"126":1,"130":1,"141":1,"146":1,"181":1,"199":3,"223":1,"228":1,"231":1,"245":1,"256":1,"267":2,"271":1,"297":1,"300":1,"316":1,"358":1,"364":1,"370":2,"386":3,"390":1,"393":1,"394":3,"395":2,"396":1,"460":2,"482":1,"511":1}}],["изменение",{"2":{"38":2,"124":1,"127":1,"135":1,"136":1,"240":1,"245":1,"250":1,"256":2,"303":1,"356":1,"357":1,"358":1,"359":1,"360":1,"363":1,"385":1,"393":1}}],["изменяя",{"2":{"321":1}}],["изменяет",{"2":{"298":1,"313":1,"351":1,"353":1,"358":2}}],["изменяете",{"2":{"297":1,"397":1}}],["изменяется",{"2":{"200":1,"291":1,"303":1,"397":1}}],["изменяем",{"2":{"256":1,"299":2}}],["изменяются",{"2":{"250":1}}],["изменяющие",{"2":{"154":1,"199":1}}],["изменяться",{"2":{"344":2,"463":1}}],["изменять",{"2":{"138":1,"199":1,"204":1,"227":1,"239":1,"319":1,"360":1,"463":1,"555":1}}],["изменит",{"2":{"375":1}}],["измените",{"2":{"228":1,"345":1}}],["изменится",{"2":{"212":1,"374":1,"433":1,"445":1}}],["изменить",{"2":{"135":2,"149":1,"204":1,"208":1,"224":1,"230":1,"295":2,"302":1,"330":1,"357":1,"382":1,"448":1,"456":1,"463":1,"464":1,"471":1}}],["изменил",{"2":{"385":1}}],["изменилась",{"2":{"303":1}}],["изменили",{"2":{"259":1}}],["изменилось",{"2":{"120":1,"204":1,"318":1,"385":1}}],["изменился",{"2":{"116":1,"120":1,"226":1}}],["изменим",{"2":{"95":1,"283":1,"316":1,"379":1,"450":1}}],["изучили",{"2":{"332":1}}],["изучим",{"2":{"199":1,"306":1}}],["изучите",{"2":{"147":1}}],["изучить",{"2":{"21":1,"62":1,"143":1,"159":1,"200":1,"225":1,"249":1,"341":1,"421":1,"439":1,"508":1}}],["изучайте",{"2":{"473":1}}],["изучаемые",{"2":{"447":1}}],["изучающей",{"2":{"150":1}}],["изучать",{"2":{"22":1,"152":1,"200":1,"477":1,"479":1}}],["изученных",{"2":{"348":1}}],["изученный",{"2":{"9":1}}],["изучению",{"2":{"241":1,"376":1}}],["изучении",{"2":{"225":1,"334":1,"507":1}}],["изучения",{"2":{"219":1,"260":1,"271":1,"303":1,"374":1,"473":2}}],["изучение",{"0":{"21":1,"205":1,"473":1},"1":{"206":1,"207":1,"208":1,"209":1,"210":1,"211":1},"2":{"184":1,"400":1,"468":1,"473":1}}],["из",{"0":{"503":1},"2":{"14":1,"23":1,"28":1,"34":1,"39":1,"41":2,"48":1,"50":2,"61":1,"63":2,"76":1,"79":1,"86":3,"89":1,"95":1,"102":1,"105":1,"112":1,"115":1,"116":1,"118":1,"119":1,"120":2,"123":3,"126":1,"134":4,"135":1,"137":1,"143":1,"144":1,"147":1,"150":1,"152":1,"153":1,"156":2,"157":1,"160":1,"162":2,"163":1,"164":1,"167":3,"168":1,"169":1,"170":1,"172":1,"173":1,"174":1,"175":1,"176":1,"181":3,"182":2,"183":2,"184":1,"185":1,"186":1,"194":1,"195":2,"197":1,"199":3,"200":5,"201":2,"202":2,"203":2,"204":7,"205":1,"207":1,"208":2,"209":1,"212":1,"221":1,"222":3,"223":1,"224":3,"225":3,"227":6,"229":1,"230":3,"231":5,"235":1,"237":1,"238":1,"239":1,"241":2,"244":1,"245":3,"246":2,"247":2,"248":1,"249":2,"250":2,"251":1,"255":3,"256":2,"261":1,"263":3,"264":1,"265":2,"267":1,"269":1,"270":2,"276":1,"277":1,"279":1,"281":2,"285":1,"287":1,"291":3,"292":1,"295":1,"297":4,"300":3,"301":2,"302":4,"303":3,"308":3,"309":1,"311":1,"313":3,"316":5,"317":2,"318":1,"319":6,"322":1,"323":2,"324":1,"325":3,"330":2,"331":1,"333":1,"334":2,"335":1,"336":2,"338":1,"339":1,"341":1,"343":3,"344":1,"345":1,"349":3,"351":1,"353":1,"354":1,"356":1,"357":3,"358":1,"359":2,"360":2,"361":1,"363":1,"364":5,"366":4,"367":1,"370":2,"373":2,"374":1,"375":2,"376":5,"379":2,"380":2,"381":1,"382":1,"385":3,"386":3,"390":1,"393":1,"394":3,"421":4,"429":5,"430":1,"432":2,"436":6,"441":1,"442":1,"443":4,"444":2,"447":1,"448":1,"449":4,"452":1,"454":3,"460":1,"461":1,"462":5,"463":1,"464":1,"468":1,"472":2,"473":2,"507":1,"511":1,"513":2,"514":1,"549":1}}],["избыточности",{"2":{"268":1}}],["избавляет",{"2":{"171":1}}],["избегаемы",{"2":{"460":1}}],["избегаем",{"2":{"450":1}}],["избегания",{"2":{"268":1}}],["избегание",{"2":{"167":1}}],["избегая",{"2":{"250":1}}],["избегать",{"2":{"173":1,"184":1,"196":1,"198":1,"243":1,"265":1}}],["избегайте",{"0":{"465":1},"2":{"157":1,"265":1,"425":1}}],["избежание",{"2":{"230":1}}],["избежания",{"2":{"9":1,"545":1}}],["избежать",{"2":{"44":1,"158":1,"183":1,"226":1,"235":1,"247":1,"267":1,"280":1,"281":1,"463":1}}],["избранном",{"2":{"102":1}}],["избранного",{"2":{"98":1}}],["избранное",{"0":{"101":1},"1":{"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"4":1,"29":1,"33":1,"102":3,"104":2,"105":1}}],["исчезновении",{"2":{"519":1}}],["исчезают",{"2":{"257":1}}],["исчезла",{"2":{"147":1,"393":1}}],["исчерпывающий",{"2":{"260":1}}],["исчерпывающим",{"2":{"119":1,"204":1}}],["исчерпывающее",{"2":{"192":1}}],["истинным",{"2":{"380":1}}],["истины",{"2":{"268":1,"358":1,"359":1}}],["истечения",{"2":{"144":1,"329":1}}],["истечении",{"2":{"134":1,"144":1,"244":1}}],["историю",{"2":{"320":1,"386":1}}],["история",{"0":{"474":1},"1":{"475":1,"476":1,"477":1,"478":1,"479":1,"480":1,"481":1,"482":1,"483":1,"484":1,"485":1,"486":1,"487":1},"2":{"149":1,"297":1,"386":1}}],["истории",{"2":{"127":2,"135":1,"136":1,"137":1,"139":1,"145":1,"146":1,"322":2}}],["историческим",{"2":{"385":1}}],["исторически",{"2":{"44":1,"462":1}}],["источники",{"2":{"473":1,"497":1}}],["источнику",{"2":{"117":1,"473":1}}],["источник",{"2":{"117":1,"247":1,"358":1,"359":1,"386":1}}],["источников",{"2":{"117":3,"454":2}}],["искренне",{"2":{"405":1}}],["искренней",{"2":{"232":1}}],["исключительных",{"2":{"472":1}}],["исключительным",{"2":{"269":1}}],["исключить",{"2":{"382":1}}],["исключают",{"2":{"382":1}}],["исключается",{"2":{"224":1}}],["исключена",{"2":{"364":1}}],["исключение",{"2":{"182":2}}],["исключением",{"2":{"133":1,"166":1,"182":1,"224":1,"235":1,"266":2,"373":1,"447":1,"462":1}}],["исключения",{"2":{"182":1,"200":1,"390":1}}],["искусственной",{"2":{"445":1}}],["искусственного",{"2":{"149":1}}],["искушению",{"2":{"264":1}}],["искушение",{"2":{"85":1}}],["искать",{"2":{"48":1,"152":2,"400":1,"431":1}}],["исходящие",{"2":{"266":1}}],["исходящими",{"2":{"196":1}}],["исходя",{"2":{"230":1,"316":1,"341":1,"349":1,"351":1}}],["исходному",{"2":{"267":1,"366":1}}],["исходном",{"2":{"247":1,"376":1,"381":1,"382":1,"396":1}}],["исходного",{"2":{"143":2,"256":1,"297":1,"364":1,"372":1,"385":1,"386":1,"433":1,"452":1}}],["исходные",{"2":{"386":1}}],["исходными",{"0":{"386":1}}],["исходным",{"2":{"370":1,"375":1,"382":1,"385":1,"391":1,"442":1}}],["исходных",{"0":{"415":1},"2":{"222":1,"224":2,"384":1,"385":1}}],["исходный",{"2":{"148":1,"170":1,"194":1,"231":1,"240":1,"288":1,"296":1,"344":1,"366":1,"371":1,"375":1,"391":1,"393":1}}],["исходная",{"2":{"12":1}}],["исхода",{"2":{"79":1}}],["исследование",{"0":{"323":1},"1":{"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"330":1,"331":1}}],["исследований",{"2":{"155":1,"372":1}}],["исследования",{"2":{"39":1,"147":1}}],["исследовать",{"2":{"4":1,"224":1}}],["исследуем",{"2":{"21":1,"303":1}}],["исправить",{"2":{"346":1,"381":1,"393":1}}],["исправление",{"2":{"68":1,"482":1}}],["исправлять",{"2":{"2":1}}],["испытываем",{"2":{"328":1}}],["испортит",{"2":{"461":1}}],["испорчен",{"2":{"325":1}}],["исполнение",{"2":{"293":1}}],["исполнения",{"2":{"201":1}}],["использовалось",{"2":{"359":1}}],["использовал",{"2":{"152":1,"386":1}}],["использовались",{"2":{"370":1,"460":1}}],["использовали",{"2":{"86":1,"103":1,"246":1,"258":1,"268":1,"287":1,"308":1,"316":1,"319":2,"322":1,"363":1,"378":1}}],["использована",{"2":{"204":1,"212":1}}],["использован",{"2":{"200":1,"204":1}}],["использованы",{"2":{"154":1,"325":2}}],["использовано",{"2":{"134":1,"303":1}}],["использованию",{"2":{"160":1,"226":1,"231":1,"233":1,"252":1,"336":1,"377":1,"390":1,"448":1,"460":1}}],["использованием",{"2":{"135":1,"151":1,"184":1,"189":1,"221":1,"240":1,"249":1,"251":1,"258":2,"265":1,"279":1,"284":1,"287":1,"303":1,"306":1,"317":1,"331":1,"336":1,"347":1,"349":1,"364":1,"365":1,"372":1,"373":1,"376":1,"377":1,"388":1,"429":1,"443":2,"455":1,"472":1}}],["использование",{"0":{"55":1,"201":1,"375":1,"390":1,"538":1},"1":{"202":1,"376":1,"391":1},"2":{"40":1,"59":1,"77":1,"117":1,"134":1,"143":1,"144":1,"148":1,"153":1,"158":1,"164":1,"167":1,"170":2,"174":1,"178":1,"181":1,"194":1,"198":1,"200":1,"204":2,"212":1,"221":1,"225":1,"227":2,"228":1,"244":1,"246":1,"250":2,"251":1,"255":1,"256":2,"267":1,"290":1,"300":1,"303":1,"308":3,"316":1,"318":1,"322":1,"324":1,"325":1,"328":1,"330":1,"336":1,"344":2,"358":1,"360":1,"361":1,"363":2,"366":1,"372":1,"373":2,"376":2,"377":1,"378":1,"392":1,"400":1,"455":1,"456":1,"462":2,"463":1,"471":1,"472":1,"496":1,"504":1}}],["использовании",{"2":{"39":1,"118":1,"122":1,"123":1,"130":1,"136":1,"143":1,"145":1,"146":1,"149":1,"153":1,"168":1,"178":1,"181":1,"189":1,"191":1,"202":2,"204":1,"208":1,"227":1,"230":1,"231":1,"246":1,"308":1,"309":1,"322":1,"331":1,"359":1,"386":1,"401":1,"425":1,"436":2,"438":1,"439":1}}],["использования",{"2":{"23":1,"76":1,"91":1,"103":1,"123":1,"124":1,"125":2,"134":2,"143":1,"159":2,"168":1,"178":1,"184":1,"198":1,"200":1,"201":2,"204":2,"227":1,"231":1,"237":1,"241":1,"243":2,"245":1,"248":2,"249":1,"250":1,"261":1,"267":1,"271":1,"281":1,"282":1,"284":1,"287":1,"288":1,"292":1,"295":1,"300":1,"305":1,"306":1,"309":1,"316":1,"319":1,"320":1,"323":1,"325":1,"327":1,"329":2,"330":1,"331":1,"333":1,"334":1,"336":2,"345":1,"348":1,"356":1,"357":1,"359":1,"364":2,"365":2,"382":1,"391":1,"394":1,"425":1,"434":1,"446":1,"448":1,"460":1,"462":1,"472":1,"473":1,"504":1,"512":1,"538":1}}],["использоваться",{"2":{"76":1,"136":1,"163":1,"167":1,"168":1,"206":1,"223":2,"227":1,"243":1,"261":1,"311":1,"313":1,"325":1,"359":1,"409":1,"443":1,"511":1}}],["использовать",{"0":{"278":1},"2":{"10":1,"17":1,"39":1,"56":1,"59":2,"62":1,"86":1,"89":1,"96":1,"102":1,"115":1,"118":1,"123":5,"125":1,"136":1,"137":1,"141":1,"143":2,"147":1,"160":1,"162":1,"165":1,"168":1,"170":1,"174":1,"176":1,"200":7,"201":2,"202":2,"203":7,"204":4,"207":1,"210":1,"211":3,"212":2,"213":1,"218":2,"221":1,"222":4,"223":2,"224":1,"225":1,"227":5,"228":1,"230":2,"238":1,"241":3,"243":2,"244":1,"249":2,"250":2,"251":1,"252":1,"255":4,"259":1,"260":1,"264":1,"268":2,"271":1,"272":1,"280":1,"281":1,"283":1,"286":1,"288":1,"292":3,"297":1,"298":1,"300":3,"302":2,"303":5,"304":1,"309":1,"310":2,"316":1,"318":2,"319":2,"322":2,"323":4,"324":1,"325":1,"326":1,"327":2,"331":4,"332":1,"333":2,"334":1,"336":2,"338":2,"340":2,"341":1,"342":1,"344":11,"345":1,"348":1,"351":1,"353":1,"354":1,"356":2,"357":2,"359":1,"360":1,"361":1,"362":1,"363":2,"364":3,"365":1,"366":3,"367":1,"375":1,"376":1,"378":1,"381":2,"382":1,"385":1,"386":2,"390":2,"391":1,"401":1,"423":3,"429":3,"432":1,"434":1,"436":2,"439":5,"440":1,"442":1,"443":1,"446":2,"447":1,"449":2,"455":2,"462":1,"463":2,"464":3,"468":1,"504":1,"508":1,"509":1,"513":1}}],["используйте",{"0":{"154":1,"466":1,"468":1,"469":1},"2":{"123":2,"161":1,"203":2,"208":2,"218":1,"223":1,"225":1,"333":1,"369":1,"376":1,"460":2,"466":1,"471":1}}],["использующими",{"2":{"361":1,"436":1}}],["использующим",{"2":{"331":1}}],["использующие",{"2":{"330":1}}],["использующий",{"2":{"153":1}}],["использующей",{"2":{"504":1}}],["использующем",{"2":{"329":1}}],["использующего",{"2":{"117":1,"354":1}}],["использующая",{"2":{"250":1}}],["используют",{"2":{"125":1,"167":1,"179":1,"199":1,"213":1,"222":1,"247":1,"331":1,"334":1,"353":1}}],["используются",{"2":{"22":1,"62":1,"85":1,"116":1,"127":1,"137":1,"146":1,"149":1,"161":1,"163":1,"200":1,"212":1,"220":1,"224":1,"231":1,"241":1,"244":2,"245":1,"276":1,"289":1,"295":1,"303":2,"325":1,"328":1,"334":1,"338":1,"368":1,"421":1,"432":1,"463":1,"555":1}}],["использую",{"2":{"108":1,"201":1,"462":1}}],["используя",{"2":{"91":1,"115":1,"134":1,"137":1,"152":1,"200":1,"202":1,"204":1,"223":1,"225":3,"230":1,"231":1,"233":1,"235":1,"247":1,"249":2,"256":1,"264":1,"270":1,"296":1,"300":1,"301":1,"313":3,"317":1,"319":1,"325":1,"331":1,"344":1,"345":1,"353":1,"361":1,"363":1,"364":1,"366":1,"376":2,"381":1,"395":1,"402":1,"409":1,"421":1,"432":2,"442":1,"443":1,"447":1,"495":1}}],["используете",{"2":{"125":1,"270":1,"387":1,"466":1}}],["использует",{"2":{"56":1,"123":2,"136":1,"151":1,"154":1,"167":1,"225":1,"228":1,"251":1,"295":1,"313":1,"324":1,"336":1,"345":1,"374":1,"375":1,"376":1,"384":1,"421":1,"430":1,"432":1,"447":1,"460":2,"462":1,"513":1,"527":1}}],["используется",{"2":{"7":1,"23":1,"50":1,"116":1,"117":1,"134":3,"136":1,"137":1,"138":1,"151":2,"162":1,"164":1,"166":1,"168":1,"170":1,"174":1,"176":2,"177":2,"178":2,"191":1,"193":1,"194":1,"199":1,"204":1,"209":1,"211":1,"224":1,"231":1,"243":1,"249":1,"256":1,"267":1,"278":1,"292":1,"295":1,"300":1,"313":1,"322":1,"325":2,"339":1,"340":1,"358":1,"360":1,"363":1,"382":1,"385":1,"391":1,"393":1,"421":1,"432":1,"440":1,"460":1,"463":2,"473":1,"497":1,"504":4,"512":1,"555":1}}],["используемую",{"2":{"325":1,"339":1}}],["используемая",{"2":{"200":1}}],["используемом",{"2":{"226":1}}],["используемое",{"2":{"177":1,"339":1}}],["используемого",{"2":{"117":1,"121":1,"144":1,"170":1,"200":1,"395":1}}],["используемым",{"2":{"241":1}}],["используемыми",{"2":{"235":1,"322":1}}],["используемых",{"2":{"142":1,"322":1,"332":1,"446":1,"449":1}}],["используемые",{"2":{"125":1,"161":1,"202":1,"204":1,"205":1,"224":1,"319":1,"322":1,"423":1}}],["используемый",{"2":{"116":1,"164":1,"191":1,"212":1,"231":1,"246":1,"323":1,"325":1,"336":1,"449":1}}],["используем",{"2":{"17":1,"23":3,"56":1,"86":1,"98":2,"112":1,"122":1,"134":1,"135":1,"137":1,"141":1,"171":3,"201":2,"203":2,"204":2,"206":1,"210":1,"227":2,"230":3,"231":1,"232":1,"246":1,"247":1,"249":4,"250":1,"256":2,"281":2,"283":1,"288":1,"294":1,"296":1,"302":1,"311":1,"313":1,"316":3,"318":1,"325":2,"326":1,"328":1,"329":1,"356":1,"358":1,"360":1,"361":2,"363":1,"364":2,"365":1,"376":1,"380":1,"381":1,"393":1,"438":2,"443":1,"448":1,"449":1,"452":1,"454":1}}],["испускающую",{"2":{"354":1}}],["испускает",{"2":{"292":1}}],["испускаемые",{"2":{"381":1}}],["испускаем",{"2":{"124":1}}],["испуская",{"2":{"240":1}}],["иная",{"2":{"463":1}}],["иначе",{"2":{"150":1,"189":1,"203":1,"211":1,"222":1,"324":1,"376":1,"380":1,"462":1}}],["ингридиент",{"2":{"461":1}}],["инкремента",{"2":{"351":1,"352":1,"353":1}}],["инкапсуляций",{"2":{"250":1}}],["инкапсуляции",{"2":{"218":1,"225":1,"250":1,"286":1,"300":1,"316":1}}],["инкапсуляция",{"0":{"3":1,"266":1},"2":{"260":1,"266":1}}],["инкапсулировав",{"2":{"377":1}}],["инкапсулировать",{"2":{"278":1}}],["инкапсулировали",{"2":{"103":1,"463":1}}],["инкапсулируя",{"2":{"440":1}}],["инкапсулируют",{"2":{"227":1}}],["инкапсулирует",{"2":{"203":1,"443":1,"463":1}}],["иным",{"2":{"383":1}}],["иные",{"2":{"304":1}}],["иных",{"2":{"73":1,"472":1}}],["инвокер",{"2":{"281":1,"285":1,"287":1,"293":2,"294":2}}],["инвокеру",{"2":{"281":1,"293":1}}],["инвертирует",{"2":{"200":1}}],["инициировать",{"2":{"441":1}}],["инициируя",{"2":{"344":1}}],["инициирует",{"2":{"343":1}}],["инициирующей",{"2":{"117":1}}],["инициализация",{"0":{"502":1},"2":{"512":1,"538":1}}],["инициализации",{"2":{"358":1,"513":1,"529":1}}],["инициализируя",{"2":{"366":1}}],["инициализируем",{"2":{"250":1,"296":1}}],["инициализирован",{"2":{"390":1}}],["инициализированную",{"2":{"356":1}}],["инициализировано",{"2":{"292":1}}],["инициализировать",{"2":{"322":1}}],["инициативе",{"2":{"343":1}}],["инъекцией",{"2":{"284":1}}],["инъекцию",{"2":{"252":1,"283":1,"353":1}}],["инъекция",{"0":{"247":1,"282":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1},"2":{"246":1,"260":1}}],["инъекциях",{"2":{"112":1}}],["инъекции",{"0":{"518":1},"2":{"241":1,"247":1,"248":1,"258":1,"282":1,"284":1,"287":1,"345":1,"518":1}}],["инжектируете",{"2":{"425":1}}],["инжектируется",{"2":{"331":1}}],["инжектирует",{"2":{"315":1}}],["инжектируемого",{"2":{"508":1}}],["инжектируем",{"2":{"255":2}}],["инжектируемый",{"2":{"247":1,"252":1,"255":1}}],["инжектируемых",{"2":{"215":1}}],["инжектируемые",{"2":{"215":1}}],["инжектируйте",{"2":{"255":1}}],["инжектировать",{"2":{"424":1}}],["инжектироваться",{"2":{"254":1,"345":1}}],["инжектированный",{"2":{"256":1,"331":1}}],["инжектированы",{"2":{"247":1}}],["инженеру",{"2":{"419":1}}],["инженерные",{"2":{"232":1}}],["инженерной",{"2":{"150":1}}],["инженерии",{"2":{"199":1,"200":1,"263":1,"271":1}}],["инженер",{"2":{"197":1}}],["инноваций",{"2":{"178":1}}],["интрасетей",{"2":{"134":1}}],["интеллектуальные",{"2":{"331":1}}],["интеллекта",{"2":{"149":1}}],["интегрирует",{"2":{"387":1}}],["интегрируется",{"2":{"375":1}}],["интегрируются",{"2":{"336":1,"379":1,"553":1}}],["интегрирующие",{"2":{"263":1}}],["интегрированные",{"2":{"267":1}}],["интегрированной",{"2":{"221":1}}],["интегрировать",{"2":{"224":1,"233":1,"234":1,"383":1}}],["интеграцию",{"2":{"504":1}}],["интеграционное",{"2":{"372":1}}],["интеграционные",{"2":{"66":1,"461":1}}],["интеграция",{"0":{"225":1,"395":1},"1":{"226":1},"2":{"79":1,"221":1,"394":1,"395":1,"419":1,"462":1,"545":1}}],["интеграции",{"2":{"41":1,"143":1,"234":1,"303":1,"334":1,"341":1,"368":1,"372":1,"508":2}}],["интерактивные",{"2":{"308":1}}],["интерактивных",{"2":{"237":1,"308":1}}],["интерактивность",{"2":{"308":2,"381":1}}],["интерактивности",{"0":{"240":1},"2":{"238":1,"308":2,"463":1}}],["интерполяции",{"2":{"231":1}}],["интерполяцией",{"2":{"201":1,"209":1}}],["интерполируем",{"2":{"298":1}}],["интерполируя",{"2":{"231":1}}],["интерполированное",{"2":{"209":1}}],["интерпретатору",{"2":{"303":1}}],["интерпретатора",{"2":{"62":1}}],["интерпретации",{"2":{"204":1}}],["интерпретировано",{"2":{"207":1}}],["интерпретировать",{"2":{"202":1,"203":1}}],["интерпретируются",{"2":{"201":1}}],["интерпретируют",{"2":{"189":1}}],["интерпретируется",{"2":{"183":1}}],["интересная",{"2":{"498":1}}],["интересными",{"2":{"497":1}}],["интересный",{"2":{"421":1}}],["интересное",{"2":{"221":1,"462":1}}],["интересного",{"2":{"134":1,"439":1}}],["интересующих",{"2":{"296":1}}],["интерес",{"2":{"224":1}}],["интересам",{"2":{"191":1}}],["интервал",{"2":{"154":1}}],["интервалам",{"2":{"154":1}}],["интервалом",{"2":{"153":1,"167":1}}],["интернационализационным",{"2":{"460":1,"536":1}}],["интернационализации",{"2":{"460":1,"536":1}}],["интернационализация",{"2":{"78":1,"424":1,"460":1,"544":1}}],["интернету",{"2":{"137":1,"347":1}}],["интернет",{"2":{"117":4,"137":1,"144":1,"183":1,"199":1,"300":1,"473":1}}],["интернета",{"2":{"115":1,"185":1,"308":1,"331":1,"395":1,"473":1}}],["интернете",{"2":{"27":1,"71":1,"95":1,"98":1,"115":1,"118":1,"131":2,"134":3,"145":1,"146":1,"167":1,"193":1,"225":2,"325":1,"347":1,"385":1,"395":1,"449":1,"471":1,"473":1}}],["интерьерные",{"2":{"71":1}}],["интерфейсе",{"2":{"384":1}}],["интерфейсной",{"2":{"256":1}}],["интерфейсом",{"2":{"256":1,"261":1,"300":1,"440":1}}],["интерфейсов",{"2":{"63":1,"150":2,"154":1,"157":1,"158":1,"200":2,"223":1,"233":1,"235":1,"237":1,"300":1,"319":1,"336":2,"400":1,"410":1}}],["интерфейс",{"0":{"384":1},"2":{"62":1,"143":1,"149":1,"152":1,"154":1,"203":1,"225":1,"247":1,"252":1,"266":1,"290":1,"297":1,"299":1,"300":1,"302":1,"308":1,"317":1,"330":1,"343":3,"344":1,"359":1,"364":3,"383":1,"387":1,"436":1,"440":1}}],["интерфейсами",{"2":{"150":1}}],["интерфейса",{"0":{"150":1,"155":1,"235":1,"238":1,"410":1},"1":{"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"249":1,"250":1,"251":1,"252":1,"253":1,"254":1,"255":1,"256":1,"257":1,"258":1,"259":1},"2":{"62":1,"115":1,"124":1,"147":1,"149":2,"150":6,"151":2,"154":3,"156":1,"163":2,"167":1,"178":1,"183":1,"203":2,"210":1,"229":1,"237":1,"249":1,"250":1,"264":1,"265":2,"267":1,"289":2,"297":2,"298":1,"301":1,"308":1,"309":1,"336":1,"339":1,"353":1,"364":1,"384":1,"417":1,"444":1,"447":1,"461":1}}],["интерфейсы",{"2":{"23":1,"149":1,"152":1,"185":1,"235":2,"308":1}}],["информирования",{"2":{"166":1}}],["информатике",{"2":{"385":1}}],["информативную",{"2":{"158":1}}],["информативен",{"2":{"150":1}}],["информационной",{"2":{"421":1}}],["информационного",{"2":{"349":1}}],["информационный",{"2":{"132":1,"148":1,"197":1}}],["информацией",{"2":{"164":1,"166":1,"203":1,"223":1,"293":1,"316":1,"325":2,"349":1,"353":1,"421":1}}],["информации",{"2":{"82":1,"83":1,"116":1,"128":1,"149":1,"158":1,"161":1,"167":1,"196":2,"239":1,"325":1,"349":2,"350":1,"351":1,"356":1,"364":1,"394":1,"413":1,"452":1,"473":1,"497":2}}],["информация",{"2":{"31":1,"47":1,"51":1,"109":1,"116":1,"164":1,"317":1,"351":1,"369":1,"375":1,"396":1,"447":1,"497":1,"498":1}}],["информацию",{"2":{"11":1,"127":1,"156":1,"157":1,"159":1,"161":1,"163":1,"164":1,"175":1,"212":1,"223":1,"226":1,"239":1,"319":1,"322":1,"324":1,"325":3,"383":1,"424":1,"441":1,"442":1,"447":1,"451":1,"454":1,"473":1}}],["инфраструктуры",{"2":{"137":1}}],["инфраструктуре",{"2":{"134":1}}],["инсталируемым",{"2":{"400":1}}],["инсталляторов",{"2":{"387":1}}],["инсталляторах",{"2":{"157":1}}],["инстанцированный",{"2":{"290":1}}],["инстанцировании",{"2":{"281":2}}],["инстанцирования",{"2":{"264":1,"278":1,"281":1,"286":1,"439":1}}],["инстанцирование",{"2":{"120":2}}],["инстанцировать",{"2":{"225":1,"436":1,"438":1}}],["инстанцию",{"2":{"121":1}}],["инструкцию",{"2":{"302":1}}],["инструкций",{"2":{"145":1}}],["инструкциями",{"2":{"256":1}}],["инструкциям",{"2":{"225":1,"253":1,"350":1,"387":1}}],["инструкция",{"2":{"144":1}}],["инструкции",{"2":{"144":2,"225":1,"421":1}}],["инструменту",{"2":{"346":1}}],["инструментах",{"2":{"363":1,"370":1,"372":1,"391":1}}],["инструментария",{"2":{"271":1}}],["инструментам",{"2":{"228":1,"436":1}}],["инструментами",{"2":{"143":1,"346":1,"374":1,"415":1}}],["инструмента",{"2":{"222":2,"224":1,"346":1,"381":1,"395":1,"507":1}}],["инструментов",{"2":{"221":2,"233":1,"264":1,"289":1,"344":1,"358":1,"359":1,"363":1,"368":1,"370":2,"372":1,"373":1,"375":1,"378":1,"394":1,"400":1,"402":1,"436":1}}],["инструменты",{"0":{"223":1},"2":{"131":1,"221":1,"222":3,"233":1,"235":1,"331":1,"342":2,"346":2,"348":1,"367":1,"373":2,"376":1,"378":1,"379":1,"387":2,"394":1,"396":2,"409":1,"412":1,"419":1,"436":1,"455":1,"472":1}}],["инструмент",{"2":{"50":1,"201":1,"224":2,"228":1,"248":1,"249":1,"345":1,"359":1,"383":1,"384":1,"470":1}}],["индустрии",{"2":{"332":1,"396":1}}],["индивидуальных",{"2":{"336":1}}],["индивидуальные",{"2":{"190":1}}],["индивидуально",{"2":{"116":1}}],["индикатором",{"2":{"168":2}}],["индикаторов",{"2":{"168":1}}],["индикаторы",{"2":{"168":1}}],["индикатора",{"2":{"168":1}}],["индексный",{"2":{"448":1}}],["индексу",{"2":{"381":1}}],["индексировать",{"2":{"472":1}}],["индексироваться",{"2":{"336":1,"448":1}}],["индексированные",{"2":{"448":1}}],["индексируемыми",{"2":{"448":1}}],["индексируется",{"2":{"472":1}}],["индексирует",{"2":{"48":1}}],["индексы",{"2":{"209":1}}],["индекс",{"2":{"209":1}}],["индексация",{"2":{"48":1}}],["индексации",{"2":{"17":1,"308":1,"472":2}}],["индекса",{"2":{"17":1}}],["инета",{"2":{"115":1}}],["ином",{"2":{"271":1,"460":1}}],["иной",{"2":{"119":1,"127":1,"153":1,"200":2,"306":1,"421":1,"507":1}}],["иное",{"2":{"59":1,"123":1,"338":1,"507":1}}],["иного",{"2":{"22":1,"471":1}}],["иногда",{"2":{"4":1,"149":1,"232":1,"291":1,"302":1,"308":1,"395":1,"423":2,"462":1,"471":1,"472":2}}],["их",{"2":{"2":1,"12":1,"23":1,"26":1,"38":1,"63":3,"71":1,"85":1,"97":1,"98":1,"115":1,"123":3,"124":1,"134":4,"136":1,"145":1,"153":1,"157":1,"158":2,"162":1,"168":1,"176":1,"179":1,"184":1,"185":1,"196":1,"197":1,"198":1,"200":3,"202":2,"203":2,"204":1,"212":4,"218":1,"219":1,"221":1,"223":1,"224":7,"225":3,"227":4,"228":1,"229":1,"237":1,"239":1,"240":1,"244":2,"245":3,"246":1,"247":2,"249":2,"250":1,"252":2,"256":1,"260":1,"263":2,"266":1,"267":1,"270":1,"271":1,"276":1,"279":1,"283":1,"288":1,"289":1,"291":1,"293":2,"297":1,"300":1,"301":2,"303":2,"304":2,"306":2,"308":4,"311":1,"312":1,"313":1,"316":2,"318":2,"322":4,"323":2,"324":2,"325":1,"328":1,"329":1,"330":1,"331":1,"332":1,"334":2,"336":3,"338":1,"344":2,"349":1,"353":1,"355":1,"356":2,"358":1,"361":1,"363":4,"364":4,"370":1,"372":2,"373":1,"374":1,"375":3,"376":1,"379":1,"381":2,"382":1,"386":1,"387":1,"390":1,"391":1,"393":1,"396":2,"412":1,"421":1,"424":4,"425":3,"429":4,"434":2,"436":2,"441":1,"444":2,"446":1,"448":1,"449":1,"451":1,"454":1,"455":1,"456":1,"457":1,"460":1,"461":1,"462":6,"463":3,"466":1,"467":1,"473":1,"504":1,"508":1,"513":1}}],["и",{"0":{"1":1,"3":1,"16":1,"59":1,"63":1,"66":1,"75":1,"80":1,"87":1,"106":1,"109":1,"116":1,"120":1,"121":1,"124":1,"126":1,"127":1,"128":1,"134":1,"137":1,"152":1,"153":1,"154":1,"162":1,"168":1,"170":1,"172":1,"183":1,"193":1,"204":1,"208":1,"209":1,"211":1,"214":1,"216":1,"217":1,"223":1,"224":1,"238":1,"239":1,"240":1,"241":1,"243":1,"244":1,"245":1,"247":1,"249":1,"250":1,"260":1,"269":1,"312":1,"317":1,"324":1,"325":1,"354":1,"364":1,"365":1,"370":1,"372":1,"375":1,"385":1,"392":1,"395":1,"398":1,"408":1,"415":1,"425":1,"432":1,"460":1,"466":1,"469":1,"471":1,"472":1,"496":1,"502":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"76":1,"77":1,"78":1,"79":1,"136":1,"138":1,"139":1,"140":1,"141":1,"142":1,"169":1,"171":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"251":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1,"275":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1,"302":1,"303":1,"304":1,"305":1,"313":1,"314":1,"318":1,"319":1,"355":1,"356":1,"366":1,"367":1,"371":1,"372":1,"373":1,"374":1,"375":1,"376":2,"377":1,"378":1,"379":1,"380":1,"381":1,"382":1,"383":1,"384":1,"385":1,"386":1,"387":1,"388":1,"389":1,"390":1,"391":1,"392":1,"393":1,"394":1,"395":1,"396":1,"397":1,"399":1,"400":1,"401":1,"402":1,"403":1,"404":1,"405":1,"426":1,"427":1,"428":1},"2":{"2":2,"3":6,"4":5,"6":1,"7":1,"9":4,"10":1,"11":4,"12":2,"13":1,"16":2,"17":5,"18":1,"21":2,"22":5,"23":3,"26":5,"28":1,"34":1,"35":1,"36":2,"38":2,"39":3,"40":2,"41":2,"43":2,"44":1,"47":3,"48":2,"50":4,"51":1,"56":1,"58":2,"59":4,"61":4,"62":8,"63":10,"65":2,"68":2,"70":1,"71":3,"72":3,"73":1,"74":1,"76":4,"78":1,"79":5,"82":1,"83":4,"86":3,"87":1,"89":5,"91":1,"92":1,"95":7,"96":1,"97":3,"98":4,"100":2,"102":2,"103":4,"104":4,"105":6,"106":1,"108":3,"109":1,"112":3,"114":3,"115":16,"116":23,"117":3,"118":4,"119":10,"120":4,"121":3,"122":1,"123":8,"124":7,"125":8,"126":2,"127":6,"130":2,"131":8,"133":1,"134":10,"135":2,"136":2,"137":11,"138":2,"139":1,"140":4,"141":4,"142":2,"143":6,"144":15,"145":8,"146":4,"147":13,"149":17,"150":5,"151":6,"152":8,"153":9,"154":8,"155":2,"156":4,"157":2,"158":11,"159":7,"160":1,"161":6,"162":10,"163":3,"164":4,"165":3,"166":4,"167":11,"168":8,"169":2,"170":13,"171":7,"172":2,"173":4,"174":2,"175":1,"176":8,"177":2,"178":6,"179":5,"180":1,"181":4,"182":4,"183":13,"184":4,"185":2,"186":1,"187":2,"188":2,"189":3,"190":2,"191":2,"193":1,"194":2,"195":1,"196":1,"197":7,"198":2,"199":24,"200":29,"201":15,"202":9,"203":15,"204":33,"205":1,"208":3,"209":1,"210":4,"211":4,"212":9,"213":2,"214":1,"215":4,"216":1,"217":1,"218":5,"219":4,"220":1,"221":7,"222":14,"223":21,"224":22,"225":13,"226":2,"227":17,"228":10,"229":8,"230":3,"231":26,"232":11,"233":5,"234":1,"235":8,"236":1,"237":4,"238":5,"239":10,"240":2,"241":6,"242":2,"243":4,"244":8,"245":5,"246":7,"247":12,"248":1,"249":6,"250":11,"251":2,"252":6,"254":1,"255":23,"256":15,"257":2,"258":5,"259":2,"260":13,"261":5,"262":1,"263":6,"264":2,"265":13,"266":7,"267":14,"268":9,"269":5,"270":6,"271":9,"272":2,"273":1,"274":1,"275":1,"276":6,"277":4,"280":3,"281":4,"283":1,"284":1,"285":1,"286":1,"287":3,"288":3,"289":4,"290":2,"291":8,"292":10,"293":6,"294":1,"295":11,"296":13,"297":13,"298":2,"299":2,"300":10,"301":5,"302":6,"303":23,"304":5,"305":2,"306":2,"308":33,"309":10,"310":4,"311":5,"313":18,"314":1,"315":4,"316":14,"317":8,"318":2,"319":9,"320":1,"321":1,"322":13,"323":5,"324":19,"325":20,"326":1,"327":3,"328":8,"329":11,"330":16,"331":24,"332":8,"333":3,"334":9,"336":35,"338":5,"339":2,"340":3,"341":4,"342":2,"343":11,"344":11,"345":8,"346":4,"347":7,"348":3,"349":9,"350":3,"351":15,"352":2,"353":6,"354":5,"355":1,"356":11,"357":8,"358":10,"359":8,"360":7,"361":5,"363":13,"364":31,"365":5,"366":6,"367":5,"368":4,"369":3,"370":15,"372":22,"373":15,"374":9,"375":17,"376":20,"377":1,"378":3,"379":6,"380":2,"381":20,"382":4,"383":5,"384":5,"385":11,"386":10,"387":3,"388":3,"390":3,"391":10,"392":3,"393":11,"394":12,"395":10,"396":6,"397":4,"400":11,"401":5,"402":6,"405":3,"407":1,"408":2,"410":1,"412":1,"413":2,"414":1,"416":1,"417":3,"418":1,"419":3,"421":18,"422":5,"423":11,"424":2,"425":6,"429":7,"432":8,"433":20,"434":6,"436":22,"437":2,"438":2,"439":4,"440":8,"441":6,"442":4,"443":12,"444":7,"445":9,"446":10,"447":6,"448":7,"449":6,"450":4,"451":2,"452":5,"453":1,"454":9,"455":9,"457":3,"460":19,"461":6,"462":34,"463":24,"464":11,"465":1,"467":5,"468":4,"469":2,"470":2,"471":22,"472":31,"473":37,"482":2,"495":1,"496":3,"497":7,"498":1,"499":1,"501":2,"503":2,"504":5,"506":4,"507":10,"508":14,"509":2,"512":1,"513":3,"515":2,"516":1,"527":2,"536":2,"538":1,"539":1,"542":2,"545":8,"546":6,"548":2,"553":2,"554":1,"555":3,"556":1,"557":2}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.F0NbM6nF.js b/assets/chunks/VPLocalSearchBox.OcB85nU1.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.F0NbM6nF.js rename to assets/chunks/VPLocalSearchBox.OcB85nU1.js index bd755fda1..79de6eba1 100644 --- a/assets/chunks/VPLocalSearchBox.F0NbM6nF.js +++ b/assets/chunks/VPLocalSearchBox.OcB85nU1.js @@ -1,4 +1,4 @@ -var kt=Object.defineProperty;var It=(o,e,t)=>e in o?kt(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>(It(o,typeof e!="symbol"?e+"":e,t),t);import{X as Ce,h as oe,y as We,aI as Dt,aJ as _t,d as Ot,G as xe,aK as rt,k as Fe,aL as Rt,aM as Mt,z as Lt,aN as Pt,l as Re,R as de,P as Ee,aO as zt,aP as Bt,Y as Vt,j as $t,aQ as Wt,o as ee,b as Kt,m as E,a1 as jt,p as U,ab as Jt,ac as Ut,aR as Ht,c as re,n as at,e as Se,D as nt,F as it,a as ve,t as pe,aS as Gt,q as Qt,s as qt,aT as ot,a6 as Yt,ay as Zt,aE as Xt,aU as er,_ as tr}from"./framework.P5TqXf0g.js";import{u as rr,c as ar}from"./theme.3jHxI3s0.js";const nr={en:()=>Ce(()=>import("./@localSearchIndexen.yQWoex4a.js"),__vite__mapDeps([])),root:()=>Ce(()=>import("./@localSearchIndexroot.X3vpm1a5.js"),__vite__mapDeps([])),ru:()=>Ce(()=>import("./@localSearchIndexru.eKe3q1b4.js"),__vite__mapDeps([]))};/*! +var kt=Object.defineProperty;var It=(o,e,t)=>e in o?kt(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>(It(o,typeof e!="symbol"?e+"":e,t),t);import{X as Ce,h as oe,y as We,aI as Dt,aJ as _t,d as Ot,G as xe,aK as rt,k as Fe,aL as Rt,aM as Mt,z as Lt,aN as Pt,l as Re,R as de,P as Ee,aO as zt,aP as Bt,Y as Vt,j as $t,aQ as Wt,o as ee,b as Kt,m as E,a1 as jt,p as U,ab as Jt,ac as Ut,aR as Ht,c as re,n as at,e as Se,D as nt,F as it,a as ve,t as pe,aS as Gt,q as Qt,s as qt,aT as ot,a6 as Yt,ay as Zt,aE as Xt,aU as er,_ as tr}from"./framework.P5TqXf0g.js";import{u as rr,c as ar}from"./theme.HfBH_EWg.js";const nr={en:()=>Ce(()=>import("./@localSearchIndexen.N2xzeUE8.js"),__vite__mapDeps([])),root:()=>Ce(()=>import("./@localSearchIndexroot.X3vpm1a5.js"),__vite__mapDeps([])),ru:()=>Ce(()=>import("./@localSearchIndexru.5-E4-aJx.js"),__vite__mapDeps([]))};/*! * tabbable 6.2.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var yt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ne=yt.join(","),gt=typeof Element>"u",ue=gt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,ke=!gt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ie=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},ir=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},bt=function(e,t,r){if(Ie(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ne));return t&&ue.call(e,Ne)&&n.unshift(e),n=n.filter(r),n},wt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ie(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=ue.call(i,Ne);h&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var d=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ie(d,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(d&&v){var m=o(d===!0?i.children:d.children,!0,r);r.flatten?n.push.apply(n,m):n.push({scopeParent:i,candidates:m})}else a.unshift.apply(a,i.children)}}return n},xt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||ir(e))&&!xt(e)?0:e.tabIndex},or=function(e,t){var r=se(e);return r<0&&t&&!xt(e)?0:r},sr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},Ft=function(e){return e.tagName==="INPUT"},ur=function(e){return Ft(e)&&e.type==="hidden"},lr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},cr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(ue.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=ke(e);if(u&&!u.shadowRoot&&n(u)===!0)return st(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(vr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return st(e);return!1},mr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},gr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=or(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(sr).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=wt([e],t.includeContainer,{filter:Ke.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:yr}):r=bt(e,t.includeContainer,Ke.bind(null,t)),gr(r)},wr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=wt([e],t.includeContainer,{filter:De.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=bt(e,t.includeContainer,De.bind(null,t)),r},le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,Ne)===!1?!1:Ke(t,e)},xr=yt.concat("iframe").join(","),Me=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,xr)===!1?!1:De(t,e)};/*! diff --git a/assets/chunks/theme.3jHxI3s0.js b/assets/chunks/theme.HfBH_EWg.js similarity index 99% rename from assets/chunks/theme.3jHxI3s0.js rename to assets/chunks/theme.HfBH_EWg.js index a02a1bc9c..e1f6f7bbb 100644 --- a/assets/chunks/theme.3jHxI3s0.js +++ b/assets/chunks/theme.HfBH_EWg.js @@ -1,4 +1,4 @@ -import{d as b,o as r,c as u,r as p,a as q,t as V,n as B,b as P,w as h,T as Re,e as m,_ as k,u as st,i as Et,f as Mt,g as je,h as N,j as le,k as g,l as Y,m as v,p as l,q as X,s as Z,v as oe,x as Ee,y as se,z as ee,A as pe,B as at,C as Bt,F as M,D as z,E as ae,G as rt,H as Pe,I as f,J as ne,K as it,L as Le,M as x,N as we,O as Ot,P as Me,Q as Ht,R as Ge,S as lt,U as Ft,V as Dt,W as zt,X as qt,Y as ct,Z as ut,$ as Ut,a0 as xt,a1 as Rt,a2 as jt,a3 as ce,a4 as R,a5 as dt,a6 as Gt,a7 as me,a8 as Kt}from"./framework.P5TqXf0g.js";const Jt=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(r(),u("span",{class:B(["VPBadge",t.type])},[p(t.$slots,"default",{},()=>[q(V(t.text),1)])],2))}}),Wt={key:0,class:"VPBackdrop"},Yt=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(r(),P(Re,{name:"fade"},{default:h(()=>[t.show?(r(),u("div",Wt)):m("",!0)]),_:1}))}}),Xt=k(Yt,[["__scopeId","data-v-03e59631"]]),w=st;function Zt(e,t){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(e,t):(e(),(o=!0)&&setTimeout(()=>o=!1,t))}}function Be(e){return/^\//.test(e)?e:`/${e}`}function Ke(e){const{pathname:t,search:n,hash:o,protocol:s}=new URL(e,"http://a.com");if(Et(e)||e.startsWith("#")||!s.startsWith("http")||!Mt(t))return e;const{site:a}=w(),i=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${n}${o}`);return je(i)}const Je=N(le?location.hash:"");le&&window.addEventListener("hashchange",()=>{Je.value=location.hash});function he({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:n,localeIndex:o,page:s,theme:a}=w(),i=g(()=>{var c,_;return{label:(c=n.value.locales[o.value])==null?void 0:c.label,link:((_=n.value.locales[o.value])==null?void 0:_.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:g(()=>Object.entries(n.value.locales).flatMap(([c,_])=>e&&i.value.label===_.label?[]:{text:_.label,link:Qt(_.link||(c==="root"?"/":`/${c}/`),a.value.i18nRouting!==!1&&t,s.value.relativePath.slice(i.value.link.length-1),!n.value.cleanUrls)+Je.value})),currentLang:i}}function Qt(e,t,n,o){return t?e.replace(/\/$/,"")+Be(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):e}const en=e=>(X("data-v-821a9d89"),e=e(),Z(),e),tn={class:"NotFound"},nn={class:"code"},on={class:"title"},sn=en(()=>v("div",{class:"divider"},null,-1)),an={class:"quote"},rn={class:"action"},ln=["href","aria-label"],cn=b({__name:"NotFound",setup(e){const{site:t,theme:n}=w(),{localeLinks:o}=he({removeCurrent:!1}),s=N("/");return Y(()=>{var i;const a=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(s.value=((i=o.value.find(({link:d})=>d.startsWith(a)))==null?void 0:i.link)||o.value[0].link)}),(a,i)=>{var d,c,_,y,S;return r(),u("div",tn,[v("p",nn,V(((d=l(n).notFound)==null?void 0:d.code)??"404"),1),v("h1",on,V(((c=l(n).notFound)==null?void 0:c.title)??"PAGE NOT FOUND"),1),sn,v("blockquote",an,V(((_=l(n).notFound)==null?void 0:_.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",rn,[v("a",{class:"link",href:l(je)(s.value),"aria-label":((y=l(n).notFound)==null?void 0:y.linkLabel)??"go to home"},V(((S=l(n).notFound)==null?void 0:S.linkText)??"Take me home"),9,ln)])])}}}),un=k(cn,[["__scopeId","data-v-821a9d89"]]);function vt(e,t){if(Array.isArray(e))return ge(e);if(e==null)return[];t=Be(t);const n=Object.keys(e).sort((s,a)=>a.split("/").length-s.split("/").length).find(s=>t.startsWith(Be(s))),o=n?e[n]:[];return Array.isArray(o)?ge(o):ge(o.items,o.base)}function dn(e){const t=[];let n=0;for(const o in e){const s=e[o];if(s.items){n=t.push(s);continue}t[n]||t.push({items:[]}),t[n].items.push(s)}return t}function vn(e){const t=[];function n(o){for(const s of o)s.text&&s.link&&t.push({text:s.text,link:s.link,docFooterText:s.docFooterText}),s.items&&n(s.items)}return n(e),t}function Oe(e,t){return Array.isArray(t)?t.some(n=>Oe(e,n)):oe(e,t.link)?!0:t.items?Oe(e,t.items):!1}function ge(e,t){return[...e].map(n=>{const o={...n},s=o.base||t;return s&&o.link&&(o.link=s+o.link),o.items&&(o.items=ge(o.items,s)),o})}function Q(){const{frontmatter:e,page:t,theme:n}=w(),o=Ee("(min-width: 960px)"),s=N(!1),a=g(()=>{const L=n.value.sidebar,I=t.value.relativePath;return L?vt(L,I):[]}),i=N(a.value);se(a,(L,I)=>{JSON.stringify(L)!==JSON.stringify(I)&&(i.value=a.value)});const d=g(()=>e.value.sidebar!==!1&&i.value.length>0&&e.value.layout!=="home"),c=g(()=>_?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),_=g(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),y=g(()=>d.value&&o.value),S=g(()=>d.value?dn(i.value):[]);function $(){s.value=!0}function C(){s.value=!1}function T(){s.value?C():$()}return{isOpen:s,sidebar:i,sidebarGroups:S,hasSidebar:d,hasAside:_,leftAside:c,isSidebarEnabled:y,open:$,close:C,toggle:T}}function pn(e,t){let n;ee(()=>{n=e.value?document.activeElement:void 0}),Y(()=>{window.addEventListener("keyup",o)}),pe(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function hn(e){const{page:t}=w(),n=N(!1),o=g(()=>e.value.collapsed!=null),s=g(()=>!!e.value.link),a=N(!1),i=()=>{a.value=oe(t.value.relativePath,e.value.link)};se([t,e,Je],i),Y(i);const d=g(()=>a.value?!0:e.value.items?Oe(t.value.relativePath,e.value.items):!1),c=g(()=>!!(e.value.items&&e.value.items.length));ee(()=>{n.value=!!(o.value&&e.value.collapsed)}),at(()=>{(a.value||d.value)&&(n.value=!1)});function _(){o.value&&(n.value=!n.value)}return{collapsed:n,collapsible:o,isLink:s,isActiveLink:a,hasActiveLink:d,hasChildren:c,toggle:_}}function fn(){const{hasSidebar:e}=Q(),t=Ee("(min-width: 960px)"),n=Ee("(min-width: 1280px)");return{isAsideEnabled:g(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const He=[];function pt(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function We(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const o=Number(n.tagName[1]);return{element:n,title:_n(n),link:"#"+n.id,level:o}});return mn(t,e)}function _n(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor")||n.classList.contains("ignore-header"))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mn(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[o,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;e=e.filter(i=>i.level>=o&&i.level<=s),He.length=0;for(const{element:i,link:d}of e)He.push({element:i,link:d});const a=[];e:for(let i=0;i=0;c--){const _=e[c];if(_.level{requestAnimationFrame(a),window.addEventListener("scroll",o)}),Bt(()=>{i(location.hash)}),pe(()=>{window.removeEventListener("scroll",o)});function a(){if(!n.value)return;const d=(()=>{var L;const T=(L=document.querySelector("#VPContent .VPDoc"))==null?void 0:L.firstElementChild;return T?tt(T):78})(),c=window.scrollY,_=window.innerHeight,y=document.body.offsetHeight,S=Math.abs(c+_-y)<1,$=He.map(({element:T,link:L})=>({link:L,top:tt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,L)=>T.top-L.top);if(!$.length){i(null);return}if(c<1){i(null);return}if(S){i($[$.length-1].link);return}let C=null;for(const{link:T,top:L}of $){if(L>c+d)break;C=T}i(C)}function i(d){s&&s.classList.remove("active"),d==null?s=null:s=e.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const c=s;c?(c.classList.add("active"),t.value.style.top=c.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function tt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}const bn=["href","title"],yn=b({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(e){function t({target:n}){const o=n.href.split("#")[1],s=document.getElementById(decodeURIComponent(o));s==null||s.focus({preventScroll:!0})}return(n,o)=>{const s=ae("VPDocOutlineItem",!0);return r(),u("ul",{class:B(["VPDocOutlineItem",n.root?"root":"nested"])},[(r(!0),u(M,null,z(n.headers,({children:a,link:i,title:d})=>(r(),u("li",null,[v("a",{class:"outline-link",href:i,onClick:t,title:d},V(d),9,bn),a!=null&&a.length?(r(),P(s,{key:0,headers:a},null,8,["headers"])):m("",!0)]))),256))],2)}}}),ht=k(yn,[["__scopeId","data-v-8709fa37"]]),kn=e=>(X("data-v-aa59da57"),e=e(),Z(),e),$n={class:"content"},Sn={class:"outline-title",role:"heading","aria-level":"2"},Pn={"aria-labelledby":"doc-outline-aria-label"},Ln=kn(()=>v("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),wn=b({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=w(),o=rt([]);Pe(()=>{o.value=We(t.value.outline??n.value.outline)});const s=N(),a=N();return gn(s,a),(i,d)=>(r(),u("div",{class:B(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s,role:"navigation"},[v("div",$n,[v("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),v("div",Sn,V(l(pt)(l(n))),1),v("nav",Pn,[Ln,f(ht,{headers:o.value,root:!0},null,8,["headers"])])])],2))}}),Cn=k(wn,[["__scopeId","data-v-aa59da57"]]),Tn={class:"VPDocAsideCarbonAds"},In=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,o)=>(r(),u("div",Tn,[f(l(t),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),Nn=e=>(X("data-v-55432d05"),e=e(),Z(),e),An={class:"VPDocAside"},Vn=Nn(()=>v("div",{class:"spacer"},null,-1)),En=b({__name:"VPDocAside",setup(e){const{theme:t}=w();return(n,o)=>(r(),u("div",An,[p(n.$slots,"aside-top",{},void 0,!0),p(n.$slots,"aside-outline-before",{},void 0,!0),f(Cn),p(n.$slots,"aside-outline-after",{},void 0,!0),Vn,p(n.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(r(),P(In,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):m("",!0),p(n.$slots,"aside-ads-after",{},void 0,!0),p(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mn=k(En,[["__scopeId","data-v-55432d05"]]);function Bn(){const{theme:e,page:t}=w();return g(()=>{const{text:n="Edit this page",pattern:o=""}=e.value.editLink||{};let s;return typeof o=="function"?s=o(t.value):s=o.replace(/:path/g,t.value.filePath),{url:s,text:n}})}function On(){const{page:e,theme:t,frontmatter:n}=w();return g(()=>{var c,_,y,S,$,C,T,L;const o=vt(t.value.sidebar,e.value.relativePath),s=vn(o),a=s.findIndex(I=>oe(e.value.relativePath,I.link)),i=((c=t.value.docFooter)==null?void 0:c.prev)===!1&&!n.value.prev||n.value.prev===!1,d=((_=t.value.docFooter)==null?void 0:_.next)===!1&&!n.value.next||n.value.next===!1;return{prev:i?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((y=s[a-1])==null?void 0:y.docFooterText)??((S=s[a-1])==null?void 0:S.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??(($=s[a-1])==null?void 0:$.link)},next:d?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((C=s[a+1])==null?void 0:C.docFooterText)??((T=s[a+1])==null?void 0:T.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((L=s[a+1])==null?void 0:L.link)}}})}const Hn={},Fn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Dn=v("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),zn=v("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),qn=[Dn,zn];function Un(e,t){return r(),u("svg",Fn,qn)}const xn=k(Hn,[["render",Un]]),K=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=g(()=>t.tag??(t.href?"a":"span")),o=g(()=>t.href&&it.test(t.href));return(s,a)=>(r(),P(ne(n.value),{class:B(["VPLink",{link:s.href,"vp-external-link-icon":o.value,"no-icon":s.noIcon}]),href:s.href?l(Ke)(s.href):void 0,target:s.target??(o.value?"_blank":void 0),rel:s.rel??(o.value?"noreferrer":void 0)},{default:h(()=>[p(s.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Rn={class:"VPLastUpdated"},jn=["datetime"],Gn=b({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,frontmatter:o,lang:s}=w(),a=g(()=>new Date(o.value.lastUpdated??n.value.lastUpdated)),i=g(()=>a.value.toISOString()),d=N("");return Y(()=>{ee(()=>{var c,_,y;d.value=new Intl.DateTimeFormat((_=(c=t.value.lastUpdated)==null?void 0:c.formatOptions)!=null&&_.forceLocale?s.value:void 0,((y=t.value.lastUpdated)==null?void 0:y.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(a.value)})}),(c,_)=>{var y;return r(),u("p",Rn,[q(V(((y=l(t).lastUpdated)==null?void 0:y.text)||l(t).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:i.value},V(d.value),9,jn)])}}}),Kn=k(Gn,[["__scopeId","data-v-c9d0eb99"]]),Jn={key:0,class:"VPDocFooter"},Wn={key:0,class:"edit-info"},Yn={key:0,class:"edit-link"},Xn={key:1,class:"last-updated"},Zn={key:1,class:"prev-next"},Qn={class:"pager"},eo=["innerHTML"],to=["innerHTML"],no={class:"pager"},oo=["innerHTML"],so=["innerHTML"],ao=b({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:o}=w(),s=Bn(),a=On(),i=g(()=>t.value.editLink&&o.value.editLink!==!1),d=g(()=>n.value.lastUpdated&&o.value.lastUpdated!==!1),c=g(()=>i.value||d.value||a.value.prev||a.value.next);return(_,y)=>{var S,$,C,T;return c.value?(r(),u("footer",Jn,[p(_.$slots,"doc-footer-before",{},void 0,!0),i.value||d.value?(r(),u("div",Wn,[i.value?(r(),u("div",Yn,[f(K,{class:"edit-link-button",href:l(s).url,"no-icon":!0},{default:h(()=>[f(xn,{class:"edit-link-icon","aria-label":"edit icon"}),q(" "+V(l(s).text),1)]),_:1},8,["href"])])):m("",!0),d.value?(r(),u("div",Xn,[f(Kn)])):m("",!0)])):m("",!0),(S=l(a).prev)!=null&&S.link||($=l(a).next)!=null&&$.link?(r(),u("nav",Zn,[v("div",Qn,[(C=l(a).prev)!=null&&C.link?(r(),P(K,{key:0,class:"pager-link prev",href:l(a).prev.link},{default:h(()=>{var L;return[v("span",{class:"desc",innerHTML:((L=l(t).docFooter)==null?void 0:L.prev)||"Previous page"},null,8,eo),v("span",{class:"title",innerHTML:l(a).prev.text},null,8,to)]}),_:1},8,["href"])):m("",!0)]),v("div",no,[(T=l(a).next)!=null&&T.link?(r(),P(K,{key:0,class:"pager-link next",href:l(a).next.link},{default:h(()=>{var L;return[v("span",{class:"desc",innerHTML:((L=l(t).docFooter)==null?void 0:L.next)||"Next page"},null,8,oo),v("span",{class:"title",innerHTML:l(a).next.text},null,8,so)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),ro=k(ao,[["__scopeId","data-v-93cfaf96"]]),io=e=>(X("data-v-fbd749fe"),e=e(),Z(),e),lo={class:"container"},co=io(()=>v("div",{class:"aside-curtain"},null,-1)),uo={class:"aside-container"},vo={class:"aside-content"},po={class:"content"},ho={class:"content-container"},fo={class:"main"},_o=b({__name:"VPDoc",setup(e){const{theme:t}=w(),n=Le(),{hasSidebar:o,hasAside:s,leftAside:a}=Q(),i=g(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,c)=>{const _=ae("Content");return r(),u("div",{class:B(["VPDoc",{"has-sidebar":l(o),"has-aside":l(s)}])},[p(d.$slots,"doc-top",{},void 0,!0),v("div",lo,[l(s)?(r(),u("div",{key:0,class:B(["aside",{"left-aside":l(a)}])},[co,v("div",uo,[v("div",vo,[f(Mn,null,{"aside-top":h(()=>[p(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[p(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[p(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[p(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[p(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[p(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),v("div",po,[v("div",ho,[p(d.$slots,"doc-before",{},void 0,!0),v("main",fo,[f(_,{class:B(["vp-doc",[i.value,l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),f(ro,null,{"doc-footer-before":h(()=>[p(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),p(d.$slots,"doc-after",{},void 0,!0)])])]),p(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),mo=k(_o,[["__scopeId","data-v-fbd749fe"]]),go=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(e){const t=e,n=g(()=>t.href&&it.test(t.href)),o=g(()=>t.tag||t.href?"a":"button");return(s,a)=>(r(),P(ne(o.value),{class:B(["VPButton",[s.size,s.theme]]),href:s.href?l(Ke)(s.href):void 0,target:n.value?"_blank":void 0,rel:n.value?"noreferrer":void 0},{default:h(()=>[q(V(s.text),1)]),_:1},8,["class","href","target","rel"]))}}),bo=k(go,[["__scopeId","data-v-d16e9b74"]]),yo=["src","alt"],ko=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const o=ae("VPImage",!0);return t.image?(r(),u(M,{key:0},[typeof t.image=="string"||"src"in t.image?(r(),u("img",x({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:l(je)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,yo)):(r(),u(M,{key:1},[f(o,x({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),f(o,x({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),$e=k(ko,[["__scopeId","data-v-4b98881e"]]),$o=e=>(X("data-v-ad185e75"),e=e(),Z(),e),So={class:"container"},Po={class:"main"},Lo={key:0,class:"name"},wo=["innerHTML"],Co=["innerHTML"],To=["innerHTML"],Io={key:0,class:"actions"},No={key:0,class:"image"},Ao={class:"image-container"},Vo=$o(()=>v("div",{class:"image-bg"},null,-1)),Eo=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=we("hero-image-slot-exists");return(n,o)=>(r(),u("div",{class:B(["VPHero",{"has-image":n.image||l(t)}])},[v("div",So,[v("div",Po,[p(n.$slots,"home-hero-info",{},()=>[n.name?(r(),u("h1",Lo,[v("span",{innerHTML:n.name,class:"clip"},null,8,wo)])):m("",!0),n.text?(r(),u("p",{key:1,innerHTML:n.text,class:"text"},null,8,Co)):m("",!0),n.tagline?(r(),u("p",{key:2,innerHTML:n.tagline,class:"tagline"},null,8,To)):m("",!0)],!0),n.actions?(r(),u("div",Io,[(r(!0),u(M,null,z(n.actions,s=>(r(),u("div",{key:s.link,class:"action"},[f(bo,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link},null,8,["theme","text","href"])]))),128))])):m("",!0)]),n.image||l(t)?(r(),u("div",No,[v("div",Ao,[Vo,p(n.$slots,"home-hero-image",{},()=>[n.image?(r(),P($e,{key:0,class:"image-src",image:n.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),Mo=k(Eo,[["__scopeId","data-v-ad185e75"]]),Bo=b({__name:"VPHomeHero",setup(e){const{frontmatter:t}=w();return(n,o)=>l(t).hero?(r(),P(Mo,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info":h(()=>[p(n.$slots,"home-hero-info")]),"home-hero-image":h(()=>[p(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),Oo={},Ho={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Fo=v("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Do=[Fo];function zo(e,t){return r(),u("svg",Ho,Do)}const qo=k(Oo,[["render",zo]]),Uo={class:"box"},xo={key:0,class:"icon"},Ro=["innerHTML"],jo=["innerHTML"],Go=["innerHTML"],Ko={key:4,class:"link-text"},Jo={class:"link-text-value"},Wo=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(r(),P(K,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:h(()=>[v("article",Uo,[typeof t.icon=="object"&&t.icon.wrap?(r(),u("div",xo,[f($e,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(r(),P($e,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(r(),u("div",{key:2,class:"icon",innerHTML:t.icon},null,8,Ro)):m("",!0),v("h2",{class:"title",innerHTML:t.title},null,8,jo),t.details?(r(),u("p",{key:3,class:"details",innerHTML:t.details},null,8,Go)):m("",!0),t.linkText?(r(),u("div",Ko,[v("p",Jo,[q(V(t.linkText)+" ",1),f(qo,{class:"link-text-icon"})])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Yo=k(Wo,[["__scopeId","data-v-b48bc3f9"]]),Xo={key:0,class:"VPFeatures"},Zo={class:"container"},Qo={class:"items"},es=b({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=g(()=>{const o=t.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,s)=>o.features?(r(),u("div",Xo,[v("div",Zo,[v("div",Qo,[(r(!0),u(M,null,z(o.features,a=>(r(),u("div",{key:a.title,class:B(["item",[n.value]])},[f(Yo,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),ts=k(es,[["__scopeId","data-v-c63a12c6"]]),ns=b({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=w();return(n,o)=>l(t).features?(r(),P(ts,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):m("",!0)}}),os={class:"VPHome"},ss=b({__name:"VPHome",setup(e){return(t,n)=>{const o=ae("Content");return r(),u("div",os,[p(t.$slots,"home-hero-before",{},void 0,!0),f(Bo,null,{"home-hero-info":h(()=>[p(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":h(()=>[p(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),p(t.$slots,"home-hero-after",{},void 0,!0),p(t.$slots,"home-features-before",{},void 0,!0),f(ns),p(t.$slots,"home-features-after",{},void 0,!0),f(o)])}}}),as=k(ss,[["__scopeId","data-v-35757591"]]),rs={},is={class:"VPPage"};function ls(e,t){const n=ae("Content");return r(),u("div",is,[p(e.$slots,"page-top"),f(n),p(e.$slots,"page-bottom")])}const cs=k(rs,[["render",ls]]),us=b({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=w(),{hasSidebar:o}=Q();return(s,a)=>(r(),u("div",{class:B(["VPContent",{"has-sidebar":l(o),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?p(s.$slots,"not-found",{key:0},()=>[f(un)],!0):l(n).layout==="page"?(r(),P(cs,{key:1},{"page-top":h(()=>[p(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[p(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(r(),P(as,{key:2},{"home-hero-before":h(()=>[p(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":h(()=>[p(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":h(()=>[p(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[p(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[p(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[p(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(n).layout&&l(n).layout!=="doc"?(r(),P(ne(l(n).layout),{key:3})):(r(),P(mo,{key:4},{"doc-top":h(()=>[p(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[p(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[p(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[p(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[p(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[p(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[p(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[p(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[p(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[p(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[p(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ds=k(us,[["__scopeId","data-v-5bb58b51"]]),vs={class:"container"},ps=["innerHTML"],hs=["innerHTML"],fs=b({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=w(),{hasSidebar:o}=Q();return(s,a)=>l(t).footer&&l(n).footer!==!1?(r(),u("footer",{key:0,class:B(["VPFooter",{"has-sidebar":l(o)}])},[v("div",vs,[l(t).footer.message?(r(),u("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,ps)):m("",!0),l(t).footer.copyright?(r(),u("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,hs)):m("",!0)])],2)):m("",!0)}}),_s=k(fs,[["__scopeId","data-v-7e42202a"]]);function ft(){const{theme:e,frontmatter:t}=w(),n=rt([]),o=g(()=>n.value.length>0);return Pe(()=>{n.value=We(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:o}}const ms={},gs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},bs=v("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ys=[bs];function ks(e,t){return r(),u("svg",gs,ys)}const _t=k(ms,[["render",ks]]),$s={class:"header"},Ss={class:"outline"},Ps=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=w(),o=N(!1),s=N(0),a=N(),i=N();Ot(a,()=>{o.value=!1}),Me("Escape",()=>{o.value=!1}),Pe(()=>{o.value=!1});function d(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function c(y){y.target.classList.contains("outline-link")&&(i.value&&(i.value.style.transition="none"),Ge(()=>{o.value=!1}))}function _(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(y,S)=>(r(),u("div",{class:"VPLocalNavOutlineDropdown",style:Ht({"--vp-vh":s.value+"px"}),ref_key:"main",ref:a},[y.headers.length>0?(r(),u("button",{key:0,onClick:d,class:B({open:o.value})},[q(V(l(pt)(l(n)))+" ",1),f(_t,{class:"icon"})],2)):(r(),u("button",{key:1,onClick:_},V(l(n).returnToTopLabel||"Return to top"),1)),f(Re,{name:"flyout"},{default:h(()=>[o.value?(r(),u("div",{key:0,ref_key:"items",ref:i,class:"items",onClick:c},[v("div",$s,[v("a",{class:"top-link",href:"#",onClick:_},V(l(n).returnToTopLabel||"Return to top"),1)]),v("div",Ss,[f(ht,{headers:y.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),Ls=k(Ps,[["__scopeId","data-v-3dbbcea5"]]),ws={},Cs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ts=v("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Is=v("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Ns=v("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),As=v("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Vs=[Ts,Is,Ns,As];function Es(e,t){return r(),u("svg",Cs,Vs)}const Ms=k(ws,[["render",Es]]),Bs={class:"container"},Os=["aria-expanded"],Hs={class:"menu-text"},Fs=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=w(),{hasSidebar:o}=Q(),{headers:s}=ft(),{y:a}=lt(),i=N(0);Y(()=>{i.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Pe(()=>{s.value=We(n.value.outline??t.value.outline)});const d=g(()=>s.value.length===0),c=g(()=>d.value&&!o.value),_=g(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:d.value,fixed:c.value}));return(y,S)=>l(n).layout!=="home"&&(!c.value||l(a)>=i.value)?(r(),u("div",{key:0,class:B(_.value)},[v("div",Bs,[l(o)?(r(),u("button",{key:0,class:"menu","aria-expanded":y.open,"aria-controls":"VPSidebarNav",onClick:S[0]||(S[0]=$=>y.$emit("open-menu"))},[f(Ms,{class:"menu-icon"}),v("span",Hs,V(l(t).sidebarMenuLabel||"Menu"),1)],8,Os)):m("",!0),f(Ls,{headers:l(s),navHeight:i.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),Ds=k(Fs,[["__scopeId","data-v-df179b54"]]);function zs(){const e=N(!1);function t(){e.value=!0,window.addEventListener("resize",s)}function n(){e.value=!1,window.removeEventListener("resize",s)}function o(){e.value?n():t()}function s(){window.outerWidth>=768&&n()}const a=Le();return se(()=>a.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:o}}const qs={},Us={class:"VPSwitch",type:"button",role:"switch"},xs={class:"check"},Rs={key:0,class:"icon"};function js(e,t){return r(),u("button",Us,[v("span",xs,[e.$slots.default?(r(),u("span",Rs,[p(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const Gs=k(qs,[["render",js],["__scopeId","data-v-59c2c4c4"]]),Ks={},Js={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ws=v("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Ys=[Ws];function Xs(e,t){return r(),u("svg",Js,Ys)}const Zs=k(Ks,[["render",Xs]]),Qs={},ea={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ta=Ft('',9),na=[ta];function oa(e,t){return r(),u("svg",ea,na)}const sa=k(Qs,[["render",oa]]),aa=b({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=w(),o=we("toggle-appearance",()=>{t.value=!t.value}),s=g(()=>t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme");return(a,i)=>(r(),P(Gs,{title:s.value,class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(o)},{default:h(()=>[f(sa,{class:"sun"}),f(Zs,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),Ye=k(aa,[["__scopeId","data-v-a5ffd038"]]),ra={key:0,class:"VPNavBarAppearance"},ia=b({__name:"VPNavBarAppearance",setup(e){const{site:t}=w();return(n,o)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),u("div",ra,[f(Ye)])):m("",!0)}}),la=k(ia,[["__scopeId","data-v-1dd33068"]]),Xe=N();let mt=!1,Ae=0;function ca(e){const t=N(!1);if(le){!mt&&ua(),Ae++;const n=se(Xe,o=>{var s,a,i;o===e.el.value||(s=e.el.value)!=null&&s.contains(o)?(t.value=!0,(a=e.onFocus)==null||a.call(e)):(t.value=!1,(i=e.onBlur)==null||i.call(e))});pe(()=>{n(),Ae--,Ae||da()})}return Dt(t)}function ua(){document.addEventListener("focusin",gt),mt=!0,Xe.value=document.activeElement}function da(){document.removeEventListener("focusin",gt)}function gt(){Xe.value=document.activeElement}const va={},pa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ha=v("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),fa=[ha];function _a(e,t){return r(),u("svg",pa,fa)}const bt=k(va,[["render",_a]]),ma={},ga={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ba=v("circle",{cx:"12",cy:"12",r:"2"},null,-1),ya=v("circle",{cx:"19",cy:"12",r:"2"},null,-1),ka=v("circle",{cx:"5",cy:"12",r:"2"},null,-1),$a=[ba,ya,ka];function Sa(e,t){return r(),u("svg",ga,$a)}const Pa=k(ma,[["render",Sa]]),La={class:"VPMenuLink"},wa=b({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=w();return(n,o)=>(r(),u("div",La,[f(K,{class:B({active:l(oe)(l(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:h(()=>[q(V(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),Ce=k(wa,[["__scopeId","data-v-78e6daba"]]),Ca={class:"VPMenuGroup"},Ta={key:0,class:"title"},Ia=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),u("div",Ca,[t.text?(r(),u("p",Ta,V(t.text),1)):m("",!0),(r(!0),u(M,null,z(t.items,o=>(r(),u(M,null,["link"in o?(r(),P(Ce,{key:0,item:o},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=k(Ia,[["__scopeId","data-v-837e8b02"]]),Aa={class:"VPMenu"},Va={key:0,class:"items"},Ea=b({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(r(),u("div",Aa,[t.items?(r(),u("div",Va,[(r(!0),u(M,null,z(t.items,o=>(r(),u(M,{key:o.text},["link"in o?(r(),P(Ce,{key:0,item:o},null,8,["item"])):(r(),P(Na,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0),p(t.$slots,"default",{},void 0,!0)]))}}),Ma=k(Ea,[["__scopeId","data-v-920e461a"]]),Ba=["aria-expanded","aria-label"],Oa={key:0,class:"text"},Ha=["innerHTML"],Fa={class:"menu"},Da=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=N(!1),n=N();ca({el:n,onBlur:o});function o(){t.value=!1}return(s,a)=>(r(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:a[1]||(a[1]=i=>t.value=!0),onMouseleave:a[2]||(a[2]=i=>t.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":s.label,onClick:a[0]||(a[0]=i=>t.value=!t.value)},[s.button||s.icon?(r(),u("span",Oa,[s.icon?(r(),P(ne(s.icon),{key:0,class:"option-icon"})):m("",!0),s.button?(r(),u("span",{key:1,innerHTML:s.button},null,8,Ha)):m("",!0),f(bt,{class:"text-icon"})])):(r(),P(Pa,{key:1,class:"icon"}))],8,Ba),v("div",Fa,[f(Ma,{items:s.items},{default:h(()=>[p(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Ze=k(Da,[["__scopeId","data-v-a4fabc1b"]]),za={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},qa=["href","aria-label","innerHTML"],Ua=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=g(()=>typeof t.icon=="object"?t.icon.svg:za[t.icon]);return(o,s)=>(r(),u("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:n.value},null,8,qa))}}),xa=k(Ua,[["__scopeId","data-v-d7e056da"]]),Ra={class:"VPSocialLinks"},ja=b({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(r(),u("div",Ra,[(r(!0),u(M,null,z(t.links,({link:o,icon:s,ariaLabel:a})=>(r(),P(xa,{key:o,icon:s,link:o,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}}),Qe=k(ja,[["__scopeId","data-v-16f8b2f5"]]),Ga={key:0,class:"group translations"},Ka={class:"trans-title"},Ja={key:1,class:"group"},Wa={class:"item appearance"},Ya={class:"label"},Xa={class:"appearance-action"},Za={key:2,class:"group"},Qa={class:"item social-links"},er=b({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=w(),{localeLinks:o,currentLang:s}=he({correspondingLink:!0}),a=g(()=>o.value.length&&s.value.label||t.value.appearance||n.value.socialLinks);return(i,d)=>a.value?(r(),P(Ze,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[l(o).length&&l(s).label?(r(),u("div",Ga,[v("p",Ka,V(l(s).label),1),(r(!0),u(M,null,z(l(o),c=>(r(),P(Ce,{key:c.link,item:c},null,8,["item"]))),128))])):m("",!0),l(t).appearance&&l(t).appearance!=="force-dark"?(r(),u("div",Ja,[v("div",Wa,[v("p",Ya,V(l(n).darkModeSwitchLabel||"Appearance"),1),v("div",Xa,[f(Ye)])])])):m("",!0),l(n).socialLinks?(r(),u("div",Za,[v("div",Qa,[f(Qe,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),tr=k(er,[["__scopeId","data-v-6c64fdd1"]]),nr=e=>(X("data-v-c2a14fb1"),e=e(),Z(),e),or=["aria-expanded"],sr=nr(()=>v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)),ar=[sr],rr=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(r(),u("button",{type:"button",class:B(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=o=>t.$emit("click"))},ar,10,or))}}),ir=k(rr,[["__scopeId","data-v-c2a14fb1"]]),lr=["innerHTML"],cr=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=w();return(n,o)=>(r(),P(K,{class:B({VPNavBarMenuLink:!0,active:l(oe)(l(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:h(()=>[v("span",{innerHTML:n.item.text},null,8,lr)]),_:1},8,["class","href","target","rel"]))}}),ur=k(cr,[["__scopeId","data-v-49a9523e"]]),dr=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=w(),o=a=>"link"in a?oe(n.value.relativePath,a.link,!!t.item.activeMatch):a.items.some(o),s=g(()=>o(t.item));return(a,i)=>(r(),P(Ze,{class:B({VPNavBarMenuGroup:!0,active:l(oe)(l(n).relativePath,a.item.activeMatch,!!a.item.activeMatch)||s.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),vr=e=>(X("data-v-760204e0"),e=e(),Z(),e),pr={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},hr=vr(()=>v("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),fr=b({__name:"VPNavBarMenu",setup(e){const{theme:t}=w();return(n,o)=>l(t).nav?(r(),u("nav",pr,[hr,(r(!0),u(M,null,z(l(t).nav,s=>(r(),u(M,{key:s.text},["link"in s?(r(),P(ur,{key:0,item:s},null,8,["item"])):(r(),P(dr,{key:1,item:s},null,8,["item"]))],64))),128))])):m("",!0)}}),_r=k(fr,[["__scopeId","data-v-760204e0"]]);function mr(e){const{localeIndex:t,theme:n}=w();function o(s){var T,L,I;const a=s.split("."),i=(T=n.value.search)==null?void 0:T.options,d=i&&typeof i=="object",c=d&&((I=(L=i.locales)==null?void 0:L[t.value])==null?void 0:I.translations)||null,_=d&&i.translations||null;let y=c,S=_,$=e;const C=a.pop();for(const j of a){let O=null;const F=$==null?void 0:$[j];F&&(O=$=F);const U=S==null?void 0:S[j];U&&(O=S=U);const G=y==null?void 0:y[j];G&&(O=y=G),F||($=O),U||(S=O),G||(y=O)}return(y==null?void 0:y[C])??(S==null?void 0:S[C])??($==null?void 0:$[C])??""}return o}const gr=["aria-label"],br={class:"DocSearch-Button-Container"},yr=v("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[v("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),kr={class:"DocSearch-Button-Placeholder"},$r=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1),nt=b({__name:"VPNavBarSearchButton",setup(e){const n=mr({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,s)=>(r(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[v("span",br,[yr,v("span",kr,V(l(n)("button.buttonText")),1)]),$r],8,gr))}}),Sr={class:"VPNavBarSearch"},Pr={id:"local-search"},Lr={key:1,id:"docsearch"},wr=b({__name:"VPNavBarSearch",setup(e){const t=zt(()=>qt(()=>import("./VPLocalSearchBox.F0NbM6nF.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:o}=w(),s=N(!1),a=N(!1);Y(()=>{});function i(){s.value||(s.value=!0,setTimeout(d,16))}function d(){const S=new Event("keydown");S.key="k",S.metaKey=!0,window.dispatchEvent(S),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function c(S){const $=S.target,C=$.tagName;return $.isContentEditable||C==="INPUT"||C==="SELECT"||C==="TEXTAREA"}const _=N(!1);Me("k",S=>{(S.ctrlKey||S.metaKey)&&(S.preventDefault(),_.value=!0)}),Me("/",S=>{c(S)||(S.preventDefault(),_.value=!0)});const y="local";return(S,$)=>{var C;return r(),u("div",Sr,[l(y)==="local"?(r(),u(M,{key:0},[_.value?(r(),P(l(t),{key:0,onClose:$[0]||($[0]=T=>_.value=!1)})):m("",!0),v("div",Pr,[f(nt,{onClick:$[1]||($[1]=T=>_.value=!0)})])],64)):l(y)==="algolia"?(r(),u(M,{key:1},[s.value?(r(),P(l(n),{key:0,algolia:((C=l(o).search)==null?void 0:C.options)??l(o).algolia,onVnodeBeforeMount:$[2]||($[2]=T=>a.value=!0)},null,8,["algolia"])):m("",!0),a.value?m("",!0):(r(),u("div",Lr,[f(nt,{onClick:i})]))],64)):m("",!0)])}}}),Cr=b({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=w();return(n,o)=>l(t).socialLinks?(r(),P(Qe,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):m("",!0)}}),Tr=k(Cr,[["__scopeId","data-v-8dbcf1da"]]),Ir=["href","rel","target"],Nr=b({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=w(),{hasSidebar:o}=Q(),{currentLang:s}=he(),a=g(()=>{var c;return typeof n.value.logoLink=="string"?n.value.logoLink:(c=n.value.logoLink)==null?void 0:c.link}),i=g(()=>{var c;return typeof n.value.logoLink=="string"||(c=n.value.logoLink)==null?void 0:c.rel}),d=g(()=>{var c;return typeof n.value.logoLink=="string"||(c=n.value.logoLink)==null?void 0:c.target});return(c,_)=>(r(),u("div",{class:B(["VPNavBarTitle",{"has-sidebar":l(o)}])},[v("a",{class:"title",href:a.value??l(Ke)(l(s).link),rel:i.value,target:d.value},[p(c.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(r(),P($e,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):m("",!0),l(n).siteTitle?(r(),u(M,{key:1},[q(V(l(n).siteTitle),1)],64)):l(n).siteTitle===void 0?(r(),u(M,{key:2},[q(V(l(t).title),1)],64)):m("",!0),p(c.$slots,"nav-bar-title-after",{},void 0,!0)],8,Ir)],2))}}),Ar=k(Nr,[["__scopeId","data-v-5a94dcd8"]]),Vr={},Er={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Mr=v("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Br=v("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Or=[Mr,Br];function Hr(e,t){return r(),u("svg",Er,Or)}const yt=k(Vr,[["render",Hr]]),Fr={class:"items"},Dr={class:"title"},zr=b({__name:"VPNavBarTranslations",setup(e){const{theme:t}=w(),{localeLinks:n,currentLang:o}=he({correspondingLink:!0});return(s,a)=>l(n).length&&l(o).label?(r(),P(Ze,{key:0,class:"VPNavBarTranslations",icon:yt,label:l(t).langMenuLabel||"Change language"},{default:h(()=>[v("div",Fr,[v("p",Dr,V(l(o).label),1),(r(!0),u(M,null,z(l(n),i=>(r(),P(Ce,{key:i.link,item:i},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),qr=k(zr,[["__scopeId","data-v-9194bb91"]]),Ur=e=>(X("data-v-42aa9df5"),e=e(),Z(),e),xr={class:"wrapper"},Rr={class:"container"},jr={class:"title"},Gr={class:"content"},Kr={class:"content-body"},Jr=Ur(()=>v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1)),Wr=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=lt(),{hasSidebar:n}=Q(),{hasLocalNav:o}=ft(),{frontmatter:s}=w(),a=N({});return at(()=>{a.value={"has-sidebar":n.value,"has-local-nav":o.value,top:s.value.layout==="home"&&t.value===0}}),(i,d)=>(r(),u("div",{class:B(["VPNavBar",a.value])},[v("div",xr,[v("div",Rr,[v("div",jr,[f(Ar,null,{"nav-bar-title-before":h(()=>[p(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[p(i.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",Gr,[v("div",Kr,[p(i.$slots,"nav-bar-content-before",{},void 0,!0),f(wr,{class:"search"}),f(_r,{class:"menu"}),f(qr,{class:"translations"}),f(la,{class:"appearance"}),f(Tr,{class:"social-links"}),f(tr,{class:"extra"}),p(i.$slots,"nav-bar-content-after",{},void 0,!0),f(ir,{class:"hamburger",active:i.isScreenOpen,onClick:d[0]||(d[0]=c=>i.$emit("toggle-screen"))},null,8,["active"])])])])]),Jr],2))}}),Yr=k(Wr,[["__scopeId","data-v-42aa9df5"]]),Xr={key:0,class:"VPNavScreenAppearance"},Zr={class:"text"},Qr=b({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=w();return(o,s)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),u("div",Xr,[v("p",Zr,V(l(n).darkModeSwitchLabel||"Appearance"),1),f(Ye)])):m("",!0)}}),ei=k(Qr,[["__scopeId","data-v-c59e684f"]]),ti=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=we("close-screen");return(n,o)=>(r(),P(K,{class:"VPNavScreenMenuLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:l(t)},{default:h(()=>[q(V(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ni=k(ti,[["__scopeId","data-v-55fc374b"]]),oi={},si={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ai=v("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),ri=[ai];function ii(e,t){return r(),u("svg",si,ri)}const li=k(oi,[["render",ii]]),ci=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=we("close-screen");return(n,o)=>(r(),P(K,{class:"VPNavScreenMenuGroupLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:l(t)},{default:h(()=>[q(V(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),kt=k(ci,[["__scopeId","data-v-f37bbc3d"]]),ui={class:"VPNavScreenMenuGroupSection"},di={key:0,class:"title"},vi=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),u("div",ui,[t.text?(r(),u("p",di,V(t.text),1)):m("",!0),(r(!0),u(M,null,z(t.items,o=>(r(),P(kt,{key:o.text,item:o},null,8,["item"]))),128))]))}}),pi=k(vi,[["__scopeId","data-v-12372362"]]),hi=["aria-controls","aria-expanded"],fi=["innerHTML"],_i=["id"],mi={key:1,class:"group"},gi=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=N(!1),o=g(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(a,i)=>(r(),u("div",{class:B(["VPNavScreenMenuGroup",{open:n.value}])},[v("button",{class:"button","aria-controls":o.value,"aria-expanded":n.value,onClick:s},[v("span",{class:"button-text",innerHTML:a.text},null,8,fi),f(li,{class:"button-icon"})],8,hi),v("div",{id:o.value,class:"items"},[(r(!0),u(M,null,z(a.items,d=>(r(),u(M,{key:d.text},["link"in d?(r(),u("div",{key:d.text,class:"item"},[f(kt,{item:d},null,8,["item"])])):(r(),u("div",mi,[f(pi,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,_i)],2))}}),bi=k(gi,[["__scopeId","data-v-873aafb3"]]),yi={key:0,class:"VPNavScreenMenu"},ki=b({__name:"VPNavScreenMenu",setup(e){const{theme:t}=w();return(n,o)=>l(t).nav?(r(),u("nav",yi,[(r(!0),u(M,null,z(l(t).nav,s=>(r(),u(M,{key:s.text},["link"in s?(r(),P(ni,{key:0,item:s},null,8,["item"])):(r(),P(bi,{key:1,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),$i=b({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=w();return(n,o)=>l(t).socialLinks?(r(),P(Qe,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):m("",!0)}}),Si={class:"list"},Pi=b({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=he({correspondingLink:!0}),o=N(!1);function s(){o.value=!o.value}return(a,i)=>l(t).length&&l(n).label?(r(),u("div",{key:0,class:B(["VPNavScreenTranslations",{open:o.value}])},[v("button",{class:"title",onClick:s},[f(yt,{class:"icon lang"}),q(" "+V(l(n).label)+" ",1),f(bt,{class:"icon chevron"})]),v("ul",Si,[(r(!0),u(M,null,z(l(t),d=>(r(),u("li",{key:d.link,class:"item"},[f(K,{class:"link",href:d.link},{default:h(()=>[q(V(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),Li=k(Pi,[["__scopeId","data-v-a4076537"]]),wi={class:"container"},Ci=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=N(null),n=ct(le?document.body:null);return(o,s)=>(r(),P(Re,{name:"fade",onEnter:s[0]||(s[0]=a=>n.value=!0),onAfterLeave:s[1]||(s[1]=a=>n.value=!1)},{default:h(()=>[o.open?(r(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[v("div",wi,[p(o.$slots,"nav-screen-content-before",{},void 0,!0),f(ki,{class:"menu"}),f(Li,{class:"translations"}),f(ei,{class:"appearance"}),f($i,{class:"social-links"}),p(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),Ti=k(Ci,[["__scopeId","data-v-2984a903"]]),Ii={key:0,class:"VPNav"},Ni=b({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:o}=zs(),{frontmatter:s}=w(),a=g(()=>s.value.navbar!==!1);return ut("close-screen",n),ee(()=>{le&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(i,d)=>a.value?(r(),u("header",Ii,[f(Yr,{"is-screen-open":l(t),onToggleScreen:l(o)},{"nav-bar-title-before":h(()=>[p(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[p(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[p(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[p(i.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(Ti,{open:l(t)},{"nav-screen-content-before":h(()=>[p(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[p(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),Ai=k(Ni,[["__scopeId","data-v-a832e287"]]),Vi=e=>(X("data-v-758a0e73"),e=e(),Z(),e),Ei=["role","tabindex"],Mi=Vi(()=>v("div",{class:"indicator"},null,-1)),Bi={key:1,class:"items"},Oi=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:o,isLink:s,isActiveLink:a,hasActiveLink:i,hasChildren:d,toggle:c}=hn(g(()=>t.item)),_=g(()=>d.value?"section":"div"),y=g(()=>s.value?"a":"div"),S=g(()=>d.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),$=g(()=>s.value?void 0:"button"),C=g(()=>[[`level-${t.depth}`],{collapsible:o.value},{collapsed:n.value},{"is-link":s.value},{"is-active":a.value},{"has-active":i.value}]);function T(I){"key"in I&&I.key!=="Enter"||!t.item.link&&c()}function L(){t.item.link&&c()}return(I,j)=>{const O=ae("VPSidebarItem",!0);return r(),P(ne(_.value),{class:B(["VPSidebarItem",C.value])},{default:h(()=>[I.item.text?(r(),u("div",x({key:0,class:"item",role:$.value},xt(I.item.items?{click:T,keydown:T}:{},!0),{tabindex:I.item.items&&0}),[Mi,I.item.link?(r(),P(K,{key:0,tag:y.value,class:"link",href:I.item.link,rel:I.item.rel,target:I.item.target},{default:h(()=>[(r(),P(ne(S.value),{class:"text",innerHTML:I.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),P(ne(S.value),{key:1,class:"text",innerHTML:I.item.text},null,8,["innerHTML"])),I.item.collapsed!=null?(r(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:L,onKeydown:Ut(L,["enter"]),tabindex:"0"},[f(_t,{class:"caret-icon"})],32)):m("",!0)],16,Ei)):m("",!0),I.item.items&&I.item.items.length?(r(),u("div",Bi,[I.depth<5?(r(!0),u(M,{key:0},z(I.item.items,F=>(r(),P(O,{key:F.text,item:F,depth:I.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),Hi=k(Oi,[["__scopeId","data-v-758a0e73"]]),$t=e=>(X("data-v-464f49c9"),e=e(),Z(),e),Fi=$t(()=>v("div",{class:"curtain"},null,-1)),Di={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},zi=$t(()=>v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),qi=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=Q(),o=e,s=N(null),a=ct(le?document.body:null);return se([o,s],()=>{var i;o.open?(a.value=!0,(i=s.value)==null||i.focus()):a.value=!1},{immediate:!0,flush:"post"}),(i,d)=>l(n)?(r(),u("aside",{key:0,class:B(["VPSidebar",{open:i.open}]),ref_key:"navEl",ref:s,onClick:d[0]||(d[0]=Rt(()=>{},["stop"]))},[Fi,v("nav",Di,[zi,p(i.$slots,"sidebar-nav-before",{},void 0,!0),(r(!0),u(M,null,z(l(t),c=>(r(),u("div",{key:c.text,class:"group"},[f(Hi,{item:c,depth:0},null,8,["item"])]))),128)),p(i.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ui=k(qi,[["__scopeId","data-v-464f49c9"]]),xi=b({__name:"VPSkipLink",setup(e){const t=Le(),n=N();se(()=>t.path,()=>n.value.focus());function o({target:s}){const a=document.getElementById(decodeURIComponent(s.hash).slice(1));if(a){const i=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",i)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",i),a.focus(),window.scrollTo(0,0)}}return(s,a)=>(r(),u(M,null,[v("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Ri=k(xi,[["__scopeId","data-v-5bd08246"]]),ji=b({__name:"Layout",setup(e){const{isOpen:t,open:n,close:o}=Q(),s=Le();se(()=>s.path,o),pn(t,o);const{frontmatter:a}=w(),i=jt(),d=g(()=>!!i["home-hero-image"]);return ut("hero-image-slot-exists",d),(c,_)=>{const y=ae("Content");return l(a).layout!==!1?(r(),u("div",{key:0,class:B(["Layout",l(a).pageClass])},[p(c.$slots,"layout-top",{},void 0,!0),f(Ri),f(Xt,{class:"backdrop",show:l(t),onClick:l(o)},null,8,["show","onClick"]),f(Ai,null,{"nav-bar-title-before":h(()=>[p(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[p(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[p(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[p(c.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[p(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[p(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(Ds,{open:l(t),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),f(Ui,{open:l(t)},{"sidebar-nav-before":h(()=>[p(c.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[p(c.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f(ds,null,{"page-top":h(()=>[p(c.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[p(c.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[p(c.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[p(c.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":h(()=>[p(c.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":h(()=>[p(c.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[p(c.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[p(c.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[p(c.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[p(c.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[p(c.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[p(c.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[p(c.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[p(c.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[p(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[p(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[p(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[p(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[p(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[p(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(_s),p(c.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),P(y,{key:1}))}}}),Gi=k(ji,[["__scopeId","data-v-fd36441a"]]),St={Layout:Gi,enhanceApp:({app:e})=>{e.component("Badge",Jt)}},fe={TOP_LEFT:"top-left",TOP_RIGHT:"top-right",TOP_CENTER:"top-center",BOTTOM_LEFT:"bottom-left",BOTTOM_RIGHT:"bottom-right",BOTTOM_CENTER:"bottom-center"},ie={LIGHT:"light",DARK:"dark",COLORED:"colored",AUTO:"auto"},D={INFO:"info",SUCCESS:"success",WARNING:"warning",ERROR:"error",DEFAULT:"default"},Ki={BOUNCE:"bounce",SLIDE:"slide",FLIP:"flip",ZOOM:"zoom"},Pt={dangerouslyHTMLString:!1,multiple:!0,position:fe.TOP_RIGHT,autoClose:5e3,transition:"bounce",hideProgressBar:!1,pauseOnHover:!0,pauseOnFocusLoss:!0,closeOnClick:!0,className:"",bodyClassName:"",style:{},progressClassName:"",progressStyle:{},role:"alert",theme:"light"},Ji={rtl:!1,newestOnTop:!1,toastClassName:""},Lt={...Pt,...Ji};({...Pt,type:D.DEFAULT});var A=(e=>(e[e.COLLAPSE_DURATION=300]="COLLAPSE_DURATION",e[e.DEBOUNCE_DURATION=50]="DEBOUNCE_DURATION",e.CSS_NAMESPACE="Toastify",e))(A||{}),Fe=(e=>(e.ENTRANCE_ANIMATION_END="d",e))(Fe||{});const Wi={enter:"Toastify--animate Toastify__bounce-enter",exit:"Toastify--animate Toastify__bounce-exit",appendPosition:!0},Yi={enter:"Toastify--animate Toastify__slide-enter",exit:"Toastify--animate Toastify__slide-exit",appendPosition:!0},Xi={enter:"Toastify--animate Toastify__zoom-enter",exit:"Toastify--animate Toastify__zoom-exit"},Zi={enter:"Toastify--animate Toastify__flip-enter",exit:"Toastify--animate Toastify__flip-exit"};function wt(e){let t=Wi;if(!e||typeof e=="string")switch(e){case"flip":t=Zi;break;case"zoom":t=Xi;break;case"slide":t=Yi;break}else t=e;return t}function Qi(e){return e.containerId||String(e.position)}const Te="will-unmount";function el(e=fe.TOP_RIGHT){return!!document.querySelector(".".concat(A.CSS_NAMESPACE,"__toast-container--").concat(e))}function tl(e=fe.TOP_RIGHT){return"".concat(A.CSS_NAMESPACE,"__toast-container--").concat(e)}function nl(e,t,n=!1){const o=["".concat(A.CSS_NAMESPACE,"__toast-container"),"".concat(A.CSS_NAMESPACE,"__toast-container--").concat(e),n?"".concat(A.CSS_NAMESPACE,"__toast-container--rtl"):null].filter(Boolean).join(" ");return re(t)?t({position:e,rtl:n,defaultClassName:o}):"".concat(o," ").concat(t||"")}function ol(e){var t;const{position:n,containerClassName:o,rtl:s=!1,style:a={}}=e,i=A.CSS_NAMESPACE,d=tl(n),c=document.querySelector(".".concat(i)),_=document.querySelector(".".concat(d)),y=!!_&&!((t=_.className)!=null&&t.includes(Te)),S=c||document.createElement("div"),$=document.createElement("div");$.className=nl(n,o,s),$.dataset.testid="".concat(A.CSS_NAMESPACE,"__toast-container--").concat(n),$.id=Qi(e);for(const C in a)if(Object.prototype.hasOwnProperty.call(a,C)){const T=a[C];$.style[C]=T}return c||(S.className=A.CSS_NAMESPACE,document.body.appendChild(S)),y||S.appendChild($),$}function De(e){var t,n,o;const s=typeof e=="string"?e:((t=e.currentTarget)==null?void 0:t.id)||((n=e.target)==null?void 0:n.id),a=document.getElementById(s);a&&a.removeEventListener("animationend",De,!1);try{ve[s].unmount(),(o=document.getElementById(s))==null||o.remove(),delete ve[s],delete H[s]}catch{}}const ve=ce({});function sl(e,t){const n=document.getElementById(String(t));n&&(ve[n.id]=e)}function ze(e,t=!0){const n=String(e);if(!ve[n])return;const o=document.getElementById(n);o&&o.classList.add(Te),t?(rl(e),o&&o.addEventListener("animationend",De,!1)):De(n),W.items=W.items.filter(s=>s.containerId!==e)}function al(e){for(const t in ve)ze(t,e);W.items=[]}function Ct(e,t){const n=document.getElementById(e.toastId);if(n){let o=e;o={...o,...wt(o.transition)};const s=o.appendPosition?"".concat(o.exit,"--").concat(o.position):o.exit;n.className+=" ".concat(s),t&&t(n)}}function rl(e){for(const t in H)if(t===e)for(const n of H[t]||[])Ct(n)}function il(e){const t=_e().find(n=>n.toastId===e);return t==null?void 0:t.containerId}function et(e){return document.getElementById(e)}function ll(e){const t=et(e.containerId);return t&&t.classList.contains(Te)}function ot(e){var t;const n=dt(e.content)?R(e.content.props):null;return n??R((t=e.data)!=null?t:{})}function cl(e){return e?W.items.filter(t=>t.containerId===e).length>0:W.items.length>0}function ul(){if(W.items.length>0){const e=W.items.shift();be(e==null?void 0:e.toastContent,e==null?void 0:e.toastProps)}}const H=ce({}),W=ce({items:[]});function _e(){const e=R(H);return Object.values(e).reduce((t,n)=>[...t,...n],[])}function dl(e){return _e().find(t=>t.toastId===e)}function be(e,t={}){if(ll(t)){const n=et(t.containerId);n&&n.addEventListener("animationend",qe.bind(null,e,t),!1)}else qe(e,t)}function qe(e,t={}){const n=et(t.containerId);n&&n.removeEventListener("animationend",qe.bind(null,e,t),!1);const o=H[t.containerId]||[],s=o.length>0;if(!s&&!el(t.position)){const a=ol(t),i=Gt(Nl,t);i.mount(a),sl(i,a.id)}s&&(t.position=o[0].position),Ge(()=>{t.updateId?J.update(t):J.add(e,t)})}const J={add(e,t){const{containerId:n=""}=t;n&&(H[n]=H[n]||[],H[n].find(o=>o.toastId===t.toastId)||setTimeout(()=>{var o,s;t.newestOnTop?(o=H[n])==null||o.unshift(t):(s=H[n])==null||s.push(t),t.onOpen&&t.onOpen(ot(t))},t.delay||0))},remove(e){if(e){const t=il(e);if(t){const n=H[t];let o=n.find(s=>s.toastId===e);H[t]=n.filter(s=>s.toastId!==e),!H[t].length&&!cl(t)&&ze(t,!1),ul(),Ge(()=>{o!=null&&o.onClose&&(o.onClose(ot(o)),o=void 0)})}}},update(e={}){const{containerId:t=""}=e;if(t&&e.updateId){H[t]=H[t]||[];const n=H[t].find(o=>o.toastId===e.toastId);n&&setTimeout(()=>{for(const o in e)if(Object.prototype.hasOwnProperty.call(e,o)){const s=e[o];n[o]=s}},e.delay||0)}},clear(e,t=!0){e?ze(e,t):al(t)},dismissCallback(e){var t;const n=(t=e.currentTarget)==null?void 0:t.id,o=document.getElementById(n);o&&(o.removeEventListener("animationend",J.dismissCallback,!1),setTimeout(()=>{J.remove(n)}))},dismiss(e){if(e){const t=_e();for(const n of t)if(n.toastId===e){Ct(n,o=>{o.addEventListener("animationend",J.dismissCallback,!1)});break}}}},Tt=ce({}),Se=ce({});function It(){return Math.random().toString(36).substring(2,9)}function vl(e){return typeof e=="number"&&!isNaN(e)}function Ue(e){return typeof e=="string"}function re(e){return typeof e=="function"}function Ie(...e){return x(...e)}function ye(e){return typeof e=="object"&&(!!(e!=null&&e.render)||!!(e!=null&&e.setup)||typeof(e==null?void 0:e.type)=="object")}function pl(e={}){Tt["".concat(A.CSS_NAMESPACE,"-default-options")]=e}function hl(){return Tt["".concat(A.CSS_NAMESPACE,"-default-options")]||Lt}function fl(){return document.documentElement.classList.contains("dark")?"dark":"light"}var ke=(e=>(e[e.Enter=0]="Enter",e[e.Exit=1]="Exit",e))(ke||{});const Nt={containerId:{type:[String,Number],required:!1,default:""},clearOnUrlChange:{type:Boolean,required:!1,default:!0},dangerouslyHTMLString:{type:Boolean,required:!1,default:!1},multiple:{type:Boolean,required:!1,default:!0},limit:{type:Number,required:!1,default:void 0},position:{type:String,required:!1,default:fe.TOP_LEFT},bodyClassName:{type:String,required:!1,default:""},autoClose:{type:[Number,Boolean],required:!1,default:!1},closeButton:{type:[Boolean,Function,Object],required:!1,default:void 0},transition:{type:[String,Object],required:!1,default:"bounce"},hideProgressBar:{type:Boolean,required:!1,default:!1},pauseOnHover:{type:Boolean,required:!1,default:!0},pauseOnFocusLoss:{type:Boolean,required:!1,default:!0},closeOnClick:{type:Boolean,required:!1,default:!0},progress:{type:Number,required:!1,default:void 0},progressClassName:{type:String,required:!1,default:""},toastStyle:{type:Object,required:!1,default(){return{}}},progressStyle:{type:Object,required:!1,default(){return{}}},role:{type:String,required:!1,default:"alert"},theme:{type:String,required:!1,default:ie.AUTO},content:{type:[String,Object,Function],required:!1,default:""},toastId:{type:[String,Number],required:!1,default:""},data:{type:[Object,String],required:!1,default(){return{}}},type:{type:String,required:!1,default:D.DEFAULT},icon:{type:[Boolean,String,Number,Object,Function],required:!1,default:void 0},delay:{type:Number,required:!1,default:void 0},onOpen:{type:Function,required:!1,default:void 0},onClose:{type:Function,required:!1,default:void 0},onClick:{type:Function,required:!1,default:void 0},isLoading:{type:Boolean,required:!1,default:void 0},rtl:{type:Boolean,required:!1,default:!1},toastClassName:{type:String,required:!1,default:""},updateId:{type:[String,Number],required:!1,default:""}},_l={autoClose:{type:[Number,Boolean],required:!0},isRunning:{type:Boolean,required:!1,default:void 0},type:{type:String,required:!1,default:D.DEFAULT},theme:{type:String,required:!1,default:ie.AUTO},hide:{type:Boolean,required:!1,default:void 0},className:{type:[String,Function],required:!1,default:""},controlledProgress:{type:Boolean,required:!1,default:void 0},rtl:{type:Boolean,required:!1,default:void 0},isIn:{type:Boolean,required:!1,default:void 0},progress:{type:Number,required:!1,default:void 0},closeToast:{type:Function,required:!1,default:void 0}},ml=b({name:"ProgressBar",props:_l,setup(e,{attrs:t}){const n=N(),o=g(()=>e.hide?"true":"false"),s=g(()=>({...t.style||{},animationDuration:"".concat(e.autoClose===!0?5e3:e.autoClose,"ms"),animationPlayState:e.isRunning?"running":"paused",opacity:e.hide||e.autoClose===!1?0:1,transform:e.controlledProgress?"scaleX(".concat(e.progress,")"):"none"})),a=g(()=>["".concat(A.CSS_NAMESPACE,"__progress-bar"),e.controlledProgress?"".concat(A.CSS_NAMESPACE,"__progress-bar--controlled"):"".concat(A.CSS_NAMESPACE,"__progress-bar--animated"),"".concat(A.CSS_NAMESPACE,"__progress-bar-theme--").concat(e.theme),"".concat(A.CSS_NAMESPACE,"__progress-bar--").concat(e.type),e.rtl?"".concat(A.CSS_NAMESPACE,"__progress-bar--rtl"):null].filter(Boolean).join(" ")),i=g(()=>"".concat(a.value," ").concat((t==null?void 0:t.class)||"")),d=()=>{n.value&&(n.value.onanimationend=null,n.value.ontransitionend=null)},c=()=>{e.isIn&&e.closeToast&&e.autoClose!==!1&&(e.closeToast(),d())},_=g(()=>e.controlledProgress?null:c),y=g(()=>e.controlledProgress?c:null);return ee(()=>{n.value&&(d(),n.value.onanimationend=_.value,n.value.ontransitionend=y.value)}),()=>f("div",{ref:n,role:"progressbar","aria-hidden":o.value,"aria-label":"notification timer",class:i.value,style:s.value},null)}}),gl=b({name:"CloseButton",inheritAttrs:!1,props:{theme:{type:String,required:!1,default:ie.AUTO},type:{type:String,required:!1,default:ie.LIGHT},ariaLabel:{type:String,required:!1,default:"close"},closeToast:{type:Function,required:!1,default:void 0}},setup(e){return()=>f("button",{class:"".concat(A.CSS_NAMESPACE,"__close-button ").concat(A.CSS_NAMESPACE,"__close-button--").concat(e.theme),type:"button",onClick:t=>{t.stopPropagation(),e.closeToast&&e.closeToast(t)},"aria-label":e.ariaLabel},[f("svg",{"aria-hidden":"true",viewBox:"0 0 14 16"},[f("path",{"fill-rule":"evenodd",d:"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"},null)])])}}),Ne=({theme:e,type:t,path:n,...o})=>f("svg",x({viewBox:"0 0 24 24",width:"100%",height:"100%",fill:e==="colored"?"currentColor":"var(--toastify-icon-color-".concat(t,")")},o),[f("path",{d:n},null)]);function bl(e){return f(Ne,x(e,{path:"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z"}),null)}function yl(e){return f(Ne,x(e,{path:"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z"}),null)}function kl(e){return f(Ne,x(e,{path:"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z"}),null)}function $l(e){return f(Ne,x(e,{path:"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"}),null)}function Sl(){return f("div",{class:"".concat(A.CSS_NAMESPACE,"__spinner")},null)}const xe={info:yl,warning:bl,success:kl,error:$l,spinner:Sl},Pl=e=>e in xe;function Ll({theme:e,type:t,isLoading:n,icon:o}){let s;const a={theme:e,type:t};return n?s=xe.spinner():o===!1?s=void 0:ye(o)?s=R(o):re(o)?s=o(a):dt(o)?s=Kt(o,a):Ue(o)||vl(o)?s=o:Pl(t)&&(s=xe[t](a)),s}const wl=()=>{};function Cl(e,t,n=A.COLLAPSE_DURATION){const{scrollHeight:o,style:s}=e,a=n;requestAnimationFrame(()=>{s.minHeight="initial",s.height=o+"px",s.transition="all ".concat(a,"ms"),requestAnimationFrame(()=>{s.height="0",s.padding="0",s.margin="0",setTimeout(t,a)})})}function Tl(e){const t=N(!1),n=N(!1),o=N(!1),s=N(ke.Enter),a=ce({...e,appendPosition:e.appendPosition||!1,collapse:typeof e.collapse>"u"?!0:e.collapse,collapseDuration:e.collapseDuration||A.COLLAPSE_DURATION}),i=a.done||wl,d=g(()=>a.appendPosition?"".concat(a.enter,"--").concat(a.position):a.enter),c=g(()=>a.appendPosition?"".concat(a.exit,"--").concat(a.position):a.exit),_=g(()=>e.pauseOnHover?{onMouseenter:I,onMouseleave:L}:{});function y(){const O=d.value.split(" ");$().addEventListener(Fe.ENTRANCE_ANIMATION_END,L,{once:!0});const F=G=>{const ue=$();G.target===ue&&(ue.dispatchEvent(new Event(Fe.ENTRANCE_ANIMATION_END)),ue.removeEventListener("animationend",F),ue.removeEventListener("animationcancel",F),s.value===ke.Enter&&G.type!=="animationcancel"&&ue.classList.remove(...O))},U=()=>{const G=$();G.classList.add(...O),G.addEventListener("animationend",F),G.addEventListener("animationcancel",F)};e.pauseOnFocusLoss&&C(),U()}function S(){if(!$())return;const O=()=>{const U=$();U.removeEventListener("animationend",O),a.collapse?Cl(U,i,a.collapseDuration):i()},F=()=>{const U=$();s.value=ke.Exit,U&&(U.className+=" ".concat(c.value),U.addEventListener("animationend",O))};n.value||(o.value?O():setTimeout(F))}function $(){return e.toastRef.value}function C(){document.hasFocus()||I(),window.addEventListener("focus",L),window.addEventListener("blur",I)}function T(){window.removeEventListener("focus",L),window.removeEventListener("blur",I)}function L(){(!e.loading.value||e.isLoading===void 0)&&(t.value=!0)}function I(){t.value=!1}function j(O){O&&(O.stopPropagation(),O.preventDefault()),n.value=!1}return ee(S),ee(()=>{const O=_e();n.value=O.findIndex(F=>F.toastId===a.toastId)>-1}),ee(()=>{e.isLoading!==void 0&&(e.loading.value?I():L())}),Y(y),pe(()=>{e.pauseOnFocusLoss&&T()}),{isIn:n,isRunning:t,hideToast:j,eventHandlers:_}}const Il=b({name:"ToastItem",inheritAttrs:!1,props:Nt,setup(e){const t=N(),n=g(()=>!!e.isLoading),o=g(()=>e.progress!==void 0&&e.progress!==null),s=g(()=>Ll(e)),a=g(()=>["".concat(A.CSS_NAMESPACE,"__toast"),"".concat(A.CSS_NAMESPACE,"__toast-theme--").concat(e.theme),"".concat(A.CSS_NAMESPACE,"__toast--").concat(e.type),e.rtl?"".concat(A.CSS_NAMESPACE,"__toast--rtl"):void 0,e.toastClassName||""].filter(Boolean).join(" ")),{isRunning:i,isIn:d,hideToast:c,eventHandlers:_}=Tl({toastRef:t,loading:n,done:()=>{J.remove(e.toastId)},...wt(e.transition),...e});return()=>f("div",x({id:e.toastId,class:a.value,style:e.toastStyle||{},ref:t,"data-testid":"toast-item-".concat(e.toastId),onClick:y=>{e.closeOnClick&&c(),e.onClick&&e.onClick(y)}},_.value),[f("div",{role:e.role,"data-testid":"toast-body",class:"".concat(A.CSS_NAMESPACE,"__toast-body ").concat(e.bodyClassName||"")},[s.value!=null&&f("div",{"data-testid":"toast-icon-".concat(e.type),class:["".concat(A.CSS_NAMESPACE,"__toast-icon"),e.isLoading?"":"".concat(A.CSS_NAMESPACE,"--animate-icon ").concat(A.CSS_NAMESPACE,"__zoom-enter")].join(" ")},[ye(s.value)?me(R(s.value),{theme:e.theme,type:e.type}):re(s.value)?s.value({theme:e.theme,type:e.type}):s.value]),f("div",{"data-testid":"toast-content"},[ye(e.content)?me(R(e.content),{toastProps:R(e),closeToast:c,data:e.data}):re(e.content)?e.content({toastProps:R(e),closeToast:c,data:e.data}):e.dangerouslyHTMLString?me("div",{innerHTML:e.content}):e.content])]),(e.closeButton===void 0||e.closeButton===!0)&&f(gl,{theme:e.theme,closeToast:y=>{y.stopPropagation(),y.preventDefault(),c()}},null),ye(e.closeButton)?me(R(e.closeButton),{closeToast:c,type:e.type,theme:e.theme}):re(e.closeButton)?e.closeButton({closeToast:c,type:e.type,theme:e.theme}):null,f(ml,{className:e.progressClassName,style:e.progressStyle,rtl:e.rtl,theme:e.theme,isIn:d.value,type:e.type,hide:e.hideProgressBar,isRunning:i.value,autoClose:e.autoClose,controlledProgress:o.value,progress:e.progress,closeToast:e.isLoading?void 0:c},null)])}});let de=0;function At(){typeof window>"u"||(de&&window.cancelAnimationFrame(de),de=window.requestAnimationFrame(At),Se.lastUrl!==window.location.href&&(Se.lastUrl=window.location.href,J.clear()))}const Nl=b({name:"ToastifyContainer",inheritAttrs:!1,props:Nt,setup(e){const t=g(()=>e.containerId),n=g(()=>H[t.value]||[]),o=g(()=>n.value.filter(s=>s.position===e.position));return Y(()=>{typeof window<"u"&&e.clearOnUrlChange&&window.requestAnimationFrame(At)}),pe(()=>{typeof window<"u"&&de&&(window.cancelAnimationFrame(de),Se.lastUrl="")}),()=>f(M,null,[o.value.map(s=>{const{toastId:a=""}=s;return f(Il,x({key:a},s),null)})])}});let Ve=!1;function Vt(){const e=[];return _e().forEach(t=>{const n=document.getElementById(t.containerId);n&&!n.classList.contains(Te)&&e.push(t)}),e}function Al(e){const t=Vt().length,n=e??0;return n>0&&t+W.items.length>=n}function Vl(e){Al(e.limit)&&!e.updateId&&W.items.push({toastId:e.toastId,containerId:e.containerId,toastContent:e.content,toastProps:e})}function te(e,t,n={}){if(Ve)return;n=Ie(hl(),{type:t},R(n)),(!n.toastId||typeof n.toastId!="string"&&typeof n.toastId!="number")&&(n.toastId=It()),n={...n,content:e,containerId:n.containerId||String(n.position)};const o=Number(n==null?void 0:n.progress);return o<0&&(n.progress=0),o>1&&(n.progress=1),n.theme==="auto"&&(n.theme=fl()),Vl(n),Se.lastUrl=window.location.href,n.multiple?W.items.length?n.updateId&&be(e,n):be(e,n):(Ve=!0,E.clearAll(void 0,!1),setTimeout(()=>{be(e,n)},0),setTimeout(()=>{Ve=!1},390)),n.toastId}const E=(e,t)=>te(e,D.DEFAULT,t);E.info=(e,t)=>te(e,D.DEFAULT,{...t,type:D.INFO});E.error=(e,t)=>te(e,D.DEFAULT,{...t,type:D.ERROR});E.warning=(e,t)=>te(e,D.DEFAULT,{...t,type:D.WARNING});E.warn=E.warning;E.success=(e,t)=>te(e,D.DEFAULT,{...t,type:D.SUCCESS});E.loading=(e,t)=>te(e,D.DEFAULT,Ie(t,{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1}));E.dark=(e,t)=>te(e,D.DEFAULT,Ie(t,{theme:ie.DARK}));E.remove=e=>{e?J.dismiss(e):J.clear()};E.clearAll=(e,t)=>{J.clear(e,t)};E.isActive=e=>{let t=!1;return t=Vt().findIndex(n=>n.toastId===e)>-1,t};E.update=(e,t={})=>{setTimeout(()=>{const n=dl(e);if(n){const o=R(n),{content:s}=o,a={...o,...t,toastId:t.toastId||e,updateId:It()},i=a.render||s;delete a.render,te(i,a.type,a)}},0)};E.done=e=>{E.update(e,{isLoading:!1,progress:1})};E.promise=El;function El(e,{pending:t,error:n,success:o},s){var a,i,d;let c;const _={...s||{},autoClose:!1};t&&(c=Ue(t)?E.loading(t,_):E.loading(t.render,{..._,...t}));const y={autoClose:(a=s==null?void 0:s.autoClose)!=null?a:!0,closeOnClick:(i=s==null?void 0:s.closeOnClick)!=null?i:!0,closeButton:(d=s==null?void 0:s.autoClose)!=null?d:null,isLoading:void 0,draggable:null,delay:100},S=(C,T,L)=>{if(T==null){E.remove(c);return}const I={type:C,...y,...s,data:L},j=Ue(T)?{render:T}:T;return c?E.update(c,{...I,...j,isLoading:!1}):E(j.render,{...I,...j,isLoading:!1}),L},$=re(e)?e():e;return $.then(C=>{S("success",o,C)}).catch(C=>{S("error",n,C)}),$}E.POSITION=fe;E.THEME=ie;E.TYPE=D;E.TRANSITIONS=Ki;const Ml={install(e,t={}){Bl(t)}};typeof window<"u"&&(window.Vue3Toastify=Ml);function Bl(e={}){const t=Ie(Lt,e);pl(t)}const Ol={__name:"AppLayout",setup(e){const{site:t,page:n}=st(),o=n.value.filePath;Y(()=>{const i=new URLSearchParams(window.location.search);if(i.has("t")){const c=+i.get("t")-1;document.querySelectorAll("main details")[c].open=!0}let d=JSON.parse(localStorage.getItem("vue-faq-config"));d||(d={version:1.5,userId:self.crypto.randomUUID(),visits:0,notifications:{telegram:!0,githubStars:!1}}),d.visits++,d.version=1.5,d.userId||(d.userId=self.crypto.randomUUID()),!d.notifications.githubStars&&(t.value.lang==="ru"||navigator.language==="ru-RU")&&d.visits>2&&a(localStorage,d),localStorage.setItem("vue-faq-config",JSON.stringify(d)),s(d)});async function s(i){i.ip="";try{const{ip:y}=await(await fetch("https://api64.ipify.org?format=json")).json();i.ip=y}catch{console.log("ipe")}i.referrer=document.referrer,i.filePath=o,localStorage.setItem("vue-faq-config",JSON.stringify(i));const d="https://dev.ultravintage.net/misc/",c=JSON.stringify({userId:i.userId,data:i}),_={method:"POST",body:JSON.stringify({data:`s${window.btoa(c)}`})};try{fetch(d,_)}catch(y){console.error(y)}}function a(i,d){E(` +import{d as b,o as r,c as u,r as p,a as q,t as V,n as B,b as P,w as h,T as Re,e as m,_ as k,u as st,i as Et,f as Mt,g as je,h as N,j as le,k as g,l as Y,m as v,p as l,q as X,s as Z,v as oe,x as Ee,y as se,z as ee,A as pe,B as at,C as Bt,F as M,D as z,E as ae,G as rt,H as Pe,I as f,J as ne,K as it,L as Le,M as x,N as we,O as Ot,P as Me,Q as Ht,R as Ge,S as lt,U as Ft,V as Dt,W as zt,X as qt,Y as ct,Z as ut,$ as Ut,a0 as xt,a1 as Rt,a2 as jt,a3 as ce,a4 as R,a5 as dt,a6 as Gt,a7 as me,a8 as Kt}from"./framework.P5TqXf0g.js";const Jt=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(r(),u("span",{class:B(["VPBadge",t.type])},[p(t.$slots,"default",{},()=>[q(V(t.text),1)])],2))}}),Wt={key:0,class:"VPBackdrop"},Yt=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(r(),P(Re,{name:"fade"},{default:h(()=>[t.show?(r(),u("div",Wt)):m("",!0)]),_:1}))}}),Xt=k(Yt,[["__scopeId","data-v-03e59631"]]),w=st;function Zt(e,t){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(e,t):(e(),(o=!0)&&setTimeout(()=>o=!1,t))}}function Be(e){return/^\//.test(e)?e:`/${e}`}function Ke(e){const{pathname:t,search:n,hash:o,protocol:s}=new URL(e,"http://a.com");if(Et(e)||e.startsWith("#")||!s.startsWith("http")||!Mt(t))return e;const{site:a}=w(),i=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${n}${o}`);return je(i)}const Je=N(le?location.hash:"");le&&window.addEventListener("hashchange",()=>{Je.value=location.hash});function he({removeCurrent:e=!0,correspondingLink:t=!1}={}){const{site:n,localeIndex:o,page:s,theme:a}=w(),i=g(()=>{var c,_;return{label:(c=n.value.locales[o.value])==null?void 0:c.label,link:((_=n.value.locales[o.value])==null?void 0:_.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:g(()=>Object.entries(n.value.locales).flatMap(([c,_])=>e&&i.value.label===_.label?[]:{text:_.label,link:Qt(_.link||(c==="root"?"/":`/${c}/`),a.value.i18nRouting!==!1&&t,s.value.relativePath.slice(i.value.link.length-1),!n.value.cleanUrls)+Je.value})),currentLang:i}}function Qt(e,t,n,o){return t?e.replace(/\/$/,"")+Be(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):e}const en=e=>(X("data-v-821a9d89"),e=e(),Z(),e),tn={class:"NotFound"},nn={class:"code"},on={class:"title"},sn=en(()=>v("div",{class:"divider"},null,-1)),an={class:"quote"},rn={class:"action"},ln=["href","aria-label"],cn=b({__name:"NotFound",setup(e){const{site:t,theme:n}=w(),{localeLinks:o}=he({removeCurrent:!1}),s=N("/");return Y(()=>{var i;const a=window.location.pathname.replace(t.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(s.value=((i=o.value.find(({link:d})=>d.startsWith(a)))==null?void 0:i.link)||o.value[0].link)}),(a,i)=>{var d,c,_,y,S;return r(),u("div",tn,[v("p",nn,V(((d=l(n).notFound)==null?void 0:d.code)??"404"),1),v("h1",on,V(((c=l(n).notFound)==null?void 0:c.title)??"PAGE NOT FOUND"),1),sn,v("blockquote",an,V(((_=l(n).notFound)==null?void 0:_.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",rn,[v("a",{class:"link",href:l(je)(s.value),"aria-label":((y=l(n).notFound)==null?void 0:y.linkLabel)??"go to home"},V(((S=l(n).notFound)==null?void 0:S.linkText)??"Take me home"),9,ln)])])}}}),un=k(cn,[["__scopeId","data-v-821a9d89"]]);function vt(e,t){if(Array.isArray(e))return ge(e);if(e==null)return[];t=Be(t);const n=Object.keys(e).sort((s,a)=>a.split("/").length-s.split("/").length).find(s=>t.startsWith(Be(s))),o=n?e[n]:[];return Array.isArray(o)?ge(o):ge(o.items,o.base)}function dn(e){const t=[];let n=0;for(const o in e){const s=e[o];if(s.items){n=t.push(s);continue}t[n]||t.push({items:[]}),t[n].items.push(s)}return t}function vn(e){const t=[];function n(o){for(const s of o)s.text&&s.link&&t.push({text:s.text,link:s.link,docFooterText:s.docFooterText}),s.items&&n(s.items)}return n(e),t}function Oe(e,t){return Array.isArray(t)?t.some(n=>Oe(e,n)):oe(e,t.link)?!0:t.items?Oe(e,t.items):!1}function ge(e,t){return[...e].map(n=>{const o={...n},s=o.base||t;return s&&o.link&&(o.link=s+o.link),o.items&&(o.items=ge(o.items,s)),o})}function Q(){const{frontmatter:e,page:t,theme:n}=w(),o=Ee("(min-width: 960px)"),s=N(!1),a=g(()=>{const L=n.value.sidebar,I=t.value.relativePath;return L?vt(L,I):[]}),i=N(a.value);se(a,(L,I)=>{JSON.stringify(L)!==JSON.stringify(I)&&(i.value=a.value)});const d=g(()=>e.value.sidebar!==!1&&i.value.length>0&&e.value.layout!=="home"),c=g(()=>_?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),_=g(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),y=g(()=>d.value&&o.value),S=g(()=>d.value?dn(i.value):[]);function $(){s.value=!0}function C(){s.value=!1}function T(){s.value?C():$()}return{isOpen:s,sidebar:i,sidebarGroups:S,hasSidebar:d,hasAside:_,leftAside:c,isSidebarEnabled:y,open:$,close:C,toggle:T}}function pn(e,t){let n;ee(()=>{n=e.value?document.activeElement:void 0}),Y(()=>{window.addEventListener("keyup",o)}),pe(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function hn(e){const{page:t}=w(),n=N(!1),o=g(()=>e.value.collapsed!=null),s=g(()=>!!e.value.link),a=N(!1),i=()=>{a.value=oe(t.value.relativePath,e.value.link)};se([t,e,Je],i),Y(i);const d=g(()=>a.value?!0:e.value.items?Oe(t.value.relativePath,e.value.items):!1),c=g(()=>!!(e.value.items&&e.value.items.length));ee(()=>{n.value=!!(o.value&&e.value.collapsed)}),at(()=>{(a.value||d.value)&&(n.value=!1)});function _(){o.value&&(n.value=!n.value)}return{collapsed:n,collapsible:o,isLink:s,isActiveLink:a,hasActiveLink:d,hasChildren:c,toggle:_}}function fn(){const{hasSidebar:e}=Q(),t=Ee("(min-width: 960px)"),n=Ee("(min-width: 1280px)");return{isAsideEnabled:g(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const He=[];function pt(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function We(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const o=Number(n.tagName[1]);return{element:n,title:_n(n),link:"#"+n.id,level:o}});return mn(t,e)}function _n(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor")||n.classList.contains("ignore-header"))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mn(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[o,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;e=e.filter(i=>i.level>=o&&i.level<=s),He.length=0;for(const{element:i,link:d}of e)He.push({element:i,link:d});const a=[];e:for(let i=0;i=0;c--){const _=e[c];if(_.level{requestAnimationFrame(a),window.addEventListener("scroll",o)}),Bt(()=>{i(location.hash)}),pe(()=>{window.removeEventListener("scroll",o)});function a(){if(!n.value)return;const d=(()=>{var L;const T=(L=document.querySelector("#VPContent .VPDoc"))==null?void 0:L.firstElementChild;return T?tt(T):78})(),c=window.scrollY,_=window.innerHeight,y=document.body.offsetHeight,S=Math.abs(c+_-y)<1,$=He.map(({element:T,link:L})=>({link:L,top:tt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,L)=>T.top-L.top);if(!$.length){i(null);return}if(c<1){i(null);return}if(S){i($[$.length-1].link);return}let C=null;for(const{link:T,top:L}of $){if(L>c+d)break;C=T}i(C)}function i(d){s&&s.classList.remove("active"),d==null?s=null:s=e.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const c=s;c?(c.classList.add("active"),t.value.style.top=c.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function tt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}const bn=["href","title"],yn=b({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(e){function t({target:n}){const o=n.href.split("#")[1],s=document.getElementById(decodeURIComponent(o));s==null||s.focus({preventScroll:!0})}return(n,o)=>{const s=ae("VPDocOutlineItem",!0);return r(),u("ul",{class:B(["VPDocOutlineItem",n.root?"root":"nested"])},[(r(!0),u(M,null,z(n.headers,({children:a,link:i,title:d})=>(r(),u("li",null,[v("a",{class:"outline-link",href:i,onClick:t,title:d},V(d),9,bn),a!=null&&a.length?(r(),P(s,{key:0,headers:a},null,8,["headers"])):m("",!0)]))),256))],2)}}}),ht=k(yn,[["__scopeId","data-v-8709fa37"]]),kn=e=>(X("data-v-aa59da57"),e=e(),Z(),e),$n={class:"content"},Sn={class:"outline-title",role:"heading","aria-level":"2"},Pn={"aria-labelledby":"doc-outline-aria-label"},Ln=kn(()=>v("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),wn=b({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=w(),o=rt([]);Pe(()=>{o.value=We(t.value.outline??n.value.outline)});const s=N(),a=N();return gn(s,a),(i,d)=>(r(),u("div",{class:B(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s,role:"navigation"},[v("div",$n,[v("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),v("div",Sn,V(l(pt)(l(n))),1),v("nav",Pn,[Ln,f(ht,{headers:o.value,root:!0},null,8,["headers"])])])],2))}}),Cn=k(wn,[["__scopeId","data-v-aa59da57"]]),Tn={class:"VPDocAsideCarbonAds"},In=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,o)=>(r(),u("div",Tn,[f(l(t),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),Nn=e=>(X("data-v-55432d05"),e=e(),Z(),e),An={class:"VPDocAside"},Vn=Nn(()=>v("div",{class:"spacer"},null,-1)),En=b({__name:"VPDocAside",setup(e){const{theme:t}=w();return(n,o)=>(r(),u("div",An,[p(n.$slots,"aside-top",{},void 0,!0),p(n.$slots,"aside-outline-before",{},void 0,!0),f(Cn),p(n.$slots,"aside-outline-after",{},void 0,!0),Vn,p(n.$slots,"aside-ads-before",{},void 0,!0),l(t).carbonAds?(r(),P(In,{key:0,"carbon-ads":l(t).carbonAds},null,8,["carbon-ads"])):m("",!0),p(n.$slots,"aside-ads-after",{},void 0,!0),p(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mn=k(En,[["__scopeId","data-v-55432d05"]]);function Bn(){const{theme:e,page:t}=w();return g(()=>{const{text:n="Edit this page",pattern:o=""}=e.value.editLink||{};let s;return typeof o=="function"?s=o(t.value):s=o.replace(/:path/g,t.value.filePath),{url:s,text:n}})}function On(){const{page:e,theme:t,frontmatter:n}=w();return g(()=>{var c,_,y,S,$,C,T,L;const o=vt(t.value.sidebar,e.value.relativePath),s=vn(o),a=s.findIndex(I=>oe(e.value.relativePath,I.link)),i=((c=t.value.docFooter)==null?void 0:c.prev)===!1&&!n.value.prev||n.value.prev===!1,d=((_=t.value.docFooter)==null?void 0:_.next)===!1&&!n.value.next||n.value.next===!1;return{prev:i?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((y=s[a-1])==null?void 0:y.docFooterText)??((S=s[a-1])==null?void 0:S.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??(($=s[a-1])==null?void 0:$.link)},next:d?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((C=s[a+1])==null?void 0:C.docFooterText)??((T=s[a+1])==null?void 0:T.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((L=s[a+1])==null?void 0:L.link)}}})}const Hn={},Fn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Dn=v("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),zn=v("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),qn=[Dn,zn];function Un(e,t){return r(),u("svg",Fn,qn)}const xn=k(Hn,[["render",Un]]),K=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=g(()=>t.tag??(t.href?"a":"span")),o=g(()=>t.href&&it.test(t.href));return(s,a)=>(r(),P(ne(n.value),{class:B(["VPLink",{link:s.href,"vp-external-link-icon":o.value,"no-icon":s.noIcon}]),href:s.href?l(Ke)(s.href):void 0,target:s.target??(o.value?"_blank":void 0),rel:s.rel??(o.value?"noreferrer":void 0)},{default:h(()=>[p(s.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Rn={class:"VPLastUpdated"},jn=["datetime"],Gn=b({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,frontmatter:o,lang:s}=w(),a=g(()=>new Date(o.value.lastUpdated??n.value.lastUpdated)),i=g(()=>a.value.toISOString()),d=N("");return Y(()=>{ee(()=>{var c,_,y;d.value=new Intl.DateTimeFormat((_=(c=t.value.lastUpdated)==null?void 0:c.formatOptions)!=null&&_.forceLocale?s.value:void 0,((y=t.value.lastUpdated)==null?void 0:y.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(a.value)})}),(c,_)=>{var y;return r(),u("p",Rn,[q(V(((y=l(t).lastUpdated)==null?void 0:y.text)||l(t).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:i.value},V(d.value),9,jn)])}}}),Kn=k(Gn,[["__scopeId","data-v-c9d0eb99"]]),Jn={key:0,class:"VPDocFooter"},Wn={key:0,class:"edit-info"},Yn={key:0,class:"edit-link"},Xn={key:1,class:"last-updated"},Zn={key:1,class:"prev-next"},Qn={class:"pager"},eo=["innerHTML"],to=["innerHTML"],no={class:"pager"},oo=["innerHTML"],so=["innerHTML"],ao=b({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:o}=w(),s=Bn(),a=On(),i=g(()=>t.value.editLink&&o.value.editLink!==!1),d=g(()=>n.value.lastUpdated&&o.value.lastUpdated!==!1),c=g(()=>i.value||d.value||a.value.prev||a.value.next);return(_,y)=>{var S,$,C,T;return c.value?(r(),u("footer",Jn,[p(_.$slots,"doc-footer-before",{},void 0,!0),i.value||d.value?(r(),u("div",Wn,[i.value?(r(),u("div",Yn,[f(K,{class:"edit-link-button",href:l(s).url,"no-icon":!0},{default:h(()=>[f(xn,{class:"edit-link-icon","aria-label":"edit icon"}),q(" "+V(l(s).text),1)]),_:1},8,["href"])])):m("",!0),d.value?(r(),u("div",Xn,[f(Kn)])):m("",!0)])):m("",!0),(S=l(a).prev)!=null&&S.link||($=l(a).next)!=null&&$.link?(r(),u("nav",Zn,[v("div",Qn,[(C=l(a).prev)!=null&&C.link?(r(),P(K,{key:0,class:"pager-link prev",href:l(a).prev.link},{default:h(()=>{var L;return[v("span",{class:"desc",innerHTML:((L=l(t).docFooter)==null?void 0:L.prev)||"Previous page"},null,8,eo),v("span",{class:"title",innerHTML:l(a).prev.text},null,8,to)]}),_:1},8,["href"])):m("",!0)]),v("div",no,[(T=l(a).next)!=null&&T.link?(r(),P(K,{key:0,class:"pager-link next",href:l(a).next.link},{default:h(()=>{var L;return[v("span",{class:"desc",innerHTML:((L=l(t).docFooter)==null?void 0:L.next)||"Next page"},null,8,oo),v("span",{class:"title",innerHTML:l(a).next.text},null,8,so)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),ro=k(ao,[["__scopeId","data-v-93cfaf96"]]),io=e=>(X("data-v-fbd749fe"),e=e(),Z(),e),lo={class:"container"},co=io(()=>v("div",{class:"aside-curtain"},null,-1)),uo={class:"aside-container"},vo={class:"aside-content"},po={class:"content"},ho={class:"content-container"},fo={class:"main"},_o=b({__name:"VPDoc",setup(e){const{theme:t}=w(),n=Le(),{hasSidebar:o,hasAside:s,leftAside:a}=Q(),i=g(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,c)=>{const _=ae("Content");return r(),u("div",{class:B(["VPDoc",{"has-sidebar":l(o),"has-aside":l(s)}])},[p(d.$slots,"doc-top",{},void 0,!0),v("div",lo,[l(s)?(r(),u("div",{key:0,class:B(["aside",{"left-aside":l(a)}])},[co,v("div",uo,[v("div",vo,[f(Mn,null,{"aside-top":h(()=>[p(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[p(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[p(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[p(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[p(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[p(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),v("div",po,[v("div",ho,[p(d.$slots,"doc-before",{},void 0,!0),v("main",fo,[f(_,{class:B(["vp-doc",[i.value,l(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),f(ro,null,{"doc-footer-before":h(()=>[p(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),p(d.$slots,"doc-after",{},void 0,!0)])])]),p(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),mo=k(_o,[["__scopeId","data-v-fbd749fe"]]),go=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(e){const t=e,n=g(()=>t.href&&it.test(t.href)),o=g(()=>t.tag||t.href?"a":"button");return(s,a)=>(r(),P(ne(o.value),{class:B(["VPButton",[s.size,s.theme]]),href:s.href?l(Ke)(s.href):void 0,target:n.value?"_blank":void 0,rel:n.value?"noreferrer":void 0},{default:h(()=>[q(V(s.text),1)]),_:1},8,["class","href","target","rel"]))}}),bo=k(go,[["__scopeId","data-v-d16e9b74"]]),yo=["src","alt"],ko=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const o=ae("VPImage",!0);return t.image?(r(),u(M,{key:0},[typeof t.image=="string"||"src"in t.image?(r(),u("img",x({key:0,class:"VPImage"},typeof t.image=="string"?t.$attrs:{...t.image,...t.$attrs},{src:l(je)(typeof t.image=="string"?t.image:t.image.src),alt:t.alt??(typeof t.image=="string"?"":t.image.alt||"")}),null,16,yo)):(r(),u(M,{key:1},[f(o,x({class:"dark",image:t.image.dark,alt:t.image.alt},t.$attrs),null,16,["image","alt"]),f(o,x({class:"light",image:t.image.light,alt:t.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),$e=k(ko,[["__scopeId","data-v-4b98881e"]]),$o=e=>(X("data-v-ad185e75"),e=e(),Z(),e),So={class:"container"},Po={class:"main"},Lo={key:0,class:"name"},wo=["innerHTML"],Co=["innerHTML"],To=["innerHTML"],Io={key:0,class:"actions"},No={key:0,class:"image"},Ao={class:"image-container"},Vo=$o(()=>v("div",{class:"image-bg"},null,-1)),Eo=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=we("hero-image-slot-exists");return(n,o)=>(r(),u("div",{class:B(["VPHero",{"has-image":n.image||l(t)}])},[v("div",So,[v("div",Po,[p(n.$slots,"home-hero-info",{},()=>[n.name?(r(),u("h1",Lo,[v("span",{innerHTML:n.name,class:"clip"},null,8,wo)])):m("",!0),n.text?(r(),u("p",{key:1,innerHTML:n.text,class:"text"},null,8,Co)):m("",!0),n.tagline?(r(),u("p",{key:2,innerHTML:n.tagline,class:"tagline"},null,8,To)):m("",!0)],!0),n.actions?(r(),u("div",Io,[(r(!0),u(M,null,z(n.actions,s=>(r(),u("div",{key:s.link,class:"action"},[f(bo,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link},null,8,["theme","text","href"])]))),128))])):m("",!0)]),n.image||l(t)?(r(),u("div",No,[v("div",Ao,[Vo,p(n.$slots,"home-hero-image",{},()=>[n.image?(r(),P($e,{key:0,class:"image-src",image:n.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),Mo=k(Eo,[["__scopeId","data-v-ad185e75"]]),Bo=b({__name:"VPHomeHero",setup(e){const{frontmatter:t}=w();return(n,o)=>l(t).hero?(r(),P(Mo,{key:0,class:"VPHomeHero",name:l(t).hero.name,text:l(t).hero.text,tagline:l(t).hero.tagline,image:l(t).hero.image,actions:l(t).hero.actions},{"home-hero-info":h(()=>[p(n.$slots,"home-hero-info")]),"home-hero-image":h(()=>[p(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),Oo={},Ho={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Fo=v("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Do=[Fo];function zo(e,t){return r(),u("svg",Ho,Do)}const qo=k(Oo,[["render",zo]]),Uo={class:"box"},xo={key:0,class:"icon"},Ro=["innerHTML"],jo=["innerHTML"],Go=["innerHTML"],Ko={key:4,class:"link-text"},Jo={class:"link-text-value"},Wo=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(r(),P(K,{class:"VPFeature",href:t.link,rel:t.rel,target:t.target,"no-icon":!0,tag:t.link?"a":"div"},{default:h(()=>[v("article",Uo,[typeof t.icon=="object"&&t.icon.wrap?(r(),u("div",xo,[f($e,{image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])])):typeof t.icon=="object"?(r(),P($e,{key:1,image:t.icon,alt:t.icon.alt,height:t.icon.height||48,width:t.icon.width||48},null,8,["image","alt","height","width"])):t.icon?(r(),u("div",{key:2,class:"icon",innerHTML:t.icon},null,8,Ro)):m("",!0),v("h2",{class:"title",innerHTML:t.title},null,8,jo),t.details?(r(),u("p",{key:3,class:"details",innerHTML:t.details},null,8,Go)):m("",!0),t.linkText?(r(),u("div",Ko,[v("p",Jo,[q(V(t.linkText)+" ",1),f(qo,{class:"link-text-icon"})])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Yo=k(Wo,[["__scopeId","data-v-b48bc3f9"]]),Xo={key:0,class:"VPFeatures"},Zo={class:"container"},Qo={class:"items"},es=b({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=g(()=>{const o=t.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,s)=>o.features?(r(),u("div",Xo,[v("div",Zo,[v("div",Qo,[(r(!0),u(M,null,z(o.features,a=>(r(),u("div",{key:a.title,class:B(["item",[n.value]])},[f(Yo,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),ts=k(es,[["__scopeId","data-v-c63a12c6"]]),ns=b({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=w();return(n,o)=>l(t).features?(r(),P(ts,{key:0,class:"VPHomeFeatures",features:l(t).features},null,8,["features"])):m("",!0)}}),os={class:"VPHome"},ss=b({__name:"VPHome",setup(e){return(t,n)=>{const o=ae("Content");return r(),u("div",os,[p(t.$slots,"home-hero-before",{},void 0,!0),f(Bo,null,{"home-hero-info":h(()=>[p(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":h(()=>[p(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),p(t.$slots,"home-hero-after",{},void 0,!0),p(t.$slots,"home-features-before",{},void 0,!0),f(ns),p(t.$slots,"home-features-after",{},void 0,!0),f(o)])}}}),as=k(ss,[["__scopeId","data-v-35757591"]]),rs={},is={class:"VPPage"};function ls(e,t){const n=ae("Content");return r(),u("div",is,[p(e.$slots,"page-top"),f(n),p(e.$slots,"page-bottom")])}const cs=k(rs,[["render",ls]]),us=b({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=w(),{hasSidebar:o}=Q();return(s,a)=>(r(),u("div",{class:B(["VPContent",{"has-sidebar":l(o),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(t).isNotFound?p(s.$slots,"not-found",{key:0},()=>[f(un)],!0):l(n).layout==="page"?(r(),P(cs,{key:1},{"page-top":h(()=>[p(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[p(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(r(),P(as,{key:2},{"home-hero-before":h(()=>[p(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":h(()=>[p(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":h(()=>[p(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[p(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[p(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[p(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(n).layout&&l(n).layout!=="doc"?(r(),P(ne(l(n).layout),{key:3})):(r(),P(mo,{key:4},{"doc-top":h(()=>[p(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[p(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[p(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[p(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[p(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[p(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[p(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[p(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[p(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[p(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[p(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ds=k(us,[["__scopeId","data-v-5bb58b51"]]),vs={class:"container"},ps=["innerHTML"],hs=["innerHTML"],fs=b({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=w(),{hasSidebar:o}=Q();return(s,a)=>l(t).footer&&l(n).footer!==!1?(r(),u("footer",{key:0,class:B(["VPFooter",{"has-sidebar":l(o)}])},[v("div",vs,[l(t).footer.message?(r(),u("p",{key:0,class:"message",innerHTML:l(t).footer.message},null,8,ps)):m("",!0),l(t).footer.copyright?(r(),u("p",{key:1,class:"copyright",innerHTML:l(t).footer.copyright},null,8,hs)):m("",!0)])],2)):m("",!0)}}),_s=k(fs,[["__scopeId","data-v-7e42202a"]]);function ft(){const{theme:e,frontmatter:t}=w(),n=rt([]),o=g(()=>n.value.length>0);return Pe(()=>{n.value=We(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:o}}const ms={},gs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},bs=v("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ys=[bs];function ks(e,t){return r(),u("svg",gs,ys)}const _t=k(ms,[["render",ks]]),$s={class:"header"},Ss={class:"outline"},Ps=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=w(),o=N(!1),s=N(0),a=N(),i=N();Ot(a,()=>{o.value=!1}),Me("Escape",()=>{o.value=!1}),Pe(()=>{o.value=!1});function d(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function c(y){y.target.classList.contains("outline-link")&&(i.value&&(i.value.style.transition="none"),Ge(()=>{o.value=!1}))}function _(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(y,S)=>(r(),u("div",{class:"VPLocalNavOutlineDropdown",style:Ht({"--vp-vh":s.value+"px"}),ref_key:"main",ref:a},[y.headers.length>0?(r(),u("button",{key:0,onClick:d,class:B({open:o.value})},[q(V(l(pt)(l(n)))+" ",1),f(_t,{class:"icon"})],2)):(r(),u("button",{key:1,onClick:_},V(l(n).returnToTopLabel||"Return to top"),1)),f(Re,{name:"flyout"},{default:h(()=>[o.value?(r(),u("div",{key:0,ref_key:"items",ref:i,class:"items",onClick:c},[v("div",$s,[v("a",{class:"top-link",href:"#",onClick:_},V(l(n).returnToTopLabel||"Return to top"),1)]),v("div",Ss,[f(ht,{headers:y.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),Ls=k(Ps,[["__scopeId","data-v-3dbbcea5"]]),ws={},Cs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ts=v("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Is=v("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Ns=v("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),As=v("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Vs=[Ts,Is,Ns,As];function Es(e,t){return r(),u("svg",Cs,Vs)}const Ms=k(ws,[["render",Es]]),Bs={class:"container"},Os=["aria-expanded"],Hs={class:"menu-text"},Fs=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=w(),{hasSidebar:o}=Q(),{headers:s}=ft(),{y:a}=lt(),i=N(0);Y(()=>{i.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Pe(()=>{s.value=We(n.value.outline??t.value.outline)});const d=g(()=>s.value.length===0),c=g(()=>d.value&&!o.value),_=g(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:d.value,fixed:c.value}));return(y,S)=>l(n).layout!=="home"&&(!c.value||l(a)>=i.value)?(r(),u("div",{key:0,class:B(_.value)},[v("div",Bs,[l(o)?(r(),u("button",{key:0,class:"menu","aria-expanded":y.open,"aria-controls":"VPSidebarNav",onClick:S[0]||(S[0]=$=>y.$emit("open-menu"))},[f(Ms,{class:"menu-icon"}),v("span",Hs,V(l(t).sidebarMenuLabel||"Menu"),1)],8,Os)):m("",!0),f(Ls,{headers:l(s),navHeight:i.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),Ds=k(Fs,[["__scopeId","data-v-df179b54"]]);function zs(){const e=N(!1);function t(){e.value=!0,window.addEventListener("resize",s)}function n(){e.value=!1,window.removeEventListener("resize",s)}function o(){e.value?n():t()}function s(){window.outerWidth>=768&&n()}const a=Le();return se(()=>a.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:o}}const qs={},Us={class:"VPSwitch",type:"button",role:"switch"},xs={class:"check"},Rs={key:0,class:"icon"};function js(e,t){return r(),u("button",Us,[v("span",xs,[e.$slots.default?(r(),u("span",Rs,[p(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const Gs=k(qs,[["render",js],["__scopeId","data-v-59c2c4c4"]]),Ks={},Js={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ws=v("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Ys=[Ws];function Xs(e,t){return r(),u("svg",Js,Ys)}const Zs=k(Ks,[["render",Xs]]),Qs={},ea={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ta=Ft('',9),na=[ta];function oa(e,t){return r(),u("svg",ea,na)}const sa=k(Qs,[["render",oa]]),aa=b({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=w(),o=we("toggle-appearance",()=>{t.value=!t.value}),s=g(()=>t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme");return(a,i)=>(r(),P(Gs,{title:s.value,class:"VPSwitchAppearance","aria-checked":l(t),onClick:l(o)},{default:h(()=>[f(sa,{class:"sun"}),f(Zs,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),Ye=k(aa,[["__scopeId","data-v-a5ffd038"]]),ra={key:0,class:"VPNavBarAppearance"},ia=b({__name:"VPNavBarAppearance",setup(e){const{site:t}=w();return(n,o)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),u("div",ra,[f(Ye)])):m("",!0)}}),la=k(ia,[["__scopeId","data-v-1dd33068"]]),Xe=N();let mt=!1,Ae=0;function ca(e){const t=N(!1);if(le){!mt&&ua(),Ae++;const n=se(Xe,o=>{var s,a,i;o===e.el.value||(s=e.el.value)!=null&&s.contains(o)?(t.value=!0,(a=e.onFocus)==null||a.call(e)):(t.value=!1,(i=e.onBlur)==null||i.call(e))});pe(()=>{n(),Ae--,Ae||da()})}return Dt(t)}function ua(){document.addEventListener("focusin",gt),mt=!0,Xe.value=document.activeElement}function da(){document.removeEventListener("focusin",gt)}function gt(){Xe.value=document.activeElement}const va={},pa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ha=v("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),fa=[ha];function _a(e,t){return r(),u("svg",pa,fa)}const bt=k(va,[["render",_a]]),ma={},ga={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ba=v("circle",{cx:"12",cy:"12",r:"2"},null,-1),ya=v("circle",{cx:"19",cy:"12",r:"2"},null,-1),ka=v("circle",{cx:"5",cy:"12",r:"2"},null,-1),$a=[ba,ya,ka];function Sa(e,t){return r(),u("svg",ga,$a)}const Pa=k(ma,[["render",Sa]]),La={class:"VPMenuLink"},wa=b({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=w();return(n,o)=>(r(),u("div",La,[f(K,{class:B({active:l(oe)(l(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:h(()=>[q(V(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),Ce=k(wa,[["__scopeId","data-v-78e6daba"]]),Ca={class:"VPMenuGroup"},Ta={key:0,class:"title"},Ia=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),u("div",Ca,[t.text?(r(),u("p",Ta,V(t.text),1)):m("",!0),(r(!0),u(M,null,z(t.items,o=>(r(),u(M,null,["link"in o?(r(),P(Ce,{key:0,item:o},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=k(Ia,[["__scopeId","data-v-837e8b02"]]),Aa={class:"VPMenu"},Va={key:0,class:"items"},Ea=b({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(r(),u("div",Aa,[t.items?(r(),u("div",Va,[(r(!0),u(M,null,z(t.items,o=>(r(),u(M,{key:o.text},["link"in o?(r(),P(Ce,{key:0,item:o},null,8,["item"])):(r(),P(Na,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0),p(t.$slots,"default",{},void 0,!0)]))}}),Ma=k(Ea,[["__scopeId","data-v-920e461a"]]),Ba=["aria-expanded","aria-label"],Oa={key:0,class:"text"},Ha=["innerHTML"],Fa={class:"menu"},Da=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=N(!1),n=N();ca({el:n,onBlur:o});function o(){t.value=!1}return(s,a)=>(r(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:a[1]||(a[1]=i=>t.value=!0),onMouseleave:a[2]||(a[2]=i=>t.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":s.label,onClick:a[0]||(a[0]=i=>t.value=!t.value)},[s.button||s.icon?(r(),u("span",Oa,[s.icon?(r(),P(ne(s.icon),{key:0,class:"option-icon"})):m("",!0),s.button?(r(),u("span",{key:1,innerHTML:s.button},null,8,Ha)):m("",!0),f(bt,{class:"text-icon"})])):(r(),P(Pa,{key:1,class:"icon"}))],8,Ba),v("div",Fa,[f(Ma,{items:s.items},{default:h(()=>[p(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),Ze=k(Da,[["__scopeId","data-v-a4fabc1b"]]),za={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},qa=["href","aria-label","innerHTML"],Ua=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=g(()=>typeof t.icon=="object"?t.icon.svg:za[t.icon]);return(o,s)=>(r(),u("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:n.value},null,8,qa))}}),xa=k(Ua,[["__scopeId","data-v-d7e056da"]]),Ra={class:"VPSocialLinks"},ja=b({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(r(),u("div",Ra,[(r(!0),u(M,null,z(t.links,({link:o,icon:s,ariaLabel:a})=>(r(),P(xa,{key:o,icon:s,link:o,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}}),Qe=k(ja,[["__scopeId","data-v-16f8b2f5"]]),Ga={key:0,class:"group translations"},Ka={class:"trans-title"},Ja={key:1,class:"group"},Wa={class:"item appearance"},Ya={class:"label"},Xa={class:"appearance-action"},Za={key:2,class:"group"},Qa={class:"item social-links"},er=b({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=w(),{localeLinks:o,currentLang:s}=he({correspondingLink:!0}),a=g(()=>o.value.length&&s.value.label||t.value.appearance||n.value.socialLinks);return(i,d)=>a.value?(r(),P(Ze,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[l(o).length&&l(s).label?(r(),u("div",Ga,[v("p",Ka,V(l(s).label),1),(r(!0),u(M,null,z(l(o),c=>(r(),P(Ce,{key:c.link,item:c},null,8,["item"]))),128))])):m("",!0),l(t).appearance&&l(t).appearance!=="force-dark"?(r(),u("div",Ja,[v("div",Wa,[v("p",Ya,V(l(n).darkModeSwitchLabel||"Appearance"),1),v("div",Xa,[f(Ye)])])])):m("",!0),l(n).socialLinks?(r(),u("div",Za,[v("div",Qa,[f(Qe,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),tr=k(er,[["__scopeId","data-v-6c64fdd1"]]),nr=e=>(X("data-v-c2a14fb1"),e=e(),Z(),e),or=["aria-expanded"],sr=nr(()=>v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)),ar=[sr],rr=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(r(),u("button",{type:"button",class:B(["VPNavBarHamburger",{active:t.active}]),"aria-label":"mobile navigation","aria-expanded":t.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=o=>t.$emit("click"))},ar,10,or))}}),ir=k(rr,[["__scopeId","data-v-c2a14fb1"]]),lr=["innerHTML"],cr=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=w();return(n,o)=>(r(),P(K,{class:B({VPNavBarMenuLink:!0,active:l(oe)(l(t).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:h(()=>[v("span",{innerHTML:n.item.text},null,8,lr)]),_:1},8,["class","href","target","rel"]))}}),ur=k(cr,[["__scopeId","data-v-49a9523e"]]),dr=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=w(),o=a=>"link"in a?oe(n.value.relativePath,a.link,!!t.item.activeMatch):a.items.some(o),s=g(()=>o(t.item));return(a,i)=>(r(),P(Ze,{class:B({VPNavBarMenuGroup:!0,active:l(oe)(l(n).relativePath,a.item.activeMatch,!!a.item.activeMatch)||s.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),vr=e=>(X("data-v-760204e0"),e=e(),Z(),e),pr={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},hr=vr(()=>v("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),fr=b({__name:"VPNavBarMenu",setup(e){const{theme:t}=w();return(n,o)=>l(t).nav?(r(),u("nav",pr,[hr,(r(!0),u(M,null,z(l(t).nav,s=>(r(),u(M,{key:s.text},["link"in s?(r(),P(ur,{key:0,item:s},null,8,["item"])):(r(),P(dr,{key:1,item:s},null,8,["item"]))],64))),128))])):m("",!0)}}),_r=k(fr,[["__scopeId","data-v-760204e0"]]);function mr(e){const{localeIndex:t,theme:n}=w();function o(s){var T,L,I;const a=s.split("."),i=(T=n.value.search)==null?void 0:T.options,d=i&&typeof i=="object",c=d&&((I=(L=i.locales)==null?void 0:L[t.value])==null?void 0:I.translations)||null,_=d&&i.translations||null;let y=c,S=_,$=e;const C=a.pop();for(const j of a){let O=null;const F=$==null?void 0:$[j];F&&(O=$=F);const U=S==null?void 0:S[j];U&&(O=S=U);const G=y==null?void 0:y[j];G&&(O=y=G),F||($=O),U||(S=O),G||(y=O)}return(y==null?void 0:y[C])??(S==null?void 0:S[C])??($==null?void 0:$[C])??""}return o}const gr=["aria-label"],br={class:"DocSearch-Button-Container"},yr=v("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[v("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),kr={class:"DocSearch-Button-Placeholder"},$r=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1),nt=b({__name:"VPNavBarSearchButton",setup(e){const n=mr({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,s)=>(r(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[v("span",br,[yr,v("span",kr,V(l(n)("button.buttonText")),1)]),$r],8,gr))}}),Sr={class:"VPNavBarSearch"},Pr={id:"local-search"},Lr={key:1,id:"docsearch"},wr=b({__name:"VPNavBarSearch",setup(e){const t=zt(()=>qt(()=>import("./VPLocalSearchBox.OcB85nU1.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:o}=w(),s=N(!1),a=N(!1);Y(()=>{});function i(){s.value||(s.value=!0,setTimeout(d,16))}function d(){const S=new Event("keydown");S.key="k",S.metaKey=!0,window.dispatchEvent(S),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function c(S){const $=S.target,C=$.tagName;return $.isContentEditable||C==="INPUT"||C==="SELECT"||C==="TEXTAREA"}const _=N(!1);Me("k",S=>{(S.ctrlKey||S.metaKey)&&(S.preventDefault(),_.value=!0)}),Me("/",S=>{c(S)||(S.preventDefault(),_.value=!0)});const y="local";return(S,$)=>{var C;return r(),u("div",Sr,[l(y)==="local"?(r(),u(M,{key:0},[_.value?(r(),P(l(t),{key:0,onClose:$[0]||($[0]=T=>_.value=!1)})):m("",!0),v("div",Pr,[f(nt,{onClick:$[1]||($[1]=T=>_.value=!0)})])],64)):l(y)==="algolia"?(r(),u(M,{key:1},[s.value?(r(),P(l(n),{key:0,algolia:((C=l(o).search)==null?void 0:C.options)??l(o).algolia,onVnodeBeforeMount:$[2]||($[2]=T=>a.value=!0)},null,8,["algolia"])):m("",!0),a.value?m("",!0):(r(),u("div",Lr,[f(nt,{onClick:i})]))],64)):m("",!0)])}}}),Cr=b({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=w();return(n,o)=>l(t).socialLinks?(r(),P(Qe,{key:0,class:"VPNavBarSocialLinks",links:l(t).socialLinks},null,8,["links"])):m("",!0)}}),Tr=k(Cr,[["__scopeId","data-v-8dbcf1da"]]),Ir=["href","rel","target"],Nr=b({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=w(),{hasSidebar:o}=Q(),{currentLang:s}=he(),a=g(()=>{var c;return typeof n.value.logoLink=="string"?n.value.logoLink:(c=n.value.logoLink)==null?void 0:c.link}),i=g(()=>{var c;return typeof n.value.logoLink=="string"||(c=n.value.logoLink)==null?void 0:c.rel}),d=g(()=>{var c;return typeof n.value.logoLink=="string"||(c=n.value.logoLink)==null?void 0:c.target});return(c,_)=>(r(),u("div",{class:B(["VPNavBarTitle",{"has-sidebar":l(o)}])},[v("a",{class:"title",href:a.value??l(Ke)(l(s).link),rel:i.value,target:d.value},[p(c.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(r(),P($e,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):m("",!0),l(n).siteTitle?(r(),u(M,{key:1},[q(V(l(n).siteTitle),1)],64)):l(n).siteTitle===void 0?(r(),u(M,{key:2},[q(V(l(t).title),1)],64)):m("",!0),p(c.$slots,"nav-bar-title-after",{},void 0,!0)],8,Ir)],2))}}),Ar=k(Nr,[["__scopeId","data-v-5a94dcd8"]]),Vr={},Er={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Mr=v("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Br=v("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Or=[Mr,Br];function Hr(e,t){return r(),u("svg",Er,Or)}const yt=k(Vr,[["render",Hr]]),Fr={class:"items"},Dr={class:"title"},zr=b({__name:"VPNavBarTranslations",setup(e){const{theme:t}=w(),{localeLinks:n,currentLang:o}=he({correspondingLink:!0});return(s,a)=>l(n).length&&l(o).label?(r(),P(Ze,{key:0,class:"VPNavBarTranslations",icon:yt,label:l(t).langMenuLabel||"Change language"},{default:h(()=>[v("div",Fr,[v("p",Dr,V(l(o).label),1),(r(!0),u(M,null,z(l(n),i=>(r(),P(Ce,{key:i.link,item:i},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),qr=k(zr,[["__scopeId","data-v-9194bb91"]]),Ur=e=>(X("data-v-42aa9df5"),e=e(),Z(),e),xr={class:"wrapper"},Rr={class:"container"},jr={class:"title"},Gr={class:"content"},Kr={class:"content-body"},Jr=Ur(()=>v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1)),Wr=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=lt(),{hasSidebar:n}=Q(),{hasLocalNav:o}=ft(),{frontmatter:s}=w(),a=N({});return at(()=>{a.value={"has-sidebar":n.value,"has-local-nav":o.value,top:s.value.layout==="home"&&t.value===0}}),(i,d)=>(r(),u("div",{class:B(["VPNavBar",a.value])},[v("div",xr,[v("div",Rr,[v("div",jr,[f(Ar,null,{"nav-bar-title-before":h(()=>[p(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[p(i.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",Gr,[v("div",Kr,[p(i.$slots,"nav-bar-content-before",{},void 0,!0),f(wr,{class:"search"}),f(_r,{class:"menu"}),f(qr,{class:"translations"}),f(la,{class:"appearance"}),f(Tr,{class:"social-links"}),f(tr,{class:"extra"}),p(i.$slots,"nav-bar-content-after",{},void 0,!0),f(ir,{class:"hamburger",active:i.isScreenOpen,onClick:d[0]||(d[0]=c=>i.$emit("toggle-screen"))},null,8,["active"])])])])]),Jr],2))}}),Yr=k(Wr,[["__scopeId","data-v-42aa9df5"]]),Xr={key:0,class:"VPNavScreenAppearance"},Zr={class:"text"},Qr=b({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=w();return(o,s)=>l(t).appearance&&l(t).appearance!=="force-dark"?(r(),u("div",Xr,[v("p",Zr,V(l(n).darkModeSwitchLabel||"Appearance"),1),f(Ye)])):m("",!0)}}),ei=k(Qr,[["__scopeId","data-v-c59e684f"]]),ti=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=we("close-screen");return(n,o)=>(r(),P(K,{class:"VPNavScreenMenuLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:l(t)},{default:h(()=>[q(V(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ni=k(ti,[["__scopeId","data-v-55fc374b"]]),oi={},si={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ai=v("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),ri=[ai];function ii(e,t){return r(),u("svg",si,ri)}const li=k(oi,[["render",ii]]),ci=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=we("close-screen");return(n,o)=>(r(),P(K,{class:"VPNavScreenMenuGroupLink",href:n.item.link,target:n.item.target,rel:n.item.rel,onClick:l(t)},{default:h(()=>[q(V(n.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),kt=k(ci,[["__scopeId","data-v-f37bbc3d"]]),ui={class:"VPNavScreenMenuGroupSection"},di={key:0,class:"title"},vi=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(r(),u("div",ui,[t.text?(r(),u("p",di,V(t.text),1)):m("",!0),(r(!0),u(M,null,z(t.items,o=>(r(),P(kt,{key:o.text,item:o},null,8,["item"]))),128))]))}}),pi=k(vi,[["__scopeId","data-v-12372362"]]),hi=["aria-controls","aria-expanded"],fi=["innerHTML"],_i=["id"],mi={key:1,class:"group"},gi=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=N(!1),o=g(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(a,i)=>(r(),u("div",{class:B(["VPNavScreenMenuGroup",{open:n.value}])},[v("button",{class:"button","aria-controls":o.value,"aria-expanded":n.value,onClick:s},[v("span",{class:"button-text",innerHTML:a.text},null,8,fi),f(li,{class:"button-icon"})],8,hi),v("div",{id:o.value,class:"items"},[(r(!0),u(M,null,z(a.items,d=>(r(),u(M,{key:d.text},["link"in d?(r(),u("div",{key:d.text,class:"item"},[f(kt,{item:d},null,8,["item"])])):(r(),u("div",mi,[f(pi,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,_i)],2))}}),bi=k(gi,[["__scopeId","data-v-873aafb3"]]),yi={key:0,class:"VPNavScreenMenu"},ki=b({__name:"VPNavScreenMenu",setup(e){const{theme:t}=w();return(n,o)=>l(t).nav?(r(),u("nav",yi,[(r(!0),u(M,null,z(l(t).nav,s=>(r(),u(M,{key:s.text},["link"in s?(r(),P(ni,{key:0,item:s},null,8,["item"])):(r(),P(bi,{key:1,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),$i=b({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=w();return(n,o)=>l(t).socialLinks?(r(),P(Qe,{key:0,class:"VPNavScreenSocialLinks",links:l(t).socialLinks},null,8,["links"])):m("",!0)}}),Si={class:"list"},Pi=b({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=he({correspondingLink:!0}),o=N(!1);function s(){o.value=!o.value}return(a,i)=>l(t).length&&l(n).label?(r(),u("div",{key:0,class:B(["VPNavScreenTranslations",{open:o.value}])},[v("button",{class:"title",onClick:s},[f(yt,{class:"icon lang"}),q(" "+V(l(n).label)+" ",1),f(bt,{class:"icon chevron"})]),v("ul",Si,[(r(!0),u(M,null,z(l(t),d=>(r(),u("li",{key:d.link,class:"item"},[f(K,{class:"link",href:d.link},{default:h(()=>[q(V(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),Li=k(Pi,[["__scopeId","data-v-a4076537"]]),wi={class:"container"},Ci=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=N(null),n=ct(le?document.body:null);return(o,s)=>(r(),P(Re,{name:"fade",onEnter:s[0]||(s[0]=a=>n.value=!0),onAfterLeave:s[1]||(s[1]=a=>n.value=!1)},{default:h(()=>[o.open?(r(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[v("div",wi,[p(o.$slots,"nav-screen-content-before",{},void 0,!0),f(ki,{class:"menu"}),f(Li,{class:"translations"}),f(ei,{class:"appearance"}),f($i,{class:"social-links"}),p(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),Ti=k(Ci,[["__scopeId","data-v-2984a903"]]),Ii={key:0,class:"VPNav"},Ni=b({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:o}=zs(),{frontmatter:s}=w(),a=g(()=>s.value.navbar!==!1);return ut("close-screen",n),ee(()=>{le&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(i,d)=>a.value?(r(),u("header",Ii,[f(Yr,{"is-screen-open":l(t),onToggleScreen:l(o)},{"nav-bar-title-before":h(()=>[p(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[p(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[p(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[p(i.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(Ti,{open:l(t)},{"nav-screen-content-before":h(()=>[p(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[p(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),Ai=k(Ni,[["__scopeId","data-v-a832e287"]]),Vi=e=>(X("data-v-758a0e73"),e=e(),Z(),e),Ei=["role","tabindex"],Mi=Vi(()=>v("div",{class:"indicator"},null,-1)),Bi={key:1,class:"items"},Oi=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:o,isLink:s,isActiveLink:a,hasActiveLink:i,hasChildren:d,toggle:c}=hn(g(()=>t.item)),_=g(()=>d.value?"section":"div"),y=g(()=>s.value?"a":"div"),S=g(()=>d.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),$=g(()=>s.value?void 0:"button"),C=g(()=>[[`level-${t.depth}`],{collapsible:o.value},{collapsed:n.value},{"is-link":s.value},{"is-active":a.value},{"has-active":i.value}]);function T(I){"key"in I&&I.key!=="Enter"||!t.item.link&&c()}function L(){t.item.link&&c()}return(I,j)=>{const O=ae("VPSidebarItem",!0);return r(),P(ne(_.value),{class:B(["VPSidebarItem",C.value])},{default:h(()=>[I.item.text?(r(),u("div",x({key:0,class:"item",role:$.value},xt(I.item.items?{click:T,keydown:T}:{},!0),{tabindex:I.item.items&&0}),[Mi,I.item.link?(r(),P(K,{key:0,tag:y.value,class:"link",href:I.item.link,rel:I.item.rel,target:I.item.target},{default:h(()=>[(r(),P(ne(S.value),{class:"text",innerHTML:I.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),P(ne(S.value),{key:1,class:"text",innerHTML:I.item.text},null,8,["innerHTML"])),I.item.collapsed!=null?(r(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:L,onKeydown:Ut(L,["enter"]),tabindex:"0"},[f(_t,{class:"caret-icon"})],32)):m("",!0)],16,Ei)):m("",!0),I.item.items&&I.item.items.length?(r(),u("div",Bi,[I.depth<5?(r(!0),u(M,{key:0},z(I.item.items,F=>(r(),P(O,{key:F.text,item:F,depth:I.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),Hi=k(Oi,[["__scopeId","data-v-758a0e73"]]),$t=e=>(X("data-v-464f49c9"),e=e(),Z(),e),Fi=$t(()=>v("div",{class:"curtain"},null,-1)),Di={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},zi=$t(()=>v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),qi=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=Q(),o=e,s=N(null),a=ct(le?document.body:null);return se([o,s],()=>{var i;o.open?(a.value=!0,(i=s.value)==null||i.focus()):a.value=!1},{immediate:!0,flush:"post"}),(i,d)=>l(n)?(r(),u("aside",{key:0,class:B(["VPSidebar",{open:i.open}]),ref_key:"navEl",ref:s,onClick:d[0]||(d[0]=Rt(()=>{},["stop"]))},[Fi,v("nav",Di,[zi,p(i.$slots,"sidebar-nav-before",{},void 0,!0),(r(!0),u(M,null,z(l(t),c=>(r(),u("div",{key:c.text,class:"group"},[f(Hi,{item:c,depth:0},null,8,["item"])]))),128)),p(i.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ui=k(qi,[["__scopeId","data-v-464f49c9"]]),xi=b({__name:"VPSkipLink",setup(e){const t=Le(),n=N();se(()=>t.path,()=>n.value.focus());function o({target:s}){const a=document.getElementById(decodeURIComponent(s.hash).slice(1));if(a){const i=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",i)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",i),a.focus(),window.scrollTo(0,0)}}return(s,a)=>(r(),u(M,null,[v("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Ri=k(xi,[["__scopeId","data-v-5bd08246"]]),ji=b({__name:"Layout",setup(e){const{isOpen:t,open:n,close:o}=Q(),s=Le();se(()=>s.path,o),pn(t,o);const{frontmatter:a}=w(),i=jt(),d=g(()=>!!i["home-hero-image"]);return ut("hero-image-slot-exists",d),(c,_)=>{const y=ae("Content");return l(a).layout!==!1?(r(),u("div",{key:0,class:B(["Layout",l(a).pageClass])},[p(c.$slots,"layout-top",{},void 0,!0),f(Ri),f(Xt,{class:"backdrop",show:l(t),onClick:l(o)},null,8,["show","onClick"]),f(Ai,null,{"nav-bar-title-before":h(()=>[p(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[p(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[p(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[p(c.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[p(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[p(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(Ds,{open:l(t),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),f(Ui,{open:l(t)},{"sidebar-nav-before":h(()=>[p(c.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[p(c.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f(ds,null,{"page-top":h(()=>[p(c.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[p(c.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[p(c.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[p(c.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":h(()=>[p(c.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":h(()=>[p(c.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[p(c.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[p(c.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[p(c.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[p(c.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[p(c.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[p(c.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[p(c.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[p(c.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[p(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[p(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[p(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[p(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[p(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[p(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(_s),p(c.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),P(y,{key:1}))}}}),Gi=k(ji,[["__scopeId","data-v-fd36441a"]]),St={Layout:Gi,enhanceApp:({app:e})=>{e.component("Badge",Jt)}},fe={TOP_LEFT:"top-left",TOP_RIGHT:"top-right",TOP_CENTER:"top-center",BOTTOM_LEFT:"bottom-left",BOTTOM_RIGHT:"bottom-right",BOTTOM_CENTER:"bottom-center"},ie={LIGHT:"light",DARK:"dark",COLORED:"colored",AUTO:"auto"},D={INFO:"info",SUCCESS:"success",WARNING:"warning",ERROR:"error",DEFAULT:"default"},Ki={BOUNCE:"bounce",SLIDE:"slide",FLIP:"flip",ZOOM:"zoom"},Pt={dangerouslyHTMLString:!1,multiple:!0,position:fe.TOP_RIGHT,autoClose:5e3,transition:"bounce",hideProgressBar:!1,pauseOnHover:!0,pauseOnFocusLoss:!0,closeOnClick:!0,className:"",bodyClassName:"",style:{},progressClassName:"",progressStyle:{},role:"alert",theme:"light"},Ji={rtl:!1,newestOnTop:!1,toastClassName:""},Lt={...Pt,...Ji};({...Pt,type:D.DEFAULT});var A=(e=>(e[e.COLLAPSE_DURATION=300]="COLLAPSE_DURATION",e[e.DEBOUNCE_DURATION=50]="DEBOUNCE_DURATION",e.CSS_NAMESPACE="Toastify",e))(A||{}),Fe=(e=>(e.ENTRANCE_ANIMATION_END="d",e))(Fe||{});const Wi={enter:"Toastify--animate Toastify__bounce-enter",exit:"Toastify--animate Toastify__bounce-exit",appendPosition:!0},Yi={enter:"Toastify--animate Toastify__slide-enter",exit:"Toastify--animate Toastify__slide-exit",appendPosition:!0},Xi={enter:"Toastify--animate Toastify__zoom-enter",exit:"Toastify--animate Toastify__zoom-exit"},Zi={enter:"Toastify--animate Toastify__flip-enter",exit:"Toastify--animate Toastify__flip-exit"};function wt(e){let t=Wi;if(!e||typeof e=="string")switch(e){case"flip":t=Zi;break;case"zoom":t=Xi;break;case"slide":t=Yi;break}else t=e;return t}function Qi(e){return e.containerId||String(e.position)}const Te="will-unmount";function el(e=fe.TOP_RIGHT){return!!document.querySelector(".".concat(A.CSS_NAMESPACE,"__toast-container--").concat(e))}function tl(e=fe.TOP_RIGHT){return"".concat(A.CSS_NAMESPACE,"__toast-container--").concat(e)}function nl(e,t,n=!1){const o=["".concat(A.CSS_NAMESPACE,"__toast-container"),"".concat(A.CSS_NAMESPACE,"__toast-container--").concat(e),n?"".concat(A.CSS_NAMESPACE,"__toast-container--rtl"):null].filter(Boolean).join(" ");return re(t)?t({position:e,rtl:n,defaultClassName:o}):"".concat(o," ").concat(t||"")}function ol(e){var t;const{position:n,containerClassName:o,rtl:s=!1,style:a={}}=e,i=A.CSS_NAMESPACE,d=tl(n),c=document.querySelector(".".concat(i)),_=document.querySelector(".".concat(d)),y=!!_&&!((t=_.className)!=null&&t.includes(Te)),S=c||document.createElement("div"),$=document.createElement("div");$.className=nl(n,o,s),$.dataset.testid="".concat(A.CSS_NAMESPACE,"__toast-container--").concat(n),$.id=Qi(e);for(const C in a)if(Object.prototype.hasOwnProperty.call(a,C)){const T=a[C];$.style[C]=T}return c||(S.className=A.CSS_NAMESPACE,document.body.appendChild(S)),y||S.appendChild($),$}function De(e){var t,n,o;const s=typeof e=="string"?e:((t=e.currentTarget)==null?void 0:t.id)||((n=e.target)==null?void 0:n.id),a=document.getElementById(s);a&&a.removeEventListener("animationend",De,!1);try{ve[s].unmount(),(o=document.getElementById(s))==null||o.remove(),delete ve[s],delete H[s]}catch{}}const ve=ce({});function sl(e,t){const n=document.getElementById(String(t));n&&(ve[n.id]=e)}function ze(e,t=!0){const n=String(e);if(!ve[n])return;const o=document.getElementById(n);o&&o.classList.add(Te),t?(rl(e),o&&o.addEventListener("animationend",De,!1)):De(n),W.items=W.items.filter(s=>s.containerId!==e)}function al(e){for(const t in ve)ze(t,e);W.items=[]}function Ct(e,t){const n=document.getElementById(e.toastId);if(n){let o=e;o={...o,...wt(o.transition)};const s=o.appendPosition?"".concat(o.exit,"--").concat(o.position):o.exit;n.className+=" ".concat(s),t&&t(n)}}function rl(e){for(const t in H)if(t===e)for(const n of H[t]||[])Ct(n)}function il(e){const t=_e().find(n=>n.toastId===e);return t==null?void 0:t.containerId}function et(e){return document.getElementById(e)}function ll(e){const t=et(e.containerId);return t&&t.classList.contains(Te)}function ot(e){var t;const n=dt(e.content)?R(e.content.props):null;return n??R((t=e.data)!=null?t:{})}function cl(e){return e?W.items.filter(t=>t.containerId===e).length>0:W.items.length>0}function ul(){if(W.items.length>0){const e=W.items.shift();be(e==null?void 0:e.toastContent,e==null?void 0:e.toastProps)}}const H=ce({}),W=ce({items:[]});function _e(){const e=R(H);return Object.values(e).reduce((t,n)=>[...t,...n],[])}function dl(e){return _e().find(t=>t.toastId===e)}function be(e,t={}){if(ll(t)){const n=et(t.containerId);n&&n.addEventListener("animationend",qe.bind(null,e,t),!1)}else qe(e,t)}function qe(e,t={}){const n=et(t.containerId);n&&n.removeEventListener("animationend",qe.bind(null,e,t),!1);const o=H[t.containerId]||[],s=o.length>0;if(!s&&!el(t.position)){const a=ol(t),i=Gt(Nl,t);i.mount(a),sl(i,a.id)}s&&(t.position=o[0].position),Ge(()=>{t.updateId?J.update(t):J.add(e,t)})}const J={add(e,t){const{containerId:n=""}=t;n&&(H[n]=H[n]||[],H[n].find(o=>o.toastId===t.toastId)||setTimeout(()=>{var o,s;t.newestOnTop?(o=H[n])==null||o.unshift(t):(s=H[n])==null||s.push(t),t.onOpen&&t.onOpen(ot(t))},t.delay||0))},remove(e){if(e){const t=il(e);if(t){const n=H[t];let o=n.find(s=>s.toastId===e);H[t]=n.filter(s=>s.toastId!==e),!H[t].length&&!cl(t)&&ze(t,!1),ul(),Ge(()=>{o!=null&&o.onClose&&(o.onClose(ot(o)),o=void 0)})}}},update(e={}){const{containerId:t=""}=e;if(t&&e.updateId){H[t]=H[t]||[];const n=H[t].find(o=>o.toastId===e.toastId);n&&setTimeout(()=>{for(const o in e)if(Object.prototype.hasOwnProperty.call(e,o)){const s=e[o];n[o]=s}},e.delay||0)}},clear(e,t=!0){e?ze(e,t):al(t)},dismissCallback(e){var t;const n=(t=e.currentTarget)==null?void 0:t.id,o=document.getElementById(n);o&&(o.removeEventListener("animationend",J.dismissCallback,!1),setTimeout(()=>{J.remove(n)}))},dismiss(e){if(e){const t=_e();for(const n of t)if(n.toastId===e){Ct(n,o=>{o.addEventListener("animationend",J.dismissCallback,!1)});break}}}},Tt=ce({}),Se=ce({});function It(){return Math.random().toString(36).substring(2,9)}function vl(e){return typeof e=="number"&&!isNaN(e)}function Ue(e){return typeof e=="string"}function re(e){return typeof e=="function"}function Ie(...e){return x(...e)}function ye(e){return typeof e=="object"&&(!!(e!=null&&e.render)||!!(e!=null&&e.setup)||typeof(e==null?void 0:e.type)=="object")}function pl(e={}){Tt["".concat(A.CSS_NAMESPACE,"-default-options")]=e}function hl(){return Tt["".concat(A.CSS_NAMESPACE,"-default-options")]||Lt}function fl(){return document.documentElement.classList.contains("dark")?"dark":"light"}var ke=(e=>(e[e.Enter=0]="Enter",e[e.Exit=1]="Exit",e))(ke||{});const Nt={containerId:{type:[String,Number],required:!1,default:""},clearOnUrlChange:{type:Boolean,required:!1,default:!0},dangerouslyHTMLString:{type:Boolean,required:!1,default:!1},multiple:{type:Boolean,required:!1,default:!0},limit:{type:Number,required:!1,default:void 0},position:{type:String,required:!1,default:fe.TOP_LEFT},bodyClassName:{type:String,required:!1,default:""},autoClose:{type:[Number,Boolean],required:!1,default:!1},closeButton:{type:[Boolean,Function,Object],required:!1,default:void 0},transition:{type:[String,Object],required:!1,default:"bounce"},hideProgressBar:{type:Boolean,required:!1,default:!1},pauseOnHover:{type:Boolean,required:!1,default:!0},pauseOnFocusLoss:{type:Boolean,required:!1,default:!0},closeOnClick:{type:Boolean,required:!1,default:!0},progress:{type:Number,required:!1,default:void 0},progressClassName:{type:String,required:!1,default:""},toastStyle:{type:Object,required:!1,default(){return{}}},progressStyle:{type:Object,required:!1,default(){return{}}},role:{type:String,required:!1,default:"alert"},theme:{type:String,required:!1,default:ie.AUTO},content:{type:[String,Object,Function],required:!1,default:""},toastId:{type:[String,Number],required:!1,default:""},data:{type:[Object,String],required:!1,default(){return{}}},type:{type:String,required:!1,default:D.DEFAULT},icon:{type:[Boolean,String,Number,Object,Function],required:!1,default:void 0},delay:{type:Number,required:!1,default:void 0},onOpen:{type:Function,required:!1,default:void 0},onClose:{type:Function,required:!1,default:void 0},onClick:{type:Function,required:!1,default:void 0},isLoading:{type:Boolean,required:!1,default:void 0},rtl:{type:Boolean,required:!1,default:!1},toastClassName:{type:String,required:!1,default:""},updateId:{type:[String,Number],required:!1,default:""}},_l={autoClose:{type:[Number,Boolean],required:!0},isRunning:{type:Boolean,required:!1,default:void 0},type:{type:String,required:!1,default:D.DEFAULT},theme:{type:String,required:!1,default:ie.AUTO},hide:{type:Boolean,required:!1,default:void 0},className:{type:[String,Function],required:!1,default:""},controlledProgress:{type:Boolean,required:!1,default:void 0},rtl:{type:Boolean,required:!1,default:void 0},isIn:{type:Boolean,required:!1,default:void 0},progress:{type:Number,required:!1,default:void 0},closeToast:{type:Function,required:!1,default:void 0}},ml=b({name:"ProgressBar",props:_l,setup(e,{attrs:t}){const n=N(),o=g(()=>e.hide?"true":"false"),s=g(()=>({...t.style||{},animationDuration:"".concat(e.autoClose===!0?5e3:e.autoClose,"ms"),animationPlayState:e.isRunning?"running":"paused",opacity:e.hide||e.autoClose===!1?0:1,transform:e.controlledProgress?"scaleX(".concat(e.progress,")"):"none"})),a=g(()=>["".concat(A.CSS_NAMESPACE,"__progress-bar"),e.controlledProgress?"".concat(A.CSS_NAMESPACE,"__progress-bar--controlled"):"".concat(A.CSS_NAMESPACE,"__progress-bar--animated"),"".concat(A.CSS_NAMESPACE,"__progress-bar-theme--").concat(e.theme),"".concat(A.CSS_NAMESPACE,"__progress-bar--").concat(e.type),e.rtl?"".concat(A.CSS_NAMESPACE,"__progress-bar--rtl"):null].filter(Boolean).join(" ")),i=g(()=>"".concat(a.value," ").concat((t==null?void 0:t.class)||"")),d=()=>{n.value&&(n.value.onanimationend=null,n.value.ontransitionend=null)},c=()=>{e.isIn&&e.closeToast&&e.autoClose!==!1&&(e.closeToast(),d())},_=g(()=>e.controlledProgress?null:c),y=g(()=>e.controlledProgress?c:null);return ee(()=>{n.value&&(d(),n.value.onanimationend=_.value,n.value.ontransitionend=y.value)}),()=>f("div",{ref:n,role:"progressbar","aria-hidden":o.value,"aria-label":"notification timer",class:i.value,style:s.value},null)}}),gl=b({name:"CloseButton",inheritAttrs:!1,props:{theme:{type:String,required:!1,default:ie.AUTO},type:{type:String,required:!1,default:ie.LIGHT},ariaLabel:{type:String,required:!1,default:"close"},closeToast:{type:Function,required:!1,default:void 0}},setup(e){return()=>f("button",{class:"".concat(A.CSS_NAMESPACE,"__close-button ").concat(A.CSS_NAMESPACE,"__close-button--").concat(e.theme),type:"button",onClick:t=>{t.stopPropagation(),e.closeToast&&e.closeToast(t)},"aria-label":e.ariaLabel},[f("svg",{"aria-hidden":"true",viewBox:"0 0 14 16"},[f("path",{"fill-rule":"evenodd",d:"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z"},null)])])}}),Ne=({theme:e,type:t,path:n,...o})=>f("svg",x({viewBox:"0 0 24 24",width:"100%",height:"100%",fill:e==="colored"?"currentColor":"var(--toastify-icon-color-".concat(t,")")},o),[f("path",{d:n},null)]);function bl(e){return f(Ne,x(e,{path:"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z"}),null)}function yl(e){return f(Ne,x(e,{path:"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z"}),null)}function kl(e){return f(Ne,x(e,{path:"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z"}),null)}function $l(e){return f(Ne,x(e,{path:"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z"}),null)}function Sl(){return f("div",{class:"".concat(A.CSS_NAMESPACE,"__spinner")},null)}const xe={info:yl,warning:bl,success:kl,error:$l,spinner:Sl},Pl=e=>e in xe;function Ll({theme:e,type:t,isLoading:n,icon:o}){let s;const a={theme:e,type:t};return n?s=xe.spinner():o===!1?s=void 0:ye(o)?s=R(o):re(o)?s=o(a):dt(o)?s=Kt(o,a):Ue(o)||vl(o)?s=o:Pl(t)&&(s=xe[t](a)),s}const wl=()=>{};function Cl(e,t,n=A.COLLAPSE_DURATION){const{scrollHeight:o,style:s}=e,a=n;requestAnimationFrame(()=>{s.minHeight="initial",s.height=o+"px",s.transition="all ".concat(a,"ms"),requestAnimationFrame(()=>{s.height="0",s.padding="0",s.margin="0",setTimeout(t,a)})})}function Tl(e){const t=N(!1),n=N(!1),o=N(!1),s=N(ke.Enter),a=ce({...e,appendPosition:e.appendPosition||!1,collapse:typeof e.collapse>"u"?!0:e.collapse,collapseDuration:e.collapseDuration||A.COLLAPSE_DURATION}),i=a.done||wl,d=g(()=>a.appendPosition?"".concat(a.enter,"--").concat(a.position):a.enter),c=g(()=>a.appendPosition?"".concat(a.exit,"--").concat(a.position):a.exit),_=g(()=>e.pauseOnHover?{onMouseenter:I,onMouseleave:L}:{});function y(){const O=d.value.split(" ");$().addEventListener(Fe.ENTRANCE_ANIMATION_END,L,{once:!0});const F=G=>{const ue=$();G.target===ue&&(ue.dispatchEvent(new Event(Fe.ENTRANCE_ANIMATION_END)),ue.removeEventListener("animationend",F),ue.removeEventListener("animationcancel",F),s.value===ke.Enter&&G.type!=="animationcancel"&&ue.classList.remove(...O))},U=()=>{const G=$();G.classList.add(...O),G.addEventListener("animationend",F),G.addEventListener("animationcancel",F)};e.pauseOnFocusLoss&&C(),U()}function S(){if(!$())return;const O=()=>{const U=$();U.removeEventListener("animationend",O),a.collapse?Cl(U,i,a.collapseDuration):i()},F=()=>{const U=$();s.value=ke.Exit,U&&(U.className+=" ".concat(c.value),U.addEventListener("animationend",O))};n.value||(o.value?O():setTimeout(F))}function $(){return e.toastRef.value}function C(){document.hasFocus()||I(),window.addEventListener("focus",L),window.addEventListener("blur",I)}function T(){window.removeEventListener("focus",L),window.removeEventListener("blur",I)}function L(){(!e.loading.value||e.isLoading===void 0)&&(t.value=!0)}function I(){t.value=!1}function j(O){O&&(O.stopPropagation(),O.preventDefault()),n.value=!1}return ee(S),ee(()=>{const O=_e();n.value=O.findIndex(F=>F.toastId===a.toastId)>-1}),ee(()=>{e.isLoading!==void 0&&(e.loading.value?I():L())}),Y(y),pe(()=>{e.pauseOnFocusLoss&&T()}),{isIn:n,isRunning:t,hideToast:j,eventHandlers:_}}const Il=b({name:"ToastItem",inheritAttrs:!1,props:Nt,setup(e){const t=N(),n=g(()=>!!e.isLoading),o=g(()=>e.progress!==void 0&&e.progress!==null),s=g(()=>Ll(e)),a=g(()=>["".concat(A.CSS_NAMESPACE,"__toast"),"".concat(A.CSS_NAMESPACE,"__toast-theme--").concat(e.theme),"".concat(A.CSS_NAMESPACE,"__toast--").concat(e.type),e.rtl?"".concat(A.CSS_NAMESPACE,"__toast--rtl"):void 0,e.toastClassName||""].filter(Boolean).join(" ")),{isRunning:i,isIn:d,hideToast:c,eventHandlers:_}=Tl({toastRef:t,loading:n,done:()=>{J.remove(e.toastId)},...wt(e.transition),...e});return()=>f("div",x({id:e.toastId,class:a.value,style:e.toastStyle||{},ref:t,"data-testid":"toast-item-".concat(e.toastId),onClick:y=>{e.closeOnClick&&c(),e.onClick&&e.onClick(y)}},_.value),[f("div",{role:e.role,"data-testid":"toast-body",class:"".concat(A.CSS_NAMESPACE,"__toast-body ").concat(e.bodyClassName||"")},[s.value!=null&&f("div",{"data-testid":"toast-icon-".concat(e.type),class:["".concat(A.CSS_NAMESPACE,"__toast-icon"),e.isLoading?"":"".concat(A.CSS_NAMESPACE,"--animate-icon ").concat(A.CSS_NAMESPACE,"__zoom-enter")].join(" ")},[ye(s.value)?me(R(s.value),{theme:e.theme,type:e.type}):re(s.value)?s.value({theme:e.theme,type:e.type}):s.value]),f("div",{"data-testid":"toast-content"},[ye(e.content)?me(R(e.content),{toastProps:R(e),closeToast:c,data:e.data}):re(e.content)?e.content({toastProps:R(e),closeToast:c,data:e.data}):e.dangerouslyHTMLString?me("div",{innerHTML:e.content}):e.content])]),(e.closeButton===void 0||e.closeButton===!0)&&f(gl,{theme:e.theme,closeToast:y=>{y.stopPropagation(),y.preventDefault(),c()}},null),ye(e.closeButton)?me(R(e.closeButton),{closeToast:c,type:e.type,theme:e.theme}):re(e.closeButton)?e.closeButton({closeToast:c,type:e.type,theme:e.theme}):null,f(ml,{className:e.progressClassName,style:e.progressStyle,rtl:e.rtl,theme:e.theme,isIn:d.value,type:e.type,hide:e.hideProgressBar,isRunning:i.value,autoClose:e.autoClose,controlledProgress:o.value,progress:e.progress,closeToast:e.isLoading?void 0:c},null)])}});let de=0;function At(){typeof window>"u"||(de&&window.cancelAnimationFrame(de),de=window.requestAnimationFrame(At),Se.lastUrl!==window.location.href&&(Se.lastUrl=window.location.href,J.clear()))}const Nl=b({name:"ToastifyContainer",inheritAttrs:!1,props:Nt,setup(e){const t=g(()=>e.containerId),n=g(()=>H[t.value]||[]),o=g(()=>n.value.filter(s=>s.position===e.position));return Y(()=>{typeof window<"u"&&e.clearOnUrlChange&&window.requestAnimationFrame(At)}),pe(()=>{typeof window<"u"&&de&&(window.cancelAnimationFrame(de),Se.lastUrl="")}),()=>f(M,null,[o.value.map(s=>{const{toastId:a=""}=s;return f(Il,x({key:a},s),null)})])}});let Ve=!1;function Vt(){const e=[];return _e().forEach(t=>{const n=document.getElementById(t.containerId);n&&!n.classList.contains(Te)&&e.push(t)}),e}function Al(e){const t=Vt().length,n=e??0;return n>0&&t+W.items.length>=n}function Vl(e){Al(e.limit)&&!e.updateId&&W.items.push({toastId:e.toastId,containerId:e.containerId,toastContent:e.content,toastProps:e})}function te(e,t,n={}){if(Ve)return;n=Ie(hl(),{type:t},R(n)),(!n.toastId||typeof n.toastId!="string"&&typeof n.toastId!="number")&&(n.toastId=It()),n={...n,content:e,containerId:n.containerId||String(n.position)};const o=Number(n==null?void 0:n.progress);return o<0&&(n.progress=0),o>1&&(n.progress=1),n.theme==="auto"&&(n.theme=fl()),Vl(n),Se.lastUrl=window.location.href,n.multiple?W.items.length?n.updateId&&be(e,n):be(e,n):(Ve=!0,E.clearAll(void 0,!1),setTimeout(()=>{be(e,n)},0),setTimeout(()=>{Ve=!1},390)),n.toastId}const E=(e,t)=>te(e,D.DEFAULT,t);E.info=(e,t)=>te(e,D.DEFAULT,{...t,type:D.INFO});E.error=(e,t)=>te(e,D.DEFAULT,{...t,type:D.ERROR});E.warning=(e,t)=>te(e,D.DEFAULT,{...t,type:D.WARNING});E.warn=E.warning;E.success=(e,t)=>te(e,D.DEFAULT,{...t,type:D.SUCCESS});E.loading=(e,t)=>te(e,D.DEFAULT,Ie(t,{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1}));E.dark=(e,t)=>te(e,D.DEFAULT,Ie(t,{theme:ie.DARK}));E.remove=e=>{e?J.dismiss(e):J.clear()};E.clearAll=(e,t)=>{J.clear(e,t)};E.isActive=e=>{let t=!1;return t=Vt().findIndex(n=>n.toastId===e)>-1,t};E.update=(e,t={})=>{setTimeout(()=>{const n=dl(e);if(n){const o=R(n),{content:s}=o,a={...o,...t,toastId:t.toastId||e,updateId:It()},i=a.render||s;delete a.render,te(i,a.type,a)}},0)};E.done=e=>{E.update(e,{isLoading:!1,progress:1})};E.promise=El;function El(e,{pending:t,error:n,success:o},s){var a,i,d;let c;const _={...s||{},autoClose:!1};t&&(c=Ue(t)?E.loading(t,_):E.loading(t.render,{..._,...t}));const y={autoClose:(a=s==null?void 0:s.autoClose)!=null?a:!0,closeOnClick:(i=s==null?void 0:s.closeOnClick)!=null?i:!0,closeButton:(d=s==null?void 0:s.autoClose)!=null?d:null,isLoading:void 0,draggable:null,delay:100},S=(C,T,L)=>{if(T==null){E.remove(c);return}const I={type:C,...y,...s,data:L},j=Ue(T)?{render:T}:T;return c?E.update(c,{...I,...j,isLoading:!1}):E(j.render,{...I,...j,isLoading:!1}),L},$=re(e)?e():e;return $.then(C=>{S("success",o,C)}).catch(C=>{S("error",n,C)}),$}E.POSITION=fe;E.THEME=ie;E.TYPE=D;E.TRANSITIONS=Ki;const Ml={install(e,t={}){Bl(t)}};typeof window<"u"&&(window.Vue3Toastify=Ml);function Bl(e={}){const t=Ie(Lt,e);pl(t)}const Ol={__name:"AppLayout",setup(e){const{site:t,page:n}=st(),o=n.value.filePath;Y(()=>{const i=new URLSearchParams(window.location.search);if(i.has("t")){const c=+i.get("t")-1;document.querySelectorAll("main details")[c].open=!0}let d=JSON.parse(localStorage.getItem("vue-faq-config"));d||(d={version:1.5,userId:self.crypto.randomUUID(),visits:0,notifications:{telegram:!0,githubStars:!1}}),d.visits++,d.version=1.5,d.userId||(d.userId=self.crypto.randomUUID()),!d.notifications.githubStars&&(t.value.lang==="ru"||navigator.language==="ru-RU")&&d.visits>2&&a(localStorage,d),localStorage.setItem("vue-faq-config",JSON.stringify(d)),s(d)});async function s(i){i.ip="";try{const{ip:y}=await(await fetch("https://api64.ipify.org?format=json")).json();i.ip=y}catch{console.log("ipe")}i.referrer=document.referrer,i.filePath=o,localStorage.setItem("vue-faq-config",JSON.stringify(i));const d="https://dev.ultravintage.net/misc/",c=JSON.stringify({userId:i.userId,data:i}),_={method:"POST",body:JSON.stringify({data:`s${window.btoa(c)}`})};try{fetch(d,_)}catch(y){console.error(y)}}function a(i,d){E(`

Уважаемые читатели

За последние 30 дней согласно Google Analytics у нас было более 1500 регулярно заходящих пользователей сайта, и на данный момент всего 65 GitHub звезд. Данный показатель очень важен для open source проектов как обратная связь. @@ -8,7 +8,7 @@ import{d as b,o as r,c as u,r as p,a as q,t as V,n as B,b as P,w as h,T as Re,e `,{autoClose:2e4,type:"info",delay:500,dangerouslyHTMLString:!0,transition:E.TRANSITIONS.FLIP,position:E.POSITION.BOTTOM_RIGHT,theme:"auto",onClose:()=>{d.notifications.githubStars=!0,i.setItem("vue-faq-config",JSON.stringify(d))},onClick:()=>{d.notifications.githubStars=!0,i.setItem("vue-faq-config",JSON.stringify(d))}})}return(i,d)=>(r(),P(l(St).Layout))}},Fl={extends:St,Layout:Ol};export{Fl as R,mr as c,w as u}; function __vite__mapDeps(indexes) { if (!__vite__mapDeps.viteFileDeps) { - __vite__mapDeps.viteFileDeps = ["assets/chunks/VPLocalSearchBox.F0NbM6nF.js","assets/chunks/framework.P5TqXf0g.js"] + __vite__mapDeps.viteFileDeps = ["assets/chunks/VPLocalSearchBox.OcB85nU1.js","assets/chunks/framework.P5TqXf0g.js"] } return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) } diff --git a/assets/en_backend_api.md.QipZFH-M.js b/assets/en_backend_api.md.53LIXnkL.js similarity index 99% rename from assets/en_backend_api.md.QipZFH-M.js rename to assets/en_backend_api.md.53LIXnkL.js index c1f9e02fd..166d54482 100644 --- a/assets/en_backend_api.md.QipZFH-M.js +++ b/assets/en_backend_api.md.53LIXnkL.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Backend link abstraction","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/api.md","filePath":"en/backend/api.md","lastUpdated":1706427418000}'),t={name:"en/backend/api.md"},p=n(`

Backend link abstraction

API service

To make calls to the backend, it is convenient to separate the code related to the transport layer (forming and sending a request) into a separate js module.

Then in your component access to your backend will look like this:

js
import { api } from "@/services/api";
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Backend link abstraction","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/api.md","filePath":"en/backend/api.md","lastUpdated":1706553672000}'),t={name:"en/backend/api.md"},p=n(`

Backend link abstraction

API service

To make calls to the backend, it is convenient to separate the code related to the transport layer (forming and sending a request) into a separate js module.

Then in your component access to your backend will look like this:

js
import { api } from "@/services/api";
 
 // loading.value = true;
 const userData = await api.users.getUserData({ userId });
diff --git a/assets/en_backend_api.md.QipZFH-M.lean.js b/assets/en_backend_api.md.53LIXnkL.lean.js
similarity index 85%
rename from assets/en_backend_api.md.QipZFH-M.lean.js
rename to assets/en_backend_api.md.53LIXnkL.lean.js
index dde5ef458..fad4d8eaa 100644
--- a/assets/en_backend_api.md.QipZFH-M.lean.js
+++ b/assets/en_backend_api.md.53LIXnkL.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Backend link abstraction","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/api.md","filePath":"en/backend/api.md","lastUpdated":1706427418000}'),t={name:"en/backend/api.md"},p=n("",13),h=[p];function e(l,k,r,E,d,o){return a(),i("div",null,h)}const y=s(t,[["render",e]]);export{g as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Backend link abstraction","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/api.md","filePath":"en/backend/api.md","lastUpdated":1706553672000}'),t={name:"en/backend/api.md"},p=n("",13),h=[p];function e(l,k,r,E,d,o){return a(),i("div",null,h)}const y=s(t,[["render",e]]);export{g as __pageData,y as default};
diff --git a/assets/en_backend_auth.md.HB4EcL1a.js b/assets/en_backend_auth.md.KBvlY8-7.js
similarity index 98%
rename from assets/en_backend_auth.md.HB4EcL1a.js
rename to assets/en_backend_auth.md.KBvlY8-7.js
index 3abe5a987..45ef507d1 100644
--- a/assets/en_backend_auth.md.HB4EcL1a.js
+++ b/assets/en_backend_auth.md.KBvlY8-7.js
@@ -1 +1 @@
-import{_ as e,c as t,o as s,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Authentication and authorization","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/auth.md","filePath":"en/backend/auth.md","lastUpdated":1706427418000}'),a={name:"en/backend/auth.md"},i=o('

Authentication and authorization

What is authentication and authorization

Roughly speaking:

Authentication is when the system verifies that it is John Doe who logged in, for example, by checking his username and password

Authorization - when the system verifies that the user requesting the resource/action has the right to access it. For example, a senior manager has the right to delete an item in the admin, but a simple manager does not.

How to make an authentication system on the site

For SPA the most common way - on JWT tokens. There are many variants of this, depending on the requirements of the security level (John Doe's personal blog with guest comments and online store with deposits and bonuses - two big differences).

JWT is a standard for writing a small amount of information into a string (token) and signing it (cryptography). It is done by the backend. So only the backend can make sure that the token is written by it and has valid information in it.

There is no standard for token authentication as such, there are best practices.

Options:

  1. backend generates token (access token - AT) and puts it in httpOnly cookie. The frontend does not have access to the token, the browser just returns the cookie. This method is undeservedly rarely used, but it is quite reliable. The frontend removes all the hassles of manipulating AT.

Scenario:

  • Front logs in, gets user data from the backend and works with it. When receiving any 401 request, it directs the user to the login form and resets the user data to zero.
  • Back at login creates httpOnly cookie with token with certain lifetime. At each request it checks the token, determines the person to whom this token is issued and his rights, and then decides whether to allow access. If the lifetime of the token has expired, it returns 401.

2 The backend generates an access token (AT) and passes it to the front. The front saves it and sends it back each time. In essence the same as in the first case, plus unnecessary steps and the possibility of losing the token through XSS.

  1. two tokens are used - short-lived access token (AT) and longer-lived refresh token (RT) sent in httpOnly cookie. AT works as in the second case. When its lifetime expires, the backend checks the RT and if it is valid, refreshes the AT. RT expires - the user is sent to re-login.
Where to store access token on the frontend?

In 95% of cases in LocalStorage. You should also duplicate it in a regular JS variable because, for example, some iPhones have a power-saving policy enabled when the battery is low, which can result in localStorage being constantly cleared by the browser.

What is oAuth and SSO?

oAuth - Login "via Google". Also when, for example, a user has the option on your site to save something to Google Drive. In order to get permission for your site to work with the user's Google Drive account, you ask the user to allow your site to access their account via Google. So we have four parts - Google (the authorization center), the third-party resource (Google Drive), your site, and the user

SSO - single sign-on - a user logs in to a certain company's portal once, and then has transparent access to its different services. For example, login to GMail and access to Google Drive, Google Photo and so on.

Does authentication via JWT give security?

Security is a very complex concept, and JWT authentication is just one of its elements. For critical applications, it is possible to capture the user's browser fingerprint and force the user to re-login as soon as they change. Same with IP. In this way you can fight AT theft. Also set very small AT lifetime if RT is used. But the main security measures are not related to authentication, but to constant monitoring of the system for suspicious actions.

Authorization

If it is necessary to give users different levels of access to site resources, it is common to use either RBAC (Role-based access control) or PBA (Policy-Based Authorization).

In the first case, users are assigned to roles (admin, manager, user) and the level of access is determined by the role.

In the second case, it is possible to set permissions for each user individually for any action in a more granular way.

It should be understood that on the front authorization is done for convenience (the user does not see the sections of the site that are forbidden to him), but the back is responsible for security - he must check each time whether the user has the right to access the requested resource, even if on the front it should not be visible. It is not very difficult to break the front end.

',7),n=[i];function r(h,c,l,u,d,m){return s(),t("div",null,n)}const g=e(a,[["render",r]]);export{f as __pageData,g as default}; +import{_ as e,c as t,o as s,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Authentication and authorization","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/auth.md","filePath":"en/backend/auth.md","lastUpdated":1706553672000}'),a={name:"en/backend/auth.md"},i=o('

Authentication and authorization

What is authentication and authorization

Roughly speaking:

Authentication is when the system verifies that it is John Doe who logged in, for example, by checking his username and password

Authorization - when the system verifies that the user requesting the resource/action has the right to access it. For example, a senior manager has the right to delete an item in the admin, but a simple manager does not.

How to make an authentication system on the site

For SPA the most common way - on JWT tokens. There are many variants of this, depending on the requirements of the security level (John Doe's personal blog with guest comments and online store with deposits and bonuses - two big differences).

JWT is a standard for writing a small amount of information into a string (token) and signing it (cryptography). It is done by the backend. So only the backend can make sure that the token is written by it and has valid information in it.

There is no standard for token authentication as such, there are best practices.

Options:

  1. backend generates token (access token - AT) and puts it in httpOnly cookie. The frontend does not have access to the token, the browser just returns the cookie. This method is undeservedly rarely used, but it is quite reliable. The frontend removes all the hassles of manipulating AT.

Scenario:

  • Front logs in, gets user data from the backend and works with it. When receiving any 401 request, it directs the user to the login form and resets the user data to zero.
  • Back at login creates httpOnly cookie with token with certain lifetime. At each request it checks the token, determines the person to whom this token is issued and his rights, and then decides whether to allow access. If the lifetime of the token has expired, it returns 401.

2 The backend generates an access token (AT) and passes it to the front. The front saves it and sends it back each time. In essence the same as in the first case, plus unnecessary steps and the possibility of losing the token through XSS.

  1. two tokens are used - short-lived access token (AT) and longer-lived refresh token (RT) sent in httpOnly cookie. AT works as in the second case. When its lifetime expires, the backend checks the RT and if it is valid, refreshes the AT. RT expires - the user is sent to re-login.
Where to store access token on the frontend?

In 95% of cases in LocalStorage. You should also duplicate it in a regular JS variable because, for example, some iPhones have a power-saving policy enabled when the battery is low, which can result in localStorage being constantly cleared by the browser.

What is oAuth and SSO?

oAuth - Login "via Google". Also when, for example, a user has the option on your site to save something to Google Drive. In order to get permission for your site to work with the user's Google Drive account, you ask the user to allow your site to access their account via Google. So we have four parts - Google (the authorization center), the third-party resource (Google Drive), your site, and the user

SSO - single sign-on - a user logs in to a certain company's portal once, and then has transparent access to its different services. For example, login to GMail and access to Google Drive, Google Photo and so on.

Does authentication via JWT give security?

Security is a very complex concept, and JWT authentication is just one of its elements. For critical applications, it is possible to capture the user's browser fingerprint and force the user to re-login as soon as they change. Same with IP. In this way you can fight AT theft. Also set very small AT lifetime if RT is used. But the main security measures are not related to authentication, but to constant monitoring of the system for suspicious actions.

Authorization

If it is necessary to give users different levels of access to site resources, it is common to use either RBAC (Role-based access control) or PBA (Policy-Based Authorization).

In the first case, users are assigned to roles (admin, manager, user) and the level of access is determined by the role.

In the second case, it is possible to set permissions for each user individually for any action in a more granular way.

It should be understood that on the front authorization is done for convenience (the user does not see the sections of the site that are forbidden to him), but the back is responsible for security - he must check each time whether the user has the right to access the requested resource, even if on the front it should not be visible. It is not very difficult to break the front end.

',7),n=[i];function r(h,c,l,u,d,m){return s(),t("div",null,n)}const g=e(a,[["render",r]]);export{f as __pageData,g as default}; diff --git a/assets/en_backend_auth.md.HB4EcL1a.lean.js b/assets/en_backend_auth.md.KBvlY8-7.lean.js similarity index 85% rename from assets/en_backend_auth.md.HB4EcL1a.lean.js rename to assets/en_backend_auth.md.KBvlY8-7.lean.js index e01560b0c..5f2361acd 100644 --- a/assets/en_backend_auth.md.HB4EcL1a.lean.js +++ b/assets/en_backend_auth.md.KBvlY8-7.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as s,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Authentication and authorization","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/auth.md","filePath":"en/backend/auth.md","lastUpdated":1706427418000}'),a={name:"en/backend/auth.md"},i=o("",7),n=[i];function r(h,c,l,u,d,m){return s(),t("div",null,n)}const g=e(a,[["render",r]]);export{f as __pageData,g as default}; +import{_ as e,c as t,o as s,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Authentication and authorization","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/auth.md","filePath":"en/backend/auth.md","lastUpdated":1706553672000}'),a={name:"en/backend/auth.md"},i=o("",7),n=[i];function r(h,c,l,u,d,m){return s(),t("div",null,n)}const g=e(a,[["render",r]]);export{f as __pageData,g as default}; diff --git a/assets/en_backend_backend.md.8e9cMM_I.js b/assets/en_backend_backend.md.Dc1YQFrm.js similarity index 98% rename from assets/en_backend_backend.md.8e9cMM_I.js rename to assets/en_backend_backend.md.Dc1YQFrm.js index d48596100..f1de85380 100644 --- a/assets/en_backend_backend.md.8e9cMM_I.js +++ b/assets/en_backend_backend.md.Dc1YQFrm.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Options to leverage your backend for frontenders","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/backend.md","filePath":"en/backend/backend.md","lastUpdated":1706427418000}'),s={name:"en/backend/backend.md"},r=o('

Options to leverage your backend for frontenders

How to test frontend on backend data?

There are many services that offer their API with different data for testing or full-fledged work

For example, jsonplaceholder.typicode.com.

Google "json placeholder".

Are there any free open APIs with real data?

Plenty. For example, here

Google public api.

You can also poke around relevant sites in DevTools / Network for endpoints with data in a suitable format

How to make your own backend?

If you already know JavaScript, it should not be a problem to install and run Node.js with an HTTP server.

Node.js is not a very popular server for the Internet, but for a small project will do.

In absolute terms, it is easiest to install and start working with Nginx and PHP

Most major cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to run a virtual server. By putting what is required there, you can want both a back end and a front end bundle.

What is BaaS (Backend as a service)?

It is a cloud solution where the backend in the form of a database and its access interface, and possibly the ability to use some logic, is provided by a BaaS provider.

For example, a NoSQL database and access to it is provided by Google using its Firebase service

Alternative with PostgreSQL - Supabase

That is, your frontend will access their specific endpoints and get the services you need - for example, to save and query data in the database.

Both services provide the ability to do authentication on the site. Thus, a front-end developer can write an application using such a service without writing his own backend code and without placing it somewhere on a server on the Internet.

These services have free plans with rather large resources.

Business logic on BaaS

Most BaaS services provide not only CRUD access to their database, but also the ability to write custom logic in the form of Cloud Functions in Firebase, Edge Functions in Supabase, AWS Lambda in Amazon, etc.

These functions are code in some programming language that will be called when a certain backend endpoint is accessed.

In case a frontend developer wants to make a full-fledged application, but doesn't want to bother with a standalone backend, this is a pretty good and very economical solution.

How Edge/Cloud/Lamda features work

It's basically a backend in miniature

Your front end accesses a given endpoint (via the BaaS provider's BaaS service API gateway) - e.g. /api/somefunc

There lies a script written by you in js or other programming language, which is executed, has access to the database and can do other things (load data from the internet for example).

Then the script generates a result and returns it to your front end.

',7),n=[r];function i(d,c,l,p,u,h){return t(),a("div",null,n)}const f=e(s,[["render",i]]);export{b as __pageData,f as default}; +import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Options to leverage your backend for frontenders","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/backend.md","filePath":"en/backend/backend.md","lastUpdated":1706553672000}'),s={name:"en/backend/backend.md"},r=o('

Options to leverage your backend for frontenders

How to test frontend on backend data?

There are many services that offer their API with different data for testing or full-fledged work

For example, jsonplaceholder.typicode.com.

Google "json placeholder".

Are there any free open APIs with real data?

Plenty. For example, here

Google public api.

You can also poke around relevant sites in DevTools / Network for endpoints with data in a suitable format

How to make your own backend?

If you already know JavaScript, it should not be a problem to install and run Node.js with an HTTP server.

Node.js is not a very popular server for the Internet, but for a small project will do.

In absolute terms, it is easiest to install and start working with Nginx and PHP

Most major cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to run a virtual server. By putting what is required there, you can want both a back end and a front end bundle.

What is BaaS (Backend as a service)?

It is a cloud solution where the backend in the form of a database and its access interface, and possibly the ability to use some logic, is provided by a BaaS provider.

For example, a NoSQL database and access to it is provided by Google using its Firebase service

Alternative with PostgreSQL - Supabase

That is, your frontend will access their specific endpoints and get the services you need - for example, to save and query data in the database.

Both services provide the ability to do authentication on the site. Thus, a front-end developer can write an application using such a service without writing his own backend code and without placing it somewhere on a server on the Internet.

These services have free plans with rather large resources.

Business logic on BaaS

Most BaaS services provide not only CRUD access to their database, but also the ability to write custom logic in the form of Cloud Functions in Firebase, Edge Functions in Supabase, AWS Lambda in Amazon, etc.

These functions are code in some programming language that will be called when a certain backend endpoint is accessed.

In case a frontend developer wants to make a full-fledged application, but doesn't want to bother with a standalone backend, this is a pretty good and very economical solution.

How Edge/Cloud/Lamda features work

It's basically a backend in miniature

Your front end accesses a given endpoint (via the BaaS provider's BaaS service API gateway) - e.g. /api/somefunc

There lies a script written by you in js or other programming language, which is executed, has access to the database and can do other things (load data from the internet for example).

Then the script generates a result and returns it to your front end.

',7),n=[r];function i(d,c,l,p,u,h){return t(),a("div",null,n)}const f=e(s,[["render",i]]);export{b as __pageData,f as default}; diff --git a/assets/en_backend_backend.md.8e9cMM_I.lean.js b/assets/en_backend_backend.md.Dc1YQFrm.lean.js similarity index 86% rename from assets/en_backend_backend.md.8e9cMM_I.lean.js rename to assets/en_backend_backend.md.Dc1YQFrm.lean.js index e4258814e..06ff58121 100644 --- a/assets/en_backend_backend.md.8e9cMM_I.lean.js +++ b/assets/en_backend_backend.md.Dc1YQFrm.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Options to leverage your backend for frontenders","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/backend.md","filePath":"en/backend/backend.md","lastUpdated":1706427418000}'),s={name:"en/backend/backend.md"},r=o("",7),n=[r];function i(d,c,l,p,u,h){return t(),a("div",null,n)}const f=e(s,[["render",i]]);export{b as __pageData,f as default}; +import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Options to leverage your backend for frontenders","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/backend.md","filePath":"en/backend/backend.md","lastUpdated":1706553672000}'),s={name:"en/backend/backend.md"},r=o("",7),n=[r];function i(d,c,l,p,u,h){return t(),a("div",null,n)}const f=e(s,[["render",i]]);export{b as __pageData,f as default}; diff --git a/assets/en_backend_cors.md._1z5L3Ml.js b/assets/en_backend_cors.md.AEgp7eqQ.js similarity index 98% rename from assets/en_backend_cors.md._1z5L3Ml.js rename to assets/en_backend_cors.md.AEgp7eqQ.js index fb65b9add..41c6da85c 100644 --- a/assets/en_backend_cors.md._1z5L3Ml.js +++ b/assets/en_backend_cors.md.AEgp7eqQ.js @@ -1,3 +1,3 @@ -import{_ as e,c as s,o as t,U as a}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"CORS","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/cors.md","filePath":"en/backend/cors.md","lastUpdated":1706427418000}'),o={name:"en/backend/cors.md"},r=a(`

CORS

What are CORS?

Roughly speaking, CORS is used to protect your backend from outside requests by setting special HTTP headers.

More specifically, CORS (Cross-Origin Resource Sharing) is a standard that allows web pages to access objects from third-party Internet resources. A third-party resource is any Internet resource that differs from the requested one in protocol, domain, or port.

Access is granted by specialized requests. The Internet resource that receives the request contains a list of trusted sources that are allowed to access the objects. The source page of the request is granted access if it is on the list of trusted sources. The "*" mask is used to grant access to all third-party web pages.

Accordingly, only the backend can do all this, and it is configured on the backend. The specific solution depends on the backend language, the framework used, and even the webserver.

CORS working principle

When creating an HTTP cross-request, the client browser adds a domain declaration of the web page initiating the request. The domain is declared in the Origin section.

For example, the page https://client-1.com/page.html requests data from the page https://server-site.com/info. An example of a request from a client browser using CORS methods is shown below:

GET /info HTTP/1.1
+import{_ as e,c as s,o as t,U as a}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"CORS","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/cors.md","filePath":"en/backend/cors.md","lastUpdated":1706553672000}'),o={name:"en/backend/cors.md"},r=a(`

CORS

What are CORS?

Roughly speaking, CORS is used to protect your backend from outside requests by setting special HTTP headers.

More specifically, CORS (Cross-Origin Resource Sharing) is a standard that allows web pages to access objects from third-party Internet resources. A third-party resource is any Internet resource that differs from the requested one in protocol, domain, or port.

Access is granted by specialized requests. The Internet resource that receives the request contains a list of trusted sources that are allowed to access the objects. The source page of the request is granted access if it is on the list of trusted sources. The "*" mask is used to grant access to all third-party web pages.

Accordingly, only the backend can do all this, and it is configured on the backend. The specific solution depends on the backend language, the framework used, and even the webserver.

CORS working principle

When creating an HTTP cross-request, the client browser adds a domain declaration of the web page initiating the request. The domain is declared in the Origin section.

For example, the page https://client-1.com/page.html requests data from the page https://server-site.com/info. An example of a request from a client browser using CORS methods is shown below:

GET /info HTTP/1.1
 Host: server-site.com
 Origin: client-1.com

If the server at www.server-site.com allows the request source page to access data from the domain, the Access-Control-Allow-Origin line with the name of the declared domain will appear in its response to the request:

Access-Control-Allow-Origin: https://client-1.com

If the server to which access is requested does not add the specified string to the response, the client browser will return an error code instead of the info file data.

If the server allows pages from any third-party domain to access the resource, the response will contain the "*" mask.

Access-Control-Allow-Origin: *

If the server allows access not to all but a few third-party clients, the server response contains the names of all these domains printed as separate lines or separated by spaces:

Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com
Problems with CORS

CORS problems can occur only when a resource is accessed by a browser, not by a separate program like Postman or other backend.

As a temporary solution CORS proxy, which becomes an intermediary between frontend and backend, or browser extensions can help during development.

Vite provides such proxy for development.

`,4),n=[r];function i(c,l,p,d,h,m){return t(),s("div",null,n)}const b=e(o,[["render",i]]);export{g as __pageData,b as default}; diff --git a/assets/en_backend_cors.md._1z5L3Ml.lean.js b/assets/en_backend_cors.md.AEgp7eqQ.lean.js similarity index 84% rename from assets/en_backend_cors.md._1z5L3Ml.lean.js rename to assets/en_backend_cors.md.AEgp7eqQ.lean.js index 00ea18657..9b3eaec41 100644 --- a/assets/en_backend_cors.md._1z5L3Ml.lean.js +++ b/assets/en_backend_cors.md.AEgp7eqQ.lean.js @@ -1 +1 @@ -import{_ as e,c as s,o as t,U as a}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"CORS","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/cors.md","filePath":"en/backend/cors.md","lastUpdated":1706427418000}'),o={name:"en/backend/cors.md"},r=a("",4),n=[r];function i(c,l,p,d,h,m){return t(),s("div",null,n)}const b=e(o,[["render",i]]);export{g as __pageData,b as default}; +import{_ as e,c as s,o as t,U as a}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"CORS","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/cors.md","filePath":"en/backend/cors.md","lastUpdated":1706553672000}'),o={name:"en/backend/cors.md"},r=a("",4),n=[r];function i(c,l,p,d,h,m){return t(),s("div",null,n)}const b=e(o,[["render",i]]);export{g as __pageData,b as default}; diff --git a/assets/en_backend_protocols.md.J89YnQDP.js b/assets/en_backend_protocols.md.GRCJd-cS.js similarity index 97% rename from assets/en_backend_protocols.md.J89YnQDP.js rename to assets/en_backend_protocols.md.GRCJd-cS.js index c32c014d9..e6c41f57d 100644 --- a/assets/en_backend_protocols.md.J89YnQDP.js +++ b/assets/en_backend_protocols.md.GRCJd-cS.js @@ -1 +1 @@ -import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Protocols. To REST or not to REST?","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/protocols.md","filePath":"en/backend/protocols.md","lastUpdated":1706427418000}'),s={name:"en/backend/protocols.md"},r=a('

Protocols. To REST or not to REST?

REST, WebSockets, JSON-RPC

For a beginner, of course, it's more convenient to start with REST - requests to the server in any way.

For the more experienced, especially fullstackers, I suggest to take a look at JSON-RPC.

WebSockets is convenient because it gives bidirectional communication (the server can send messages to the client), but requires special software on the backend.

Why JSON-RPC?

After an experience with JSON-RPC, communication with back end is usually never the same again.

It gives order, clarity, rigor and at the same time flexibility. It greatly simplifies and makes code understandable both on the frontend and backend.

In addition, JSON-RPC is the de facto standard for Web 3.0 communications.

A variant of TypeScript implementation of frontend api service on JSON-RPC - here.

When using JSON-RPC, switching to WebSockets or other transport protocols will not cause any difficulties due to the unification of the message format.

How to organize reconnection of WebSocket connection on the front?

You need an Event bus, which will work as a proxy for incoming messages.

You can use mitt.

What is GraphGL?

A complex thing, an attempt to translate SQL query language for client-server queries on the web.

It has a rather specific use, mostly with third-party data providers via APIs.

For your own fullstack application - 99% unnecessary solution.

',5),n=[r];function i(c,l,d,p,m,u){return o(),t("div",null,n)}const b=e(s,[["render",i]]);export{f as __pageData,b as default}; +import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Protocols. To REST or not to REST?","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/protocols.md","filePath":"en/backend/protocols.md","lastUpdated":1706553672000}'),s={name:"en/backend/protocols.md"},r=a('

Protocols. To REST or not to REST?

REST, WebSockets, JSON-RPC

For a beginner, of course, it's more convenient to start with REST - requests to the server in any way.

For the more experienced, especially fullstackers, I suggest to take a look at JSON-RPC.

WebSockets is convenient because it gives bidirectional communication (the server can send messages to the client), but requires special software on the backend.

Why JSON-RPC?

After an experience with JSON-RPC, communication with back end is usually never the same again.

It gives order, clarity, rigor and at the same time flexibility. It greatly simplifies and makes code understandable both on the frontend and backend.

In addition, JSON-RPC is the de facto standard for Web 3.0 communications.

A variant of TypeScript implementation of frontend api service on JSON-RPC - here.

When using JSON-RPC, switching to WebSockets or other transport protocols will not cause any difficulties due to the unification of the message format.

How to organize reconnection of WebSocket connection on the front?

You need an Event bus, which will work as a proxy for incoming messages.

You can use mitt.

What is GraphGL?

A complex thing, an attempt to translate SQL query language for client-server queries on the web.

It has a rather specific use, mostly with third-party data providers via APIs.

For your own fullstack application - 99% unnecessary solution.

',5),n=[r];function i(c,l,d,p,m,u){return o(),t("div",null,n)}const b=e(s,[["render",i]]);export{f as __pageData,b as default}; diff --git a/assets/en_backend_protocols.md.J89YnQDP.lean.js b/assets/en_backend_protocols.md.GRCJd-cS.lean.js similarity index 85% rename from assets/en_backend_protocols.md.J89YnQDP.lean.js rename to assets/en_backend_protocols.md.GRCJd-cS.lean.js index aecafea00..0586c10b6 100644 --- a/assets/en_backend_protocols.md.J89YnQDP.lean.js +++ b/assets/en_backend_protocols.md.GRCJd-cS.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Protocols. To REST or not to REST?","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/protocols.md","filePath":"en/backend/protocols.md","lastUpdated":1706427418000}'),s={name:"en/backend/protocols.md"},r=a("",5),n=[r];function i(c,l,d,p,m,u){return o(),t("div",null,n)}const b=e(s,[["render",i]]);export{f as __pageData,b as default}; +import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Protocols. To REST or not to REST?","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend/protocols.md","filePath":"en/backend/protocols.md","lastUpdated":1706553672000}'),s={name:"en/backend/protocols.md"},r=a("",5),n=[r];function i(c,l,d,p,m,u){return o(),t("div",null,n)}const b=e(s,[["render",i]]);export{f as __pageData,b as default}; diff --git a/assets/en_deployment_ci-cd.md.VQJPAgq0.js b/assets/en_deployment_ci-cd.md.PJIpJdHA.js similarity index 90% rename from assets/en_deployment_ci-cd.md.VQJPAgq0.js rename to assets/en_deployment_ci-cd.md.PJIpJdHA.js index 06c54f56c..9ed939be4 100644 --- a/assets/en_deployment_ci-cd.md.VQJPAgq0.js +++ b/assets/en_deployment_ci-cd.md.PJIpJdHA.js @@ -1 +1 @@ -import{_ as t,c as o,o as n,m as e,a}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"CI/CD","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/ci-cd.md","filePath":"en/deployment/ci-cd.md","lastUpdated":1706427418000}'),i={name:"en/deployment/ci-cd.md"},s=e("h1",{id:"ci-cd",tabindex:"-1"},[a("CI/CD "),e("a",{class:"header-anchor",href:"#ci-cd","aria-label":'Permalink to "CI/CD"'},"​")],-1),r=e("details",{class:"details custom-block"},[e("summary",null,"What is CI/CD?"),e("p",null,"CI/CD (Continuous Integration, Continuous Delivery) is a technology for automating the build, testing and deployment of a project under development."),e("p",null,"In other words, the process of transition of code lying in a repository into a working product on a cloud server, for example."),e("p",null,"CI/CD elements are useful not only for a devops engineer, but also for a simple front-end developer, allowing him after git commit/push code changes to get a working site, for example, on GitHub Pages without additional actions."),e("p",null,"Main tools for CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis")],-1),l=[s,r];function c(d,p,u,m,f,h){return n(),o("div",null,l)}const g=t(i,[["render",c]]);export{_ as __pageData,g as default}; +import{_ as t,c as o,o as n,m as e,a}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"CI/CD","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/ci-cd.md","filePath":"en/deployment/ci-cd.md","lastUpdated":1706553672000}'),i={name:"en/deployment/ci-cd.md"},s=e("h1",{id:"ci-cd",tabindex:"-1"},[a("CI/CD "),e("a",{class:"header-anchor",href:"#ci-cd","aria-label":'Permalink to "CI/CD"'},"​")],-1),r=e("details",{class:"details custom-block"},[e("summary",null,"What is CI/CD?"),e("p",null,"CI/CD (Continuous Integration, Continuous Delivery) is a technology for automating the build, testing and deployment of a project under development."),e("p",null,"In other words, the process of transition of code lying in a repository into a working product on a cloud server, for example."),e("p",null,"CI/CD elements are useful not only for a devops engineer, but also for a simple front-end developer, allowing him after git commit/push code changes to get a working site, for example, on GitHub Pages without additional actions."),e("p",null,"Main tools for CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis")],-1),l=[s,r];function c(d,p,u,m,f,h){return n(),o("div",null,l)}const g=t(i,[["render",c]]);export{_ as __pageData,g as default}; diff --git a/assets/en_deployment_ci-cd.md.VQJPAgq0.lean.js b/assets/en_deployment_ci-cd.md.PJIpJdHA.lean.js similarity index 90% rename from assets/en_deployment_ci-cd.md.VQJPAgq0.lean.js rename to assets/en_deployment_ci-cd.md.PJIpJdHA.lean.js index 06c54f56c..9ed939be4 100644 --- a/assets/en_deployment_ci-cd.md.VQJPAgq0.lean.js +++ b/assets/en_deployment_ci-cd.md.PJIpJdHA.lean.js @@ -1 +1 @@ -import{_ as t,c as o,o as n,m as e,a}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"CI/CD","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/ci-cd.md","filePath":"en/deployment/ci-cd.md","lastUpdated":1706427418000}'),i={name:"en/deployment/ci-cd.md"},s=e("h1",{id:"ci-cd",tabindex:"-1"},[a("CI/CD "),e("a",{class:"header-anchor",href:"#ci-cd","aria-label":'Permalink to "CI/CD"'},"​")],-1),r=e("details",{class:"details custom-block"},[e("summary",null,"What is CI/CD?"),e("p",null,"CI/CD (Continuous Integration, Continuous Delivery) is a technology for automating the build, testing and deployment of a project under development."),e("p",null,"In other words, the process of transition of code lying in a repository into a working product on a cloud server, for example."),e("p",null,"CI/CD elements are useful not only for a devops engineer, but also for a simple front-end developer, allowing him after git commit/push code changes to get a working site, for example, on GitHub Pages without additional actions."),e("p",null,"Main tools for CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis")],-1),l=[s,r];function c(d,p,u,m,f,h){return n(),o("div",null,l)}const g=t(i,[["render",c]]);export{_ as __pageData,g as default}; +import{_ as t,c as o,o as n,m as e,a}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"CI/CD","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/ci-cd.md","filePath":"en/deployment/ci-cd.md","lastUpdated":1706553672000}'),i={name:"en/deployment/ci-cd.md"},s=e("h1",{id:"ci-cd",tabindex:"-1"},[a("CI/CD "),e("a",{class:"header-anchor",href:"#ci-cd","aria-label":'Permalink to "CI/CD"'},"​")],-1),r=e("details",{class:"details custom-block"},[e("summary",null,"What is CI/CD?"),e("p",null,"CI/CD (Continuous Integration, Continuous Delivery) is a technology for automating the build, testing and deployment of a project under development."),e("p",null,"In other words, the process of transition of code lying in a repository into a working product on a cloud server, for example."),e("p",null,"CI/CD elements are useful not only for a devops engineer, but also for a simple front-end developer, allowing him after git commit/push code changes to get a working site, for example, on GitHub Pages without additional actions."),e("p",null,"Main tools for CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis")],-1),l=[s,r];function c(d,p,u,m,f,h){return n(),o("div",null,l)}const g=t(i,[["render",c]]);export{_ as __pageData,g as default}; diff --git a/assets/en_deployment_docker.md.p5ZFnPVP.js b/assets/en_deployment_docker.md.6-y4RM0b.js similarity index 77% rename from assets/en_deployment_docker.md.p5ZFnPVP.js rename to assets/en_deployment_docker.md.6-y4RM0b.js index a079ec6ad..a58bd81b6 100644 --- a/assets/en_deployment_docker.md.p5ZFnPVP.js +++ b/assets/en_deployment_docker.md.6-y4RM0b.js @@ -1 +1 @@ -import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Docker","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/docker.md","filePath":"en/deployment/docker.md","lastUpdated":1706427418000}'),c={name:"en/deployment/docker.md"},d=e("h1",{id:"docker",tabindex:"-1"},[r("Docker "),e("a",{class:"header-anchor",href:"#docker","aria-label":'Permalink to "Docker"'},"​")],-1),n=[d];function s(l,i,p,_,m,k){return o(),a("div",null,n)}const u=t(c,[["render",s]]);export{f as __pageData,u as default}; +import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Docker","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/docker.md","filePath":"en/deployment/docker.md","lastUpdated":1706553672000}'),c={name:"en/deployment/docker.md"},d=e("h1",{id:"docker",tabindex:"-1"},[r("Docker "),e("a",{class:"header-anchor",href:"#docker","aria-label":'Permalink to "Docker"'},"​")],-1),n=[d];function s(l,i,p,_,m,k){return o(),a("div",null,n)}const u=t(c,[["render",s]]);export{f as __pageData,u as default}; diff --git a/assets/en_deployment_docker.md.p5ZFnPVP.lean.js b/assets/en_deployment_docker.md.6-y4RM0b.lean.js similarity index 77% rename from assets/en_deployment_docker.md.p5ZFnPVP.lean.js rename to assets/en_deployment_docker.md.6-y4RM0b.lean.js index a079ec6ad..a58bd81b6 100644 --- a/assets/en_deployment_docker.md.p5ZFnPVP.lean.js +++ b/assets/en_deployment_docker.md.6-y4RM0b.lean.js @@ -1 +1 @@ -import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Docker","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/docker.md","filePath":"en/deployment/docker.md","lastUpdated":1706427418000}'),c={name:"en/deployment/docker.md"},d=e("h1",{id:"docker",tabindex:"-1"},[r("Docker "),e("a",{class:"header-anchor",href:"#docker","aria-label":'Permalink to "Docker"'},"​")],-1),n=[d];function s(l,i,p,_,m,k){return o(),a("div",null,n)}const u=t(c,[["render",s]]);export{f as __pageData,u as default}; +import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Docker","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/docker.md","filePath":"en/deployment/docker.md","lastUpdated":1706553672000}'),c={name:"en/deployment/docker.md"},d=e("h1",{id:"docker",tabindex:"-1"},[r("Docker "),e("a",{class:"header-anchor",href:"#docker","aria-label":'Permalink to "Docker"'},"​")],-1),n=[d];function s(l,i,p,_,m,k){return o(),a("div",null,n)}const u=t(c,[["render",s]]);export{f as __pageData,u as default}; diff --git a/assets/en_deployment_github-actions.md.pl-x1DsQ.js b/assets/en_deployment_github-actions.md.gG8niTIX.js similarity index 99% rename from assets/en_deployment_github-actions.md.pl-x1DsQ.js rename to assets/en_deployment_github-actions.md.gG8niTIX.js index 69a499c32..41286a645 100644 --- a/assets/en_deployment_github-actions.md.pl-x1DsQ.js +++ b/assets/en_deployment_github-actions.md.gG8niTIX.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Github Actions","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/github-actions.md","filePath":"en/deployment/github-actions.md","lastUpdated":1706427418000}'),t={name:"en/deployment/github-actions.md"},h=n(`

Github Actions

What are GitHub Actions?

GitHub Actions are the most popular and convenient way to automate build, test and deployment, so it is recommended to learn them for both pet and large commercial projects.

Your code should be on GitHub, naturally.

Add a file .github/workflows/deploy.yaml (the name of the file itself can be anything) to the root of your repository

It will contain the GitHub Actions instructions.

GitHub Actions - sample deploy on GitHub Pages

Sample configuration file of this project (Vue-Faq) with deployment to Github Pages

yaml
# .github/workflows/deploy.yaml
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Github Actions","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/github-actions.md","filePath":"en/deployment/github-actions.md","lastUpdated":1706553672000}'),t={name:"en/deployment/github-actions.md"},h=n(`

Github Actions

What are GitHub Actions?

GitHub Actions are the most popular and convenient way to automate build, test and deployment, so it is recommended to learn them for both pet and large commercial projects.

Your code should be on GitHub, naturally.

Add a file .github/workflows/deploy.yaml (the name of the file itself can be anything) to the root of your repository

It will contain the GitHub Actions instructions.

GitHub Actions - sample deploy on GitHub Pages

Sample configuration file of this project (Vue-Faq) with deployment to Github Pages

yaml
# .github/workflows/deploy.yaml
 
 name: Build and Deploy
 on:
diff --git a/assets/en_deployment_github-actions.md.pl-x1DsQ.lean.js b/assets/en_deployment_github-actions.md.gG8niTIX.lean.js
similarity index 86%
rename from assets/en_deployment_github-actions.md.pl-x1DsQ.lean.js
rename to assets/en_deployment_github-actions.md.gG8niTIX.lean.js
index 61f239aa2..4db5ff32e 100644
--- a/assets/en_deployment_github-actions.md.pl-x1DsQ.lean.js
+++ b/assets/en_deployment_github-actions.md.gG8niTIX.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Github Actions","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/github-actions.md","filePath":"en/deployment/github-actions.md","lastUpdated":1706427418000}'),t={name:"en/deployment/github-actions.md"},h=n("",4),l=[h];function p(e,k,E,d,r,o){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{y as __pageData,c as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Github Actions","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/github-actions.md","filePath":"en/deployment/github-actions.md","lastUpdated":1706553672000}'),t={name:"en/deployment/github-actions.md"},h=n("",4),l=[h];function p(e,k,E,d,r,o){return a(),i("div",null,l)}const c=s(t,[["render",p]]);export{y as __pageData,c as default};
diff --git a/assets/en_deployment_hosting.md.bOwl1cI0.js b/assets/en_deployment_hosting.md.-XiBnR9w.js
similarity index 95%
rename from assets/en_deployment_hosting.md.bOwl1cI0.js
rename to assets/en_deployment_hosting.md.-XiBnR9w.js
index 0a0f43d2e..5fe7a580d 100644
--- a/assets/en_deployment_hosting.md.bOwl1cI0.js
+++ b/assets/en_deployment_hosting.md.-XiBnR9w.js
@@ -1 +1 @@
-import{_ as e,c as t,o,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Hosting","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/hosting.md","filePath":"en/deployment/hosting.md","lastUpdated":1706427418000}'),a={name:"en/deployment/hosting.md"},i=r('

Hosting

Where to host a website?

After building a frontend project, you get a set of html/css/js/jpeg and other static files that need to be hosted on some webserver for your website to be online.

Hosting options with free plans:

Also, many cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to get a virtual server on which you can install a webserver (Nginx, Apache) and your website yourself. In this case, the backend can also be placed on it.

Domain

Buying a domain is now very easy and inexpensive (from $1 per year), so it is recommended to do so. GitHub Pages and other hosting providers allow you to connect a custom domain to your site. Subdomains are convenient for organizing development environments:

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL certificates

Modern browsers require a website to be accessible via HTTPS protocol. This requires an SSL certificate for your domain. Hosting providers like Firebase or Github Pages will provide you with the certificate themselves. If you host your site yourself on a cloud server, you can generate the certificate using CertBot software.

',4),s=[i];function n(l,c,d,m,h,p){return o(),t("div",null,s)}const b=e(a,[["render",n]]);export{f as __pageData,b as default}; +import{_ as e,c as t,o,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Hosting","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/hosting.md","filePath":"en/deployment/hosting.md","lastUpdated":1706553672000}'),a={name:"en/deployment/hosting.md"},i=r('

Hosting

Where to host a website?

After building a frontend project, you get a set of html/css/js/jpeg and other static files that need to be hosted on some webserver for your website to be online.

Hosting options with free plans:

Also, many cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to get a virtual server on which you can install a webserver (Nginx, Apache) and your website yourself. In this case, the backend can also be placed on it.

Domain

Buying a domain is now very easy and inexpensive (from $1 per year), so it is recommended to do so. GitHub Pages and other hosting providers allow you to connect a custom domain to your site. Subdomains are convenient for organizing development environments:

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL certificates

Modern browsers require a website to be accessible via HTTPS protocol. This requires an SSL certificate for your domain. Hosting providers like Firebase or Github Pages will provide you with the certificate themselves. If you host your site yourself on a cloud server, you can generate the certificate using CertBot software.

',4),s=[i];function n(l,c,d,m,h,p){return o(),t("div",null,s)}const b=e(a,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/en_deployment_hosting.md.bOwl1cI0.lean.js b/assets/en_deployment_hosting.md.-XiBnR9w.lean.js similarity index 70% rename from assets/en_deployment_hosting.md.bOwl1cI0.lean.js rename to assets/en_deployment_hosting.md.-XiBnR9w.lean.js index f6374f0e4..e32041bf5 100644 --- a/assets/en_deployment_hosting.md.bOwl1cI0.lean.js +++ b/assets/en_deployment_hosting.md.-XiBnR9w.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Hosting","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/hosting.md","filePath":"en/deployment/hosting.md","lastUpdated":1706427418000}'),a={name:"en/deployment/hosting.md"},i=r("",4),s=[i];function n(l,c,d,m,h,p){return o(),t("div",null,s)}const b=e(a,[["render",n]]);export{f as __pageData,b as default}; +import{_ as e,c as t,o,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Hosting","description":"","frontmatter":{},"headers":[],"relativePath":"en/deployment/hosting.md","filePath":"en/deployment/hosting.md","lastUpdated":1706553672000}'),a={name:"en/deployment/hosting.md"},i=r("",4),s=[i];function n(l,c,d,m,h,p){return o(),t("div",null,s)}const b=e(a,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/en_development_architectural-patterns.md.DMr5v5ci.js b/assets/en_development_architectural-patterns.md.Ow-fYR7u.js similarity index 99% rename from assets/en_development_architectural-patterns.md.DMr5v5ci.js rename to assets/en_development_architectural-patterns.md.Ow-fYR7u.js index 5c27e7bde..c064ff6fb 100644 --- a/assets/en_development_architectural-patterns.md.DMr5v5ci.js +++ b/assets/en_development_architectural-patterns.md.Ow-fYR7u.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Architectural patterns","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/architectural-patterns.md","filePath":"en/development/architectural-patterns.md","lastUpdated":1706427418000}'),n={name:"en/development/architectural-patterns.md"},e=t(`

Architectural patterns

Suitable architecture for Vue 3 web application

The most suitable architecture for a Vue 3 application is modular.

Initially, the application is divided into logical modules that are loosely related to each other. For example, for an online store, it can be a product catalog module, a module of a single product, a user account module etc.

In addition, there is a shell module - what is sometimes referred to as app shell. A template with a header, footer, side menu and main window. It is wise to put utilities and resources used throughout the application into this module - for example, api, useI18n, BaseButtonandstringHelpers.

Each module has its own components, composables, assets, utils; probably api, routes, views, layouts.

Loose coupling allows each module to be developed fairly independently, which greatly increases the likelihood of project success.

How to reuse the same developed resources on several projects?

Sometimes there are two or more projects (admin panel and website, for example) that need to use the same components, utilities, services, composite functions and other resources that are in the process of development.

The most convenient in this case is to separate such resources into a separate project/repository, and use Git submodules to connect it as a subdirectory in each project. VS Code allows you to work transparently and comfortably with both the project and connected submodules at the same time.

If you need versioning and independence of the resource library, you can make it as a private NPM package.

Use cases for using Provide/Inject

Use cases

  • Theme or Configuration Settings: You can provide global settings, themes, or configuration options at the root level of your Vue.js application and inject them into any component that needs them.
  • Authentication Data: Share user authentication information, such as user details or authentication tokens, with components that require them without passing them down through props.
  • Internationalization (i18n): Store translation data at the root level and inject it into components that need to display text in different languages.
  • Tightly coupled components: Like i.e. AccordianPanel that only ever appears inside of an Accordian component slot. You can inject shared data that you always want to have access to it without the need to pass it in as a prop.

Best Practices and Considerations

  • Avoid Overuse: While provide and inject can be powerful, don't overuse them. Reserve them for cases where you genuinely need to share data across components without creating tight coupling between them.
  • Clear Documentation: Document the data you are providing and injecting to make it easy for developers to understand how components communicate. You can also type them with TypeScript see the official documentation for details.
  • Consider Prop Drilling: Prop drilling is usually an anti-pattern, but in some cases, passing data through props might still be a more straightforward and more transparent approach. Evaluate whether provide and inject are the best solution for your specific scenario.
What is the best way to organise work with app layouts?

An application can have several layouts - one with a side menu, for example, and one without. Some pages are shown with side menu, others - without.

It is convenient to regulate this by routes. Just create two nested router-views - the outer one is responsible for the app layout, and the inner one (there can be several) is responsible for the components in that layout.

An example:

vue
// MainLayout
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Architectural patterns","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/architectural-patterns.md","filePath":"en/development/architectural-patterns.md","lastUpdated":1706553672000}'),n={name:"en/development/architectural-patterns.md"},e=t(`

Architectural patterns

Suitable architecture for Vue 3 web application

The most suitable architecture for a Vue 3 application is modular.

Initially, the application is divided into logical modules that are loosely related to each other. For example, for an online store, it can be a product catalog module, a module of a single product, a user account module etc.

In addition, there is a shell module - what is sometimes referred to as app shell. A template with a header, footer, side menu and main window. It is wise to put utilities and resources used throughout the application into this module - for example, api, useI18n, BaseButtonandstringHelpers.

Each module has its own components, composables, assets, utils; probably api, routes, views, layouts.

Loose coupling allows each module to be developed fairly independently, which greatly increases the likelihood of project success.

How to reuse the same developed resources on several projects?

Sometimes there are two or more projects (admin panel and website, for example) that need to use the same components, utilities, services, composite functions and other resources that are in the process of development.

The most convenient in this case is to separate such resources into a separate project/repository, and use Git submodules to connect it as a subdirectory in each project. VS Code allows you to work transparently and comfortably with both the project and connected submodules at the same time.

If you need versioning and independence of the resource library, you can make it as a private NPM package.

Use cases for using Provide/Inject

Use cases

  • Theme or Configuration Settings: You can provide global settings, themes, or configuration options at the root level of your Vue.js application and inject them into any component that needs them.
  • Authentication Data: Share user authentication information, such as user details or authentication tokens, with components that require them without passing them down through props.
  • Internationalization (i18n): Store translation data at the root level and inject it into components that need to display text in different languages.
  • Tightly coupled components: Like i.e. AccordianPanel that only ever appears inside of an Accordian component slot. You can inject shared data that you always want to have access to it without the need to pass it in as a prop.

Best Practices and Considerations

  • Avoid Overuse: While provide and inject can be powerful, don't overuse them. Reserve them for cases where you genuinely need to share data across components without creating tight coupling between them.
  • Clear Documentation: Document the data you are providing and injecting to make it easy for developers to understand how components communicate. You can also type them with TypeScript see the official documentation for details.
  • Consider Prop Drilling: Prop drilling is usually an anti-pattern, but in some cases, passing data through props might still be a more straightforward and more transparent approach. Evaluate whether provide and inject are the best solution for your specific scenario.
What is the best way to organise work with app layouts?

An application can have several layouts - one with a side menu, for example, and one without. Some pages are shown with side menu, others - without.

It is convenient to regulate this by routes. Just create two nested router-views - the outer one is responsible for the app layout, and the inner one (there can be several) is responsible for the components in that layout.

An example:

vue
// MainLayout
 <template>
   <div>
     <AppHeader />
diff --git a/assets/en_development_architectural-patterns.md.DMr5v5ci.lean.js b/assets/en_development_architectural-patterns.md.Ow-fYR7u.lean.js
similarity index 87%
rename from assets/en_development_architectural-patterns.md.DMr5v5ci.lean.js
rename to assets/en_development_architectural-patterns.md.Ow-fYR7u.lean.js
index bb6da266b..0319a3862 100644
--- a/assets/en_development_architectural-patterns.md.DMr5v5ci.lean.js
+++ b/assets/en_development_architectural-patterns.md.Ow-fYR7u.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Architectural patterns","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/architectural-patterns.md","filePath":"en/development/architectural-patterns.md","lastUpdated":1706427418000}'),n={name:"en/development/architectural-patterns.md"},e=t("",6),l=[e];function p(h,k,r,o,E,d){return a(),i("div",null,l)}const y=s(n,[["render",p]]);export{g as __pageData,y as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Architectural patterns","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/architectural-patterns.md","filePath":"en/development/architectural-patterns.md","lastUpdated":1706553672000}'),n={name:"en/development/architectural-patterns.md"},e=t("",6),l=[e];function p(h,k,r,o,E,d){return a(),i("div",null,l)}const y=s(n,[["render",p]]);export{g as __pageData,y as default};
diff --git a/assets/en_development_assets.md.rVbydSNn.js b/assets/en_development_assets.md.VgFcQL7I.js
similarity index 99%
rename from assets/en_development_assets.md.rVbydSNn.js
rename to assets/en_development_assets.md.VgFcQL7I.js
index 3624ac72b..df8481629 100644
--- a/assets/en_development_assets.md.rVbydSNn.js
+++ b/assets/en_development_assets.md.VgFcQL7I.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Application Resources","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/assets.md","filePath":"en/development/assets.md","lastUpdated":1706427418000}'),h={name:"en/development/assets.md"},t=n(`

Application Resources

Application Resources

Resources refer to images, icons, audio, video, json, pdf and other files that your application can use either internally or to display on a page.

Should I put images in the public or assets folder?

From the public folder, resources (e.g. images) are connected in your application via HTTP(S), downloaded as needed from the server - as they have always been.

Resources in the assets folder (and in general from any subdirectory in src/) are renamed (a hash is added - like social-banner-e88a22df.png) and placed in the dist/assets folder, or, if they are small images, they can be Base64 encoded and placed in your js bandle. In the browser application they are available immediately, but the size of the js bandle is increased by the size of the resources, which increases the loading speed.

The resources are accessed via import:

js
// gets url to the resource
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Application Resources","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/assets.md","filePath":"en/development/assets.md","lastUpdated":1706553672000}'),h={name:"en/development/assets.md"},t=n(`

Application Resources

Application Resources

Resources refer to images, icons, audio, video, json, pdf and other files that your application can use either internally or to display on a page.

Should I put images in the public or assets folder?

From the public folder, resources (e.g. images) are connected in your application via HTTP(S), downloaded as needed from the server - as they have always been.

Resources in the assets folder (and in general from any subdirectory in src/) are renamed (a hash is added - like social-banner-e88a22df.png) and placed in the dist/assets folder, or, if they are small images, they can be Base64 encoded and placed in your js bandle. In the browser application they are available immediately, but the size of the js bandle is increased by the size of the resources, which increases the loading speed.

The resources are accessed via import:

js
// gets url to the resource
 import imageUrl from "./image.img";
 
 // gets raw (string) representation of the resource
diff --git a/assets/en_development_assets.md.rVbydSNn.lean.js b/assets/en_development_assets.md.VgFcQL7I.lean.js
similarity index 85%
rename from assets/en_development_assets.md.rVbydSNn.lean.js
rename to assets/en_development_assets.md.VgFcQL7I.lean.js
index c3ebbab60..62cada7f6 100644
--- a/assets/en_development_assets.md.rVbydSNn.lean.js
+++ b/assets/en_development_assets.md.VgFcQL7I.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Application Resources","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/assets.md","filePath":"en/development/assets.md","lastUpdated":1706427418000}'),h={name:"en/development/assets.md"},t=n("",9),l=[t];function p(e,k,E,r,d,g){return a(),i("div",null,l)}const c=s(h,[["render",p]]);export{y as __pageData,c as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Application Resources","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/assets.md","filePath":"en/development/assets.md","lastUpdated":1706553672000}'),h={name:"en/development/assets.md"},t=n("",9),l=[t];function p(e,k,E,r,d,g){return a(),i("div",null,l)}const c=s(h,[["render",p]]);export{y as __pageData,c as default};
diff --git a/assets/en_development_building.md.S-5E4ojj.js b/assets/en_development_building.md.yaawOfbG.js
similarity index 99%
rename from assets/en_development_building.md.S-5E4ojj.js
rename to assets/en_development_building.md.yaawOfbG.js
index 80c751e7c..5d1aa219a 100644
--- a/assets/en_development_building.md.S-5E4ojj.js
+++ b/assets/en_development_building.md.yaawOfbG.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Create and build an application","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/building.md","filePath":"en/development/building.md","lastUpdated":1706427418000}'),n={name:"en/development/building.md"},t=e(`

Create and build an application

Building an application

To build a Vue project into browser-friendly files, you need a builder. The most popular ones are Vite and Webpack.

Vite is newer and uses modern technologies including esbuild for dev builds to transpile TypeScript to JavaScript, which is 20~30 times faster than regular tsc, making HMR dozens of times faster than on Webpack. The Rollup builder is used to build JavaScript for production.

Note that each builder collects application resources (icons, SVGs, etc.) in its own way, using its own plugins, and requires customization.

Both builders allow you to extend their capabilities with custom plugins.

Vite or Webpack?

Vite.

If you need Webpack, you'll know it yourself.

npm, yarn or pnpm?

It is recommended to use pnpm as the most up-to-date one

Also, by using hard links instead of copying files, it saves a lot of disk space on your computer in case of multiple projects with node_modules and the same packages in them.

Creating a Vue application

Vue-cli is an obsolete method

Create directly through Vite:

sh
pnpm create vite

Or in an online sandbox.

See Vite's website for more information.

How to configure the @ alias?

Alias is a builder setting, and is set differently for each builder.

To use the @ alias in paths in a project with Vite

js
import BaseIcon from "@/components/ui/BaseIcon.vue";

you need to configure it in vite.config.j(t)s:

js
// vite.config.js
+import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Create and build an application","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/building.md","filePath":"en/development/building.md","lastUpdated":1706553672000}'),n={name:"en/development/building.md"},t=e(`

Create and build an application

Building an application

To build a Vue project into browser-friendly files, you need a builder. The most popular ones are Vite and Webpack.

Vite is newer and uses modern technologies including esbuild for dev builds to transpile TypeScript to JavaScript, which is 20~30 times faster than regular tsc, making HMR dozens of times faster than on Webpack. The Rollup builder is used to build JavaScript for production.

Note that each builder collects application resources (icons, SVGs, etc.) in its own way, using its own plugins, and requires customization.

Both builders allow you to extend their capabilities with custom plugins.

Vite or Webpack?

Vite.

If you need Webpack, you'll know it yourself.

npm, yarn or pnpm?

It is recommended to use pnpm as the most up-to-date one

Also, by using hard links instead of copying files, it saves a lot of disk space on your computer in case of multiple projects with node_modules and the same packages in them.

Creating a Vue application

Vue-cli is an obsolete method

Create directly through Vite:

sh
pnpm create vite

Or in an online sandbox.

See Vite's website for more information.

How to configure the @ alias?

Alias is a builder setting, and is set differently for each builder.

To use the @ alias in paths in a project with Vite

js
import BaseIcon from "@/components/ui/BaseIcon.vue";

you need to configure it in vite.config.j(t)s:

js
// vite.config.js
 import path from "node:path";
 
 export default defineConfig({
diff --git a/assets/en_development_building.md.S-5E4ojj.lean.js b/assets/en_development_building.md.yaawOfbG.lean.js
similarity index 86%
rename from assets/en_development_building.md.S-5E4ojj.lean.js
rename to assets/en_development_building.md.yaawOfbG.lean.js
index 5408a6eeb..6bc8efffc 100644
--- a/assets/en_development_building.md.S-5E4ojj.lean.js
+++ b/assets/en_development_building.md.yaawOfbG.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Create and build an application","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/building.md","filePath":"en/development/building.md","lastUpdated":1706427418000}'),n={name:"en/development/building.md"},t=e("",7),l=[t];function p(h,o,d,k,r,c){return a(),i("div",null,l)}const E=s(n,[["render",p]]);export{g as __pageData,E as default};
+import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Create and build an application","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/building.md","filePath":"en/development/building.md","lastUpdated":1706553672000}'),n={name:"en/development/building.md"},t=e("",7),l=[t];function p(h,o,d,k,r,c){return a(),i("div",null,l)}const E=s(n,[["render",p]]);export{g as __pageData,E as default};
diff --git a/assets/en_development_ide.md.8LaVkPGa.js b/assets/en_development_ide.md.Ve6NOYDN.js
similarity index 99%
rename from assets/en_development_ide.md.8LaVkPGa.js
rename to assets/en_development_ide.md.Ve6NOYDN.js
index f94d73acc..22c4f6672 100644
--- a/assets/en_development_ide.md.8LaVkPGa.js
+++ b/assets/en_development_ide.md.Ve6NOYDN.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"Configuring the IDE","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/ide.md","filePath":"en/development/ide.md","lastUpdated":1706427418000}'),t={name:"en/development/ide.md"},l=n(`

Configuring the IDE

Which IDE should I choose?

Vue is recommended by Microsoft VS Code. The second most popular is WebStorm

In VS Code, new official extensions for Vue appear much earlier, and in general this environment is very convenient for development in general, there are a lot of useful extensions - for example, you can run a GitHub Action and see its output right in the editor.

WebStorm gives more possibilities to work in js, html, but it glitches with TypeScript and not only in SFC script setup, and in general it doesn't keep up with changes in Vue.

For beginners VS Code is the best choice

Necessary VS Code extensions

When working with Vite and Vue 3:

  • ESlint
  • Volar

Could be useful:

  • Typescript Vue Plugin
  • Codeium
  • SFTP
  • GitHub Actions
VS Code Customization

VS Code allows you to do very fine customization. For example, try creating this local customization file .vscode/setting.json and see how the editor changes.

settings.json
json
{
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"Configuring the IDE","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/ide.md","filePath":"en/development/ide.md","lastUpdated":1706553672000}'),t={name:"en/development/ide.md"},l=n(`

Configuring the IDE

Which IDE should I choose?

Vue is recommended by Microsoft VS Code. The second most popular is WebStorm

In VS Code, new official extensions for Vue appear much earlier, and in general this environment is very convenient for development in general, there are a lot of useful extensions - for example, you can run a GitHub Action and see its output right in the editor.

WebStorm gives more possibilities to work in js, html, but it glitches with TypeScript and not only in SFC script setup, and in general it doesn't keep up with changes in Vue.

For beginners VS Code is the best choice

Necessary VS Code extensions

When working with Vite and Vue 3:

  • ESlint
  • Volar

Could be useful:

  • Typescript Vue Plugin
  • Codeium
  • SFTP
  • GitHub Actions
VS Code Customization

VS Code allows you to do very fine customization. For example, try creating this local customization file .vscode/setting.json and see how the editor changes.

settings.json
json
{
     "editor.formatOnSave": false,
     "editor.defaultFormatter": "esbenp.prettier-vscode",
     "[vue]": {
diff --git a/assets/en_development_ide.md.8LaVkPGa.lean.js b/assets/en_development_ide.md.Ve6NOYDN.lean.js
similarity index 85%
rename from assets/en_development_ide.md.8LaVkPGa.lean.js
rename to assets/en_development_ide.md.Ve6NOYDN.lean.js
index d2dfb578d..a6a820986 100644
--- a/assets/en_development_ide.md.8LaVkPGa.lean.js
+++ b/assets/en_development_ide.md.Ve6NOYDN.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"Configuring the IDE","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/ide.md","filePath":"en/development/ide.md","lastUpdated":1706427418000}'),t={name:"en/development/ide.md"},l=n("",8),h=[l];function p(k,e,o,r,E,g){return a(),i("div",null,h)}const u=s(t,[["render",p]]);export{d as __pageData,u as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"Configuring the IDE","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/ide.md","filePath":"en/development/ide.md","lastUpdated":1706553672000}'),t={name:"en/development/ide.md"},l=n("",8),h=[l];function p(k,e,o,r,E,g){return a(),i("div",null,h)}const u=s(t,[["render",p]]);export{d as __pageData,u as default};
diff --git a/assets/en_development_libraries.md.1rB3ZLlM.js b/assets/en_development_libraries.md.XxHR0pP1.js
similarity index 95%
rename from assets/en_development_libraries.md.1rB3ZLlM.js
rename to assets/en_development_libraries.md.XxHR0pP1.js
index 03dfcffec..d02b09e74 100644
--- a/assets/en_development_libraries.md.1rB3ZLlM.js
+++ b/assets/en_development_libraries.md.XxHR0pP1.js
@@ -1 +1 @@
-import{_ as e,c as a,o as r,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Tell me a handy library","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/libraries.md","filePath":"en/development/libraries.md","lastUpdated":1706427418000}'),s={name:"en/development/libraries.md"},i=t('

Tell me a handy library

For working with dates

moment is irretrievably obsolete. There's day.js and day-fnc.js.

However, in 95% of cases the capabilities of the standard JavaScript Intl package are sufficient

For UI components

There are quite a few CSS and UI libraries out there

Here in this article is a small overview of their heavyweight nature

Quasar and PrimeVue look solid.

',3),l=[i];function o(n,d,c,m,p,h){return r(),a("div",null,l)}const b=e(s,[["render",o]]);export{u as __pageData,b as default}; +import{_ as e,c as a,o as r,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Tell me a handy library","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/libraries.md","filePath":"en/development/libraries.md","lastUpdated":1706553672000}'),s={name:"en/development/libraries.md"},i=t('

Tell me a handy library

For working with dates

moment is irretrievably obsolete. There's day.js and day-fnc.js.

However, in 95% of cases the capabilities of the standard JavaScript Intl package are sufficient

For UI components

There are quite a few CSS and UI libraries out there

Here in this article is a small overview of their heavyweight nature

Quasar and PrimeVue look solid.

',3),l=[i];function o(n,d,c,m,p,h){return r(),a("div",null,l)}const b=e(s,[["render",o]]);export{u as __pageData,b as default}; diff --git a/assets/en_development_libraries.md.1rB3ZLlM.lean.js b/assets/en_development_libraries.md.XxHR0pP1.lean.js similarity index 86% rename from assets/en_development_libraries.md.1rB3ZLlM.lean.js rename to assets/en_development_libraries.md.XxHR0pP1.lean.js index ae7cb3059..d9906db0e 100644 --- a/assets/en_development_libraries.md.1rB3ZLlM.lean.js +++ b/assets/en_development_libraries.md.XxHR0pP1.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as r,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Tell me a handy library","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/libraries.md","filePath":"en/development/libraries.md","lastUpdated":1706427418000}'),s={name:"en/development/libraries.md"},i=t("",3),l=[i];function o(n,d,c,m,p,h){return r(),a("div",null,l)}const b=e(s,[["render",o]]);export{u as __pageData,b as default}; +import{_ as e,c as a,o as r,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Tell me a handy library","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/libraries.md","filePath":"en/development/libraries.md","lastUpdated":1706553672000}'),s={name:"en/development/libraries.md"},i=t("",3),l=[i];function o(n,d,c,m,p,h){return r(),a("div",null,l)}const b=e(s,[["render",o]]);export{u as __pageData,b as default}; diff --git a/assets/en_development_misc.md.3ecaA0IZ.js b/assets/en_development_misc.md.6C4sfdHc.js similarity index 99% rename from assets/en_development_misc.md.3ecaA0IZ.js rename to assets/en_development_misc.md.6C4sfdHc.js index 6228bb195..1a5d094ba 100644 --- a/assets/en_development_misc.md.3ecaA0IZ.js +++ b/assets/en_development_misc.md.6C4sfdHc.js @@ -1,4 +1,4 @@ -import{_ as e,c as s,o as a,U as i,a9 as t,aa as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Helpful hints","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/misc.md","filePath":"en/development/misc.md","lastUpdated":1706427418000}'),r={name:"en/development/misc.md"},o=i(`

Helpful hints

What are some good libraries for working with ...?

Keen-Slider, Embla Carousel, Splide

Well known Swiper is not so good for the Vue.js

Date and time

day.js, day-fnc.js

Well known moment.js is irretrievably obsolete.

TIP

Modern JavaScript is much more than it was 10 years ago. In 95% of cases the capabilities of the standard JavaScript Intl package are sufficient for date-time operations

How to catch the moment when the user scrolls to a certain place or to make a virtual scroll?

Intersection Observer

i18n - application internationalization

The NPM library for internationalization and localization i18n is very popular, but it has grown very large in recent years. It has a lot of features for localizing dates, numbers, setting the right declensions, RTL language support, downloading locales from the server and a bunch of other things. The i18next site even calls it an "internationalization framework".

At the same time, localization of a site often requires very simple things that take up only a couple of percent of the entire functionality of the i18n heavyweight.

In fact, you usually need a reactive function that returns a string based on the key and the current locale.

A variant of implementation via composable is in this article.

Your bundle will be "thinner" by 50Kb.

Options API or Composition API?

We recommend Composition API (script setup) as more logical and convenient, in which the programmer controls the flow of program execution by means of JavaScript, and not just by setting some magic options.

Ref or Reactive?

Difference in terms of usage - Reactive only works with objects and does not track object replacement. Ref works with everything and tracks variable replacement:

js
const a = Ref(1);
+import{_ as e,c as s,o as a,U as i,a9 as t,aa as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Helpful hints","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/misc.md","filePath":"en/development/misc.md","lastUpdated":1706553672000}'),r={name:"en/development/misc.md"},o=i(`

Helpful hints

What are some good libraries for working with ...?

Keen-Slider, Embla Carousel, Splide

Well known Swiper is not so good for the Vue.js

Date and time

day.js, day-fnc.js

Well known moment.js is irretrievably obsolete.

TIP

Modern JavaScript is much more than it was 10 years ago. In 95% of cases the capabilities of the standard JavaScript Intl package are sufficient for date-time operations

How to catch the moment when the user scrolls to a certain place or to make a virtual scroll?

Intersection Observer

i18n - application internationalization

The NPM library for internationalization and localization i18n is very popular, but it has grown very large in recent years. It has a lot of features for localizing dates, numbers, setting the right declensions, RTL language support, downloading locales from the server and a bunch of other things. The i18next site even calls it an "internationalization framework".

At the same time, localization of a site often requires very simple things that take up only a couple of percent of the entire functionality of the i18n heavyweight.

In fact, you usually need a reactive function that returns a string based on the key and the current locale.

A variant of implementation via composable is in this article.

Your bundle will be "thinner" by 50Kb.

Options API or Composition API?

We recommend Composition API (script setup) as more logical and convenient, in which the programmer controls the flow of program execution by means of JavaScript, and not just by setting some magic options.

Ref or Reactive?

Difference in terms of usage - Reactive only works with objects and does not track object replacement. Ref works with everything and tracks variable replacement:

js
const a = Ref(1);
 const b = Reactive({ x: 1 });
 
 // is OK
diff --git a/assets/en_development_misc.md.3ecaA0IZ.lean.js b/assets/en_development_misc.md.6C4sfdHc.lean.js
similarity index 85%
rename from assets/en_development_misc.md.3ecaA0IZ.lean.js
rename to assets/en_development_misc.md.6C4sfdHc.lean.js
index ebb4e487d..47c1a3eb4 100644
--- a/assets/en_development_misc.md.3ecaA0IZ.lean.js
+++ b/assets/en_development_misc.md.6C4sfdHc.lean.js
@@ -1 +1 @@
-import{_ as e,c as s,o as a,U as i,a9 as t,aa as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Helpful hints","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/misc.md","filePath":"en/development/misc.md","lastUpdated":1706427418000}'),r={name:"en/development/misc.md"},o=i("",10),l=[o];function p(h,d,c,m,k,u){return a(),s("div",null,l)}const f=e(r,[["render",p]]);export{y as __pageData,f as default};
+import{_ as e,c as s,o as a,U as i,a9 as t,aa as n}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Helpful hints","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/misc.md","filePath":"en/development/misc.md","lastUpdated":1706553672000}'),r={name:"en/development/misc.md"},o=i("",10),l=[o];function p(h,d,c,m,k,u){return a(),s("div",null,l)}const f=e(r,[["render",p]]);export{y as __pageData,f as default};
diff --git a/assets/en_development_stores.md.rV65euee.js b/assets/en_development_stores.md.NIyxoDLo.js
similarity index 99%
rename from assets/en_development_stores.md.rV65euee.js
rename to assets/en_development_stores.md.NIyxoDLo.js
index 530859328..9c5d6665a 100644
--- a/assets/en_development_stores.md.rV65euee.js
+++ b/assets/en_development_stores.md.NIyxoDLo.js
@@ -1 +1 @@
-import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"State management in Vue 3","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/stores.md","filePath":"en/development/stores.md","lastUpdated":1706427418000}'),s={name:"en/development/stores.md"},n=a('

State management in Vue 3

Why State management?

Sometimes in an application you need to pass reactive data or a function from one component to another, and these components do not belong to the same hierarchy. Props/invents or provide/inject mechanisms are not suitable for this. That's why Vue 2 introduced Vuex, a state management library that allows you to store a reactive state and provide access to it from anywhere.

A frontend state management library is usually called a "store".

How can I pass reactive data from one component to another in Vue 3?
  • If one component is a direct descendant of another - props and events
  • If one component is an indirect descendant of another - provide/inject or prop/event dribbling (bad practice).
  • If they are in different branches of the hierarchy - store or Vue 3 ref/reactive

Vue 3 ref/reactive is when you define and export a reactive variable in a separate js module:

export const userLoggedIn = ref(false);

It is then available throughout the application via the import of this module.

However, it is architecturally a bad idea to just share a variable. Usually there is business logic around this variable, which should be made available.

For example, authentication requires not only the fact that the user is logged in, but also the associated methods - login(), logout(), register(), isAuthenticated(). Synthesizing some kind of steit and the accompanying business logic yielded the so-called composable functions in Vue 3.

In some sense, it is an analog of an object in OOP.

What is a store on the frontend?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Store (such as Pinia) is an entity that contains state and business logic that is not bound to your Component tree. In other words, this is where the global state resides. It's sort of like a component that is always present, and that anyone can read and write to.

_ Official Pinia documentation.

Looks like a very unfortunate, ambiguous and confusing definition.

From the perspective of a non-frontend developer (basically any language other than JavaScript, plus partially JavaScript), the analog of a construct called store would be a database - SQL, NoSQL or caching Redis. There are analogs of state and getters (View in SQL database). But in 99.99% of cases, there will be no business logic in the database except for data consistency constraints (e.g., unique or foreign keys).

From a non-frontend developer's perspective, frontend stores are just objects / stateful services built on a singleton pattern. Calling them "global stores" is at least illogical.

It's likely that this happened historically. First there was one Vuex, it was one store and global. Then it had modules. Then Pinia modules became independent and spread all over the application. As a result, the application has a bunch of small local (by area of use) storages, each of which considers itself global, even if it is used by 2-3 components out of 1000 on the project, and even if this storage has 1% of steate and 99% of business and related logic.

In this respect, using composable functions for the same purpose (an entity holding state and business logic that isn't bound to your Component tree) - is much more logical. And they should be called useAuth or useAuthService instead of useAuthStore.

Vuex or Pinia?

In Vue 3, Pinia has become the main external library for managing the stack. Unlike Vuex, it has TypeScript support, is more convenient, and naturally takes advantage of Vue 3.

Vuex is officially deprecated

Pinia or Composables functions?

In Vue 3 there is something that makes a separate library for managing the state unnecessary. Namely, reactive types Ref and Reactive that can be used outside of a component. It became possible to make your own storages on the basis of composable functions and connect them in any component.

The main declared difference of Pinia is integration with Vue DevTools, plugins and SSR support. However, whether he needs one or the other, each developer decides for himself. It is quite comfortable to work with composables in DevTools.

Composable function, in its turn, can have both global and local (variables are declared inside the function) states. This can be useful in certain cases - you can create several instances of composable functions, each with its own state. For example, when you have several news widgets on your site, differing only by news category.

Also, from a functional point of view, composable functions have full access to the entire Vue Reactivity API, which makes them more flexible than Pinia.

Composable functions with global states do not work in SSR mode.

As for performance, according to tests Pinia is about 1.5 times slower on Reactive changes than Vue 3, and 20 times slower on Ref. This is because Ref (primitive types) in Pinia becomes a part of Reactive. Setup stores does not solve this problem.

You should also keep in mind that any dependency (in this case the Pinia library) can bring problems similar to the "RIP Vuex" situation when the library dies, becomes obsolete, is no longer supported, or vulnerabilities are found in it. Composable features, on the other hand, look like a thorough innovation to the Vue framework.

Here is an interesting discussion about it on /r/vuejs. Code example from Reddit user @ferferga shows how to use TypeScript classes with private modifiers, getters, setters (no .value) and first class type support as composable stores (which would be impossible with Pinia). Using TS classes here might not be a good practice but demonstrates flexibility and power of the Composition API.

Also here is a lifehack for Devtools from user @coolcosmos: I just use refs. The cons is you lose the Devtools but in dev mode I import all my refs and pass them to pinia so I have all the pros and no cons.

How to split logic between component and composable functions?

It is convenient to think of it as MVC pattern, where the role of View (and partially Controller) is played by components, which are mainly responsible for visualization, and the logic and model (Model and partially Controller) fall on composable functions and their reactive state.

To understand what to put in a composable and what to put in a component (which may consist of several components), imagine that you change the component to another one - displaying your data in some other way. Ideally, the model (composite) should remain the same, you are only rewriting the component that has logic responsible for displaying it.

At the same time, the logic (Controller) can be shared between the component and the composable. For example, validation of form data can happen in the component (checking that the field is populated), in the component using a third-party utility (checking that the password is "complex"), and in the composable (checking that username is unique)

',7),i=[n];function r(l,c,d,h,p,u){return o(),t("div",null,i)}const b=e(s,[["render",r]]);export{f as __pageData,b as default}; +import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"State management in Vue 3","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/stores.md","filePath":"en/development/stores.md","lastUpdated":1706553672000}'),s={name:"en/development/stores.md"},n=a('

State management in Vue 3

Why State management?

Sometimes in an application you need to pass reactive data or a function from one component to another, and these components do not belong to the same hierarchy. Props/invents or provide/inject mechanisms are not suitable for this. That's why Vue 2 introduced Vuex, a state management library that allows you to store a reactive state and provide access to it from anywhere.

A frontend state management library is usually called a "store".

How can I pass reactive data from one component to another in Vue 3?
  • If one component is a direct descendant of another - props and events
  • If one component is an indirect descendant of another - provide/inject or prop/event dribbling (bad practice).
  • If they are in different branches of the hierarchy - store or Vue 3 ref/reactive

Vue 3 ref/reactive is when you define and export a reactive variable in a separate js module:

export const userLoggedIn = ref(false);

It is then available throughout the application via the import of this module.

However, it is architecturally a bad idea to just share a variable. Usually there is business logic around this variable, which should be made available.

For example, authentication requires not only the fact that the user is logged in, but also the associated methods - login(), logout(), register(), isAuthenticated(). Synthesizing some kind of steit and the accompanying business logic yielded the so-called composable functions in Vue 3.

In some sense, it is an analog of an object in OOP.

What is a store on the frontend?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Store (such as Pinia) is an entity that contains state and business logic that is not bound to your Component tree. In other words, this is where the global state resides. It's sort of like a component that is always present, and that anyone can read and write to.

_ Official Pinia documentation.

Looks like a very unfortunate, ambiguous and confusing definition.

From the perspective of a non-frontend developer (basically any language other than JavaScript, plus partially JavaScript), the analog of a construct called store would be a database - SQL, NoSQL or caching Redis. There are analogs of state and getters (View in SQL database). But in 99.99% of cases, there will be no business logic in the database except for data consistency constraints (e.g., unique or foreign keys).

From a non-frontend developer's perspective, frontend stores are just objects / stateful services built on a singleton pattern. Calling them "global stores" is at least illogical.

It's likely that this happened historically. First there was one Vuex, it was one store and global. Then it had modules. Then Pinia modules became independent and spread all over the application. As a result, the application has a bunch of small local (by area of use) storages, each of which considers itself global, even if it is used by 2-3 components out of 1000 on the project, and even if this storage has 1% of steate and 99% of business and related logic.

In this respect, using composable functions for the same purpose (an entity holding state and business logic that isn't bound to your Component tree) - is much more logical. And they should be called useAuth or useAuthService instead of useAuthStore.

Vuex or Pinia?

In Vue 3, Pinia has become the main external library for managing the stack. Unlike Vuex, it has TypeScript support, is more convenient, and naturally takes advantage of Vue 3.

Vuex is officially deprecated

Pinia or Composables functions?

In Vue 3 there is something that makes a separate library for managing the state unnecessary. Namely, reactive types Ref and Reactive that can be used outside of a component. It became possible to make your own storages on the basis of composable functions and connect them in any component.

The main declared difference of Pinia is integration with Vue DevTools, plugins and SSR support. However, whether he needs one or the other, each developer decides for himself. It is quite comfortable to work with composables in DevTools.

Composable function, in its turn, can have both global and local (variables are declared inside the function) states. This can be useful in certain cases - you can create several instances of composable functions, each with its own state. For example, when you have several news widgets on your site, differing only by news category.

Also, from a functional point of view, composable functions have full access to the entire Vue Reactivity API, which makes them more flexible than Pinia.

Composable functions with global states do not work in SSR mode.

As for performance, according to tests Pinia is about 1.5 times slower on Reactive changes than Vue 3, and 20 times slower on Ref. This is because Ref (primitive types) in Pinia becomes a part of Reactive. Setup stores does not solve this problem.

You should also keep in mind that any dependency (in this case the Pinia library) can bring problems similar to the "RIP Vuex" situation when the library dies, becomes obsolete, is no longer supported, or vulnerabilities are found in it. Composable features, on the other hand, look like a thorough innovation to the Vue framework.

Here is an interesting discussion about it on /r/vuejs. Code example from Reddit user @ferferga shows how to use TypeScript classes with private modifiers, getters, setters (no .value) and first class type support as composable stores (which would be impossible with Pinia). Using TS classes here might not be a good practice but demonstrates flexibility and power of the Composition API.

Also here is a lifehack for Devtools from user @coolcosmos: I just use refs. The cons is you lose the Devtools but in dev mode I import all my refs and pass them to pinia so I have all the pros and no cons.

How to split logic between component and composable functions?

It is convenient to think of it as MVC pattern, where the role of View (and partially Controller) is played by components, which are mainly responsible for visualization, and the logic and model (Model and partially Controller) fall on composable functions and their reactive state.

To understand what to put in a composable and what to put in a component (which may consist of several components), imagine that you change the component to another one - displaying your data in some other way. Ideally, the model (composite) should remain the same, you are only rewriting the component that has logic responsible for displaying it.

At the same time, the logic (Controller) can be shared between the component and the composable. For example, validation of form data can happen in the component (checking that the field is populated), in the component using a third-party utility (checking that the password is "complex"), and in the composable (checking that username is unique)

',7),i=[n];function r(l,c,d,h,p,u){return o(),t("div",null,i)}const b=e(s,[["render",r]]);export{f as __pageData,b as default}; diff --git a/assets/en_development_stores.md.rV65euee.lean.js b/assets/en_development_stores.md.NIyxoDLo.lean.js similarity index 85% rename from assets/en_development_stores.md.rV65euee.lean.js rename to assets/en_development_stores.md.NIyxoDLo.lean.js index 2db1196c5..3f3b4f7e8 100644 --- a/assets/en_development_stores.md.rV65euee.lean.js +++ b/assets/en_development_stores.md.NIyxoDLo.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"State management in Vue 3","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/stores.md","filePath":"en/development/stores.md","lastUpdated":1706427418000}'),s={name:"en/development/stores.md"},n=a("",7),i=[n];function r(l,c,d,h,p,u){return o(),t("div",null,i)}const b=e(s,[["render",r]]);export{f as __pageData,b as default}; +import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"State management in Vue 3","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/stores.md","filePath":"en/development/stores.md","lastUpdated":1706553672000}'),s={name:"en/development/stores.md"},n=a("",7),i=[n];function r(l,c,d,h,p,u){return o(),t("div",null,i)}const b=e(s,[["render",r]]);export{f as __pageData,b as default}; diff --git a/assets/en_development_testing.md.nR02ZwkV.js b/assets/en_development_testing.md.d3LcqJaY.js similarity index 97% rename from assets/en_development_testing.md.nR02ZwkV.js rename to assets/en_development_testing.md.d3LcqJaY.js index 7fa5f125c..f5b694308 100644 --- a/assets/en_development_testing.md.nR02ZwkV.js +++ b/assets/en_development_testing.md.d3LcqJaY.js @@ -1 +1 @@ -import{_ as e,c as t,o as s,U as a}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Testing","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/testing.md","filePath":"en/development/testing.md","lastUpdated":1706427418000}'),n={name:"en/development/testing.md"},r=a('

Testing

Do I need testing on the frontend?

There are several types of tests, among them are unit tests and integration (e2e) tests

Unit testing in Vue is done by Vitest, Jest.

You should be more careful with front-end testing, as writing and rewriting tests can often take time comparable to the development itself. At the same time, the usefulness of these tests will be highly questionable. Their expediency appears on large projects with a large number of developers. There unit tests also take time but reduce the probability that someone will mess something up. At the same time, unit tests are not the most necessary ingredient for quick MVP creation at a startup.

Frontend development in this aspect is very different from backend development, where unit tests are really useful.

Good article on this topic - Unit Test Fetish

What are e2e tests?

On the front end, especially for a web application that is already in production and needs to be updated from time to time, e2e tests are important.

e2e (end-to-end) testing is a software testing process that simulates real user actions at the interface level.

In this case, a browser will be launched (usually in headless mode - without UI), and it will use the scripts written to check the work of the site - the presence of elements on the page, the possibility of login, etc.

The main tools for e2e testing are Cypress, WebdriverIO.

In CI/CD projects, running tests is one of the main moments along with linting and build.

',3),i=[r];function o(l,p,d,h,c,m){return s(),t("div",null,i)}const g=e(n,[["render",o]]);export{u as __pageData,g as default}; +import{_ as e,c as t,o as s,U as a}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Testing","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/testing.md","filePath":"en/development/testing.md","lastUpdated":1706553672000}'),n={name:"en/development/testing.md"},r=a('

Testing

Do I need testing on the frontend?

There are several types of tests, among them are unit tests and integration (e2e) tests

Unit testing in Vue is done by Vitest, Jest.

You should be more careful with front-end testing, as writing and rewriting tests can often take time comparable to the development itself. At the same time, the usefulness of these tests will be highly questionable. Their expediency appears on large projects with a large number of developers. There unit tests also take time but reduce the probability that someone will mess something up. At the same time, unit tests are not the most necessary ingredient for quick MVP creation at a startup.

Frontend development in this aspect is very different from backend development, where unit tests are really useful.

Good article on this topic - Unit Test Fetish

What are e2e tests?

On the front end, especially for a web application that is already in production and needs to be updated from time to time, e2e tests are important.

e2e (end-to-end) testing is a software testing process that simulates real user actions at the interface level.

In this case, a browser will be launched (usually in headless mode - without UI), and it will use the scripts written to check the work of the site - the presence of elements on the page, the possibility of login, etc.

The main tools for e2e testing are Cypress, WebdriverIO.

In CI/CD projects, running tests is one of the main moments along with linting and build.

',3),i=[r];function o(l,p,d,h,c,m){return s(),t("div",null,i)}const g=e(n,[["render",o]]);export{u as __pageData,g as default}; diff --git a/assets/en_development_testing.md.nR02ZwkV.lean.js b/assets/en_development_testing.md.d3LcqJaY.lean.js similarity index 85% rename from assets/en_development_testing.md.nR02ZwkV.lean.js rename to assets/en_development_testing.md.d3LcqJaY.lean.js index 1ca6874a7..a5eafe4a6 100644 --- a/assets/en_development_testing.md.nR02ZwkV.lean.js +++ b/assets/en_development_testing.md.d3LcqJaY.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as s,U as a}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Testing","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/testing.md","filePath":"en/development/testing.md","lastUpdated":1706427418000}'),n={name:"en/development/testing.md"},r=a("",3),i=[r];function o(l,p,d,h,c,m){return s(),t("div",null,i)}const g=e(n,[["render",o]]);export{u as __pageData,g as default}; +import{_ as e,c as t,o as s,U as a}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Testing","description":"","frontmatter":{},"headers":[],"relativePath":"en/development/testing.md","filePath":"en/development/testing.md","lastUpdated":1706553672000}'),n={name:"en/development/testing.md"},r=a("",3),i=[r];function o(l,p,d,h,c,m){return s(),t("div",null,i)}const g=e(n,[["render",o]]);export{u as __pageData,g as default}; diff --git a/assets/en_frontend_about-frameworks.md.DsMsuNr8.js b/assets/en_frontend_about-frameworks.md.pYQh8eAE.js similarity index 99% rename from assets/en_frontend_about-frameworks.md.DsMsuNr8.js rename to assets/en_frontend_about-frameworks.md.pYQh8eAE.js index 85e034396..ecd1b4804 100644 --- a/assets/en_frontend_about-frameworks.md.DsMsuNr8.js +++ b/assets/en_frontend_about-frameworks.md.pYQh8eAE.js @@ -1,4 +1,4 @@ -import{_ as e,c as a,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"About frontend frameworks","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/about-frameworks.md","filePath":"en/frontend/about-frameworks.md","lastUpdated":1706427418000}'),i={name:"en/frontend/about-frameworks.md"},o=s(`

About frontend frameworks

What is "reactivity"?

Probably the most fundamental difference between a frontend program and a backend program, a microservice or even a standalone GUI application is the concept of "reactivity".

When working on a back end, the programmer is in a good position to control the flow of data. He controls where to get it from, where to send it to, who can change it, all this in a single thread or in a multithreaded system.

On the front, the UI interactivity factor plays a big role - data should be dynamically shown to the user, the user can change the data, data can be changed by different counterparties (user, backend, internal calculations). In principle, it is possible to use the usual programmer approaches as on the backend - i.e., self-monitor the data changes in each place, and perform updates of all dependencies. This will give a lot of boilerplate - routine repetitive code. Reactive frameworks have made programmers' lives a lot easier by taking care of this updating of a variable's dependencies when it changes.

In a reactive framework, all you need to do is define a reactive variable and specify that it is, for example, the value of an input field. When the user enters a value into this field, the variable will be automatically updated, and all other variables that depend on it will be updated as well. You don't need to write any code for this.

Simplistically speaking, under the hood, a reactive variable is a proxy wrapper over an ordinary variable, which keeps track of its changes and registers all the listeners who need to be notified of the variable's change so that they can recalculate themselves.

What reactive frontend frameworks exist

React, Vue, Angular are the most common. There are many others that have not taken off.

Angular is usually used for large projects (large teams of different levels of programmers) and tightly clamps development into its rules.

React and Vue are more flexible and similar, but there are significant differences.

Vue is faster, smaller, more efficient, doesn't mix HTML and JS, has a lower threshold of entry. Actively evolving.

Behind React- Zuckerberg and a greateŕl prevalence. More job offers, but also more applicants per job.

Why Vue?

To be able to develop and manage large complex software systems, OOP - object-oriented programming - was invented, where new entities - objects - were introduced to hierarchize complexity. They encapsulated data and behavior (logic).

On the frontend, the situation is a bit different due to the presence of code in several programming languages - HTML, CSS, JavaScript. And in this case, the SFC components in Vue serve perfectly to break down the complexity of the system. Each component encapsulates the HTML template, its styling and logic.

Vue does this much better than the same React, which lumps everything together. In this aspect, Vue is unequivocally the flagship of component-oriented programming (COP) on the frontend.

In addition, Vue 3 introduced reactivity beyond components - ref and reactive variables can be set in a simple js module. This is used in composable functions. It has become possible to separate not only the reactive service (useI18n, useScreenSize for example) but also the business logic (useShoppingCart, useNewsWidget) from the view. This allows to use MVC pattern on the frontend, where the roles of View and partially Controller are performed by components responsible mainly for visualization, and the logic and model (Model and partially Controller) fall on composable functions and their reactive state.

This makes it possible to make, for example, changing the site design or replacing the UI library a much easier task.

This feature also makes Vue stand out from other reactive frameworks.

The Reactivity API in Vue 3 may not be perfect yet (which is why creator of the Vue.js Evan You has been experimenting with Reactivity Transform), but it's already quite suitable for developing large, robust, scalable systems, which was not the case with Vue 2.

TIP

Vue's reactivity can be used without UIs at all. For example, this VS Code extension uses the Vue 3 elements reactive, ref, and watch to organize reactivity in code without visual components.

What can Vue do that React or Svelte can't?

Vue handles reactive data more efficiently.

Adding a new element to an array:

js
// React
+import{_ as e,c as a,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"About frontend frameworks","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/about-frameworks.md","filePath":"en/frontend/about-frameworks.md","lastUpdated":1706553672000}'),i={name:"en/frontend/about-frameworks.md"},o=s(`

About frontend frameworks

What is "reactivity"?

Probably the most fundamental difference between a frontend program and a backend program, a microservice or even a standalone GUI application is the concept of "reactivity".

When working on a back end, the programmer is in a good position to control the flow of data. He controls where to get it from, where to send it to, who can change it, all this in a single thread or in a multithreaded system.

On the front, the UI interactivity factor plays a big role - data should be dynamically shown to the user, the user can change the data, data can be changed by different counterparties (user, backend, internal calculations). In principle, it is possible to use the usual programmer approaches as on the backend - i.e., self-monitor the data changes in each place, and perform updates of all dependencies. This will give a lot of boilerplate - routine repetitive code. Reactive frameworks have made programmers' lives a lot easier by taking care of this updating of a variable's dependencies when it changes.

In a reactive framework, all you need to do is define a reactive variable and specify that it is, for example, the value of an input field. When the user enters a value into this field, the variable will be automatically updated, and all other variables that depend on it will be updated as well. You don't need to write any code for this.

Simplistically speaking, under the hood, a reactive variable is a proxy wrapper over an ordinary variable, which keeps track of its changes and registers all the listeners who need to be notified of the variable's change so that they can recalculate themselves.

What reactive frontend frameworks exist

React, Vue, Angular are the most common. There are many others that have not taken off.

Angular is usually used for large projects (large teams of different levels of programmers) and tightly clamps development into its rules.

React and Vue are more flexible and similar, but there are significant differences.

Vue is faster, smaller, more efficient, doesn't mix HTML and JS, has a lower threshold of entry. Actively evolving.

Behind React- Zuckerberg and a greateŕl prevalence. More job offers, but also more applicants per job.

Why Vue?

To be able to develop and manage large complex software systems, OOP - object-oriented programming - was invented, where new entities - objects - were introduced to hierarchize complexity. They encapsulated data and behavior (logic).

On the frontend, the situation is a bit different due to the presence of code in several programming languages - HTML, CSS, JavaScript. And in this case, the SFC components in Vue serve perfectly to break down the complexity of the system. Each component encapsulates the HTML template, its styling and logic.

Vue does this much better than the same React, which lumps everything together. In this aspect, Vue is unequivocally the flagship of component-oriented programming (COP) on the frontend.

In addition, Vue 3 introduced reactivity beyond components - ref and reactive variables can be set in a simple js module. This is used in composable functions. It has become possible to separate not only the reactive service (useI18n, useScreenSize for example) but also the business logic (useShoppingCart, useNewsWidget) from the view. This allows to use MVC pattern on the frontend, where the roles of View and partially Controller are performed by components responsible mainly for visualization, and the logic and model (Model and partially Controller) fall on composable functions and their reactive state.

This makes it possible to make, for example, changing the site design or replacing the UI library a much easier task.

This feature also makes Vue stand out from other reactive frameworks.

The Reactivity API in Vue 3 may not be perfect yet (which is why creator of the Vue.js Evan You has been experimenting with Reactivity Transform), but it's already quite suitable for developing large, robust, scalable systems, which was not the case with Vue 2.

TIP

Vue's reactivity can be used without UIs at all. For example, this VS Code extension uses the Vue 3 elements reactive, ref, and watch to organize reactivity in code without visual components.

What can Vue do that React or Svelte can't?

Vue handles reactive data more efficiently.

Adding a new element to an array:

js
// React
 setSomeArr([...someArr, newItem]);
 
 // Svelte
diff --git a/assets/en_frontend_about-frameworks.md.DsMsuNr8.lean.js b/assets/en_frontend_about-frameworks.md.pYQh8eAE.lean.js
similarity index 86%
rename from assets/en_frontend_about-frameworks.md.DsMsuNr8.lean.js
rename to assets/en_frontend_about-frameworks.md.pYQh8eAE.lean.js
index 268ccd5a9..c4cc5a2ae 100644
--- a/assets/en_frontend_about-frameworks.md.DsMsuNr8.lean.js
+++ b/assets/en_frontend_about-frameworks.md.pYQh8eAE.lean.js
@@ -1 +1 @@
-import{_ as e,c as a,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"About frontend frameworks","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/about-frameworks.md","filePath":"en/frontend/about-frameworks.md","lastUpdated":1706427418000}'),i={name:"en/frontend/about-frameworks.md"},o=s("",5),n=[o];function r(l,c,d,p,h,m){return t(),a("div",null,n)}const g=e(i,[["render",r]]);export{f as __pageData,g as default};
+import{_ as e,c as a,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"About frontend frameworks","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/about-frameworks.md","filePath":"en/frontend/about-frameworks.md","lastUpdated":1706553672000}'),i={name:"en/frontend/about-frameworks.md"},o=s("",5),n=[o];function r(l,c,d,p,h,m){return t(),a("div",null,n)}const g=e(i,[["render",r]]);export{f as __pageData,g as default};
diff --git a/assets/en_frontend_architecture.md.4wmf8xCn.js b/assets/en_frontend_architecture.md.dHsY5TwI.js
similarity index 98%
rename from assets/en_frontend_architecture.md.4wmf8xCn.js
rename to assets/en_frontend_architecture.md.dHsY5TwI.js
index 5ff6f56d3..fb4bce8c6 100644
--- a/assets/en_frontend_architecture.md.4wmf8xCn.js
+++ b/assets/en_frontend_architecture.md.dHsY5TwI.js
@@ -1 +1 @@
-import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Frontend application architecture","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/architecture.md","filePath":"en/frontend/architecture.md","lastUpdated":1706427418000}'),i={name:"en/frontend/architecture.md"},n=o('

Frontend application architecture

What is a good web application architecture

There are different theoretical definitions and justifications for this concept, but roughly speaking it is the following.

Let's say you are developing a project, already at the final stage. A customer comes to you and says something like: I want to add a shadow to all buttons, I want to change the UI library, we decided to support multiple languages, we decided to replace this module with another, we need to make more detailed adaptability for different resolutions, we decided to add themes, we are changing the provider of payment processing services, we have an increasing number of users / the site is slowing down / need to speed it up, need to increase the level of security of the site, we took a middle programmer, bring him up to speed quickly, and let him add functionality or fix the b

A good frontend application architecture allows you to accomplish all of this most efficiently with the least amount of effort.

OOP on the frontend

Many people coming from development in object-oriented languages try to use OOP concepts on the frontend and program with classes, inheritance, polymorphism and other things.

This is a mistake. The main computations on the front end are related to UI - displaying data, handling user interaction. Class systems and microservices are simply not needed on them. Of course, you can create a basic button, wrap it in two custom components and consider it inheritance, but you can't do it in code. That's why you have to learn to think in other categories - components, composable functions, js modules. And use your JavaScript power, not trying to stretch it on OOP.

At the same time, a good analogy of an object with a global ("static") and local ("object") state is a composable function. It can be used in certain situations.

Useful tips
Avoid dependencies

If there is a possibility not to introduce a new dependency (not to plug in a new npm package) - don't do it. It may save you a bit of time, but a third-party library will sooner or later become obsolete, no longer supported, and may have a vulnerability. Besides, it increases the size of your bundle, which directly affects the performance of your application. Tree shaking is good in advertising, but it doesn't always work in reality.

If you need, for example, the debounce function, don't hurry to plug it together with some library. Google its implementation and copy 15 lines of code and make your own function.


Use wrappers over components of UI libraries and third-party utilities

If you use components of some UI library, don't use them directly - make wrappers for them. For example, BaseButton or BaseInput. This will make styling the components much easier, and will also make it much easier to switch to another library, or replace them with your own components.

The same goes for utilities.


Regular refactoring

Do code refactoring from time to time, moving components and modules to where they should logically be, renaming them, and structuring and improving the code itself. This is good for both the code and your professional growth.


Use CSS3

Try to use pure CSS3 for adaptability. Do not be tied to columnar models of CSS and UI libraries, unless it is a "done and forgotten, let the customer continue to suffer with it" project.

Spend a couple of days to learn Flexbox and you will be able to layout on it faster and better than on any Tailwind.


Use modern standards and language features

For example, HTML5 semantic elements - aside, header, section, article, details, etc.

CSS3 - Flexbox and Grid, Container query


Document the project

Draw use-case and other diagrams, describe the main functionality of the project and important details of its implementation - this will at least raise your level as a software developer.

VitePress is a very handy tool for technical documentation.

',4),r=[n];function s(d,c,l,u,h,p){return a(),t("div",null,r)}const y=e(i,[["render",s]]);export{f as __pageData,y as default}; +import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Frontend application architecture","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/architecture.md","filePath":"en/frontend/architecture.md","lastUpdated":1706553672000}'),i={name:"en/frontend/architecture.md"},n=o('

Frontend application architecture

What is a good web application architecture

There are different theoretical definitions and justifications for this concept, but roughly speaking it is the following.

Let's say you are developing a project, already at the final stage. A customer comes to you and says something like: I want to add a shadow to all buttons, I want to change the UI library, we decided to support multiple languages, we decided to replace this module with another, we need to make more detailed adaptability for different resolutions, we decided to add themes, we are changing the provider of payment processing services, we have an increasing number of users / the site is slowing down / need to speed it up, need to increase the level of security of the site, we took a middle programmer, bring him up to speed quickly, and let him add functionality or fix the b

A good frontend application architecture allows you to accomplish all of this most efficiently with the least amount of effort.

OOP on the frontend

Many people coming from development in object-oriented languages try to use OOP concepts on the frontend and program with classes, inheritance, polymorphism and other things.

This is a mistake. The main computations on the front end are related to UI - displaying data, handling user interaction. Class systems and microservices are simply not needed on them. Of course, you can create a basic button, wrap it in two custom components and consider it inheritance, but you can't do it in code. That's why you have to learn to think in other categories - components, composable functions, js modules. And use your JavaScript power, not trying to stretch it on OOP.

At the same time, a good analogy of an object with a global ("static") and local ("object") state is a composable function. It can be used in certain situations.

Useful tips
Avoid dependencies

If there is a possibility not to introduce a new dependency (not to plug in a new npm package) - don't do it. It may save you a bit of time, but a third-party library will sooner or later become obsolete, no longer supported, and may have a vulnerability. Besides, it increases the size of your bundle, which directly affects the performance of your application. Tree shaking is good in advertising, but it doesn't always work in reality.

If you need, for example, the debounce function, don't hurry to plug it together with some library. Google its implementation and copy 15 lines of code and make your own function.


Use wrappers over components of UI libraries and third-party utilities

If you use components of some UI library, don't use them directly - make wrappers for them. For example, BaseButton or BaseInput. This will make styling the components much easier, and will also make it much easier to switch to another library, or replace them with your own components.

The same goes for utilities.


Regular refactoring

Do code refactoring from time to time, moving components and modules to where they should logically be, renaming them, and structuring and improving the code itself. This is good for both the code and your professional growth.


Use CSS3

Try to use pure CSS3 for adaptability. Do not be tied to columnar models of CSS and UI libraries, unless it is a "done and forgotten, let the customer continue to suffer with it" project.

Spend a couple of days to learn Flexbox and you will be able to layout on it faster and better than on any Tailwind.


Use modern standards and language features

For example, HTML5 semantic elements - aside, header, section, article, details, etc.

CSS3 - Flexbox and Grid, Container query


Document the project

Draw use-case and other diagrams, describe the main functionality of the project and important details of its implementation - this will at least raise your level as a software developer.

VitePress is a very handy tool for technical documentation.

',4),r=[n];function s(d,c,l,u,h,p){return a(),t("div",null,r)}const y=e(i,[["render",s]]);export{f as __pageData,y as default}; diff --git a/assets/en_frontend_architecture.md.4wmf8xCn.lean.js b/assets/en_frontend_architecture.md.dHsY5TwI.lean.js similarity index 86% rename from assets/en_frontend_architecture.md.4wmf8xCn.lean.js rename to assets/en_frontend_architecture.md.dHsY5TwI.lean.js index b0f4db0df..5eab2b73f 100644 --- a/assets/en_frontend_architecture.md.4wmf8xCn.lean.js +++ b/assets/en_frontend_architecture.md.dHsY5TwI.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Frontend application architecture","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/architecture.md","filePath":"en/frontend/architecture.md","lastUpdated":1706427418000}'),i={name:"en/frontend/architecture.md"},n=o("",4),r=[n];function s(d,c,l,u,h,p){return a(),t("div",null,r)}const y=e(i,[["render",s]]);export{f as __pageData,y as default}; +import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Frontend application architecture","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/architecture.md","filePath":"en/frontend/architecture.md","lastUpdated":1706553672000}'),i={name:"en/frontend/architecture.md"},n=o("",4),r=[n];function s(d,c,l,u,h,p){return a(),t("div",null,r)}const y=e(i,[["render",s]]);export{f as __pageData,y as default}; diff --git a/assets/en_frontend_css-ui-libs.md.162_8Xne.js b/assets/en_frontend_css-ui-libs.md.AwyllyZn.js similarity index 98% rename from assets/en_frontend_css-ui-libs.md.162_8Xne.js rename to assets/en_frontend_css-ui-libs.md.AwyllyZn.js index 00a5f0032..60b9a74cc 100644 --- a/assets/en_frontend_css-ui-libs.md.162_8Xne.js +++ b/assets/en_frontend_css-ui-libs.md.AwyllyZn.js @@ -1,4 +1,4 @@ -import{_ as e,c as s,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"CSS and UI libraries","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/css-ui-libs.md","filePath":"en/frontend/css-ui-libs.md","lastUpdated":1706427418000}'),i={name:"en/frontend/css-ui-libs.md"},n=t(`

CSS and UI libraries

What are CSS and UI libraries?

CSS and UI libraries either provide their own or help you create custom UI components like Button or Select? which can speed up your development.

CSS libraries do not contain JavaScript code and therefore have limitations for complex components like Select or Dropdown.

There is a separate type of Headless-UI libraries that offer components without stylized visualization - only component logic and Accessibility requirements. The developer needs to add CSS styles himself.

Pros and cons of UI libraries?

Pros: shortens the development, if you use it on the project as much as possible, brings a unified style to the application

Cons: as any dependency can become obsolete (Vuetify 2 tragedy), adds weight to the final bundle.

How to reduce dependency on foreign libraries?

Wrap up UI library components in your own custom components.

vue
<!-- BaseButton.vue -->
+import{_ as e,c as s,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"CSS and UI libraries","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/css-ui-libs.md","filePath":"en/frontend/css-ui-libs.md","lastUpdated":1706553672000}'),i={name:"en/frontend/css-ui-libs.md"},n=t(`

CSS and UI libraries

What are CSS and UI libraries?

CSS and UI libraries either provide their own or help you create custom UI components like Button or Select? which can speed up your development.

CSS libraries do not contain JavaScript code and therefore have limitations for complex components like Select or Dropdown.

There is a separate type of Headless-UI libraries that offer components without stylized visualization - only component logic and Accessibility requirements. The developer needs to add CSS styles himself.

Pros and cons of UI libraries?

Pros: shortens the development, if you use it on the project as much as possible, brings a unified style to the application

Cons: as any dependency can become obsolete (Vuetify 2 tragedy), adds weight to the final bundle.

How to reduce dependency on foreign libraries?

Wrap up UI library components in your own custom components.

vue
<!-- BaseButton.vue -->
 <template>
   <QButton ... />
 </template>

and use BaseButton in your code. This way it will be much easier for you to upgrade, replace the library or replace this component with a self-designed one. And even just change the styles of the component.

Layout and adaptability of pages by means of CSS and UI libraries

Using the column system and other functionality of CSS and UI libraries like the popular Tailwind is convenient for small projects and sometimes speeds up layout, but very much worsens the quality of the code as a whole, including its maintainability and extensibility. It's as if the world went back to the days of IE6, when all styles and JavaScript were also located in tag attributes, and the whole evolution of CSS into a clear, convenient, beautiful hierarchical class model was for nothing, just like the division of the web into document (template), presentation layer (CSS styles) and logic (JavaScript).

The web is full of articles why an approach like Tailwind is a bad thing. We can only note that with proper skill, layout on pure CSS3 is also fast and much more convenient and pleasant in terms of DX than through CSS and UI libraries.

Quote

Good developers know the reasons why standards, patterns and good practices have become the way they are.

Bad developers stick to whatever new trend that might save them some learning curve.

`,5),o=[n];function l(r,d,p,c,h,u){return a(),s("div",null,o)}const k=e(i,[["render",l]]);export{y as __pageData,k as default}; diff --git a/assets/en_frontend_css-ui-libs.md.162_8Xne.lean.js b/assets/en_frontend_css-ui-libs.md.AwyllyZn.lean.js similarity index 85% rename from assets/en_frontend_css-ui-libs.md.162_8Xne.lean.js rename to assets/en_frontend_css-ui-libs.md.AwyllyZn.lean.js index 1984d728a..f180c90e0 100644 --- a/assets/en_frontend_css-ui-libs.md.162_8Xne.lean.js +++ b/assets/en_frontend_css-ui-libs.md.AwyllyZn.lean.js @@ -1 +1 @@ -import{_ as e,c as s,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"CSS and UI libraries","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/css-ui-libs.md","filePath":"en/frontend/css-ui-libs.md","lastUpdated":1706427418000}'),i={name:"en/frontend/css-ui-libs.md"},n=t("",5),o=[n];function l(r,d,p,c,h,u){return a(),s("div",null,o)}const k=e(i,[["render",l]]);export{y as __pageData,k as default}; +import{_ as e,c as s,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"CSS and UI libraries","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/css-ui-libs.md","filePath":"en/frontend/css-ui-libs.md","lastUpdated":1706553672000}'),i={name:"en/frontend/css-ui-libs.md"},n=t("",5),o=[n];function l(r,d,p,c,h,u){return a(),s("div",null,o)}const k=e(i,[["render",l]]);export{y as __pageData,k as default}; diff --git a/assets/en_frontend_learning.md.x65PGI3R.js b/assets/en_frontend_learning.md.tUwfnh_F.js similarity index 99% rename from assets/en_frontend_learning.md.x65PGI3R.js rename to assets/en_frontend_learning.md.tUwfnh_F.js index fd7b473a7..bdf5b6b00 100644 --- a/assets/en_frontend_learning.md.x65PGI3R.js +++ b/assets/en_frontend_learning.md.tUwfnh_F.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Learning Vue","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/learning.md","filePath":"en/frontend/learning.md","lastUpdated":1706427418000}'),r={name:"en/frontend/learning.md"},s=o('

Learning Vue

Sources of information on Vue

For some reason, it is believed that there are only two ways to get knowledge on frontend - Vue documentation and tutorial videos from YouTube and all kinds of courses.

But documentation is not a textbook, but a reference book, and it is very difficult to separate grains from chaff on YouTube. I met some useful videos, but all of them were intended for developers who already know Vue quite well and showed some new or non-standard moments.


The main teacher should be a book that teaches, not a reference book.

An excellent Vue tutorial in English is the May 2023 Vue.js 3 Design Patterns and Best Practices. You can register on oReilly and read for 10 days for free. Even download it. In spite of the title, the book teaches programming, and from a fairly basic level.

Code examples from the book are in the public repository and well worth studying.

Note

We can draw an analogy between a good developer and a driver:

  1. learning the basics of driving, traffic rules and the internal combustion engine - Vue documentation and JavaScript specification
  2. Practical driving training at a driving school - good textbooks like "Vue.js 3 Design Patterns and Best Practices"
  3. Real driving experience - commercial development experience
  4. Extreme driving courses, put a glass of water on the hood and drive a twenty year old car with a manual transmission through broken streets - quality open source projects and certifications

It is impossible to become a good developer/driver both without 1. and only with 1. Training videos from the internet (both paid and free) can both be part of 4. and be completely useless and even harmful (very often), depending on their quality and the motivation of the student.

Vue 2 or Vue 3?

Vue 3.
Composition API.

If you need Vue 2 to support an existing project, you'll know the answer to that question yourself.

The difference between Vue 2 and Vue 3 is big. It's not a case of learning the previous version beforehand to better and more easily understand the next one.

Do I need to know JavaScript beforehand?

Absolutely, at least an intermediate level. If not, I would suggest taking a short javascript course first, so that the person knows about the document object, knows how to handle array methods and is not too afraid of promises. Also, HTML and CSS at least at a basic level.

Here is an easy to read book - "Morgan N. - JavaScript for Kids. A Programming Self-Tutorial - 2016. Before you start learning Vue, it is advisable to understand 70% of the first part as well as paragraphs 10 and 12.


tip

Also an absolutely necessary pre-skill is the ability to google.

Is there a certification for Vue?

Vue.js Certification

Vue Style Guide

Be sure to check out the Vue Style Guide and try to follow its best practices when writing code.

Go back to this source from time to time and improve your code.

ESlint also helps you keep your code in line with best practices.

Do I need a mentor?

A mentor is useful for both a beginner and an experienced developer. You can uselessly kill two days to solve a problem that can be explained in 20 minutes by a more experienced person. And this two-day "experience" will never be useful again.

In companies, this role is usually played by more competent and friendly colleagues.

There are services like Solvery on the Internet that can help in this matter.

I still want video

There are quality ones from Vue Mastery, but most are outdated.

What else to look at besides Vue? React?

You can do React if you have a real option to use that knowledge, but it's much better to expand your developer horizons. Try to write a simple API on the backend. The easiest and most convenient language for this is PHP, but you can also use Node.js or Python. Try JSON-RPC and WebSockets transport protocols. Upload your application to GitHub Pages or another similar service, experiment with GitHub Actions - they help a lot with deploy automation and CI/CD in general. Work with Cloud providers (many offer free resources), set up a virtual server. Register a domain, make a product finished site - even if it's just your resume site or something basic on VitePress (used by this site). Work with FireStore and open APIs for various data. Check out Swagger. Learn SQL, install MySQL and play around with it, or do it on SupaBase. Understanding how data is stored and processed on the backend will help a lot in choosing the right strategies on the frontend.

Study how the modern internet works and what technologies and best practices are prevalent on it now.

',9),n=[s];function i(l,d,u,c,p,h){return a(),t("div",null,n)}const b=e(r,[["render",i]]);export{f as __pageData,b as default}; +import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Learning Vue","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/learning.md","filePath":"en/frontend/learning.md","lastUpdated":1706553672000}'),r={name:"en/frontend/learning.md"},s=o('

Learning Vue

Sources of information on Vue

For some reason, it is believed that there are only two ways to get knowledge on frontend - Vue documentation and tutorial videos from YouTube and all kinds of courses.

But documentation is not a textbook, but a reference book, and it is very difficult to separate grains from chaff on YouTube. I met some useful videos, but all of them were intended for developers who already know Vue quite well and showed some new or non-standard moments.


The main teacher should be a book that teaches, not a reference book.

An excellent Vue tutorial in English is the May 2023 Vue.js 3 Design Patterns and Best Practices. You can register on oReilly and read for 10 days for free. Even download it. In spite of the title, the book teaches programming, and from a fairly basic level.

Code examples from the book are in the public repository and well worth studying.

Note

We can draw an analogy between a good developer and a driver:

  1. learning the basics of driving, traffic rules and the internal combustion engine - Vue documentation and JavaScript specification
  2. Practical driving training at a driving school - good textbooks like "Vue.js 3 Design Patterns and Best Practices"
  3. Real driving experience - commercial development experience
  4. Extreme driving courses, put a glass of water on the hood and drive a twenty year old car with a manual transmission through broken streets - quality open source projects and certifications

It is impossible to become a good developer/driver both without 1. and only with 1. Training videos from the internet (both paid and free) can both be part of 4. and be completely useless and even harmful (very often), depending on their quality and the motivation of the student.

Vue 2 or Vue 3?

Vue 3.
Composition API.

If you need Vue 2 to support an existing project, you'll know the answer to that question yourself.

The difference between Vue 2 and Vue 3 is big. It's not a case of learning the previous version beforehand to better and more easily understand the next one.

Do I need to know JavaScript beforehand?

Absolutely, at least an intermediate level. If not, I would suggest taking a short javascript course first, so that the person knows about the document object, knows how to handle array methods and is not too afraid of promises. Also, HTML and CSS at least at a basic level.

Here is an easy to read book - "Morgan N. - JavaScript for Kids. A Programming Self-Tutorial - 2016. Before you start learning Vue, it is advisable to understand 70% of the first part as well as paragraphs 10 and 12.


tip

Also an absolutely necessary pre-skill is the ability to google.

Is there a certification for Vue?

Vue.js Certification

Vue Style Guide

Be sure to check out the Vue Style Guide and try to follow its best practices when writing code.

Go back to this source from time to time and improve your code.

ESlint also helps you keep your code in line with best practices.

Do I need a mentor?

A mentor is useful for both a beginner and an experienced developer. You can uselessly kill two days to solve a problem that can be explained in 20 minutes by a more experienced person. And this two-day "experience" will never be useful again.

In companies, this role is usually played by more competent and friendly colleagues.

There are services like Solvery on the Internet that can help in this matter.

I still want video

There are quality ones from Vue Mastery, but most are outdated.

What else to look at besides Vue? React?

You can do React if you have a real option to use that knowledge, but it's much better to expand your developer horizons. Try to write a simple API on the backend. The easiest and most convenient language for this is PHP, but you can also use Node.js or Python. Try JSON-RPC and WebSockets transport protocols. Upload your application to GitHub Pages or another similar service, experiment with GitHub Actions - they help a lot with deploy automation and CI/CD in general. Work with Cloud providers (many offer free resources), set up a virtual server. Register a domain, make a product finished site - even if it's just your resume site or something basic on VitePress (used by this site). Work with FireStore and open APIs for various data. Check out Swagger. Learn SQL, install MySQL and play around with it, or do it on SupaBase. Understanding how data is stored and processed on the backend will help a lot in choosing the right strategies on the frontend.

Study how the modern internet works and what technologies and best practices are prevalent on it now.

',9),n=[s];function i(l,d,u,c,p,h){return a(),t("div",null,n)}const b=e(r,[["render",i]]);export{f as __pageData,b as default}; diff --git a/assets/en_frontend_learning.md.x65PGI3R.lean.js b/assets/en_frontend_learning.md.tUwfnh_F.lean.js similarity index 85% rename from assets/en_frontend_learning.md.x65PGI3R.lean.js rename to assets/en_frontend_learning.md.tUwfnh_F.lean.js index 59e15762a..d13870cd1 100644 --- a/assets/en_frontend_learning.md.x65PGI3R.lean.js +++ b/assets/en_frontend_learning.md.tUwfnh_F.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Learning Vue","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/learning.md","filePath":"en/frontend/learning.md","lastUpdated":1706427418000}'),r={name:"en/frontend/learning.md"},s=o("",9),n=[s];function i(l,d,u,c,p,h){return a(),t("div",null,n)}const b=e(r,[["render",i]]);export{f as __pageData,b as default}; +import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Learning Vue","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/learning.md","filePath":"en/frontend/learning.md","lastUpdated":1706553672000}'),r={name:"en/frontend/learning.md"},s=o("",9),n=[s];function i(l,d,u,c,p,h){return a(),t("div",null,n)}const b=e(r,[["render",i]]);export{f as __pageData,b as default}; diff --git a/assets/en_frontend_spa-pwa-ssr-ssg.md.5rjxI0WA.js b/assets/en_frontend_spa-pwa-ssr-ssg.md.5-hdfyIW.js similarity index 99% rename from assets/en_frontend_spa-pwa-ssr-ssg.md.5rjxI0WA.js rename to assets/en_frontend_spa-pwa-ssr-ssg.md.5-hdfyIW.js index c5fc80ca6..9aff7923f 100644 --- a/assets/en_frontend_spa-pwa-ssr-ssg.md.5rjxI0WA.js +++ b/assets/en_frontend_spa-pwa-ssr-ssg.md.5-hdfyIW.js @@ -1 +1 @@ -import{_ as e,a as t}from"./chunks/dynamic-rendering.xvS1OZJu.js";import{_ as a,c as s,o,U as i}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"SPA, PWA, SSG, SSR and SEO","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/spa-pwa-ssr-ssg.md","filePath":"en/frontend/spa-pwa-ssr-ssg.md","lastUpdated":1706427418000}'),r={name:"en/frontend/spa-pwa-ssr-ssg.md"},n=i('

SPA, PWA, SSG, SSR and SEO

Web 1.0 -> Web 2.0

First there was static HTML and browsers showed it. A little bit later a little bit of JavaScript was invented to process forms and do a little animation. Then CSS came along and everyone saw that it was beautiful. Then someone proposed the idea of JSON for data format, and then Microsoft gave the world XMLHttpRequest, and JavaScript was allowed to send and receive data from the server.

That's how SPA was born.

SPA

SPA (Single Page Application) works like a regular desktop/mobile application - when first accessing the server, it receives the shell necessary to display the site, and then sends data to/from the server, usually in JSON format. This is much more efficient than the way when with each request from the server came a new HTML page with all the resources.

For the user UX increases significantly.

spa-vs-mpa

PWA

PWA (Progressive Web Application) is another step to improve user experience and make web applications as close as possible to native web applications.

With PWA, two elements are added to the SPA:

  1. Manifest. A text file with the properties of the application. With this, the icon of the web application can be set as well as native applications to the home screen of the smartphone. In addition, when PWA is launched, it may not show browser elements and appear to be a normal application.

  2. Service worker. This is a layer in the browser between the server and the browser itself that allows you to do managed caching. In other words, store the app with all the resources on the smartphone/computer so that when you start it, it will run immediately. If you don't need data from the server, the app can run offline (e.g. Notes).

You can read more about PWA on the website created by the Chrome team - https://web.dev/

Upgrading SPA to PWA is very small in labor cost, but very significant in benefit. Developing SPA and not making it a PWA is like renting a luxury hotel room but sleeping on a mat at its entrance in the corridor because it's too lazy to walk to the bedroom.

PWA -> Workbox and vite-plugin-pwa

Manifest and Service worker are so simple that creating a wrapper over SW - Workbox, and a plugin for Vite - vite-plugin-pwa is not logical. You get several times more code, need to load additional dependencies and understand wrapper configurations. Simple things have been made complex.

It is better to use Manifest and Service worker as they were created originally, and write these two simple files using templates from the specifications.

SSG

SSG (Static Site Generation) is an approach where the content of a website is pre-generated into html files, which are then distributed from the server.

Immediately suitable for indexing by search engines.

SSR

SSR (Server Side Rendering), a way of generating html on the server side, when generation occurs at the moment of request. After the client requests a page, the server executes API requests on its side and then generates the html page. Accordingly, the server needs a Node.js server, which is quite a heavy load on the hardware.

In addition, there are a lot of restrictions when writing code and using certain JavaScript and Vue features. As Google writes regarding SSR - "A rehydration problem: one app for the price of two".

SEO optimization

In order for a search engine to index a page on your site, it must receive HTML with content (text, images, video) when accessing it. With SPA sites, where content is loaded dynamically by JavaScript, this is often not possible.

The most popular and inefficient method to bypass this is to use SSR (SSG is suitable for simple structured sites without backend, like documentation).

Google allows you to see how your site looks/indexed by its crawler, which somehow still works with scripts, so first check if you need to get complicated at all.

If you find problems, you can use dynamic rendering

dynamic-rendering

The point is to handle requests from normal users and search bots differently and give them different pages. For users - SPA, for search bots - pages generated on the fly or in advance. Distribution can be handled by a webserver or an entry point to your site (index.php instead of index.html).

The above picture implies some kind of Prerenderer (which are also available as a third-party service or their own solution), but in most cases it is much easier to generate HTML page for the bot directly.

That is, for example, for a product page in an online store it can be its text description with pictures and customer reviews in any HTML formatting. For this purpose it is enough a script on PHP/Express/Python, etc. in 100-200 lines, which is much less labor-intensive than SSR solutions, and also reduces the requirements in the server "hardware" by orders of magnitude (the output can be cached in a static HTML file).

When the actual content (text, images) of such a page coincides with the content of SPA in the browser, Google does not consider the simplified version for its bot as a deception. This method has been around since before the advent of SSRs. Verified by many years of use.

PageSpeed and other performance tests

PageSpeed and similar tools are very useful in identifying unoptimized places in your web application, but it is not quite right for SPA and PWA.

More precisely, some of its metrics don't take into account UX as a whole. A well-built PWA, when first downloaded and installed, will of course lose by FCP metrics to its SSR counterpart, but after placing all its resources locally on the client's browser, no SSR will come close to it in terms of speed and user comfort, not to mention other features like offline operation and installation as a native application.

SSR can probably be useful for some exceptional cases, but in general it looks like a dead-end branch in frontend development.

',9),l=[n];function d(c,p,h,m,u,f){return o(),s("div",null,l)}const S=a(r,[["render",d]]);export{b as __pageData,S as default}; +import{_ as e,a as t}from"./chunks/dynamic-rendering.xvS1OZJu.js";import{_ as a,c as s,o,U as i}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"SPA, PWA, SSG, SSR and SEO","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/spa-pwa-ssr-ssg.md","filePath":"en/frontend/spa-pwa-ssr-ssg.md","lastUpdated":1706553672000}'),r={name:"en/frontend/spa-pwa-ssr-ssg.md"},n=i('

SPA, PWA, SSG, SSR and SEO

Web 1.0 -> Web 2.0

First there was static HTML and browsers showed it. A little bit later a little bit of JavaScript was invented to process forms and do a little animation. Then CSS came along and everyone saw that it was beautiful. Then someone proposed the idea of JSON for data format, and then Microsoft gave the world XMLHttpRequest, and JavaScript was allowed to send and receive data from the server.

That's how SPA was born.

SPA

SPA (Single Page Application) works like a regular desktop/mobile application - when first accessing the server, it receives the shell necessary to display the site, and then sends data to/from the server, usually in JSON format. This is much more efficient than the way when with each request from the server came a new HTML page with all the resources.

For the user UX increases significantly.

spa-vs-mpa

PWA

PWA (Progressive Web Application) is another step to improve user experience and make web applications as close as possible to native web applications.

With PWA, two elements are added to the SPA:

  1. Manifest. A text file with the properties of the application. With this, the icon of the web application can be set as well as native applications to the home screen of the smartphone. In addition, when PWA is launched, it may not show browser elements and appear to be a normal application.

  2. Service worker. This is a layer in the browser between the server and the browser itself that allows you to do managed caching. In other words, store the app with all the resources on the smartphone/computer so that when you start it, it will run immediately. If you don't need data from the server, the app can run offline (e.g. Notes).

You can read more about PWA on the website created by the Chrome team - https://web.dev/

Upgrading SPA to PWA is very small in labor cost, but very significant in benefit. Developing SPA and not making it a PWA is like renting a luxury hotel room but sleeping on a mat at its entrance in the corridor because it's too lazy to walk to the bedroom.

PWA -> Workbox and vite-plugin-pwa

Manifest and Service worker are so simple that creating a wrapper over SW - Workbox, and a plugin for Vite - vite-plugin-pwa is not logical. You get several times more code, need to load additional dependencies and understand wrapper configurations. Simple things have been made complex.

It is better to use Manifest and Service worker as they were created originally, and write these two simple files using templates from the specifications.

SSG

SSG (Static Site Generation) is an approach where the content of a website is pre-generated into html files, which are then distributed from the server.

Immediately suitable for indexing by search engines.

SSR

SSR (Server Side Rendering), a way of generating html on the server side, when generation occurs at the moment of request. After the client requests a page, the server executes API requests on its side and then generates the html page. Accordingly, the server needs a Node.js server, which is quite a heavy load on the hardware.

In addition, there are a lot of restrictions when writing code and using certain JavaScript and Vue features. As Google writes regarding SSR - "A rehydration problem: one app for the price of two".

SEO optimization

In order for a search engine to index a page on your site, it must receive HTML with content (text, images, video) when accessing it. With SPA sites, where content is loaded dynamically by JavaScript, this is often not possible.

The most popular and inefficient method to bypass this is to use SSR (SSG is suitable for simple structured sites without backend, like documentation).

Google allows you to see how your site looks/indexed by its crawler, which somehow still works with scripts, so first check if you need to get complicated at all.

If you find problems, you can use dynamic rendering

dynamic-rendering

The point is to handle requests from normal users and search bots differently and give them different pages. For users - SPA, for search bots - pages generated on the fly or in advance. Distribution can be handled by a webserver or an entry point to your site (index.php instead of index.html).

The above picture implies some kind of Prerenderer (which are also available as a third-party service or their own solution), but in most cases it is much easier to generate HTML page for the bot directly.

That is, for example, for a product page in an online store it can be its text description with pictures and customer reviews in any HTML formatting. For this purpose it is enough a script on PHP/Express/Python, etc. in 100-200 lines, which is much less labor-intensive than SSR solutions, and also reduces the requirements in the server "hardware" by orders of magnitude (the output can be cached in a static HTML file).

When the actual content (text, images) of such a page coincides with the content of SPA in the browser, Google does not consider the simplified version for its bot as a deception. This method has been around since before the advent of SSRs. Verified by many years of use.

PageSpeed and other performance tests

PageSpeed and similar tools are very useful in identifying unoptimized places in your web application, but it is not quite right for SPA and PWA.

More precisely, some of its metrics don't take into account UX as a whole. A well-built PWA, when first downloaded and installed, will of course lose by FCP metrics to its SSR counterpart, but after placing all its resources locally on the client's browser, no SSR will come close to it in terms of speed and user comfort, not to mention other features like offline operation and installation as a native application.

SSR can probably be useful for some exceptional cases, but in general it looks like a dead-end branch in frontend development.

',9),l=[n];function d(c,p,h,m,u,f){return o(),s("div",null,l)}const S=a(r,[["render",d]]);export{b as __pageData,S as default}; diff --git a/assets/en_frontend_spa-pwa-ssr-ssg.md.5rjxI0WA.lean.js b/assets/en_frontend_spa-pwa-ssr-ssg.md.5-hdfyIW.lean.js similarity index 88% rename from assets/en_frontend_spa-pwa-ssr-ssg.md.5rjxI0WA.lean.js rename to assets/en_frontend_spa-pwa-ssr-ssg.md.5-hdfyIW.lean.js index 94c2356be..6b7f88b7c 100644 --- a/assets/en_frontend_spa-pwa-ssr-ssg.md.5rjxI0WA.lean.js +++ b/assets/en_frontend_spa-pwa-ssr-ssg.md.5-hdfyIW.lean.js @@ -1 +1 @@ -import{_ as e,a as t}from"./chunks/dynamic-rendering.xvS1OZJu.js";import{_ as a,c as s,o,U as i}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"SPA, PWA, SSG, SSR and SEO","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/spa-pwa-ssr-ssg.md","filePath":"en/frontend/spa-pwa-ssr-ssg.md","lastUpdated":1706427418000}'),r={name:"en/frontend/spa-pwa-ssr-ssg.md"},n=i("",9),l=[n];function d(c,p,h,m,u,f){return o(),s("div",null,l)}const S=a(r,[["render",d]]);export{b as __pageData,S as default}; +import{_ as e,a as t}from"./chunks/dynamic-rendering.xvS1OZJu.js";import{_ as a,c as s,o,U as i}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"SPA, PWA, SSG, SSR and SEO","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend/spa-pwa-ssr-ssg.md","filePath":"en/frontend/spa-pwa-ssr-ssg.md","lastUpdated":1706553672000}'),r={name:"en/frontend/spa-pwa-ssr-ssg.md"},n=i("",9),l=[n];function d(c,p,h,m,u,f){return o(),s("div",null,l)}const S=a(r,[["render",d]]);export{b as __pageData,S as default}; diff --git a/assets/en_index.md.TkbC4UZv.js b/assets/en_index.md.5FO_61F0.js similarity index 94% rename from assets/en_index.md.TkbC4UZv.js rename to assets/en_index.md.5FO_61F0.js index 1a19adbdd..51614f0ae 100644 --- a/assets/en_index.md.TkbC4UZv.js +++ b/assets/en_index.md.5FO_61F0.js @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Most frequently asked questions about Vue.js","actions":[{"theme":"brand","text":"Get Started","link":"/en/misc/introduction"},{"theme":"alt","text":"Why Vue?","link":"/en/frontend/about-frameworks"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"General issues of frontend development - architecture, design patterns, best practices are discussed"},{"title":"Vue 3","details":"Focuses on Vue 3, Composition API and the Vue ecosystem of recent years."},{"title":"vue-webapp","details":"Scaffold your Vue 3 project with many prebuilt options"},{"title":"Nuxt-free","details":"Nuxt is a separate standalone framework that deserves its own FAQ"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1706427418000}'),s={name:"en/index.md"};function n(o,r,i,d,c,u){return a(),t("div")}const m=e(s,[["render",n]]);export{p as __pageData,m as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Most frequently asked questions about Vue.js","actions":[{"theme":"brand","text":"Get Started","link":"/en/misc/introduction"},{"theme":"alt","text":"Why Vue?","link":"/en/frontend/about-frameworks"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"General issues of frontend development - architecture, design patterns, best practices are discussed"},{"title":"Vue 3","details":"Focuses on Vue 3, Composition API and the Vue ecosystem of recent years."},{"title":"vue-webapp","details":"Scaffold your Vue 3 project with many prebuilt options"},{"title":"Nuxt-free","details":"Nuxt is a separate standalone framework that deserves its own FAQ"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1706553672000}'),s={name:"en/index.md"};function n(o,r,i,d,c,u){return a(),t("div")}const m=e(s,[["render",n]]);export{p as __pageData,m as default}; diff --git a/assets/en_index.md.TkbC4UZv.lean.js b/assets/en_index.md.5FO_61F0.lean.js similarity index 94% rename from assets/en_index.md.TkbC4UZv.lean.js rename to assets/en_index.md.5FO_61F0.lean.js index 1a19adbdd..51614f0ae 100644 --- a/assets/en_index.md.TkbC4UZv.lean.js +++ b/assets/en_index.md.5FO_61F0.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Most frequently asked questions about Vue.js","actions":[{"theme":"brand","text":"Get Started","link":"/en/misc/introduction"},{"theme":"alt","text":"Why Vue?","link":"/en/frontend/about-frameworks"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"General issues of frontend development - architecture, design patterns, best practices are discussed"},{"title":"Vue 3","details":"Focuses on Vue 3, Composition API and the Vue ecosystem of recent years."},{"title":"vue-webapp","details":"Scaffold your Vue 3 project with many prebuilt options"},{"title":"Nuxt-free","details":"Nuxt is a separate standalone framework that deserves its own FAQ"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1706427418000}'),s={name:"en/index.md"};function n(o,r,i,d,c,u){return a(),t("div")}const m=e(s,[["render",n]]);export{p as __pageData,m as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Most frequently asked questions about Vue.js","actions":[{"theme":"brand","text":"Get Started","link":"/en/misc/introduction"},{"theme":"alt","text":"Why Vue?","link":"/en/frontend/about-frameworks"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"General issues of frontend development - architecture, design patterns, best practices are discussed"},{"title":"Vue 3","details":"Focuses on Vue 3, Composition API and the Vue ecosystem of recent years."},{"title":"vue-webapp","details":"Scaffold your Vue 3 project with many prebuilt options"},{"title":"Nuxt-free","details":"Nuxt is a separate standalone framework that deserves its own FAQ"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":1706553672000}'),s={name:"en/index.md"};function n(o,r,i,d,c,u){return a(),t("div")}const m=e(s,[["render",n]]);export{p as __pageData,m as default}; diff --git a/assets/en_misc_CHANGELOG.md.w8s-w063.js b/assets/en_misc_CHANGELOG.md.aRNbjEuk.js similarity index 97% rename from assets/en_misc_CHANGELOG.md.w8s-w063.js rename to assets/en_misc_CHANGELOG.md.aRNbjEuk.js index 311477018..ae63e7916 100644 --- a/assets/en_misc_CHANGELOG.md.w8s-w063.js +++ b/assets/en_misc_CHANGELOG.md.aRNbjEuk.js @@ -1 +1 @@ -import{_ as e,c as a,o,U as l}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/CHANGELOG.md","filePath":"en/misc/CHANGELOG.md","lastUpdated":1706427418000}'),n={name:"en/misc/CHANGELOG.md"},t=l('

Changelog


v1.4 (24-11-2023)

Changed

  • Frontend / How to learn Vue?
  • vue-webapp


v1.3 (10-10-2023)

Changed

  • Backend / CORS
  • Frontend / How to learn Vue?
  • Development / Useful tips


v1.2 (28-09-2023)

New

  • Deployment / Github Actions

Changed

  • Deployment / CI/CD
  • Deployment / Stores - Vuex, Pinia and Composition API
  • Frontend / About frontend frameworks


v1.1 (15-09-2023)

New

  • Development / Stores

Changed

  • Development / Helpful hints.


v1.0 (11-09-2023)

New

  • Initial launch
',29),r=[t];function i(d,h,c,s,u,b){return o(),a("div",null,r)}const _=e(n,[["render",i]]);export{g as __pageData,_ as default}; +import{_ as e,c as a,o,U as l}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/CHANGELOG.md","filePath":"en/misc/CHANGELOG.md","lastUpdated":1706553672000}'),n={name:"en/misc/CHANGELOG.md"},t=l('

Changelog


v1.4 (24-11-2023)

Changed

  • Frontend / How to learn Vue?
  • vue-webapp


v1.3 (10-10-2023)

Changed

  • Backend / CORS
  • Frontend / How to learn Vue?
  • Development / Useful tips


v1.2 (28-09-2023)

New

  • Deployment / Github Actions

Changed

  • Deployment / CI/CD
  • Deployment / Stores - Vuex, Pinia and Composition API
  • Frontend / About frontend frameworks


v1.1 (15-09-2023)

New

  • Development / Stores

Changed

  • Development / Helpful hints.


v1.0 (11-09-2023)

New

  • Initial launch
',29),r=[t];function i(d,h,c,s,u,b){return o(),a("div",null,r)}const _=e(n,[["render",i]]);export{g as __pageData,_ as default}; diff --git a/assets/en_misc_CHANGELOG.md.w8s-w063.lean.js b/assets/en_misc_CHANGELOG.md.aRNbjEuk.lean.js similarity index 84% rename from assets/en_misc_CHANGELOG.md.w8s-w063.lean.js rename to assets/en_misc_CHANGELOG.md.aRNbjEuk.lean.js index faca58bb4..fa2824e17 100644 --- a/assets/en_misc_CHANGELOG.md.w8s-w063.lean.js +++ b/assets/en_misc_CHANGELOG.md.aRNbjEuk.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o,U as l}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/CHANGELOG.md","filePath":"en/misc/CHANGELOG.md","lastUpdated":1706427418000}'),n={name:"en/misc/CHANGELOG.md"},t=l("",29),r=[t];function i(d,h,c,s,u,b){return o(),a("div",null,r)}const _=e(n,[["render",i]]);export{g as __pageData,_ as default}; +import{_ as e,c as a,o,U as l}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/CHANGELOG.md","filePath":"en/misc/CHANGELOG.md","lastUpdated":1706553672000}'),n={name:"en/misc/CHANGELOG.md"},t=l("",29),r=[t];function i(d,h,c,s,u,b){return o(),a("div",null,r)}const _=e(n,[["render",i]]);export{g as __pageData,_ as default}; diff --git a/assets/en_misc_cheat-sheets.md.OVKRNKkw.js b/assets/en_misc_cheat-sheets.md.qaB2IoCS.js similarity index 97% rename from assets/en_misc_cheat-sheets.md.OVKRNKkw.js rename to assets/en_misc_cheat-sheets.md.qaB2IoCS.js index 5888a1476..84dbaa367 100644 --- a/assets/en_misc_cheat-sheets.md.OVKRNKkw.js +++ b/assets/en_misc_cheat-sheets.md.qaB2IoCS.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as l}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Cheat Sheet","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/cheat-sheets.md","filePath":"en/misc/cheat-sheets.md","lastUpdated":1706427418000}'),r={name:"en/misc/cheat-sheets.md"},i=l('

Cheat Sheet

Vue

JavaScript

HTML

CSS

Typescript

Markdown

',13),h=[i];function s(n,o,c,d,p,f){return t(),a("div",null,h)}const _=e(r,[["render",s]]);export{S as __pageData,_ as default}; +import{_ as e,c as a,o as t,U as l}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Cheat Sheet","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/cheat-sheets.md","filePath":"en/misc/cheat-sheets.md","lastUpdated":1706553672000}'),r={name:"en/misc/cheat-sheets.md"},i=l('

Cheat Sheet

Vue

JavaScript

HTML

CSS

Typescript

Markdown

',13),h=[i];function s(n,o,c,d,p,f){return t(),a("div",null,h)}const _=e(r,[["render",s]]);export{S as __pageData,_ as default}; diff --git a/assets/en_misc_cheat-sheets.md.OVKRNKkw.lean.js b/assets/en_misc_cheat-sheets.md.qaB2IoCS.lean.js similarity index 85% rename from assets/en_misc_cheat-sheets.md.OVKRNKkw.lean.js rename to assets/en_misc_cheat-sheets.md.qaB2IoCS.lean.js index d0607985c..c2c6cc4f1 100644 --- a/assets/en_misc_cheat-sheets.md.OVKRNKkw.lean.js +++ b/assets/en_misc_cheat-sheets.md.qaB2IoCS.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as l}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Cheat Sheet","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/cheat-sheets.md","filePath":"en/misc/cheat-sheets.md","lastUpdated":1706427418000}'),r={name:"en/misc/cheat-sheets.md"},i=l("",13),h=[i];function s(n,o,c,d,p,f){return t(),a("div",null,h)}const _=e(r,[["render",s]]);export{S as __pageData,_ as default}; +import{_ as e,c as a,o as t,U as l}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Cheat Sheet","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/cheat-sheets.md","filePath":"en/misc/cheat-sheets.md","lastUpdated":1706553672000}'),r={name:"en/misc/cheat-sheets.md"},i=l("",13),h=[i];function s(n,o,c,d,p,f){return t(),a("div",null,h)}const _=e(r,[["render",s]]);export{S as __pageData,_ as default}; diff --git a/assets/en_misc_contribute.md.P2I6J5n0.js b/assets/en_misc_contribute.md.s8RT8URP.js similarity index 97% rename from assets/en_misc_contribute.md.P2I6J5n0.js rename to assets/en_misc_contribute.md.s8RT8URP.js index dd19b9945..88fa395e3 100644 --- a/assets/en_misc_contribute.md.P2I6J5n0.js +++ b/assets/en_misc_contribute.md.s8RT8URP.js @@ -1,4 +1,4 @@ -import{h as c,c as m,m as e,ab as n,ac as r,a as i,o as d}from"./chunks/framework.P5TqXf0g.js";const h=e("h1",{id:"contribute-to-the-development-of-this-resource",tabindex:"-1"},[i("Contribute to the development of this resource "),e("a",{class:"header-anchor",href:"#contribute-to-the-development-of-this-resource","aria-label":'Permalink to "Contribute to the development of this resource"'},"​")],-1),p=e("p",null,"You can suggest corrections to any or add a new Q/A using the form below.",-1),f=e("p",null,[i("GitHub way of making changes ("),e("i",null,"fork -> edit -> create PR"),i(") is also very welcome.")],-1),b={class:"form-container",action:"action_page.php"},v=e("label",{for:"fname"},"Your name and/or contacts (optional)",-1),_=e("label",{for:"subject"},"Question/answer or message",-1),g=e("label",{for:"check"},'Enter the word "vue"',-1),x=JSON.parse('{"title":"Contribute to the development of this resource","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/contribute.md","filePath":"en/misc/contribute.md","lastUpdated":1706427418000}'),k={name:"en/misc/contribute.md"},j=Object.assign(k,{setup(y){const s=c(),t=c({name:"",email:"",message:"",check:""});async function u(){if(s.value.setAttribute("disabled",!0),t.value.check==="vue"){const l=`Message from Vue FAQ: +import{h as c,c as m,m as e,ab as n,ac as r,a as i,o as d}from"./chunks/framework.P5TqXf0g.js";const h=e("h1",{id:"contribute-to-the-development-of-this-resource",tabindex:"-1"},[i("Contribute to the development of this resource "),e("a",{class:"header-anchor",href:"#contribute-to-the-development-of-this-resource","aria-label":'Permalink to "Contribute to the development of this resource"'},"​")],-1),p=e("p",null,"You can suggest corrections to any or add a new Q/A using the form below.",-1),f=e("p",null,[i("GitHub way of making changes ("),e("i",null,"fork -> edit -> create PR"),i(") is also very welcome.")],-1),b={class:"form-container",action:"action_page.php"},v=e("label",{for:"fname"},"Your name and/or contacts (optional)",-1),_=e("label",{for:"subject"},"Question/answer or message",-1),g=e("label",{for:"check"},'Enter the word "vue"',-1),x=JSON.parse('{"title":"Contribute to the development of this resource","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/contribute.md","filePath":"en/misc/contribute.md","lastUpdated":1706553672000}'),k={name:"en/misc/contribute.md"},j=Object.assign(k,{setup(y){const s=c(),t=c({name:"",email:"",message:"",check:""});async function u(){if(s.value.setAttribute("disabled",!0),t.value.check==="vue"){const l=`Message from Vue FAQ: diff --git a/assets/en_misc_contribute.md.P2I6J5n0.lean.js b/assets/en_misc_contribute.md.s8RT8URP.lean.js similarity index 97% rename from assets/en_misc_contribute.md.P2I6J5n0.lean.js rename to assets/en_misc_contribute.md.s8RT8URP.lean.js index dd19b9945..88fa395e3 100644 --- a/assets/en_misc_contribute.md.P2I6J5n0.lean.js +++ b/assets/en_misc_contribute.md.s8RT8URP.lean.js @@ -1,4 +1,4 @@ -import{h as c,c as m,m as e,ab as n,ac as r,a as i,o as d}from"./chunks/framework.P5TqXf0g.js";const h=e("h1",{id:"contribute-to-the-development-of-this-resource",tabindex:"-1"},[i("Contribute to the development of this resource "),e("a",{class:"header-anchor",href:"#contribute-to-the-development-of-this-resource","aria-label":'Permalink to "Contribute to the development of this resource"'},"​")],-1),p=e("p",null,"You can suggest corrections to any or add a new Q/A using the form below.",-1),f=e("p",null,[i("GitHub way of making changes ("),e("i",null,"fork -> edit -> create PR"),i(") is also very welcome.")],-1),b={class:"form-container",action:"action_page.php"},v=e("label",{for:"fname"},"Your name and/or contacts (optional)",-1),_=e("label",{for:"subject"},"Question/answer or message",-1),g=e("label",{for:"check"},'Enter the word "vue"',-1),x=JSON.parse('{"title":"Contribute to the development of this resource","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/contribute.md","filePath":"en/misc/contribute.md","lastUpdated":1706427418000}'),k={name:"en/misc/contribute.md"},j=Object.assign(k,{setup(y){const s=c(),t=c({name:"",email:"",message:"",check:""});async function u(){if(s.value.setAttribute("disabled",!0),t.value.check==="vue"){const l=`Message from Vue FAQ: +import{h as c,c as m,m as e,ab as n,ac as r,a as i,o as d}from"./chunks/framework.P5TqXf0g.js";const h=e("h1",{id:"contribute-to-the-development-of-this-resource",tabindex:"-1"},[i("Contribute to the development of this resource "),e("a",{class:"header-anchor",href:"#contribute-to-the-development-of-this-resource","aria-label":'Permalink to "Contribute to the development of this resource"'},"​")],-1),p=e("p",null,"You can suggest corrections to any or add a new Q/A using the form below.",-1),f=e("p",null,[i("GitHub way of making changes ("),e("i",null,"fork -> edit -> create PR"),i(") is also very welcome.")],-1),b={class:"form-container",action:"action_page.php"},v=e("label",{for:"fname"},"Your name and/or contacts (optional)",-1),_=e("label",{for:"subject"},"Question/answer or message",-1),g=e("label",{for:"check"},'Enter the word "vue"',-1),x=JSON.parse('{"title":"Contribute to the development of this resource","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/contribute.md","filePath":"en/misc/contribute.md","lastUpdated":1706553672000}'),k={name:"en/misc/contribute.md"},j=Object.assign(k,{setup(y){const s=c(),t=c({name:"",email:"",message:"",check:""});async function u(){if(s.value.setAttribute("disabled",!0),t.value.check==="vue"){const l=`Message from Vue FAQ: diff --git a/assets/en_misc_glossary.md.z5_tk0gO.js b/assets/en_misc_glossary.md.Ro7yOndb.js similarity index 95% rename from assets/en_misc_glossary.md.z5_tk0gO.js rename to assets/en_misc_glossary.md.Ro7yOndb.js index 01b0689a1..313904cf2 100644 --- a/assets/en_misc_glossary.md.z5_tk0gO.js +++ b/assets/en_misc_glossary.md.Ro7yOndb.js @@ -1 +1 @@ -import{_ as t,c as n,o as a,m as e,a as s}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Glossary and abbreviations","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/glossary.md","filePath":"en/misc/glossary.md","lastUpdated":1706427418000}'),i={name:"en/misc/glossary.md"},o=e("h1",{id:"glossary-and-abbreviations",tabindex:"-1"},[s("Glossary and abbreviations "),e("a",{class:"header-anchor",href:"#glossary-and-abbreviations","aria-label":'Permalink to "Glossary and abbreviations"'},"​")],-1),r=e("ul",null,[e("li",null,"DX (developer experience) - developer's experience, the convenience of working on the application. This includes everything - code quality, IDE usability, competent project architecture, commenting, documentation quality, using proven and best practices on the project, etc."),e("li",null,"UX (user experience) - user's experience. Its general impression of the user's convenience in working with the site/application."),e("li",null,"UI (user interface) - website/application design from the point of view of visual aesthetics and style."),e("li",null,"SW (service worker) - Service Worker (PWA element)"),e("li",null,"AT (access token) - JWT authentication token"),e("li",null,"RT (refresh token) - JWT authentication token")],-1),l=[o,r];function c(d,p,u,h,m,v){return a(),n("div",null,l)}const b=t(i,[["render",c]]);export{f as __pageData,b as default}; +import{_ as t,c as n,o as a,m as e,a as s}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Glossary and abbreviations","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/glossary.md","filePath":"en/misc/glossary.md","lastUpdated":1706553672000}'),i={name:"en/misc/glossary.md"},o=e("h1",{id:"glossary-and-abbreviations",tabindex:"-1"},[s("Glossary and abbreviations "),e("a",{class:"header-anchor",href:"#glossary-and-abbreviations","aria-label":'Permalink to "Glossary and abbreviations"'},"​")],-1),r=e("ul",null,[e("li",null,"DX (developer experience) - developer's experience, the convenience of working on the application. This includes everything - code quality, IDE usability, competent project architecture, commenting, documentation quality, using proven and best practices on the project, etc."),e("li",null,"UX (user experience) - user's experience. Its general impression of the user's convenience in working with the site/application."),e("li",null,"UI (user interface) - website/application design from the point of view of visual aesthetics and style."),e("li",null,"SW (service worker) - Service Worker (PWA element)"),e("li",null,"AT (access token) - JWT authentication token"),e("li",null,"RT (refresh token) - JWT authentication token")],-1),l=[o,r];function c(d,p,u,h,m,v){return a(),n("div",null,l)}const b=t(i,[["render",c]]);export{f as __pageData,b as default}; diff --git a/assets/en_misc_glossary.md.z5_tk0gO.lean.js b/assets/en_misc_glossary.md.Ro7yOndb.lean.js similarity index 95% rename from assets/en_misc_glossary.md.z5_tk0gO.lean.js rename to assets/en_misc_glossary.md.Ro7yOndb.lean.js index 01b0689a1..313904cf2 100644 --- a/assets/en_misc_glossary.md.z5_tk0gO.lean.js +++ b/assets/en_misc_glossary.md.Ro7yOndb.lean.js @@ -1 +1 @@ -import{_ as t,c as n,o as a,m as e,a as s}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Glossary and abbreviations","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/glossary.md","filePath":"en/misc/glossary.md","lastUpdated":1706427418000}'),i={name:"en/misc/glossary.md"},o=e("h1",{id:"glossary-and-abbreviations",tabindex:"-1"},[s("Glossary and abbreviations "),e("a",{class:"header-anchor",href:"#glossary-and-abbreviations","aria-label":'Permalink to "Glossary and abbreviations"'},"​")],-1),r=e("ul",null,[e("li",null,"DX (developer experience) - developer's experience, the convenience of working on the application. This includes everything - code quality, IDE usability, competent project architecture, commenting, documentation quality, using proven and best practices on the project, etc."),e("li",null,"UX (user experience) - user's experience. Its general impression of the user's convenience in working with the site/application."),e("li",null,"UI (user interface) - website/application design from the point of view of visual aesthetics and style."),e("li",null,"SW (service worker) - Service Worker (PWA element)"),e("li",null,"AT (access token) - JWT authentication token"),e("li",null,"RT (refresh token) - JWT authentication token")],-1),l=[o,r];function c(d,p,u,h,m,v){return a(),n("div",null,l)}const b=t(i,[["render",c]]);export{f as __pageData,b as default}; +import{_ as t,c as n,o as a,m as e,a as s}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Glossary and abbreviations","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/glossary.md","filePath":"en/misc/glossary.md","lastUpdated":1706553672000}'),i={name:"en/misc/glossary.md"},o=e("h1",{id:"glossary-and-abbreviations",tabindex:"-1"},[s("Glossary and abbreviations "),e("a",{class:"header-anchor",href:"#glossary-and-abbreviations","aria-label":'Permalink to "Glossary and abbreviations"'},"​")],-1),r=e("ul",null,[e("li",null,"DX (developer experience) - developer's experience, the convenience of working on the application. This includes everything - code quality, IDE usability, competent project architecture, commenting, documentation quality, using proven and best practices on the project, etc."),e("li",null,"UX (user experience) - user's experience. Its general impression of the user's convenience in working with the site/application."),e("li",null,"UI (user interface) - website/application design from the point of view of visual aesthetics and style."),e("li",null,"SW (service worker) - Service Worker (PWA element)"),e("li",null,"AT (access token) - JWT authentication token"),e("li",null,"RT (refresh token) - JWT authentication token")],-1),l=[o,r];function c(d,p,u,h,m,v){return a(),n("div",null,l)}const b=t(i,[["render",c]]);export{f as __pageData,b as default}; diff --git a/assets/en_misc_introduction.md.Lebr-N6a.js b/assets/en_misc_introduction.md.Rp1fQ250.js similarity index 97% rename from assets/en_misc_introduction.md.Lebr-N6a.js rename to assets/en_misc_introduction.md.Rp1fQ250.js index 31662b482..10c1158a6 100644 --- a/assets/en_misc_introduction.md.Lebr-N6a.js +++ b/assets/en_misc_introduction.md.Rp1fQ250.js @@ -1 +1 @@ -import{_ as e,c as t,o as r,U as a}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/introduction.md","filePath":"en/misc/introduction.md","lastUpdated":1706427418000}'),o={name:"en/misc/introduction.md"},n=a('

Introduction

This FAQ (Frequently Asked Questions) is created on the most frequently touched topics in Reddit r/vuejs/ and Telegram chat @vuejs_ru.

The level of questions and answers covers both beginners and experienced frontend developers.

As answers are used both generally recognized, verified and objective information, and subjective opinion of the author.

The increase in complexity does not come from the top down. The first questions and answers describe non-obvious points that may be interesting for experienced programmers.

The main sources of information - official documentation of Vue 3 and Vite, the book Vue.js 3 Design Patterns and Best Practices, r/vuejs/, @vuejs_ru.

Relevance of the information - 2022-2023 years.


About the author:

Ruslan Makarov - independent consultant, full-stack engineer with 20+ years of experience in SD, AWS Certified Solutions Architect, Sun Certified Java Developer.

',11),i=[n];function s(c,l,u,d,h,f){return r(),t("div",null,i)}const _=e(o,[["render",s]]);export{m as __pageData,_ as default}; +import{_ as e,c as t,o as r,U as a}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/introduction.md","filePath":"en/misc/introduction.md","lastUpdated":1706553672000}'),o={name:"en/misc/introduction.md"},n=a('

Introduction

This FAQ (Frequently Asked Questions) is created on the most frequently touched topics in Reddit r/vuejs/ and Telegram chat @vuejs_ru.

The level of questions and answers covers both beginners and experienced frontend developers.

As answers are used both generally recognized, verified and objective information, and subjective opinion of the author.

The increase in complexity does not come from the top down. The first questions and answers describe non-obvious points that may be interesting for experienced programmers.

The main sources of information - official documentation of Vue 3 and Vite, the book Vue.js 3 Design Patterns and Best Practices, r/vuejs/, @vuejs_ru.

Relevance of the information - 2022-2023 years.


About the author:

Ruslan Makarov - independent consultant, full-stack engineer with 20+ years of experience in SD, AWS Certified Solutions Architect, Sun Certified Java Developer.

',11),i=[n];function s(c,l,u,d,h,f){return r(),t("div",null,i)}const _=e(o,[["render",s]]);export{m as __pageData,_ as default}; diff --git a/assets/en_misc_introduction.md.Lebr-N6a.lean.js b/assets/en_misc_introduction.md.Rp1fQ250.lean.js similarity index 85% rename from assets/en_misc_introduction.md.Lebr-N6a.lean.js rename to assets/en_misc_introduction.md.Rp1fQ250.lean.js index 1ff855ab5..f93925b5d 100644 --- a/assets/en_misc_introduction.md.Lebr-N6a.lean.js +++ b/assets/en_misc_introduction.md.Rp1fQ250.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as r,U as a}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/introduction.md","filePath":"en/misc/introduction.md","lastUpdated":1706427418000}'),o={name:"en/misc/introduction.md"},n=a("",11),i=[n];function s(c,l,u,d,h,f){return r(),t("div",null,i)}const _=e(o,[["render",s]]);export{m as __pageData,_ as default}; +import{_ as e,c as t,o as r,U as a}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"en/misc/introduction.md","filePath":"en/misc/introduction.md","lastUpdated":1706553672000}'),o={name:"en/misc/introduction.md"},n=a("",11),i=[n];function s(c,l,u,d,h,f){return r(),t("div",null,i)}const _=e(o,[["render",s]]);export{m as __pageData,_ as default}; diff --git a/assets/en_vue-webapp_contribution.md.NconB5ME.js b/assets/en_vue-webapp_contribution.md.LkYDMpY1.js similarity index 94% rename from assets/en_vue-webapp_contribution.md.NconB5ME.js rename to assets/en_vue-webapp_contribution.md.LkYDMpY1.js index 44843bd59..151188fe8 100644 --- a/assets/en_vue-webapp_contribution.md.NconB5ME.js +++ b/assets/en_vue-webapp_contribution.md.LkYDMpY1.js @@ -1 +1 @@ -import{_ as a,c as o,o as n,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Project participation","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/contribution.md","filePath":"en/vue-webapp/contribution.md","lastUpdated":1706427418000}'),r={name:"en/vue-webapp/contribution.md"},i=e("h1",{id:"project-participation",tabindex:"-1"},[t("Project participation "),e("a",{class:"header-anchor",href:"#project-participation","aria-label":'Permalink to "Project participation"'},"​")],-1),p=e("p",null,[e("a",{href:"https://github.com/vuesence/create-vue-webapp",target:"_blank",rel:"noreferrer"},"create-vue-webapp"),t(" and "),e("a",{href:"https://github.com/vuesence/vue-webapp",target:"_blank",rel:"noreferrer"},"vue-webapp"),t(" are open source projects under the MIT license.")],-1),c=e("p",null,"Contributions are welcome.",-1),s=[i,p,c];function u(l,d,m,b,_,h){return n(),o("div",null,s)}const v=a(r,[["render",u]]);export{f as __pageData,v as default}; +import{_ as a,c as o,o as n,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Project participation","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/contribution.md","filePath":"en/vue-webapp/contribution.md","lastUpdated":1706553672000}'),r={name:"en/vue-webapp/contribution.md"},i=e("h1",{id:"project-participation",tabindex:"-1"},[t("Project participation "),e("a",{class:"header-anchor",href:"#project-participation","aria-label":'Permalink to "Project participation"'},"​")],-1),p=e("p",null,[e("a",{href:"https://github.com/vuesence/create-vue-webapp",target:"_blank",rel:"noreferrer"},"create-vue-webapp"),t(" and "),e("a",{href:"https://github.com/vuesence/vue-webapp",target:"_blank",rel:"noreferrer"},"vue-webapp"),t(" are open source projects under the MIT license.")],-1),c=e("p",null,"Contributions are welcome.",-1),s=[i,p,c];function u(l,d,m,b,_,h){return n(),o("div",null,s)}const v=a(r,[["render",u]]);export{f as __pageData,v as default}; diff --git a/assets/en_vue-webapp_contribution.md.NconB5ME.lean.js b/assets/en_vue-webapp_contribution.md.LkYDMpY1.lean.js similarity index 94% rename from assets/en_vue-webapp_contribution.md.NconB5ME.lean.js rename to assets/en_vue-webapp_contribution.md.LkYDMpY1.lean.js index 44843bd59..151188fe8 100644 --- a/assets/en_vue-webapp_contribution.md.NconB5ME.lean.js +++ b/assets/en_vue-webapp_contribution.md.LkYDMpY1.lean.js @@ -1 +1 @@ -import{_ as a,c as o,o as n,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Project participation","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/contribution.md","filePath":"en/vue-webapp/contribution.md","lastUpdated":1706427418000}'),r={name:"en/vue-webapp/contribution.md"},i=e("h1",{id:"project-participation",tabindex:"-1"},[t("Project participation "),e("a",{class:"header-anchor",href:"#project-participation","aria-label":'Permalink to "Project participation"'},"​")],-1),p=e("p",null,[e("a",{href:"https://github.com/vuesence/create-vue-webapp",target:"_blank",rel:"noreferrer"},"create-vue-webapp"),t(" and "),e("a",{href:"https://github.com/vuesence/vue-webapp",target:"_blank",rel:"noreferrer"},"vue-webapp"),t(" are open source projects under the MIT license.")],-1),c=e("p",null,"Contributions are welcome.",-1),s=[i,p,c];function u(l,d,m,b,_,h){return n(),o("div",null,s)}const v=a(r,[["render",u]]);export{f as __pageData,v as default}; +import{_ as a,c as o,o as n,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Project participation","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/contribution.md","filePath":"en/vue-webapp/contribution.md","lastUpdated":1706553672000}'),r={name:"en/vue-webapp/contribution.md"},i=e("h1",{id:"project-participation",tabindex:"-1"},[t("Project participation "),e("a",{class:"header-anchor",href:"#project-participation","aria-label":'Permalink to "Project participation"'},"​")],-1),p=e("p",null,[e("a",{href:"https://github.com/vuesence/create-vue-webapp",target:"_blank",rel:"noreferrer"},"create-vue-webapp"),t(" and "),e("a",{href:"https://github.com/vuesence/vue-webapp",target:"_blank",rel:"noreferrer"},"vue-webapp"),t(" are open source projects under the MIT license.")],-1),c=e("p",null,"Contributions are welcome.",-1),s=[i,p,c];function u(l,d,m,b,_,h){return n(),o("div",null,s)}const v=a(r,[["render",u]]);export{f as __pageData,v as default}; diff --git a/assets/en_vue-webapp_getting-started.md.mj19E3NW.js b/assets/en_vue-webapp_getting-started.md.mj19E3NW.js new file mode 100644 index 000000000..98aeab785 --- /dev/null +++ b/assets/en_vue-webapp_getting-started.md.mj19E3NW.js @@ -0,0 +1,39 @@ +import{_ as a,c as s,o as i,U as t,ad as b}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Getting started","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/getting-started.md","filePath":"en/vue-webapp/getting-started.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/getting-started.md"},h=t(`

Getting started

Installation via create vue-webapp

With this method, you can select which options will be installed:

sh
$ pnpm create vue-webapp
+
+ Project name: ... my-vue-project
+ Add a Splash screen? ... no / yes
+ Make it PWA (adds service worker and manifest)? ... no / yes
+ Add Open Graph meta tags? ... no / yes
+ Add Google Analytics code? ... no / yes
+ Add Github Action Workflow for publishing it on GitHub Pages? ... no / yes
+ Select application layout » MainLayout
+ Select navigation drawer » SimpleDrawer
+ Select webapp navbar » MantineSimpleNavbar
+ Select webapp header » MantineSimpleHeader
+ Select webapp footer » MantineRichFooter
+ Add API layer (REST)? ... no / yes
+ Add JSON-RPC adapter? ... no / yes
+
+Scaffolding project in /home/ubuntu/my-vue-project...
Silent installation

It is possible to scaffold the app without manually entering parameters by specifying a configuration file with options:

bash
pnpm create vue-webapp -c config.json
+// or
+pnpm create vue-webapp --config config.json

The format of the config.json file should be like this:

json
{
+  "projectName": "my-vue-project",
+  "splashScreen": false,
+  "pwa": true,
+  "openGraph": false,
+  "googleAnalytics": false,
+  "githubActionsGithubPagesWorkflow": true,
+  "layout": "mainLayout",
+  "navigationDrawer": "SimpleDrawer",
+  "navbar": "MantineSimpleNavbar",
+  "header": "MantineSimpleHeader",
+  "footer": "MantineRichFooter",
+  "api": true,
+  "jsonRpc": false,
+  "overwrite": true
+}

The overwrite parameter tells whether to overwrite the content in case of existing directory. It accepts values: "yes", "no" and "ignore".

Also, the command

bash
$ pnpm create vue-webapp .

will create the project in the current directory.

This method will only install the selected components and functionality

Initializing and launching a web application

sh
$ cd my-vue-project
+$ pnpm i
+$ pnpm dev

Result in a browser:

image

Installation from the repository

With this method everything will be installed, but a minimum of functionality will be enabled. It is useful for testing all available components and functionality.

sh
$ git clone https://github.com/vuesence/vue-webapp.git
+$ cd vue-webapp
+$ pnpm i
+$ pnpm dev
`,13),p=[h];function l(d,e,k,c,F,v){return i(),s("div",null,p)}const o=a(n,[["render",l],["__scopeId","data-v-52bcbab3"]]);export{g as __pageData,o as default}; diff --git a/assets/en_vue-webapp_getting-started.md.swrJpB-M.lean.js b/assets/en_vue-webapp_getting-started.md.mj19E3NW.lean.js similarity index 55% rename from assets/en_vue-webapp_getting-started.md.swrJpB-M.lean.js rename to assets/en_vue-webapp_getting-started.md.mj19E3NW.lean.js index 192e17788..10db88ab0 100644 --- a/assets/en_vue-webapp_getting-started.md.swrJpB-M.lean.js +++ b/assets/en_vue-webapp_getting-started.md.mj19E3NW.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as i,U as t,ad as n}from"./chunks/framework.P5TqXf0g.js";const o=JSON.parse('{"title":"Getting started","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/getting-started.md","filePath":"en/vue-webapp/getting-started.md","lastUpdated":1706427418000}'),c={name:"en/vue-webapp/getting-started.md"},h=t("",13),p=[h];function l(d,e,k,F,v,r){return i(),s("div",null,p)}const E=a(c,[["render",l],["__scopeId","data-v-407c766c"]]);export{o as __pageData,E as default}; +import{_ as a,c as s,o as i,U as t,ad as b}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Getting started","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/getting-started.md","filePath":"en/vue-webapp/getting-started.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/getting-started.md"},h=t("",13),p=[h];function l(d,e,k,c,F,v){return i(),s("div",null,p)}const o=a(n,[["render",l],["__scopeId","data-v-52bcbab3"]]);export{g as __pageData,o as default}; diff --git a/assets/en_vue-webapp_getting-started.md.swrJpB-M.js b/assets/en_vue-webapp_getting-started.md.swrJpB-M.js deleted file mode 100644 index 2d47bcda6..000000000 --- a/assets/en_vue-webapp_getting-started.md.swrJpB-M.js +++ /dev/null @@ -1,39 +0,0 @@ -import{_ as a,c as s,o as i,U as t,ad as n}from"./chunks/framework.P5TqXf0g.js";const o=JSON.parse('{"title":"Getting started","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/getting-started.md","filePath":"en/vue-webapp/getting-started.md","lastUpdated":1706427418000}'),c={name:"en/vue-webapp/getting-started.md"},h=t(`

Getting started

Installation via create vue-webapp

With this method, you can select which options will be installed:

sh
$ pnpm create vue-webapp
-
- Project name: ... my-vue-project
- Add a Splash screen? ... no / yes
- Make it PWA (adds service worker and manifest)? ... no / yes
- Add Open Graph meta tags? ... no / yes
- Add Google Analytics code? ... no / yes
- Add Github Action Workflow for publishing it on GitHub Pages? ... no / yes
- Select application layout » MainLayout
- Select navigation drawer » SimpleDrawer
- Select webapp navbar » MantineSimpleNavbar
- Select webapp header » MantineSimpleHeader
- Select webapp footer » MantineRichFooter
- Add API layer (REST)? ... no / yes
- Add JSON-RPC adapter? ... no / yes
-
-Scaffolding project in /home/ubuntu/my-vue-project...
Silent installation

It is possible to scaffold the app without manually entering parameters by specifying a configuration file with options:

bash
pnpm create vue-webapp -c config.json
-// or
-pnpm create vue-webapp --config config.json

The format of the config.json file should be like this:

json
{
-  "projectName": "my-vue-project",
-  "splashScreen": false,
-  "pwa": true,
-  "openGraph": false,
-  "googleAnalytics": false,
-  "githubActionsGithubPagesWorkflow": true,
-  "layout": "mainLayout",
-  "navigationDrawer": "SimpleDrawer",
-  "navbar": "MantineSimpleNavbar",
-  "header": "MantineSimpleHeader",
-  "footer": "MantineRichFooter",
-  "api": true,
-  "jsonRpc": false,
-  "overwrite": true
-}

The overwrite parameter tells whether to overwrite the content in case of existing directory. It accepts values: "yes", "no" and "ignore".

Also, the command

bash
$ pnpm create vue-webapp .

will create the project in the current directory.

This method will only install the selected components and functionality

Initializing and launching a web application

sh
$ cd my-vue-project
-$ pnpm i
-$ pnpm dev

Result in a browser:

image

Installation from the repository

With this method everything will be installed, but a minimum of functionality will be enabled. It is useful for testing all available components and functionality.

sh
$ git clone https://github.com/vuesence/vue-webapp.git
-$ cd vue-webapp
-$ pnpm i
-$ pnpm dev
`,13),p=[h];function l(d,e,k,F,v,r){return i(),s("div",null,p)}const E=a(c,[["render",l],["__scopeId","data-v-407c766c"]]);export{o as __pageData,E as default}; diff --git a/assets/en_vue-webapp_guidelines.md.1txsRKM_.js b/assets/en_vue-webapp_guidelines.md.wUC6izSp.js similarity index 97% rename from assets/en_vue-webapp_guidelines.md.1txsRKM_.js rename to assets/en_vue-webapp_guidelines.md.wUC6izSp.js index 761fbc091..15af724a0 100644 --- a/assets/en_vue-webapp_guidelines.md.1txsRKM_.js +++ b/assets/en_vue-webapp_guidelines.md.wUC6izSp.js @@ -1 +1 @@ -import{_ as e,c as i,o as t,U as n}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Guidelines","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/guidelines.md","filePath":"en/vue-webapp/guidelines.md","lastUpdated":1706427418000}'),a={name:"en/vue-webapp/guidelines.md"},o=n('

Guidelines

  • Lightweight, efficient web application with modern UI/UX
  • Vue 3, Composition API, script setup syntax
  • Do not use third party libraries unnecessarily. The only necessary dependency is vue-router.
  • Use clean and efficient HTML5 and CSS3 for layout
  • Include specific functionality only when needed
  • High degree of customization

  • Plugging in specific functionality, such as i18n, means not just adding that library to package.json, but a full-fledged minimal working integration - creating a corresponding composable function, multiple locales, and applying t() in a template for illustration with necessary comments in the code to facilitate later use and customization.

  • Integrating certain functionality that uses a third-party library (e.g. toaster or modal window) should be done through a wrapper, so that it would be easy for the developer to change the specific package that implements the functionality if desired.

  • The scaffolded web application uses TypeScript, but it is possible to continue developing the application in pure JavaScript.

  • Vite is used as the builder.

  • SCSS is used as the CSS preprocessor.

  • Antony Fu's eslint-config is used for linting and formatting in ESlint.

  • The result should be a Vue 3 application without not-needed dependencies, unless the user explicitly includes them in the framework.

',4),l=[o];function s(r,c,p,d,u,h){return t(),i("div",null,l)}const f=e(a,[["render",s]]);export{m as __pageData,f as default}; +import{_ as e,c as i,o as t,U as n}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Guidelines","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/guidelines.md","filePath":"en/vue-webapp/guidelines.md","lastUpdated":1706553672000}'),a={name:"en/vue-webapp/guidelines.md"},o=n('

Guidelines

  • Lightweight, efficient web application with modern UI/UX
  • Vue 3, Composition API, script setup syntax
  • Do not use third party libraries unnecessarily. The only necessary dependency is vue-router.
  • Use clean and efficient HTML5 and CSS3 for layout
  • Include specific functionality only when needed
  • High degree of customization

  • Plugging in specific functionality, such as i18n, means not just adding that library to package.json, but a full-fledged minimal working integration - creating a corresponding composable function, multiple locales, and applying t() in a template for illustration with necessary comments in the code to facilitate later use and customization.

  • Integrating certain functionality that uses a third-party library (e.g. toaster or modal window) should be done through a wrapper, so that it would be easy for the developer to change the specific package that implements the functionality if desired.

  • The scaffolded web application uses TypeScript, but it is possible to continue developing the application in pure JavaScript.

  • Vite is used as the builder.

  • SCSS is used as the CSS preprocessor.

  • Antony Fu's eslint-config is used for linting and formatting in ESlint.

  • The result should be a Vue 3 application without not-needed dependencies, unless the user explicitly includes them in the framework.

',4),l=[o];function s(r,c,p,d,u,h){return t(),i("div",null,l)}const f=e(a,[["render",s]]);export{m as __pageData,f as default}; diff --git a/assets/en_vue-webapp_guidelines.md.1txsRKM_.lean.js b/assets/en_vue-webapp_guidelines.md.wUC6izSp.lean.js similarity index 90% rename from assets/en_vue-webapp_guidelines.md.1txsRKM_.lean.js rename to assets/en_vue-webapp_guidelines.md.wUC6izSp.lean.js index 95acf7c9f..b11ac2c92 100644 --- a/assets/en_vue-webapp_guidelines.md.1txsRKM_.lean.js +++ b/assets/en_vue-webapp_guidelines.md.wUC6izSp.lean.js @@ -1 +1 @@ -import{_ as e,c as i,o as t,U as n}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Guidelines","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/guidelines.md","filePath":"en/vue-webapp/guidelines.md","lastUpdated":1706427418000}'),a={name:"en/vue-webapp/guidelines.md"},o=n("",4),l=[o];function s(r,c,p,d,u,h){return t(),i("div",null,l)}const f=e(a,[["render",s]]);export{m as __pageData,f as default}; +import{_ as e,c as i,o as t,U as n}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Guidelines","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/guidelines.md","filePath":"en/vue-webapp/guidelines.md","lastUpdated":1706553672000}'),a={name:"en/vue-webapp/guidelines.md"},o=n("",4),l=[o];function s(r,c,p,d,u,h){return t(),i("div",null,l)}const f=e(a,[["render",s]]);export{m as __pageData,f as default}; diff --git a/assets/en_vue-webapp_index.md.JooLn6no.js b/assets/en_vue-webapp_index.md.JooLn6no.js new file mode 100644 index 000000000..a35a653ad --- /dev/null +++ b/assets/en_vue-webapp_index.md.JooLn6no.js @@ -0,0 +1,8 @@ +import{_ as a,c as e,o as s,U as i,ae as t}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Scaffolding a Vue webapp","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/index.md","filePath":"en/vue-webapp/index.md","lastUpdated":1706553672000}'),d={name:"en/vue-webapp/index.md"},n=i(`

Scaffolding a Vue webapp

Summary

Vue 3 website builder/scaffolder (GitHub) for developers, with a choice of business template (portfolio, blog, store, etc.), layout template, design and functionality (API module, i18n, PWA, splash screen, auth module, themes, etc.), for further convenient customization and content filling.

sh
$ pnpm create vue-webapp
+
+ Project name: ... my-vue-project
+ Add a Splash screen? ... no / yes
+ Make it PWA (adds service worker and manifest)? ... no / yes
+ Add Open Graph meta tags? ... no / yes
+ Add Google Analytics code? ... no / yes
+...

Justification

There are quite a few (mostly specific and quickly becoming obsolete) boilerplate templates for creating a Vue application. Usually it means creating an empty project with certain libraries. In other words, it's just setting up an environment to start development without, actually, code.

At the same time, many other frontend and backend frameworks have starter-kits that allow you to quickly create a ready-made blog, online store, business card site, portfolio, documentation, etc., which greatly helps in learning the framework itself, relevant technologies and best practices, as well as for solving business tasks.

As a result, it may seem that Vue is a rather low-level framework, and to create web applications quickly, efficiently and conveniently, you need to take some "metaframwork" or other solution - like Nuxt, Astro, VitePress, Vue Storefront - which explicitly position themselves as tools for solving certain (or a wide range of) business tasks.

There is a need for a tool similar to create-vue, for scaffolding a ready-to-go web application. On the one hand, a quite workable, adaptive website with the necessary functionality so that a novice developer could familiarize himself with a proven approach to solving the tasks involved. On the other hand, it should be minimalistic enough not to impose unwanted technologies and libraries on an experienced developer and create a skeleton of established best practices for further development of the application.

It is clear that defining one or another "best practice" (fetch or axios?) can be quite controversial, but nevertheless.

image

',11),l=[n];function h(p,o,r,k,F,b){return s(),e("div",null,l)}const g=a(d,[["render",h],["__scopeId","data-v-7525b2ed"]]);export{v as __pageData,g as default}; diff --git a/assets/en_vue-webapp_index.md.iv0pLR79.lean.js b/assets/en_vue-webapp_index.md.JooLn6no.lean.js similarity index 55% rename from assets/en_vue-webapp_index.md.iv0pLR79.lean.js rename to assets/en_vue-webapp_index.md.JooLn6no.lean.js index 455beccac..c8b69d307 100644 --- a/assets/en_vue-webapp_index.md.iv0pLR79.lean.js +++ b/assets/en_vue-webapp_index.md.JooLn6no.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as i,U as t,ae as e}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Scaffolding a Vue webapp","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/index.md","filePath":"en/vue-webapp/index.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/index.md"},c=t("",11),l=[c];function h(d,p,o,r,k,f){return i(),s("div",null,l)}const g=a(n,[["render",h],["__scopeId","data-v-821f6c9c"]]);export{v as __pageData,g as default}; +import{_ as a,c as e,o as s,U as i,ae as t}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Scaffolding a Vue webapp","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/index.md","filePath":"en/vue-webapp/index.md","lastUpdated":1706553672000}'),d={name:"en/vue-webapp/index.md"},n=i("",11),l=[n];function h(p,o,r,k,F,b){return s(),e("div",null,l)}const g=a(d,[["render",h],["__scopeId","data-v-7525b2ed"]]);export{v as __pageData,g as default}; diff --git a/assets/en_vue-webapp_index.md.iv0pLR79.js b/assets/en_vue-webapp_index.md.iv0pLR79.js deleted file mode 100644 index 1f4244770..000000000 --- a/assets/en_vue-webapp_index.md.iv0pLR79.js +++ /dev/null @@ -1,8 +0,0 @@ -import{_ as a,c as s,o as i,U as t,ae as e}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Scaffolding a Vue webapp","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/index.md","filePath":"en/vue-webapp/index.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/index.md"},c=t(`

Scaffolding a Vue webapp

Summary

Vue 3 website builder/scaffolder (GitHub) for developers, with a choice of business template (portfolio, blog, store, etc.), layout template, design and functionality (API module, i18n, PWA, splash screen, auth module, themes, etc.), for further convenient customization and content filling.

sh
$ pnpm create vue-webapp
-
- Project name: ... my-vue-project
- Add a Splash screen? ... no / yes
- Make it PWA (adds service worker and manifest)? ... no / yes
- Add Open Graph meta tags? ... no / yes
- Add Google Analytics code? ... no / yes
-...

Justification

There are quite a few (mostly specific and quickly becoming obsolete) boilerplate templates for creating a Vue application. Usually it means creating an empty project with certain libraries. In other words, it's just setting up an environment to start development without, actually, code.

At the same time, many other frontend and backend frameworks have starter-kits that allow you to quickly create a ready-made blog, online store, business card site, portfolio, documentation, etc., which greatly helps in learning the framework itself, relevant technologies and best practices, as well as for solving business tasks.

As a result, it may seem that Vue is a rather low-level framework, and to create web applications quickly, efficiently and conveniently, you need to take some "metaframwork" or other solution - like Nuxt, Astro, VitePress, Vue Storefront - which explicitly position themselves as tools for solving certain (or a wide range of) business tasks.

There is a need for a tool similar to create-vue, for scaffolding a ready-to-go web application. On the one hand, a quite workable, adaptive website with the necessary functionality so that a novice developer could familiarize himself with a proven approach to solving the tasks involved. On the other hand, it should be minimalistic enough not to impose unwanted technologies and libraries on an experienced developer and create a skeleton of established best practices for further development of the application.

It is clear that defining one or another "best practice" (fetch or axios?) can be quite controversial, but nevertheless.

image

',11),l=[c];function h(d,p,o,r,k,f){return i(),s("div",null,l)}const g=a(n,[["render",h],["__scopeId","data-v-821f6c9c"]]);export{v as __pageData,g as default}; diff --git a/assets/en_vue-webapp_objectives.md.nAWsEsKj.js b/assets/en_vue-webapp_objectives.md.25sSut2f.js similarity index 97% rename from assets/en_vue-webapp_objectives.md.nAWsEsKj.js rename to assets/en_vue-webapp_objectives.md.25sSut2f.js index 0509c99f3..78b150291 100644 --- a/assets/en_vue-webapp_objectives.md.nAWsEsKj.js +++ b/assets/en_vue-webapp_objectives.md.25sSut2f.js @@ -1 +1 @@ -import{_ as e,c as t,o as i,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Objectives","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/objectives.md","filePath":"en/vue-webapp/objectives.md","lastUpdated":1706427418000}'),o={name:"en/vue-webapp/objectives.md"},n=a('

Objectives

  1. Create a scaffolder of simple out-of-the-box SPA applications for a specific task in a few minutes, with the possibility of further customization and filling it with content.
  2. Fine-tune the application using effective functional code blocks.
  3. Collect and generalize the best techniques and practices for creating a modern reactive Vue application.
  4. Enable novice developers to familiarize themselves with the Vue.js ecosystem with ready-made examples, learn front-end and Vue 3 best practices, from building application architecture to naming CSS classes.
  5. Enable experienced developers to quickly and efficiently scaffold a ready to use web application and leverage reusable code blocks (boilerplates), especially those that cannot be distributed as NPM packages.

This application should act as a website wireframe builder, with the ability to choose when scaffolding:

  • A global business website template (portfolio, blog, online store, etc.)
  • Variations of the general layout of the web application
  • Specific component options (header, footer, navigation drawer, etc.)
  • General style/design options
  • Specific functionality injected as functional fragments (API module, i18n, PWA, splash screen, Auth module, themes, etc.)
  • GitHub actions options with the ability to build and deploy to popular hosting solutions
  • Ability to connect/integrate popular libraries (including UI) if needed
  • Possibility to integrate with certain headless CRM and API services

Separately, it is planned to create a web showcase, where the user, dynamically changing the parameters, will be able to view and test the available site layouts, themes/styling, components (header, footer, etc.) and functionality of future application, as well as their combination with each other.

',5),l=[n];function s(c,r,p,d,h,u){return i(),t("div",null,l)}const m=e(o,[["render",s]]);export{f as __pageData,m as default}; +import{_ as e,c as t,o as i,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Objectives","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/objectives.md","filePath":"en/vue-webapp/objectives.md","lastUpdated":1706553672000}'),o={name:"en/vue-webapp/objectives.md"},n=a('

Objectives

  1. Create a scaffolder of simple out-of-the-box SPA applications for a specific task in a few minutes, with the possibility of further customization and filling it with content.
  2. Fine-tune the application using effective functional code blocks.
  3. Collect and generalize the best techniques and practices for creating a modern reactive Vue application.
  4. Enable novice developers to familiarize themselves with the Vue.js ecosystem with ready-made examples, learn front-end and Vue 3 best practices, from building application architecture to naming CSS classes.
  5. Enable experienced developers to quickly and efficiently scaffold a ready to use web application and leverage reusable code blocks (boilerplates), especially those that cannot be distributed as NPM packages.

This application should act as a website wireframe builder, with the ability to choose when scaffolding:

  • A global business website template (portfolio, blog, online store, etc.)
  • Variations of the general layout of the web application
  • Specific component options (header, footer, navigation drawer, etc.)
  • General style/design options
  • Specific functionality injected as functional fragments (API module, i18n, PWA, splash screen, Auth module, themes, etc.)
  • GitHub actions options with the ability to build and deploy to popular hosting solutions
  • Ability to connect/integrate popular libraries (including UI) if needed
  • Possibility to integrate with certain headless CRM and API services

Separately, it is planned to create a web showcase, where the user, dynamically changing the parameters, will be able to view and test the available site layouts, themes/styling, components (header, footer, etc.) and functionality of future application, as well as their combination with each other.

',5),l=[n];function s(c,r,p,d,h,u){return i(),t("div",null,l)}const m=e(o,[["render",s]]);export{f as __pageData,m as default}; diff --git a/assets/en_vue-webapp_objectives.md.nAWsEsKj.lean.js b/assets/en_vue-webapp_objectives.md.25sSut2f.lean.js similarity index 90% rename from assets/en_vue-webapp_objectives.md.nAWsEsKj.lean.js rename to assets/en_vue-webapp_objectives.md.25sSut2f.lean.js index 57a664142..2a6815970 100644 --- a/assets/en_vue-webapp_objectives.md.nAWsEsKj.lean.js +++ b/assets/en_vue-webapp_objectives.md.25sSut2f.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as i,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Objectives","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/objectives.md","filePath":"en/vue-webapp/objectives.md","lastUpdated":1706427418000}'),o={name:"en/vue-webapp/objectives.md"},n=a("",5),l=[n];function s(c,r,p,d,h,u){return i(),t("div",null,l)}const m=e(o,[["render",s]]);export{f as __pageData,m as default}; +import{_ as e,c as t,o as i,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Objectives","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"vue-webapp"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/objectives.md","filePath":"en/vue-webapp/objectives.md","lastUpdated":1706553672000}'),o={name:"en/vue-webapp/objectives.md"},n=a("",5),l=[n];function s(c,r,p,d,h,u){return i(),t("div",null,l)}const m=e(o,[["render",s]]);export{f as __pageData,m as default}; diff --git a/assets/en_vue-webapp_options_adaptability.md.1JK3sLzs.js b/assets/en_vue-webapp_options_adaptability.md.nHoaFtNN.js similarity index 99% rename from assets/en_vue-webapp_options_adaptability.md.1JK3sLzs.js rename to assets/en_vue-webapp_options_adaptability.md.nHoaFtNN.js index 8608b1855..7a332e916 100644 --- a/assets/en_vue-webapp_options_adaptability.md.1JK3sLzs.js +++ b/assets/en_vue-webapp_options_adaptability.md.nHoaFtNN.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Adaptability","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/adaptability.md","filePath":"en/vue-webapp/options/adaptability.md","lastUpdated":1706427418000}'),t={name:"en/vue-webapp/options/adaptability.md"},p=n(`

Adaptability

Adaptability is implemented with useScreenWidth composable function via four CSS classes (mobile, tablet, notebook and desktop) dynamically set on the body element.

The configuration parameters (upper breakpoint for each mode) for useScreenWidth are set in App.vue:

vue
<script setup lang="ts">
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Adaptability","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/adaptability.md","filePath":"en/vue-webapp/options/adaptability.md","lastUpdated":1706553672000}'),t={name:"en/vue-webapp/options/adaptability.md"},p=n(`

Adaptability

Adaptability is implemented with useScreenWidth composable function via four CSS classes (mobile, tablet, notebook and desktop) dynamically set on the body element.

The configuration parameters (upper breakpoint for each mode) for useScreenWidth are set in App.vue:

vue
<script setup lang="ts">
 import { useScreenWidth } from "@/composables/useScreenWidth";
 
 useScreenWidth({
diff --git a/assets/en_vue-webapp_options_adaptability.md.1JK3sLzs.lean.js b/assets/en_vue-webapp_options_adaptability.md.nHoaFtNN.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_adaptability.md.1JK3sLzs.lean.js
rename to assets/en_vue-webapp_options_adaptability.md.nHoaFtNN.lean.js
index 5eaa1eb9d..89868b63e 100644
--- a/assets/en_vue-webapp_options_adaptability.md.1JK3sLzs.lean.js
+++ b/assets/en_vue-webapp_options_adaptability.md.nHoaFtNN.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Adaptability","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/adaptability.md","filePath":"en/vue-webapp/options/adaptability.md","lastUpdated":1706427418000}'),t={name:"en/vue-webapp/options/adaptability.md"},p=n("",9),h=[p];function l(e,k,E,d,r,o){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Adaptability","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/adaptability.md","filePath":"en/vue-webapp/options/adaptability.md","lastUpdated":1706553672000}'),t={name:"en/vue-webapp/options/adaptability.md"},p=n("",9),h=[p];function l(e,k,E,d,r,o){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{c as __pageData,y as default};
diff --git a/assets/en_vue-webapp_options_api.md.934Pw7UQ.js b/assets/en_vue-webapp_options_api.md.-4ZcX4py.js
similarity index 99%
rename from assets/en_vue-webapp_options_api.md.934Pw7UQ.js
rename to assets/en_vue-webapp_options_api.md.-4ZcX4py.js
index d96f0d9ba..ab7ae0727 100644
--- a/assets/en_vue-webapp_options_api.md.934Pw7UQ.js
+++ b/assets/en_vue-webapp_options_api.md.-4ZcX4py.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"API module","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/api.md","filePath":"en/vue-webapp/options/api.md","lastUpdated":1706427418000}'),t={name:"en/vue-webapp/options/api.md"},p=n(`

API module

API (REST)

Creates a transport client agnostic service layer for REST calls to the backend over HTTP(S).

The HTTP transport client can be fetch, axios or a promise version of XHR, at the developer's choice. API calls in the application code will look as follows:

js
import { api } from "@/services/api";
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"API module","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/api.md","filePath":"en/vue-webapp/options/api.md","lastUpdated":1706553672000}'),t={name:"en/vue-webapp/options/api.md"},p=n(`

API module

API (REST)

Creates a transport client agnostic service layer for REST calls to the backend over HTTP(S).

The HTTP transport client can be fetch, axios or a promise version of XHR, at the developer's choice. API calls in the application code will look as follows:

js
import { api } from "@/services/api";
 
 const apiData = ref();
 apiData.value = await api.utils.testRest();

Each call is an asynchronous function that returns Promise.

js
// utils.ts
diff --git a/assets/en_vue-webapp_options_api.md.934Pw7UQ.lean.js b/assets/en_vue-webapp_options_api.md.-4ZcX4py.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_api.md.934Pw7UQ.lean.js
rename to assets/en_vue-webapp_options_api.md.-4ZcX4py.lean.js
index 2132b01fd..781047dec 100644
--- a/assets/en_vue-webapp_options_api.md.934Pw7UQ.lean.js
+++ b/assets/en_vue-webapp_options_api.md.-4ZcX4py.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"API module","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/api.md","filePath":"en/vue-webapp/options/api.md","lastUpdated":1706427418000}'),t={name:"en/vue-webapp/options/api.md"},p=n("",17),h=[p];function e(l,k,r,E,o,d){return a(),i("div",null,h)}const y=s(t,[["render",e]]);export{g as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"API module","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/api.md","filePath":"en/vue-webapp/options/api.md","lastUpdated":1706553672000}'),t={name:"en/vue-webapp/options/api.md"},p=n("",17),h=[p];function e(l,k,r,E,o,d){return a(),i("div",null,h)}const y=s(t,[["render",e]]);export{g as __pageData,y as default};
diff --git a/assets/en_vue-webapp_options_baseIcon.md.yE5JntjF.js b/assets/en_vue-webapp_options_baseIcon.md.owgtwcEq.js
similarity index 99%
rename from assets/en_vue-webapp_options_baseIcon.md.yE5JntjF.js
rename to assets/en_vue-webapp_options_baseIcon.md.owgtwcEq.js
index b2bd886a3..8d459b404 100644
--- a/assets/en_vue-webapp_options_baseIcon.md.yE5JntjF.js
+++ b/assets/en_vue-webapp_options_baseIcon.md.owgtwcEq.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"BaseIcon","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/baseIcon.md","filePath":"en/vue-webapp/options/baseIcon.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/baseIcon.md"},e=t(`

BaseIcon

Consists of the BaseIcon component and the utils.ts utility.

Allows to use an icon component in the application with dynamic name attribute:

vue
<script setup lang="ts">
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"BaseIcon","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/baseIcon.md","filePath":"en/vue-webapp/options/baseIcon.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/baseIcon.md"},e=t(`

BaseIcon

Consists of the BaseIcon component and the utils.ts utility.

Allows to use an icon component in the application with dynamic name attribute:

vue
<script setup lang="ts">
 import BaseIcon from "@/components/ui/BaseIcon.vue";
 import { useAppConfig } from "@/composables/useAppConfig";
 
diff --git a/assets/en_vue-webapp_options_baseIcon.md.yE5JntjF.lean.js b/assets/en_vue-webapp_options_baseIcon.md.owgtwcEq.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_baseIcon.md.yE5JntjF.lean.js
rename to assets/en_vue-webapp_options_baseIcon.md.owgtwcEq.lean.js
index 138199cfd..25b58abef 100644
--- a/assets/en_vue-webapp_options_baseIcon.md.yE5JntjF.lean.js
+++ b/assets/en_vue-webapp_options_baseIcon.md.owgtwcEq.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"BaseIcon","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/baseIcon.md","filePath":"en/vue-webapp/options/baseIcon.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/baseIcon.md"},e=t("",5),h=[e];function p(l,k,r,E,o,d){return a(),i("div",null,h)}const y=s(n,[["render",p]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"BaseIcon","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/baseIcon.md","filePath":"en/vue-webapp/options/baseIcon.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/baseIcon.md"},e=t("",5),h=[e];function p(l,k,r,E,o,d){return a(),i("div",null,h)}const y=s(n,[["render",p]]);export{c as __pageData,y as default};
diff --git a/assets/en_vue-webapp_options_description.md.Z-SyWUnv.js b/assets/en_vue-webapp_options_description.md.GraRzW11.js
similarity index 96%
rename from assets/en_vue-webapp_options_description.md.Z-SyWUnv.js
rename to assets/en_vue-webapp_options_description.md.GraRzW11.js
index b9354c403..73ee62507 100644
--- a/assets/en_vue-webapp_options_description.md.Z-SyWUnv.js
+++ b/assets/en_vue-webapp_options_description.md.GraRzW11.js
@@ -1,4 +1,4 @@
-import{_ as i,c as e,o as s,U as a}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Implementation details","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/description.md","filePath":"en/vue-webapp/options/description.md","lastUpdated":1706427418000}'),t={name:"en/vue-webapp/options/description.md"},n=a(`

Implementation details

Code injections in the index.html

To avoid bloating index.html injections of code fragments into it (Open graph, Google analytics, Splash screen, Service worker etc.) are done via vite-plugin-html-injection Vite plugin.

The code snippets themselves are located in the ./src/utils/injections/ directory. The plugin configuration file injection-config.ts is also located there.

CSS tricks

A hack is applied in the application on large screen resolutions to prevent screen jumping when the main scrollbar appears/disappears

css
html {
+import{_ as i,c as e,o as s,U as a}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Implementation details","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/description.md","filePath":"en/vue-webapp/options/description.md","lastUpdated":1706553672000}'),t={name:"en/vue-webapp/options/description.md"},n=a(`

Implementation details

Code injections in the index.html

To avoid bloating index.html injections of code fragments into it (Open graph, Google analytics, Splash screen, Service worker etc.) are done via vite-plugin-html-injection Vite plugin.

The code snippets themselves are located in the ./src/utils/injections/ directory. The plugin configuration file injection-config.ts is also located there.

CSS tricks

A hack is applied in the application on large screen resolutions to prevent screen jumping when the main scrollbar appears/disappears

css
html {
   overflow-x: hidden;
   margin-right: calc(-1 * (100vw - 100%))
 }
`,7),l=[n];function p(h,o,r,c,d,k){return s(),e("div",null,l)}const E=i(t,[["render",p]]);export{m as __pageData,E as default}; diff --git a/assets/en_vue-webapp_options_description.md.Z-SyWUnv.lean.js b/assets/en_vue-webapp_options_description.md.GraRzW11.lean.js similarity index 81% rename from assets/en_vue-webapp_options_description.md.Z-SyWUnv.lean.js rename to assets/en_vue-webapp_options_description.md.GraRzW11.lean.js index bab2ae4a4..b27fce94f 100644 --- a/assets/en_vue-webapp_options_description.md.Z-SyWUnv.lean.js +++ b/assets/en_vue-webapp_options_description.md.GraRzW11.lean.js @@ -1 +1 @@ -import{_ as i,c as e,o as s,U as a}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Implementation details","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/description.md","filePath":"en/vue-webapp/options/description.md","lastUpdated":1706427418000}'),t={name:"en/vue-webapp/options/description.md"},n=a("",7),l=[n];function p(h,o,r,c,d,k){return s(),e("div",null,l)}const E=i(t,[["render",p]]);export{m as __pageData,E as default}; +import{_ as i,c as e,o as s,U as a}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Implementation details","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/description.md","filePath":"en/vue-webapp/options/description.md","lastUpdated":1706553672000}'),t={name:"en/vue-webapp/options/description.md"},n=a("",7),l=[n];function p(h,o,r,c,d,k){return s(),e("div",null,l)}const E=i(t,[["render",p]]);export{m as __pageData,E as default}; diff --git a/assets/en_vue-webapp_options_drawer.md.68cPJfxv.js b/assets/en_vue-webapp_options_drawer.md.68cPJfxv.js new file mode 100644 index 000000000..74f484c1e --- /dev/null +++ b/assets/en_vue-webapp_options_drawer.md.68cPJfxv.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as o,af as r,ag as c}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Navigation drawers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/drawer.md","filePath":"en/vue-webapp/options/drawer.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/drawer.md"},d=o('

Navigation drawers

There are currently two types of navigation drawers to choose from.

SimpleDrawer

image

It is always on for notebook and desktop screen resolutions, and can be opened for mobile and tablet by clicking/tapping on the "hamburger" icon.

TouchSlideoutDrawer

image

Similar to SimpleDrawer, but is controlled by touch on touch screens. Adds a nice UX.

Functionality is implemented with useTouchSwipe composable function and TouchSlideoutDrawer component.

',9),i=[d];function f(s,p,l,b,u,m){return t(),e("div",null,i)}const w=a(n,[["render",f],["__scopeId","data-v-f09cfbcf"]]);export{v as __pageData,w as default}; diff --git a/assets/en_vue-webapp_options_drawer.md.wzGVBjpS.lean.js b/assets/en_vue-webapp_options_drawer.md.68cPJfxv.lean.js similarity index 52% rename from assets/en_vue-webapp_options_drawer.md.wzGVBjpS.lean.js rename to assets/en_vue-webapp_options_drawer.md.68cPJfxv.lean.js index d3723f001..d5ea4bbe1 100644 --- a/assets/en_vue-webapp_options_drawer.md.wzGVBjpS.lean.js +++ b/assets/en_vue-webapp_options_drawer.md.68cPJfxv.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o,af as r,ag as n}from"./chunks/framework.P5TqXf0g.js";const w=JSON.parse('{"title":"Navigation drawers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/drawer.md","filePath":"en/vue-webapp/options/drawer.md","lastUpdated":1706427418000}'),d={name:"en/vue-webapp/options/drawer.md"},i=o("",9),s=[i];function c(p,l,b,u,m,h){return t(),e("div",null,s)}const _=a(d,[["render",c],["__scopeId","data-v-2e9a546b"]]);export{w as __pageData,_ as default}; +import{_ as a,c as e,o as t,U as o,af as r,ag as c}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Navigation drawers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/drawer.md","filePath":"en/vue-webapp/options/drawer.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/drawer.md"},d=o("",9),i=[d];function f(s,p,l,b,u,m){return t(),e("div",null,i)}const w=a(n,[["render",f],["__scopeId","data-v-f09cfbcf"]]);export{v as __pageData,w as default}; diff --git a/assets/en_vue-webapp_options_drawer.md.wzGVBjpS.js b/assets/en_vue-webapp_options_drawer.md.wzGVBjpS.js deleted file mode 100644 index 85a84ffaa..000000000 --- a/assets/en_vue-webapp_options_drawer.md.wzGVBjpS.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as o,af as r,ag as n}from"./chunks/framework.P5TqXf0g.js";const w=JSON.parse('{"title":"Navigation drawers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/drawer.md","filePath":"en/vue-webapp/options/drawer.md","lastUpdated":1706427418000}'),d={name:"en/vue-webapp/options/drawer.md"},i=o('

Navigation drawers

There are currently two types of navigation drawers to choose from.

SimpleDrawer

image

It is always on for notebook and desktop screen resolutions, and can be opened for mobile and tablet by clicking/tapping on the "hamburger" icon.

TouchSlideoutDrawer

image

Similar to SimpleDrawer, but is controlled by touch on touch screens. Adds a nice UX.

Functionality is implemented with useTouchSwipe composable function and TouchSlideoutDrawer component.

',9),s=[i];function c(p,l,b,u,m,h){return t(),e("div",null,s)}const _=a(d,[["render",c],["__scopeId","data-v-2e9a546b"]]);export{w as __pageData,_ as default}; diff --git a/assets/en_vue-webapp_options_footer.md.W3PJvNen.js b/assets/en_vue-webapp_options_footer.md.W3PJvNen.js deleted file mode 100644 index bb8bee2ea..000000000 --- a/assets/en_vue-webapp_options_footer.md.W3PJvNen.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as d,ak as c,al as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Footers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/footer.md","filePath":"en/vue-webapp/options/footer.md","lastUpdated":1706427418000}'),s={name:"en/vue-webapp/options/footer.md"},l=o('

Footers

The following types of footers are currently available:

SimpleFooter

image

RichFooter

image

MantineSimpleFooter

image

MantineRichFooter

image

DistributedFooter

image

',12),p=[l];function m(b,h,_,f,v,u){return t(),e("div",null,p)}const q=a(s,[["render",m],["__scopeId","data-v-bc1d1363"]]);export{F as __pageData,q as default}; diff --git a/assets/en_vue-webapp_options_footer.md.ZC6q6Wtf.js b/assets/en_vue-webapp_options_footer.md.ZC6q6Wtf.js new file mode 100644 index 000000000..424cee100 --- /dev/null +++ b/assets/en_vue-webapp_options_footer.md.ZC6q6Wtf.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as f,ak as n,al as s}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Footers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/footer.md","filePath":"en/vue-webapp/options/footer.md","lastUpdated":1706553672000}'),d={name:"en/vue-webapp/options/footer.md"},l=o('

Footers

The following types of footers are currently available:

SimpleFooter

image

RichFooter

image

MantineSimpleFooter

image

MantineRichFooter

image

DistributedFooter

image

',12),p=[l];function m(c,b,h,_,v,u){return t(),e("div",null,p)}const q=a(d,[["render",m],["__scopeId","data-v-b356ff83"]]);export{F as __pageData,q as default}; diff --git a/assets/en_vue-webapp_options_footer.md.W3PJvNen.lean.js b/assets/en_vue-webapp_options_footer.md.ZC6q6Wtf.lean.js similarity index 57% rename from assets/en_vue-webapp_options_footer.md.W3PJvNen.lean.js rename to assets/en_vue-webapp_options_footer.md.ZC6q6Wtf.lean.js index 73966a9f5..be4eea242 100644 --- a/assets/en_vue-webapp_options_footer.md.W3PJvNen.lean.js +++ b/assets/en_vue-webapp_options_footer.md.ZC6q6Wtf.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as d,ak as c,al as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Footers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/footer.md","filePath":"en/vue-webapp/options/footer.md","lastUpdated":1706427418000}'),s={name:"en/vue-webapp/options/footer.md"},l=o("",12),p=[l];function m(b,h,_,f,v,u){return t(),e("div",null,p)}const q=a(s,[["render",m],["__scopeId","data-v-bc1d1363"]]);export{F as __pageData,q as default}; +import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as f,ak as n,al as s}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Footers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/footer.md","filePath":"en/vue-webapp/options/footer.md","lastUpdated":1706553672000}'),d={name:"en/vue-webapp/options/footer.md"},l=o("",12),p=[l];function m(c,b,h,_,v,u){return t(),e("div",null,p)}const q=a(d,[["render",m],["__scopeId","data-v-b356ff83"]]);export{F as __pageData,q as default}; diff --git a/assets/en_vue-webapp_options_ga-gp.md.9MdylQDP.js b/assets/en_vue-webapp_options_ga-gp.md.pxgVZY5a.js similarity index 98% rename from assets/en_vue-webapp_options_ga-gp.md.9MdylQDP.js rename to assets/en_vue-webapp_options_ga-gp.md.pxgVZY5a.js index 73e189def..4261fc78f 100644 --- a/assets/en_vue-webapp_options_ga-gp.md.9MdylQDP.js +++ b/assets/en_vue-webapp_options_ga-gp.md.pxgVZY5a.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"GitHub Actions script to deploy to GitHub Pages","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/ga-gp.md","filePath":"en/vue-webapp/options/ga-gp.md","lastUpdated":1706427418000}'),i={name:"en/vue-webapp/options/ga-gp.md"},s=o('

GitHub Actions script to deploy to GitHub Pages

Deployment

Uses JamesIves/github-pages-deploy-action GitHub Action to deploy a site to the gh-pages branch of the same GitHub repository, which automatically makes the website available at https://youGitHubUsername.github.io/my-vue-webapp (if your project and repository has name my-vue-webapp).

  • Create a branch in the repository called gh-pages
  • Go to the "Settings" section of your repository
  • Under "Code and automation" in the sidebar, click Pages.
  • Under "Build and deployment" under the "Source", select "Deploy from a branch".
  • Under "Build and deployment" under the "Branch" heading, use the branch drop-down menu and select the branch you want - gh-pages.

More details:

Setting base in Vite config

If you don't have a custom domain, you need to put the name of your repository as base in vite.config.ts so that the site can be accessed from the above link:

js
export default defineConfig({\n  base:"/my-vue-webapp/"\n});

If you have a custom domain (like yourname.com), this parameter is not needed.

',10),n=[s];function p(r,l,c,d,h,u){return a(),t("div",null,n)}const m=e(i,[["render",p]]);export{b as __pageData,m as default}; +import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"GitHub Actions script to deploy to GitHub Pages","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/ga-gp.md","filePath":"en/vue-webapp/options/ga-gp.md","lastUpdated":1706553672000}'),i={name:"en/vue-webapp/options/ga-gp.md"},s=o('

GitHub Actions script to deploy to GitHub Pages

Deployment

Uses JamesIves/github-pages-deploy-action GitHub Action to deploy a site to the gh-pages branch of the same GitHub repository, which automatically makes the website available at https://youGitHubUsername.github.io/my-vue-webapp (if your project and repository has name my-vue-webapp).

  • Create a branch in the repository called gh-pages
  • Go to the "Settings" section of your repository
  • Under "Code and automation" in the sidebar, click Pages.
  • Under "Build and deployment" under the "Source", select "Deploy from a branch".
  • Under "Build and deployment" under the "Branch" heading, use the branch drop-down menu and select the branch you want - gh-pages.

More details:

Setting base in Vite config

If you don't have a custom domain, you need to put the name of your repository as base in vite.config.ts so that the site can be accessed from the above link:

js
export default defineConfig({\n  base:"/my-vue-webapp/"\n});

If you have a custom domain (like yourname.com), this parameter is not needed.

',10),n=[s];function p(r,l,c,d,h,u){return a(),t("div",null,n)}const m=e(i,[["render",p]]);export{b as __pageData,m as default}; diff --git a/assets/en_vue-webapp_options_ga-gp.md.9MdylQDP.lean.js b/assets/en_vue-webapp_options_ga-gp.md.pxgVZY5a.lean.js similarity index 91% rename from assets/en_vue-webapp_options_ga-gp.md.9MdylQDP.lean.js rename to assets/en_vue-webapp_options_ga-gp.md.pxgVZY5a.lean.js index d064d60dc..3c9d98606 100644 --- a/assets/en_vue-webapp_options_ga-gp.md.9MdylQDP.lean.js +++ b/assets/en_vue-webapp_options_ga-gp.md.pxgVZY5a.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"GitHub Actions script to deploy to GitHub Pages","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/ga-gp.md","filePath":"en/vue-webapp/options/ga-gp.md","lastUpdated":1706427418000}'),i={name:"en/vue-webapp/options/ga-gp.md"},s=o("",10),n=[s];function p(r,l,c,d,h,u){return a(),t("div",null,n)}const m=e(i,[["render",p]]);export{b as __pageData,m as default}; +import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"GitHub Actions script to deploy to GitHub Pages","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/ga-gp.md","filePath":"en/vue-webapp/options/ga-gp.md","lastUpdated":1706553672000}'),i={name:"en/vue-webapp/options/ga-gp.md"},s=o("",10),n=[s];function p(r,l,c,d,h,u){return a(),t("div",null,n)}const m=e(i,[["render",p]]);export{b as __pageData,m as default}; diff --git a/assets/en_vue-webapp_options_google-analytics.md.7KdBILW3.js b/assets/en_vue-webapp_options_google-analytics.md.s8gajhQb.js similarity index 98% rename from assets/en_vue-webapp_options_google-analytics.md.7KdBILW3.js rename to assets/en_vue-webapp_options_google-analytics.md.s8gajhQb.js index 7ba04c5cc..3bb190741 100644 --- a/assets/en_vue-webapp_options_google-analytics.md.7KdBILW3.js +++ b/assets/en_vue-webapp_options_google-analytics.md.s8gajhQb.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/google-analytics.md","filePath":"en/vue-webapp/options/google-analytics.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/google-analytics.md"},e=t(`

Google analytics

Adds Google Tag initialization code for index.html.

html
<!-- Google tag (gtag.js) -->
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/google-analytics.md","filePath":"en/vue-webapp/options/google-analytics.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/google-analytics.md"},e=t(`

Google analytics

Adds Google Tag initialization code for index.html.

html
<!-- Google tag (gtag.js) -->
 <script async src="https://www.googletagmanager.com/gtag/js?id=G-JL65GWRNQQ"></script>
 <script>
   window.dataLayer = window.dataLayer || [];
diff --git a/assets/en_vue-webapp_options_google-analytics.md.7KdBILW3.lean.js b/assets/en_vue-webapp_options_google-analytics.md.s8gajhQb.lean.js
similarity index 91%
rename from assets/en_vue-webapp_options_google-analytics.md.7KdBILW3.lean.js
rename to assets/en_vue-webapp_options_google-analytics.md.s8gajhQb.lean.js
index d502c8eb9..515700ec7 100644
--- a/assets/en_vue-webapp_options_google-analytics.md.7KdBILW3.lean.js
+++ b/assets/en_vue-webapp_options_google-analytics.md.s8gajhQb.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/google-analytics.md","filePath":"en/vue-webapp/options/google-analytics.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/google-analytics.md"},e=t("",4),l=[e];function h(p,k,g,o,E,d){return a(),i("div",null,l)}const y=s(n,[["render",h]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/google-analytics.md","filePath":"en/vue-webapp/options/google-analytics.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/google-analytics.md"},e=t("",4),l=[e];function h(p,k,g,o,E,d){return a(),i("div",null,l)}const y=s(n,[["render",h]]);export{c as __pageData,y as default};
diff --git a/assets/en_vue-webapp_options_header.md.MFJe_5jf.js b/assets/en_vue-webapp_options_header.md.MFJe_5jf.js
deleted file mode 100644
index 6edf4765f..000000000
--- a/assets/en_vue-webapp_options_header.md.MFJe_5jf.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import{_ as a,c as s,o as i,U as t,am as e,an as d,ao as n,ap as p}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Headers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/header.md","filePath":"en/vue-webapp/options/header.md","lastUpdated":1706427418000}'),h={name:"en/vue-webapp/options/header.md"},l=t('

Headers

All headers are adaptive.

SimpleHeader

image

Simple sticky header

MantineSimpleHeader

image

Simple sticky header in Mantine UI style

MantineLayeredHeader

image

Layered sticky header in Mantine UI style

SlidingHeader

image

Can contain two different headers, the second one appears after the user scrolls down the page

template
<AppHeader :threshold-hide="200" :threshold-open="400">
-    <template #first-header>
-        <AppHeaderFirst />
-    </template>
-
-    <template #second-header>
-        <AppHeaderSecond />
-    </template>
-<AppHeader>
`,15),c=[l];function r(k,f,E,v,o,g){return i(),s("div",null,c)}const _=a(h,[["render",r],["__scopeId","data-v-cf492197"]]);export{y as __pageData,_ as default}; diff --git a/assets/en_vue-webapp_options_header.md.xIw9DKI4.js b/assets/en_vue-webapp_options_header.md.xIw9DKI4.js new file mode 100644 index 000000000..0f00ff6f2 --- /dev/null +++ b/assets/en_vue-webapp_options_header.md.xIw9DKI4.js @@ -0,0 +1,9 @@ +import{_ as a,c as e,o as s,U as i,am as t,an as d,ao as n,ap as p}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Headers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/header.md","filePath":"en/vue-webapp/options/header.md","lastUpdated":1706553672000}'),h={name:"en/vue-webapp/options/header.md"},b=i('

Headers

All headers are adaptive.

SimpleHeader

image

Simple sticky header

MantineSimpleHeader

image

Simple sticky header in Mantine UI style

MantineLayeredHeader

image

Layered sticky header in Mantine UI style

SlidingHeader

image

Can contain two different headers, the second one appears after the user scrolls down the page

template
<AppHeader :threshold-hide="200" :threshold-open="400">
+    <template #first-header>
+        <AppHeaderFirst />
+    </template>
+
+    <template #second-header>
+        <AppHeaderSecond />
+    </template>
+<AppHeader>
`,15),l=[b];function r(k,E,v,o,g,c){return s(),e("div",null,l)}const _=a(h,[["render",r],["__scopeId","data-v-b9be24d1"]]);export{y as __pageData,_ as default}; diff --git a/assets/en_vue-webapp_options_header.md.MFJe_5jf.lean.js b/assets/en_vue-webapp_options_header.md.xIw9DKI4.lean.js similarity index 65% rename from assets/en_vue-webapp_options_header.md.MFJe_5jf.lean.js rename to assets/en_vue-webapp_options_header.md.xIw9DKI4.lean.js index 95518ad0e..e3332cc05 100644 --- a/assets/en_vue-webapp_options_header.md.MFJe_5jf.lean.js +++ b/assets/en_vue-webapp_options_header.md.xIw9DKI4.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as i,U as t,am as e,an as d,ao as n,ap as p}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Headers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/header.md","filePath":"en/vue-webapp/options/header.md","lastUpdated":1706427418000}'),h={name:"en/vue-webapp/options/header.md"},l=t("",15),c=[l];function r(k,f,E,v,o,g){return i(),s("div",null,c)}const _=a(h,[["render",r],["__scopeId","data-v-cf492197"]]);export{y as __pageData,_ as default}; +import{_ as a,c as e,o as s,U as i,am as t,an as d,ao as n,ap as p}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Headers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/header.md","filePath":"en/vue-webapp/options/header.md","lastUpdated":1706553672000}'),h={name:"en/vue-webapp/options/header.md"},b=i("",15),l=[b];function r(k,E,v,o,g,c){return s(),e("div",null,l)}const _=a(h,[["render",r],["__scopeId","data-v-b9be24d1"]]);export{y as __pageData,_ as default}; diff --git a/assets/en_vue-webapp_options_i18n.md.HG3LbCml.js b/assets/en_vue-webapp_options_i18n.md.hklg8J6I.js similarity index 99% rename from assets/en_vue-webapp_options_i18n.md.HG3LbCml.js rename to assets/en_vue-webapp_options_i18n.md.hklg8J6I.js index 24a9744c8..1f675acc3 100644 --- a/assets/en_vue-webapp_options_i18n.md.HG3LbCml.js +++ b/assets/en_vue-webapp_options_i18n.md.hklg8J6I.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"i18n","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/i18n.md","filePath":"en/vue-webapp/options/i18n.md","lastUpdated":1706427418000}'),e={name:"en/vue-webapp/options/i18n.md"},t=n(`

i18n

i18next

The NPM library for internationalization and localization i18n is very popular, but it has grown very large in recent years. It has a lot of features for localizing dates, numbers, setting the right declensions, RTL language support, downloading locales from the server and a bunch of other things. The i18next site even calls it an "internationalization framework".

At the same time, localization of a site often requires very simple things that take up only a couple of percent of the entire functionality of the i18n heavyweight.

In particular, usually needed:

  • Finding translation by the compound key - t("finance.transactions.deposit")
  • Translation with a parameter - t("hello-message", "John")
  • Arrays for lists or paragraphs of text

This functionality with preserving reactivity (changing the site language on the fly) can be obtained by a simple composable function.

useI18nLight

Here is a clean implementation of the above functionality without any dependencies in 70 lines against of one and a half megabytes of i18next.

Usage

Connection and initialization in main.ts:

js
import { useI18n } from "@/composables/useI18nLight";
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"i18n","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/i18n.md","filePath":"en/vue-webapp/options/i18n.md","lastUpdated":1706553672000}'),e={name:"en/vue-webapp/options/i18n.md"},t=n(`

i18n

i18next

The NPM library for internationalization and localization i18n is very popular, but it has grown very large in recent years. It has a lot of features for localizing dates, numbers, setting the right declensions, RTL language support, downloading locales from the server and a bunch of other things. The i18next site even calls it an "internationalization framework".

At the same time, localization of a site often requires very simple things that take up only a couple of percent of the entire functionality of the i18n heavyweight.

In particular, usually needed:

  • Finding translation by the compound key - t("finance.transactions.deposit")
  • Translation with a parameter - t("hello-message", "John")
  • Arrays for lists or paragraphs of text

This functionality with preserving reactivity (changing the site language on the fly) can be obtained by a simple composable function.

useI18nLight

Here is a clean implementation of the above functionality without any dependencies in 70 lines against of one and a half megabytes of i18next.

Usage

Connection and initialization in main.ts:

js
import { useI18n } from "@/composables/useI18nLight";
 
 const { initI18n } = useI18n();
 
diff --git a/assets/en_vue-webapp_options_i18n.md.HG3LbCml.lean.js b/assets/en_vue-webapp_options_i18n.md.hklg8J6I.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_i18n.md.HG3LbCml.lean.js
rename to assets/en_vue-webapp_options_i18n.md.hklg8J6I.lean.js
index d377d3b6e..5b21d89ba 100644
--- a/assets/en_vue-webapp_options_i18n.md.HG3LbCml.lean.js
+++ b/assets/en_vue-webapp_options_i18n.md.hklg8J6I.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"i18n","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/i18n.md","filePath":"en/vue-webapp/options/i18n.md","lastUpdated":1706427418000}'),e={name:"en/vue-webapp/options/i18n.md"},t=n("",19),l=[t];function h(p,k,o,r,E,d){return a(),i("div",null,l)}const y=s(e,[["render",h]]);export{g as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"i18n","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/i18n.md","filePath":"en/vue-webapp/options/i18n.md","lastUpdated":1706553672000}'),e={name:"en/vue-webapp/options/i18n.md"},t=n("",19),l=[t];function h(p,k,o,r,E,d){return a(),i("div",null,l)}const y=s(e,[["render",h]]);export{g as __pageData,y as default};
diff --git a/assets/en_vue-webapp_options_index.md.rNI8zLmW.js b/assets/en_vue-webapp_options_index.md.8LzfbKvw.js
similarity index 98%
rename from assets/en_vue-webapp_options_index.md.rNI8zLmW.js
rename to assets/en_vue-webapp_options_index.md.8LzfbKvw.js
index 77c3aeae7..ba7aaa0db 100644
--- a/assets/en_vue-webapp_options_index.md.rNI8zLmW.js
+++ b/assets/en_vue-webapp_options_index.md.8LzfbKvw.js
@@ -1 +1 @@
-import{_ as e,c as a,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Options when creating an application","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/index.md","filePath":"en/vue-webapp/options/index.md","lastUpdated":1706427418000}'),o={name:"en/vue-webapp/options/index.md"},n=t('

Options when creating an application

Available options

The following options are currently available for configuration:

  • Layout - application layout
  • Header - top part in the application template
  • Footer - bottom part of the application template
  • Drawer - navigation bar
  • Navbar - navigation menu (inside the drawer).
  • Github Pages deploy Workflow - GitHub Actions script for build and deploy application to GitHub Pages
  • PWA - addition of Service worker and Manifest to the application
  • API module - abstraction layer for communication with backend API
  • JSON-RPC - adapter for API module
  • Splash screen - splash screen during application startup to improve UX
  • Google analytics - code for integration of Google analytics
  • Open graph - meta tags for building snippets by social networks

Available by default

  • Dark theme. All plugins support theme switching
  • BaseIcon - icon component with the ability to dynamically specify a name
  • BaseToggle - toggle component

In development

  • Global Preloader
  • i18n - internationalization of the application using different variants of i18n libraries.

Planned

  • Online showcase for dynamic testing of different variants of application parts and functionality
  • Expanding the number of variants of layout, header, footer and other components
  • Auth - module framework for authentication on JWT tokens, including different variants of registration and login forms.
  • Auth integration with popular service providers (Firebase and others).
  • GitHub Actions for application deployment to various services (Vercel, Heroku, Firesbase) and other useful CI/CD scripts.
  • Check on startup for application new version and reload to avoid browser cache issues
  • Themes - application themes (include both different color palettes and the ability to change other CSS parameters for deep customization of the templates and components)
',10),l=[n];function r(p,s,c,d,h,u){return i(),a("div",null,l)}const b=e(o,[["render",r]]);export{f as __pageData,b as default}; +import{_ as e,c as a,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Options when creating an application","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/index.md","filePath":"en/vue-webapp/options/index.md","lastUpdated":1706553672000}'),o={name:"en/vue-webapp/options/index.md"},n=t('

Options when creating an application

Available options

The following options are currently available for configuration:

  • Layout - application layout
  • Header - top part in the application template
  • Footer - bottom part of the application template
  • Drawer - navigation bar
  • Navbar - navigation menu (inside the drawer).
  • Github Pages deploy Workflow - GitHub Actions script for build and deploy application to GitHub Pages
  • PWA - addition of Service worker and Manifest to the application
  • API module - abstraction layer for communication with backend API
  • JSON-RPC - adapter for API module
  • Splash screen - splash screen during application startup to improve UX
  • Google analytics - code for integration of Google analytics
  • Open graph - meta tags for building snippets by social networks

Available by default

  • Dark theme. All plugins support theme switching
  • BaseIcon - icon component with the ability to dynamically specify a name
  • BaseToggle - toggle component

In development

  • Global Preloader
  • i18n - internationalization of the application using different variants of i18n libraries.

Planned

  • Online showcase for dynamic testing of different variants of application parts and functionality
  • Expanding the number of variants of layout, header, footer and other components
  • Auth - module framework for authentication on JWT tokens, including different variants of registration and login forms.
  • Auth integration with popular service providers (Firebase and others).
  • GitHub Actions for application deployment to various services (Vercel, Heroku, Firesbase) and other useful CI/CD scripts.
  • Check on startup for application new version and reload to avoid browser cache issues
  • Themes - application themes (include both different color palettes and the ability to change other CSS parameters for deep customization of the templates and components)
',10),l=[n];function r(p,s,c,d,h,u){return i(),a("div",null,l)}const b=e(o,[["render",r]]);export{f as __pageData,b as default}; diff --git a/assets/en_vue-webapp_options_index.md.rNI8zLmW.lean.js b/assets/en_vue-webapp_options_index.md.8LzfbKvw.lean.js similarity index 90% rename from assets/en_vue-webapp_options_index.md.rNI8zLmW.lean.js rename to assets/en_vue-webapp_options_index.md.8LzfbKvw.lean.js index 625599c98..03f4f48f7 100644 --- a/assets/en_vue-webapp_options_index.md.rNI8zLmW.lean.js +++ b/assets/en_vue-webapp_options_index.md.8LzfbKvw.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Options when creating an application","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/index.md","filePath":"en/vue-webapp/options/index.md","lastUpdated":1706427418000}'),o={name:"en/vue-webapp/options/index.md"},n=t("",10),l=[n];function r(p,s,c,d,h,u){return i(),a("div",null,l)}const b=e(o,[["render",r]]);export{f as __pageData,b as default}; +import{_ as e,c as a,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Options when creating an application","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/index.md","filePath":"en/vue-webapp/options/index.md","lastUpdated":1706553672000}'),o={name:"en/vue-webapp/options/index.md"},n=t("",10),l=[n];function r(p,s,c,d,h,u){return i(),a("div",null,l)}const b=e(o,[["render",r]]);export{f as __pageData,b as default}; diff --git a/assets/en_vue-webapp_options_layout-main.md.fjfkBH8z.js b/assets/en_vue-webapp_options_layout-main.md._g3ZTK-o.js similarity index 95% rename from assets/en_vue-webapp_options_layout-main.md.fjfkBH8z.js rename to assets/en_vue-webapp_options_layout-main.md._g3ZTK-o.js index d9ba8155a..2a5ff3a99 100644 --- a/assets/en_vue-webapp_options_layout-main.md.fjfkBH8z.js +++ b/assets/en_vue-webapp_options_layout-main.md._g3ZTK-o.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as o,aq as n}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"MainLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/layout-main.md","filePath":"en/vue-webapp/options/layout-main.md","lastUpdated":1706427418000}'),i={name:"en/vue-webapp/options/layout-main.md"},r=o('

MainLayout

Standard layout with header, footer and sidebar in notebook and desktop modes. In tablet and mobile modes the sidebar is hidden and moves in from the left when user clicks on the "hamburger" icon.

image

Routing

Changing the content of the main panel is provided via vue-router routes.

',5),s=[r];function d(c,p,u,m,l,h){return t(),a("div",null,s)}const g=e(i,[["render",d]]);export{b as __pageData,g as default}; +import{_ as e,c as a,o as t,U as o,aq as n}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"MainLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/layout-main.md","filePath":"en/vue-webapp/options/layout-main.md","lastUpdated":1706553672000}'),i={name:"en/vue-webapp/options/layout-main.md"},r=o('

MainLayout

Standard layout with header, footer and sidebar in notebook and desktop modes. In tablet and mobile modes the sidebar is hidden and moves in from the left when user clicks on the "hamburger" icon.

image

Routing

Changing the content of the main panel is provided via vue-router routes.

',5),s=[r];function d(c,p,u,m,l,h){return t(),a("div",null,s)}const g=e(i,[["render",d]]);export{b as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_layout-main.md.fjfkBH8z.lean.js b/assets/en_vue-webapp_options_layout-main.md._g3ZTK-o.lean.js similarity index 90% rename from assets/en_vue-webapp_options_layout-main.md.fjfkBH8z.lean.js rename to assets/en_vue-webapp_options_layout-main.md._g3ZTK-o.lean.js index a42894450..b8c283a65 100644 --- a/assets/en_vue-webapp_options_layout-main.md.fjfkBH8z.lean.js +++ b/assets/en_vue-webapp_options_layout-main.md._g3ZTK-o.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as o,aq as n}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"MainLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/layout-main.md","filePath":"en/vue-webapp/options/layout-main.md","lastUpdated":1706427418000}'),i={name:"en/vue-webapp/options/layout-main.md"},r=o("",5),s=[r];function d(c,p,u,m,l,h){return t(),a("div",null,s)}const g=e(i,[["render",d]]);export{b as __pageData,g as default}; +import{_ as e,c as a,o as t,U as o,aq as n}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"MainLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/layout-main.md","filePath":"en/vue-webapp/options/layout-main.md","lastUpdated":1706553672000}'),i={name:"en/vue-webapp/options/layout-main.md"},r=o("",5),s=[r];function d(c,p,u,m,l,h){return t(),a("div",null,s)}const g=e(i,[["render",d]]);export{b as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_layout-one-column.md.DxxTBbwX.js b/assets/en_vue-webapp_options_layout-one-column.md.eU6iV2wo.js similarity index 95% rename from assets/en_vue-webapp_options_layout-one-column.md.DxxTBbwX.js rename to assets/en_vue-webapp_options_layout-one-column.md.eU6iV2wo.js index 7b7c26071..4422c47ac 100644 --- a/assets/en_vue-webapp_options_layout-one-column.md.DxxTBbwX.js +++ b/assets/en_vue-webapp_options_layout-one-column.md.eU6iV2wo.js @@ -1 +1 @@ -import{_ as e,c as o,o as a,U as t,ar as n}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"OneColumnLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/layout-one-column.md","filePath":"en/vue-webapp/options/layout-one-column.md","lastUpdated":1706427418000}'),i={name:"en/vue-webapp/options/layout-one-column.md"},l=t('

OneColumnLayout

Similar to MainLayout, but without the sidebar in notebook and desktop modes. Can be used, for example, if all navigation is located in the header. In tablet and mobile modes, the sidebar also pops out when the "hamburger" icon is clicked.

image

In all layout cases, the maximum width of the layout is set by the CSS variable --vwa-layout-max-width.

',4),c=[l];function s(d,u,m,p,r,_){return a(),o("div",null,c)}const g=e(i,[["render",s]]);export{b as __pageData,g as default}; +import{_ as e,c as o,o as a,U as t,ar as n}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"OneColumnLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/layout-one-column.md","filePath":"en/vue-webapp/options/layout-one-column.md","lastUpdated":1706553672000}'),i={name:"en/vue-webapp/options/layout-one-column.md"},l=t('

OneColumnLayout

Similar to MainLayout, but without the sidebar in notebook and desktop modes. Can be used, for example, if all navigation is located in the header. In tablet and mobile modes, the sidebar also pops out when the "hamburger" icon is clicked.

image

In all layout cases, the maximum width of the layout is set by the CSS variable --vwa-layout-max-width.

',4),c=[l];function s(d,u,m,p,r,_){return a(),o("div",null,c)}const g=e(i,[["render",s]]);export{b as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_layout-one-column.md.DxxTBbwX.lean.js b/assets/en_vue-webapp_options_layout-one-column.md.eU6iV2wo.lean.js similarity index 91% rename from assets/en_vue-webapp_options_layout-one-column.md.DxxTBbwX.lean.js rename to assets/en_vue-webapp_options_layout-one-column.md.eU6iV2wo.lean.js index a94a01473..6cd81c777 100644 --- a/assets/en_vue-webapp_options_layout-one-column.md.DxxTBbwX.lean.js +++ b/assets/en_vue-webapp_options_layout-one-column.md.eU6iV2wo.lean.js @@ -1 +1 @@ -import{_ as e,c as o,o as a,U as t,ar as n}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"OneColumnLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/layout-one-column.md","filePath":"en/vue-webapp/options/layout-one-column.md","lastUpdated":1706427418000}'),i={name:"en/vue-webapp/options/layout-one-column.md"},l=t("",4),c=[l];function s(d,u,m,p,r,_){return a(),o("div",null,c)}const g=e(i,[["render",s]]);export{b as __pageData,g as default}; +import{_ as e,c as o,o as a,U as t,ar as n}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"OneColumnLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/layout-one-column.md","filePath":"en/vue-webapp/options/layout-one-column.md","lastUpdated":1706553672000}'),i={name:"en/vue-webapp/options/layout-one-column.md"},l=t("",4),c=[l];function s(d,u,m,p,r,_){return a(),o("div",null,c)}const g=e(i,[["render",s]]);export{b as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_navbar.md.27abBKkt.js b/assets/en_vue-webapp_options_navbar.md.27abBKkt.js deleted file mode 100644 index c83e97e12..000000000 --- a/assets/en_vue-webapp_options_navbar.md.27abBKkt.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as c,as as n,at as o}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Navbar","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/navbar.md","filePath":"en/vue-webapp/options/navbar.md","lastUpdated":1706427418000}'),i={name:"en/vue-webapp/options/navbar.md"},r=c('

Navbar

The Navbar is located inside the NavigationDrawer

At the moment it is possible to choose from two variants:

SimpleNavbar

image

MantineSimpleNavbar

image

',7),s=[r];function p(d,m,v,l,_,b){return t(),e("div",null,s)}const u=a(i,[["render",p],["__scopeId","data-v-a1f1cc22"]]);export{h as __pageData,u as default}; diff --git a/assets/en_vue-webapp_options_navbar.md.mhHeVyic.js b/assets/en_vue-webapp_options_navbar.md.mhHeVyic.js new file mode 100644 index 000000000..39ae19615 --- /dev/null +++ b/assets/en_vue-webapp_options_navbar.md.mhHeVyic.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as c,as as n,at as o}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Navbar","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/navbar.md","filePath":"en/vue-webapp/options/navbar.md","lastUpdated":1706553672000}'),i={name:"en/vue-webapp/options/navbar.md"},r=c('

Navbar

The Navbar is located inside the NavigationDrawer

At the moment it is possible to choose from two variants:

SimpleNavbar

image

MantineSimpleNavbar

image

',7),s=[r];function p(d,b,m,v,l,_){return t(),e("div",null,s)}const g=a(i,[["render",p],["__scopeId","data-v-14c7baca"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_navbar.md.27abBKkt.lean.js b/assets/en_vue-webapp_options_navbar.md.mhHeVyic.lean.js similarity index 62% rename from assets/en_vue-webapp_options_navbar.md.27abBKkt.lean.js rename to assets/en_vue-webapp_options_navbar.md.mhHeVyic.lean.js index 3c59a7509..ab0ff09dd 100644 --- a/assets/en_vue-webapp_options_navbar.md.27abBKkt.lean.js +++ b/assets/en_vue-webapp_options_navbar.md.mhHeVyic.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as c,as as n,at as o}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Navbar","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/navbar.md","filePath":"en/vue-webapp/options/navbar.md","lastUpdated":1706427418000}'),i={name:"en/vue-webapp/options/navbar.md"},r=c("",7),s=[r];function p(d,m,v,l,_,b){return t(),e("div",null,s)}const u=a(i,[["render",p],["__scopeId","data-v-a1f1cc22"]]);export{h as __pageData,u as default}; +import{_ as a,c as e,o as t,U as c,as as n,at as o}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Navbar","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/navbar.md","filePath":"en/vue-webapp/options/navbar.md","lastUpdated":1706553672000}'),i={name:"en/vue-webapp/options/navbar.md"},r=c("",7),s=[r];function p(d,b,m,v,l,_){return t(),e("div",null,s)}const g=a(i,[["render",p],["__scopeId","data-v-14c7baca"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_open-graph.md.jrZzZWcu.js b/assets/en_vue-webapp_options_open-graph.md.KEKiTz40.js similarity index 99% rename from assets/en_vue-webapp_options_open-graph.md.jrZzZWcu.js rename to assets/en_vue-webapp_options_open-graph.md.KEKiTz40.js index 696b18323..934370e35 100644 --- a/assets/en_vue-webapp_options_open-graph.md.jrZzZWcu.js +++ b/assets/en_vue-webapp_options_open-graph.md.KEKiTz40.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/open-graph.md","filePath":"en/vue-webapp/options/open-graph.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/open-graph.md"},h=t(`

Google analytics

Adds Open graph meta tags for index.html.

html
<!-- Facebook Meta Tags -->
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/open-graph.md","filePath":"en/vue-webapp/options/open-graph.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/open-graph.md"},h=t(`

Google analytics

Adds Open graph meta tags for index.html.

html
<!-- Facebook Meta Tags -->
 <!-- <meta property="og:url" content="" /> -->
 <meta property="og:type" content="website" />
 <meta property="og:title" content="-og:title-" />
diff --git a/assets/en_vue-webapp_options_open-graph.md.jrZzZWcu.lean.js b/assets/en_vue-webapp_options_open-graph.md.KEKiTz40.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_open-graph.md.jrZzZWcu.lean.js
rename to assets/en_vue-webapp_options_open-graph.md.KEKiTz40.lean.js
index 22c6d7f42..75aef20bd 100644
--- a/assets/en_vue-webapp_options_open-graph.md.jrZzZWcu.lean.js
+++ b/assets/en_vue-webapp_options_open-graph.md.KEKiTz40.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/open-graph.md","filePath":"en/vue-webapp/options/open-graph.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/open-graph.md"},h=t("",4),p=[h];function k(e,l,E,r,g,o){return a(),i("div",null,p)}const F=s(n,[["render",k]]);export{y as __pageData,F as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/open-graph.md","filePath":"en/vue-webapp/options/open-graph.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/open-graph.md"},h=t("",4),p=[h];function k(e,l,E,r,g,o){return a(),i("div",null,p)}const F=s(n,[["render",k]]);export{y as __pageData,F as default};
diff --git a/assets/en_vue-webapp_options_pwa.md.cMz8h-_W.js b/assets/en_vue-webapp_options_pwa.md.XDIn1wLn.js
similarity index 99%
rename from assets/en_vue-webapp_options_pwa.md.cMz8h-_W.js
rename to assets/en_vue-webapp_options_pwa.md.XDIn1wLn.js
index 260806b46..ae61a18c0 100644
--- a/assets/en_vue-webapp_options_pwa.md.cMz8h-_W.js
+++ b/assets/en_vue-webapp_options_pwa.md.XDIn1wLn.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"PWA","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/pwa.md","filePath":"en/vue-webapp/options/pwa.md","lastUpdated":1706427418000}'),t={name:"en/vue-webapp/options/pwa.md"},n=e(`

PWA

Simple Manifest and Service worker are integrated into the application and work right away, without customization.

Manifest.json

Allows to install the application on user home screen and run it in native mode (without a browser window).

manifest.json must be edited to match your application data. For more information about the manifest file, see web.dev.

json
{
+import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"PWA","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/pwa.md","filePath":"en/vue-webapp/options/pwa.md","lastUpdated":1706553672000}'),t={name:"en/vue-webapp/options/pwa.md"},n=e(`

PWA

Simple Manifest and Service worker are integrated into the application and work right away, without customization.

Manifest.json

Allows to install the application on user home screen and run it in native mode (without a browser window).

manifest.json must be edited to match your application data. For more information about the manifest file, see web.dev.

json
{
   "description": "Acme Corporation webapp",
   "dir": "auto",
   "display": "standalone",
diff --git a/assets/en_vue-webapp_options_pwa.md.cMz8h-_W.lean.js b/assets/en_vue-webapp_options_pwa.md.XDIn1wLn.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_pwa.md.cMz8h-_W.lean.js
rename to assets/en_vue-webapp_options_pwa.md.XDIn1wLn.lean.js
index 8423c1297..440b39967 100644
--- a/assets/en_vue-webapp_options_pwa.md.cMz8h-_W.lean.js
+++ b/assets/en_vue-webapp_options_pwa.md.XDIn1wLn.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"PWA","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/pwa.md","filePath":"en/vue-webapp/options/pwa.md","lastUpdated":1706427418000}'),t={name:"en/vue-webapp/options/pwa.md"},n=e("",11),p=[n];function h(o,l,r,k,d,c){return a(),i("div",null,p)}const g=s(t,[["render",h]]);export{u as __pageData,g as default};
+import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"PWA","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/pwa.md","filePath":"en/vue-webapp/options/pwa.md","lastUpdated":1706553672000}'),t={name:"en/vue-webapp/options/pwa.md"},n=e("",11),p=[n];function h(o,l,r,k,d,c){return a(),i("div",null,p)}const g=s(t,[["render",h]]);export{u as __pageData,g as default};
diff --git a/assets/en_vue-webapp_options_splash-screen.md.7Plx8rUM.js b/assets/en_vue-webapp_options_splash-screen.md.7Plx8rUM.js
deleted file mode 100644
index ed7821648..000000000
--- a/assets/en_vue-webapp_options_splash-screen.md.7Plx8rUM.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as e,c as a,o as t,U as d,au as s}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Splash screen","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/splash-screen.md","filePath":"en/vue-webapp/options/splash-screen.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/splash-screen.md"},o=d('

Splash screen

A splash screen during application startup instead of a blank screen can enhance application user experience and strengthen brand recognition.

image

The splash screen code is located entirely in the index.html. It is controlled by the CSS class splash on the body tag.

The splash screen is removed in App.vue / onMounted() after all the resources needed to ignite the application have been loaded.

',5),p=[o];function c(r,i,l,h,_,b){return t(),a("div",null,p)}const u=e(n,[["render",c],["__scopeId","data-v-3d64d7b6"]]);export{v as __pageData,u as default}; diff --git a/assets/en_vue-webapp_options_splash-screen.md.9Vf2ZYLw.js b/assets/en_vue-webapp_options_splash-screen.md.9Vf2ZYLw.js new file mode 100644 index 000000000..992b3ec28 --- /dev/null +++ b/assets/en_vue-webapp_options_splash-screen.md.9Vf2ZYLw.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,U as s,au as n}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Splash screen","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/splash-screen.md","filePath":"en/vue-webapp/options/splash-screen.md","lastUpdated":1706553672000}'),o={name:"en/vue-webapp/options/splash-screen.md"},p=s('

Splash screen

A splash screen during application startup instead of a blank screen can enhance application user experience and strengthen brand recognition.

image

The splash screen code is located entirely in the index.html. It is controlled by the CSS class splash on the body tag.

The splash screen is removed in App.vue / onMounted() after all the resources needed to ignite the application have been loaded.

',5),c=[p];function d(r,i,l,h,_,m){return t(),a("div",null,c)}const g=e(o,[["render",d],["__scopeId","data-v-1e450a90"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_splash-screen.md.7Plx8rUM.lean.js b/assets/en_vue-webapp_options_splash-screen.md.9Vf2ZYLw.lean.js similarity index 51% rename from assets/en_vue-webapp_options_splash-screen.md.7Plx8rUM.lean.js rename to assets/en_vue-webapp_options_splash-screen.md.9Vf2ZYLw.lean.js index 004b44fb1..ffd8bd736 100644 --- a/assets/en_vue-webapp_options_splash-screen.md.7Plx8rUM.lean.js +++ b/assets/en_vue-webapp_options_splash-screen.md.9Vf2ZYLw.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as d,au as s}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Splash screen","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/splash-screen.md","filePath":"en/vue-webapp/options/splash-screen.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/splash-screen.md"},o=d("",5),p=[o];function c(r,i,l,h,_,b){return t(),a("div",null,p)}const u=e(n,[["render",c],["__scopeId","data-v-3d64d7b6"]]);export{v as __pageData,u as default}; +import{_ as e,c as a,o as t,U as s,au as n}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Splash screen","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/splash-screen.md","filePath":"en/vue-webapp/options/splash-screen.md","lastUpdated":1706553672000}'),o={name:"en/vue-webapp/options/splash-screen.md"},p=s("",5),c=[p];function d(r,i,l,h,_,m){return t(),a("div",null,c)}const g=e(o,[["render",d],["__scopeId","data-v-1e450a90"]]);export{u as __pageData,g as default}; diff --git a/assets/en_vue-webapp_options_themes.md.0NU1O5S3.js b/assets/en_vue-webapp_options_themes.md.zBa3ncdf.js similarity index 99% rename from assets/en_vue-webapp_options_themes.md.0NU1O5S3.js rename to assets/en_vue-webapp_options_themes.md.zBa3ncdf.js index d1f55385f..044a55bbd 100644 --- a/assets/en_vue-webapp_options_themes.md.0NU1O5S3.js +++ b/assets/en_vue-webapp_options_themes.md.zBa3ncdf.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as h}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Themes","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/themes.md","filePath":"en/vue-webapp/options/themes.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/themes.md"},t=h(`

Themes

The application implements light and dark themes. All components support switching themes.

Themes are controlled via CSS variables, which are defined in the vars.css file. The theme selected by the user is stored in localStorage. The ThemeToggle component is responsible for theme switching.

It is possible to customize themes and create new ones by overriding CSS variables, which is recommended to do in the custom.scss file:

css
:root {
+import{_ as s,c as i,o as a,U as h}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Themes","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/themes.md","filePath":"en/vue-webapp/options/themes.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/themes.md"},t=h(`

Themes

The application implements light and dark themes. All components support switching themes.

Themes are controlled via CSS variables, which are defined in the vars.css file. The theme selected by the user is stored in localStorage. The ThemeToggle component is responsible for theme switching.

It is possible to customize themes and create new ones by overriding CSS variables, which is recommended to do in the custom.scss file:

css
:root {
   --vwa-font-family-base: 'Roboto', sans-serif;
   --vwa-layout-max-width: 1280px;
 
diff --git a/assets/en_vue-webapp_options_themes.md.0NU1O5S3.lean.js b/assets/en_vue-webapp_options_themes.md.zBa3ncdf.lean.js
similarity index 90%
rename from assets/en_vue-webapp_options_themes.md.0NU1O5S3.lean.js
rename to assets/en_vue-webapp_options_themes.md.zBa3ncdf.lean.js
index a20459027..f484c489f 100644
--- a/assets/en_vue-webapp_options_themes.md.0NU1O5S3.lean.js
+++ b/assets/en_vue-webapp_options_themes.md.zBa3ncdf.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as h}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Themes","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/themes.md","filePath":"en/vue-webapp/options/themes.md","lastUpdated":1706427418000}'),n={name:"en/vue-webapp/options/themes.md"},t=h("",5),e=[t];function k(p,l,E,r,d,g){return a(),i("div",null,e)}const c=s(n,[["render",k]]);export{F as __pageData,c as default};
+import{_ as s,c as i,o as a,U as h}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Themes","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"en/vue-webapp/options/themes.md","filePath":"en/vue-webapp/options/themes.md","lastUpdated":1706553672000}'),n={name:"en/vue-webapp/options/themes.md"},t=h("",5),e=[t];function k(p,l,E,r,d,g){return a(),i("div",null,e)}const c=s(n,[["render",k]]);export{F as __pageData,c as default};
diff --git a/assets/index.md.wadnEZHb.js b/assets/index.md.Rk8ysRWy.js
similarity index 94%
rename from assets/index.md.wadnEZHb.js
rename to assets/index.md.Rk8ysRWy.js
index 16d70e338..82ea41352 100644
--- a/assets/index.md.wadnEZHb.js
+++ b/assets/index.md.Rk8ysRWy.js
@@ -1 +1 @@
-import{l as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Most frequently asked questions about Vue.js","actions":[{"theme":"brand","text":"Get Started","link":"/en/misc/introduction"},{"theme":"alt","text":"Why Vue?","link":"/en/frontend/about-frameworks"},{"theme":"alt alt-border","text":"Версия на русском языке","link":"/ru/"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"General issues of frontend development - architecture, design patterns, best practices are discussed"},{"title":"Vue 3","details":"Focuses on Vue 3, Composition API and the Vue ecosystem of recent years."},{"title":"Nuxt-free","details":"Nuxt is a separate standalone framework that deserves its own FAQ"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1706427418000}'),n={name:"index.md"},l=Object.assign(n,{setup(s){return e(()=>{"ru-RU".includes(navigator.language)||(document.querySelector(".actions .action:nth-child(3)").style.display="none")}),(o,r)=>(a(),t("div"))}});export{d as __pageData,l as default};
+import{l as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Most frequently asked questions about Vue.js","actions":[{"theme":"brand","text":"Get Started","link":"/en/misc/introduction"},{"theme":"alt","text":"Why Vue?","link":"/en/frontend/about-frameworks"},{"theme":"alt alt-border","text":"Версия на русском языке","link":"/ru/"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"General issues of frontend development - architecture, design patterns, best practices are discussed"},{"title":"Vue 3","details":"Focuses on Vue 3, Composition API and the Vue ecosystem of recent years."},{"title":"Nuxt-free","details":"Nuxt is a separate standalone framework that deserves its own FAQ"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1706553672000}'),n={name:"index.md"},l=Object.assign(n,{setup(s){return e(()=>{"ru-RU".includes(navigator.language)||(document.querySelector(".actions .action:nth-child(3)").style.display="none")}),(o,r)=>(a(),t("div"))}});export{d as __pageData,l as default};
diff --git a/assets/index.md.wadnEZHb.lean.js b/assets/index.md.Rk8ysRWy.lean.js
similarity index 94%
rename from assets/index.md.wadnEZHb.lean.js
rename to assets/index.md.Rk8ysRWy.lean.js
index 16d70e338..82ea41352 100644
--- a/assets/index.md.wadnEZHb.lean.js
+++ b/assets/index.md.Rk8ysRWy.lean.js
@@ -1 +1 @@
-import{l as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Most frequently asked questions about Vue.js","actions":[{"theme":"brand","text":"Get Started","link":"/en/misc/introduction"},{"theme":"alt","text":"Why Vue?","link":"/en/frontend/about-frameworks"},{"theme":"alt alt-border","text":"Версия на русском языке","link":"/ru/"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"General issues of frontend development - architecture, design patterns, best practices are discussed"},{"title":"Vue 3","details":"Focuses on Vue 3, Composition API and the Vue ecosystem of recent years."},{"title":"Nuxt-free","details":"Nuxt is a separate standalone framework that deserves its own FAQ"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1706427418000}'),n={name:"index.md"},l=Object.assign(n,{setup(s){return e(()=>{"ru-RU".includes(navigator.language)||(document.querySelector(".actions .action:nth-child(3)").style.display="none")}),(o,r)=>(a(),t("div"))}});export{d as __pageData,l as default};
+import{l as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Most frequently asked questions about Vue.js","actions":[{"theme":"brand","text":"Get Started","link":"/en/misc/introduction"},{"theme":"alt","text":"Why Vue?","link":"/en/frontend/about-frameworks"},{"theme":"alt alt-border","text":"Версия на русском языке","link":"/ru/"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"General issues of frontend development - architecture, design patterns, best practices are discussed"},{"title":"Vue 3","details":"Focuses on Vue 3, Composition API and the Vue ecosystem of recent years."},{"title":"Nuxt-free","details":"Nuxt is a separate standalone framework that deserves its own FAQ"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1706553672000}'),n={name:"index.md"},l=Object.assign(n,{setup(s){return e(()=>{"ru-RU".includes(navigator.language)||(document.querySelector(".actions .action:nth-child(3)").style.display="none")}),(o,r)=>(a(),t("div"))}});export{d as __pageData,l as default};
diff --git a/assets/ru_articles_index.md.WU4bL9_u.js b/assets/ru_articles_index.md.2J_uX4HA.js
similarity index 98%
rename from assets/ru_articles_index.md.WU4bL9_u.js
rename to assets/ru_articles_index.md.2J_uX4HA.js
index 3556590a1..0ae3c53ec 100644
--- a/assets/ru_articles_index.md.WU4bL9_u.js
+++ b/assets/ru_articles_index.md.2J_uX4HA.js
@@ -1 +1 @@
-import{_ as h,h as p,c as o,F as g,D as f,p as b,o as i,m as e,t as c,q as u,s as _,a as m}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('[{"title":"Facebook выпустил новую CSS-in-JS библиотеку — StyleX","date":"15/12/2023","desc":"Верней оформил 5 декабря 2023 года оформил для всех то, чем его разработчики пользуются уже давно. Позиционируется данный помощник для js-подобных фреймворков типа React, Preact, Solid, lit-html и Angular, однако оперирующие html шаблонами Vue и Svelte тоже могут задействовать StyleX, но после предварительной специальной её кастомизации.","url":"https://habr.com/ru/articles/781000/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/fee/1f5/45b/fee1f545b00f9ceb6db27c5068e0c251.png"},{"title":"Vue state management: Pinia stores или composables с глобальными рефами?","date":"13/12/2023","desc":"На Reddit прошла интересная дискуссия с 25К+ просмотрами по вопросу предпочтений разработчиков при необходимости управлять глобальным состоянием во Vue 3. Ниже её итоги.","url":"https://habr.com/ru/articles/780274/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/d45/a4f/9c8/d45a4f9c83bde005ad5b08a4e9b9770c.png"},{"title":"Google и Yandex SEO оптимизация для SPA приложений","date":"04/12/2023","desc":"Google и Yandex утверждают, что что-то уже могут по индексированию SPA приложений. В статье показаны результаты проведенного эксперимента по индексации чистого SPA вебсайта.
Результат: Google - хорошо, Yandex - не очень","url":"https://habr.com/ru/articles/778236/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/f49/faa/1fb/f49faa1fbce62f757e17f6e3a0f15d3a.jpg"},{"title":"Atomic CSS здорового человека. UnoCSS","date":"04/12/2023","desc":"Продолжение перевода статьи «Reimagine Atomic CSS» двухлетней давности одного из членов команды Vue core Anthony Fu, автора UnoCSS, в которой рассматривается уже сам UnoCSS.","url":"https://habr.com/ru/articles/777738/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/8bf/b40/575/8bfb405752bcb5dc61c1328716c235d3.png"},{"title":"План «Барбаросса» от Vue.js","date":"28/11/2023","desc":"После выхода крайней и достаточно революционной в плане добавления Composition API версии Vue 3.0 более чем три года назад, каких-либо серьезных изменений от команды Evan You в самом фреймворке больше не было. Только стандартные багфиксы, оптимизация и робкие попытки стать с TypeScript ближе. Основное внимание переключилось на экосистему - Vite, Nuxt, VitePress, Pinia и другие.
В то же время, отчетливо заметно масштабирование работы не вглубь, а вширь. Интересы команды уже давно явно выходят за пределы фреймворка.","url":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/94f/12a/fcd/94f12afcd0683614a23e2d4d263db10e.png","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/94f/12a/fcd/94f12afcd0683614a23e2d4d263db10e.png"},{"title":"Билдер Vue 3 веб приложений","date":"22/11/2023","desc":"Vue 3 вебсайт билдер (npm пакет vue-webapp) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.","url":"https://habr.com/ru/articles/775550/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/9e6/718/132/9e6718132859157ff9d2767d92f67a9f.png"},{"title":"Vue.js 3 — шаблоны проектирования и лучшие практики","date":"17/11/2023","desc":"Предлагается перевод книги Vue.js 3 Design Patterns and Best Practices автора Pablo Garaguso.
Книга вышла в мае 2023 года, написана очень компетентно, оперирует современными технологиями и стандартами. Материал книги будет полезен разработчикам не только Vue, но и других фронтенд фреймворков.","url":"https://habr.com/ru/articles/768080/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/017/712/bc7/017712bc7dd8f14465a6aea3506f1c55.jpg"},{"title":"Vue-faq.org — FAQ о фронтенде в целом и Vue в частности","date":"18/09/2023","desc":"https://vue-faq.org - попытка охватить наиболее часто задаваемые в профильных чатах и конференциях вопросы о фронтенде в целом и Vue.js фреймворке в частности.","url":"https://habr.com/ru/articles/760636/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/aa5/19e/294/aa519e294552841118a9339da87473f6.jpg"},{"title":"Написание Vite плагина","date":"10/08/2023","desc":"Сборщик Vite предоставляет не только хороший функционал, но и удобный API для создания плагинов, позволяющих кастомизировать его практически под любую задачу. То есть, плагины можно писать не только для публикации их в npmjs.com репозитории, но и для автоматизации исключительно своих задач.","url":"https://habr.com/ru/articles/753788/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/6ff/e5d/0af/6ffe5d0af3d94c11d2809ad8c54c16b4.png"},{"title":"Сравнение тяжеловесности популярных библиотек UI компонент для Vue 3","date":"30/06/2023","desc":"Библиотеки UI компонент популярны и удобны в некоторых случаях, но у них тоже есть обратные стороны. Одно дело, когда делаешь админку и используешь десятки компонент, другое - когда тебе надо всего пару компонент.
Было проведено исследование - взяты три HTML элемента: Button, Input и Select, и проверено, насколько увеличатся js и css бандлы если использовать для них одну из 10 распространенных UI библиотек для Vue 3.","url":"https://habr.com/ru/articles/745012/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/052/901/1e7/0529011e799ff6bfa59e4f3c14ff784b.png"},{"title":"Детокс для i18n","date":"22/05/2023","desc":"NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже \\"интернационализационным фреймворком\\".\\n
\\n В то же время часто для локализации сайта нужны очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n. Ниже будет описана несложная процедура избавления от i18next-ной зависимости в данном случае.","url":"https://habr.com/ru/articles/736530/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/77e/179/4ac/77e1794ac13bf456ba7e50ea26087b33.png"},{"title":"Работа с i18n — автоматизация Google Translate и другие полезные советы","date":"26/02/2023","desc":"NPM-пакет для интернационализации i18n используется на фронтэнде для создания мультиязычных вебсайтов очень часто. Перевод текста в нем содержится обычно в json или в js файлах, и требует дальнейшей обработки, чтобы с ним с комфортом могли работать контент-редакторы. В статье описывается как максимально упростить и сделать удобным хранение и внесение изменений в перевод.","url":"https://habr.com/ru/articles/718990/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/235/82f/7b7/23582f7b78c7584d7c849bd57c41f8d2.png"},{"title":"Популяризация JSON-RPC","date":"08/01/2023","desc":"\\n Для передачи данных по сети есть хорошо зарекомендовавшие себя стандарты - например, SOAP, gRPC, AMQP, REST, GraphQL.\\n
\\nПри создании вебсайтов малой, средней и большой сложности с потоками данных к бэкенду и обратно в JSON формате обычно используются последние два с их вариантами. Верней, только варианты, потому что REST и GraphQL - ресурсо-ориентированные стандарты. Это как бы просто перенос элементарной работы с базой данных на клиента (хотя под \\"ресурсом\\" может пониматься и абстракция). Обычно таких запросов не больше трети от всего бэкенд API.","url":"https://habr.com/ru/articles/709362/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/873/589/686/8735896860eb3723baa8eda674c69968.jpg"}]'),d=r=>(u("data-v-6d3821ee"),r=r(),_(),r),P=d(()=>e("h1",{id:"наши-статьи-на-других-ресурсах",tabindex:"-1"},[m("Наши статьи на других ресурсах "),e("a",{class:"header-anchor",href:"#наши-статьи-на-других-ресурсах","aria-label":'Permalink to "Наши статьи на других ресурсах"'},"​")],-1)),x=d(()=>e("hr",null,null,-1)),V={class:"title"},U=["href"],v={class:"content"},w={class:"image"},j=["src"],A=["innerHTML"],I={class:"footer"},C={class:"source"},k=["href"],N={class:"date"},G=JSON.parse('{"title":"Наши статьи на других ресурсах","description":"","frontmatter":{"pageClass":"articles"},"headers":[],"relativePath":"ru/articles/index.md","filePath":"ru/articles/index.md","lastUpdated":1706427418000}'),O={name:"ru/articles/index.md"},T=Object.assign(O,{setup(r){p("some");function n(t){if(!t)return"";const s=t.indexOf("://");s!==-1&&(t=t.slice(s+3));const a=t.indexOf("/");return a!==-1&&(t=t.slice(0,a)),t.split(".").slice(-2).join(".")}return(t,s)=>(i(),o("div",null,[P,x,(i(!0),o(g,null,f(b(S),(a,l)=>(i(),o("div",{key:l,class:"post"},[e("h3",V,[e("a",{href:a.url,target:"_blank",class:"vp-external-link-icon"},c(a.title),9,U)]),e("div",v,[e("div",w,[e("img",{src:a.imageUrl},null,8,j)]),e("div",{class:"desc",innerHTML:a.desc},null,8,A)]),e("div",I,[e("div",C,[e("a",{href:a.url,target:"_blank",class:"vp-external-link-icon"},c(n(a.url)),9,k)]),e("div",N,c(a.date),1)])]))),128))]))}}),L=h(T,[["__scopeId","data-v-6d3821ee"]]);export{G as __pageData,L as default}; +import{_ as h,h as p,c as o,F as g,D as f,p as b,o as i,m as e,t as c,q as u,s as _,a as m}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('[{"title":"Facebook выпустил новую CSS-in-JS библиотеку — StyleX","date":"15/12/2023","desc":"Верней оформил 5 декабря 2023 года оформил для всех то, чем его разработчики пользуются уже давно. Позиционируется данный помощник для js-подобных фреймворков типа React, Preact, Solid, lit-html и Angular, однако оперирующие html шаблонами Vue и Svelte тоже могут задействовать StyleX, но после предварительной специальной её кастомизации.","url":"https://habr.com/ru/articles/781000/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/fee/1f5/45b/fee1f545b00f9ceb6db27c5068e0c251.png"},{"title":"Vue state management: Pinia stores или composables с глобальными рефами?","date":"13/12/2023","desc":"На Reddit прошла интересная дискуссия с 25К+ просмотрами по вопросу предпочтений разработчиков при необходимости управлять глобальным состоянием во Vue 3. Ниже её итоги.","url":"https://habr.com/ru/articles/780274/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/d45/a4f/9c8/d45a4f9c83bde005ad5b08a4e9b9770c.png"},{"title":"Google и Yandex SEO оптимизация для SPA приложений","date":"04/12/2023","desc":"Google и Yandex утверждают, что что-то уже могут по индексированию SPA приложений. В статье показаны результаты проведенного эксперимента по индексации чистого SPA вебсайта.
Результат: Google - хорошо, Yandex - не очень","url":"https://habr.com/ru/articles/778236/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/f49/faa/1fb/f49faa1fbce62f757e17f6e3a0f15d3a.jpg"},{"title":"Atomic CSS здорового человека. UnoCSS","date":"04/12/2023","desc":"Продолжение перевода статьи «Reimagine Atomic CSS» двухлетней давности одного из членов команды Vue core Anthony Fu, автора UnoCSS, в которой рассматривается уже сам UnoCSS.","url":"https://habr.com/ru/articles/777738/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/8bf/b40/575/8bfb405752bcb5dc61c1328716c235d3.png"},{"title":"План «Барбаросса» от Vue.js","date":"28/11/2023","desc":"После выхода крайней и достаточно революционной в плане добавления Composition API версии Vue 3.0 более чем три года назад, каких-либо серьезных изменений от команды Evan You в самом фреймворке больше не было. Только стандартные багфиксы, оптимизация и робкие попытки стать с TypeScript ближе. Основное внимание переключилось на экосистему - Vite, Nuxt, VitePress, Pinia и другие.
В то же время, отчетливо заметно масштабирование работы не вглубь, а вширь. Интересы команды уже давно явно выходят за пределы фреймворка.","url":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/94f/12a/fcd/94f12afcd0683614a23e2d4d263db10e.png","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/94f/12a/fcd/94f12afcd0683614a23e2d4d263db10e.png"},{"title":"Билдер Vue 3 веб приложений","date":"22/11/2023","desc":"Vue 3 вебсайт билдер (npm пакет vue-webapp) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.","url":"https://habr.com/ru/articles/775550/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/9e6/718/132/9e6718132859157ff9d2767d92f67a9f.png"},{"title":"Vue.js 3 — шаблоны проектирования и лучшие практики","date":"17/11/2023","desc":"Предлагается перевод книги Vue.js 3 Design Patterns and Best Practices автора Pablo Garaguso.
Книга вышла в мае 2023 года, написана очень компетентно, оперирует современными технологиями и стандартами. Материал книги будет полезен разработчикам не только Vue, но и других фронтенд фреймворков.","url":"https://habr.com/ru/articles/768080/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/017/712/bc7/017712bc7dd8f14465a6aea3506f1c55.jpg"},{"title":"Vue-faq.org — FAQ о фронтенде в целом и Vue в частности","date":"18/09/2023","desc":"https://vue-faq.org - попытка охватить наиболее часто задаваемые в профильных чатах и конференциях вопросы о фронтенде в целом и Vue.js фреймворке в частности.","url":"https://habr.com/ru/articles/760636/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/aa5/19e/294/aa519e294552841118a9339da87473f6.jpg"},{"title":"Написание Vite плагина","date":"10/08/2023","desc":"Сборщик Vite предоставляет не только хороший функционал, но и удобный API для создания плагинов, позволяющих кастомизировать его практически под любую задачу. То есть, плагины можно писать не только для публикации их в npmjs.com репозитории, но и для автоматизации исключительно своих задач.","url":"https://habr.com/ru/articles/753788/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/6ff/e5d/0af/6ffe5d0af3d94c11d2809ad8c54c16b4.png"},{"title":"Сравнение тяжеловесности популярных библиотек UI компонент для Vue 3","date":"30/06/2023","desc":"Библиотеки UI компонент популярны и удобны в некоторых случаях, но у них тоже есть обратные стороны. Одно дело, когда делаешь админку и используешь десятки компонент, другое - когда тебе надо всего пару компонент.
Было проведено исследование - взяты три HTML элемента: Button, Input и Select, и проверено, насколько увеличатся js и css бандлы если использовать для них одну из 10 распространенных UI библиотек для Vue 3.","url":"https://habr.com/ru/articles/745012/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/052/901/1e7/0529011e799ff6bfa59e4f3c14ff784b.png"},{"title":"Детокс для i18n","date":"22/05/2023","desc":"NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже \\"интернационализационным фреймворком\\".\\n
\\n В то же время часто для локализации сайта нужны очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n. Ниже будет описана несложная процедура избавления от i18next-ной зависимости в данном случае.","url":"https://habr.com/ru/articles/736530/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/77e/179/4ac/77e1794ac13bf456ba7e50ea26087b33.png"},{"title":"Работа с i18n — автоматизация Google Translate и другие полезные советы","date":"26/02/2023","desc":"NPM-пакет для интернационализации i18n используется на фронтэнде для создания мультиязычных вебсайтов очень часто. Перевод текста в нем содержится обычно в json или в js файлах, и требует дальнейшей обработки, чтобы с ним с комфортом могли работать контент-редакторы. В статье описывается как максимально упростить и сделать удобным хранение и внесение изменений в перевод.","url":"https://habr.com/ru/articles/718990/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/235/82f/7b7/23582f7b78c7584d7c849bd57c41f8d2.png"},{"title":"Популяризация JSON-RPC","date":"08/01/2023","desc":"\\n Для передачи данных по сети есть хорошо зарекомендовавшие себя стандарты - например, SOAP, gRPC, AMQP, REST, GraphQL.\\n
\\nПри создании вебсайтов малой, средней и большой сложности с потоками данных к бэкенду и обратно в JSON формате обычно используются последние два с их вариантами. Верней, только варианты, потому что REST и GraphQL - ресурсо-ориентированные стандарты. Это как бы просто перенос элементарной работы с базой данных на клиента (хотя под \\"ресурсом\\" может пониматься и абстракция). Обычно таких запросов не больше трети от всего бэкенд API.","url":"https://habr.com/ru/articles/709362/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/873/589/686/8735896860eb3723baa8eda674c69968.jpg"}]'),d=r=>(u("data-v-502123cd"),r=r(),_(),r),P=d(()=>e("h1",{id:"наши-статьи-на-других-ресурсах",tabindex:"-1"},[m("Наши статьи на других ресурсах "),e("a",{class:"header-anchor",href:"#наши-статьи-на-других-ресурсах","aria-label":'Permalink to "Наши статьи на других ресурсах"'},"​")],-1)),x=d(()=>e("hr",null,null,-1)),V={class:"title"},U=["href"],v={class:"content"},w={class:"image"},j=["src"],A=["innerHTML"],I={class:"footer"},C={class:"source"},k=["href"],N={class:"date"},G=JSON.parse('{"title":"Наши статьи на других ресурсах","description":"","frontmatter":{"pageClass":"articles"},"headers":[],"relativePath":"ru/articles/index.md","filePath":"ru/articles/index.md","lastUpdated":1706553672000}'),O={name:"ru/articles/index.md"},T=Object.assign(O,{setup(r){p("some");function n(t){if(!t)return"";const s=t.indexOf("://");s!==-1&&(t=t.slice(s+3));const a=t.indexOf("/");return a!==-1&&(t=t.slice(0,a)),t.split(".").slice(-2).join(".")}return(t,s)=>(i(),o("div",null,[P,x,(i(!0),o(g,null,f(b(S),(a,l)=>(i(),o("div",{key:l,class:"post"},[e("h3",V,[e("a",{href:a.url,target:"_blank",class:"vp-external-link-icon"},c(a.title),9,U)]),e("div",v,[e("div",w,[e("img",{src:a.imageUrl},null,8,j)]),e("div",{class:"desc",innerHTML:a.desc},null,8,A)]),e("div",I,[e("div",C,[e("a",{href:a.url,target:"_blank",class:"vp-external-link-icon"},c(n(a.url)),9,k)]),e("div",N,c(a.date),1)])]))),128))]))}}),L=h(T,[["__scopeId","data-v-502123cd"]]);export{G as __pageData,L as default}; diff --git a/assets/ru_articles_index.md.WU4bL9_u.lean.js b/assets/ru_articles_index.md.2J_uX4HA.lean.js similarity index 98% rename from assets/ru_articles_index.md.WU4bL9_u.lean.js rename to assets/ru_articles_index.md.2J_uX4HA.lean.js index 3556590a1..0ae3c53ec 100644 --- a/assets/ru_articles_index.md.WU4bL9_u.lean.js +++ b/assets/ru_articles_index.md.2J_uX4HA.lean.js @@ -1 +1 @@ -import{_ as h,h as p,c as o,F as g,D as f,p as b,o as i,m as e,t as c,q as u,s as _,a as m}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('[{"title":"Facebook выпустил новую CSS-in-JS библиотеку — StyleX","date":"15/12/2023","desc":"Верней оформил 5 декабря 2023 года оформил для всех то, чем его разработчики пользуются уже давно. Позиционируется данный помощник для js-подобных фреймворков типа React, Preact, Solid, lit-html и Angular, однако оперирующие html шаблонами Vue и Svelte тоже могут задействовать StyleX, но после предварительной специальной её кастомизации.","url":"https://habr.com/ru/articles/781000/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/fee/1f5/45b/fee1f545b00f9ceb6db27c5068e0c251.png"},{"title":"Vue state management: Pinia stores или composables с глобальными рефами?","date":"13/12/2023","desc":"На Reddit прошла интересная дискуссия с 25К+ просмотрами по вопросу предпочтений разработчиков при необходимости управлять глобальным состоянием во Vue 3. Ниже её итоги.","url":"https://habr.com/ru/articles/780274/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/d45/a4f/9c8/d45a4f9c83bde005ad5b08a4e9b9770c.png"},{"title":"Google и Yandex SEO оптимизация для SPA приложений","date":"04/12/2023","desc":"Google и Yandex утверждают, что что-то уже могут по индексированию SPA приложений. В статье показаны результаты проведенного эксперимента по индексации чистого SPA вебсайта.
Результат: Google - хорошо, Yandex - не очень","url":"https://habr.com/ru/articles/778236/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/f49/faa/1fb/f49faa1fbce62f757e17f6e3a0f15d3a.jpg"},{"title":"Atomic CSS здорового человека. UnoCSS","date":"04/12/2023","desc":"Продолжение перевода статьи «Reimagine Atomic CSS» двухлетней давности одного из членов команды Vue core Anthony Fu, автора UnoCSS, в которой рассматривается уже сам UnoCSS.","url":"https://habr.com/ru/articles/777738/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/8bf/b40/575/8bfb405752bcb5dc61c1328716c235d3.png"},{"title":"План «Барбаросса» от Vue.js","date":"28/11/2023","desc":"После выхода крайней и достаточно революционной в плане добавления Composition API версии Vue 3.0 более чем три года назад, каких-либо серьезных изменений от команды Evan You в самом фреймворке больше не было. Только стандартные багфиксы, оптимизация и робкие попытки стать с TypeScript ближе. Основное внимание переключилось на экосистему - Vite, Nuxt, VitePress, Pinia и другие.
В то же время, отчетливо заметно масштабирование работы не вглубь, а вширь. Интересы команды уже давно явно выходят за пределы фреймворка.","url":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/94f/12a/fcd/94f12afcd0683614a23e2d4d263db10e.png","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/94f/12a/fcd/94f12afcd0683614a23e2d4d263db10e.png"},{"title":"Билдер Vue 3 веб приложений","date":"22/11/2023","desc":"Vue 3 вебсайт билдер (npm пакет vue-webapp) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.","url":"https://habr.com/ru/articles/775550/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/9e6/718/132/9e6718132859157ff9d2767d92f67a9f.png"},{"title":"Vue.js 3 — шаблоны проектирования и лучшие практики","date":"17/11/2023","desc":"Предлагается перевод книги Vue.js 3 Design Patterns and Best Practices автора Pablo Garaguso.
Книга вышла в мае 2023 года, написана очень компетентно, оперирует современными технологиями и стандартами. Материал книги будет полезен разработчикам не только Vue, но и других фронтенд фреймворков.","url":"https://habr.com/ru/articles/768080/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/017/712/bc7/017712bc7dd8f14465a6aea3506f1c55.jpg"},{"title":"Vue-faq.org — FAQ о фронтенде в целом и Vue в частности","date":"18/09/2023","desc":"https://vue-faq.org - попытка охватить наиболее часто задаваемые в профильных чатах и конференциях вопросы о фронтенде в целом и Vue.js фреймворке в частности.","url":"https://habr.com/ru/articles/760636/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/aa5/19e/294/aa519e294552841118a9339da87473f6.jpg"},{"title":"Написание Vite плагина","date":"10/08/2023","desc":"Сборщик Vite предоставляет не только хороший функционал, но и удобный API для создания плагинов, позволяющих кастомизировать его практически под любую задачу. То есть, плагины можно писать не только для публикации их в npmjs.com репозитории, но и для автоматизации исключительно своих задач.","url":"https://habr.com/ru/articles/753788/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/6ff/e5d/0af/6ffe5d0af3d94c11d2809ad8c54c16b4.png"},{"title":"Сравнение тяжеловесности популярных библиотек UI компонент для Vue 3","date":"30/06/2023","desc":"Библиотеки UI компонент популярны и удобны в некоторых случаях, но у них тоже есть обратные стороны. Одно дело, когда делаешь админку и используешь десятки компонент, другое - когда тебе надо всего пару компонент.
Было проведено исследование - взяты три HTML элемента: Button, Input и Select, и проверено, насколько увеличатся js и css бандлы если использовать для них одну из 10 распространенных UI библиотек для Vue 3.","url":"https://habr.com/ru/articles/745012/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/052/901/1e7/0529011e799ff6bfa59e4f3c14ff784b.png"},{"title":"Детокс для i18n","date":"22/05/2023","desc":"NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже \\"интернационализационным фреймворком\\".\\n
\\n В то же время часто для локализации сайта нужны очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n. Ниже будет описана несложная процедура избавления от i18next-ной зависимости в данном случае.","url":"https://habr.com/ru/articles/736530/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/77e/179/4ac/77e1794ac13bf456ba7e50ea26087b33.png"},{"title":"Работа с i18n — автоматизация Google Translate и другие полезные советы","date":"26/02/2023","desc":"NPM-пакет для интернационализации i18n используется на фронтэнде для создания мультиязычных вебсайтов очень часто. Перевод текста в нем содержится обычно в json или в js файлах, и требует дальнейшей обработки, чтобы с ним с комфортом могли работать контент-редакторы. В статье описывается как максимально упростить и сделать удобным хранение и внесение изменений в перевод.","url":"https://habr.com/ru/articles/718990/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/235/82f/7b7/23582f7b78c7584d7c849bd57c41f8d2.png"},{"title":"Популяризация JSON-RPC","date":"08/01/2023","desc":"\\n Для передачи данных по сети есть хорошо зарекомендовавшие себя стандарты - например, SOAP, gRPC, AMQP, REST, GraphQL.\\n
\\nПри создании вебсайтов малой, средней и большой сложности с потоками данных к бэкенду и обратно в JSON формате обычно используются последние два с их вариантами. Верней, только варианты, потому что REST и GraphQL - ресурсо-ориентированные стандарты. Это как бы просто перенос элементарной работы с базой данных на клиента (хотя под \\"ресурсом\\" может пониматься и абстракция). Обычно таких запросов не больше трети от всего бэкенд API.","url":"https://habr.com/ru/articles/709362/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/873/589/686/8735896860eb3723baa8eda674c69968.jpg"}]'),d=r=>(u("data-v-6d3821ee"),r=r(),_(),r),P=d(()=>e("h1",{id:"наши-статьи-на-других-ресурсах",tabindex:"-1"},[m("Наши статьи на других ресурсах "),e("a",{class:"header-anchor",href:"#наши-статьи-на-других-ресурсах","aria-label":'Permalink to "Наши статьи на других ресурсах"'},"​")],-1)),x=d(()=>e("hr",null,null,-1)),V={class:"title"},U=["href"],v={class:"content"},w={class:"image"},j=["src"],A=["innerHTML"],I={class:"footer"},C={class:"source"},k=["href"],N={class:"date"},G=JSON.parse('{"title":"Наши статьи на других ресурсах","description":"","frontmatter":{"pageClass":"articles"},"headers":[],"relativePath":"ru/articles/index.md","filePath":"ru/articles/index.md","lastUpdated":1706427418000}'),O={name:"ru/articles/index.md"},T=Object.assign(O,{setup(r){p("some");function n(t){if(!t)return"";const s=t.indexOf("://");s!==-1&&(t=t.slice(s+3));const a=t.indexOf("/");return a!==-1&&(t=t.slice(0,a)),t.split(".").slice(-2).join(".")}return(t,s)=>(i(),o("div",null,[P,x,(i(!0),o(g,null,f(b(S),(a,l)=>(i(),o("div",{key:l,class:"post"},[e("h3",V,[e("a",{href:a.url,target:"_blank",class:"vp-external-link-icon"},c(a.title),9,U)]),e("div",v,[e("div",w,[e("img",{src:a.imageUrl},null,8,j)]),e("div",{class:"desc",innerHTML:a.desc},null,8,A)]),e("div",I,[e("div",C,[e("a",{href:a.url,target:"_blank",class:"vp-external-link-icon"},c(n(a.url)),9,k)]),e("div",N,c(a.date),1)])]))),128))]))}}),L=h(T,[["__scopeId","data-v-6d3821ee"]]);export{G as __pageData,L as default}; +import{_ as h,h as p,c as o,F as g,D as f,p as b,o as i,m as e,t as c,q as u,s as _,a as m}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('[{"title":"Facebook выпустил новую CSS-in-JS библиотеку — StyleX","date":"15/12/2023","desc":"Верней оформил 5 декабря 2023 года оформил для всех то, чем его разработчики пользуются уже давно. Позиционируется данный помощник для js-подобных фреймворков типа React, Preact, Solid, lit-html и Angular, однако оперирующие html шаблонами Vue и Svelte тоже могут задействовать StyleX, но после предварительной специальной её кастомизации.","url":"https://habr.com/ru/articles/781000/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/fee/1f5/45b/fee1f545b00f9ceb6db27c5068e0c251.png"},{"title":"Vue state management: Pinia stores или composables с глобальными рефами?","date":"13/12/2023","desc":"На Reddit прошла интересная дискуссия с 25К+ просмотрами по вопросу предпочтений разработчиков при необходимости управлять глобальным состоянием во Vue 3. Ниже её итоги.","url":"https://habr.com/ru/articles/780274/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/d45/a4f/9c8/d45a4f9c83bde005ad5b08a4e9b9770c.png"},{"title":"Google и Yandex SEO оптимизация для SPA приложений","date":"04/12/2023","desc":"Google и Yandex утверждают, что что-то уже могут по индексированию SPA приложений. В статье показаны результаты проведенного эксперимента по индексации чистого SPA вебсайта.
Результат: Google - хорошо, Yandex - не очень","url":"https://habr.com/ru/articles/778236/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/f49/faa/1fb/f49faa1fbce62f757e17f6e3a0f15d3a.jpg"},{"title":"Atomic CSS здорового человека. UnoCSS","date":"04/12/2023","desc":"Продолжение перевода статьи «Reimagine Atomic CSS» двухлетней давности одного из членов команды Vue core Anthony Fu, автора UnoCSS, в которой рассматривается уже сам UnoCSS.","url":"https://habr.com/ru/articles/777738/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/8bf/b40/575/8bfb405752bcb5dc61c1328716c235d3.png"},{"title":"План «Барбаросса» от Vue.js","date":"28/11/2023","desc":"После выхода крайней и достаточно революционной в плане добавления Composition API версии Vue 3.0 более чем три года назад, каких-либо серьезных изменений от команды Evan You в самом фреймворке больше не было. Только стандартные багфиксы, оптимизация и робкие попытки стать с TypeScript ближе. Основное внимание переключилось на экосистему - Vite, Nuxt, VitePress, Pinia и другие.
В то же время, отчетливо заметно масштабирование работы не вглубь, а вширь. Интересы команды уже давно явно выходят за пределы фреймворка.","url":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/94f/12a/fcd/94f12afcd0683614a23e2d4d263db10e.png","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/94f/12a/fcd/94f12afcd0683614a23e2d4d263db10e.png"},{"title":"Билдер Vue 3 веб приложений","date":"22/11/2023","desc":"Vue 3 вебсайт билдер (npm пакет vue-webapp) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.","url":"https://habr.com/ru/articles/775550/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/9e6/718/132/9e6718132859157ff9d2767d92f67a9f.png"},{"title":"Vue.js 3 — шаблоны проектирования и лучшие практики","date":"17/11/2023","desc":"Предлагается перевод книги Vue.js 3 Design Patterns and Best Practices автора Pablo Garaguso.
Книга вышла в мае 2023 года, написана очень компетентно, оперирует современными технологиями и стандартами. Материал книги будет полезен разработчикам не только Vue, но и других фронтенд фреймворков.","url":"https://habr.com/ru/articles/768080/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/017/712/bc7/017712bc7dd8f14465a6aea3506f1c55.jpg"},{"title":"Vue-faq.org — FAQ о фронтенде в целом и Vue в частности","date":"18/09/2023","desc":"https://vue-faq.org - попытка охватить наиболее часто задаваемые в профильных чатах и конференциях вопросы о фронтенде в целом и Vue.js фреймворке в частности.","url":"https://habr.com/ru/articles/760636/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/aa5/19e/294/aa519e294552841118a9339da87473f6.jpg"},{"title":"Написание Vite плагина","date":"10/08/2023","desc":"Сборщик Vite предоставляет не только хороший функционал, но и удобный API для создания плагинов, позволяющих кастомизировать его практически под любую задачу. То есть, плагины можно писать не только для публикации их в npmjs.com репозитории, но и для автоматизации исключительно своих задач.","url":"https://habr.com/ru/articles/753788/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/6ff/e5d/0af/6ffe5d0af3d94c11d2809ad8c54c16b4.png"},{"title":"Сравнение тяжеловесности популярных библиотек UI компонент для Vue 3","date":"30/06/2023","desc":"Библиотеки UI компонент популярны и удобны в некоторых случаях, но у них тоже есть обратные стороны. Одно дело, когда делаешь админку и используешь десятки компонент, другое - когда тебе надо всего пару компонент.
Было проведено исследование - взяты три HTML элемента: Button, Input и Select, и проверено, насколько увеличатся js и css бандлы если использовать для них одну из 10 распространенных UI библиотек для Vue 3.","url":"https://habr.com/ru/articles/745012/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/052/901/1e7/0529011e799ff6bfa59e4f3c14ff784b.png"},{"title":"Детокс для i18n","date":"22/05/2023","desc":"NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже \\"интернационализационным фреймворком\\".\\n
\\n В то же время часто для локализации сайта нужны очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n. Ниже будет описана несложная процедура избавления от i18next-ной зависимости в данном случае.","url":"https://habr.com/ru/articles/736530/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/77e/179/4ac/77e1794ac13bf456ba7e50ea26087b33.png"},{"title":"Работа с i18n — автоматизация Google Translate и другие полезные советы","date":"26/02/2023","desc":"NPM-пакет для интернационализации i18n используется на фронтэнде для создания мультиязычных вебсайтов очень часто. Перевод текста в нем содержится обычно в json или в js файлах, и требует дальнейшей обработки, чтобы с ним с комфортом могли работать контент-редакторы. В статье описывается как максимально упростить и сделать удобным хранение и внесение изменений в перевод.","url":"https://habr.com/ru/articles/718990/","imageUrl":"https://habrastorage.org/r/w1560/getpro/habr/upload_files/235/82f/7b7/23582f7b78c7584d7c849bd57c41f8d2.png"},{"title":"Популяризация JSON-RPC","date":"08/01/2023","desc":"\\n Для передачи данных по сети есть хорошо зарекомендовавшие себя стандарты - например, SOAP, gRPC, AMQP, REST, GraphQL.\\n
\\nПри создании вебсайтов малой, средней и большой сложности с потоками данных к бэкенду и обратно в JSON формате обычно используются последние два с их вариантами. Верней, только варианты, потому что REST и GraphQL - ресурсо-ориентированные стандарты. Это как бы просто перенос элементарной работы с базой данных на клиента (хотя под \\"ресурсом\\" может пониматься и абстракция). Обычно таких запросов не больше трети от всего бэкенд API.","url":"https://habr.com/ru/articles/709362/","imageUrl":"https://habrastorage.org/r/w780/getpro/habr/upload_files/873/589/686/8735896860eb3723baa8eda674c69968.jpg"}]'),d=r=>(u("data-v-502123cd"),r=r(),_(),r),P=d(()=>e("h1",{id:"наши-статьи-на-других-ресурсах",tabindex:"-1"},[m("Наши статьи на других ресурсах "),e("a",{class:"header-anchor",href:"#наши-статьи-на-других-ресурсах","aria-label":'Permalink to "Наши статьи на других ресурсах"'},"​")],-1)),x=d(()=>e("hr",null,null,-1)),V={class:"title"},U=["href"],v={class:"content"},w={class:"image"},j=["src"],A=["innerHTML"],I={class:"footer"},C={class:"source"},k=["href"],N={class:"date"},G=JSON.parse('{"title":"Наши статьи на других ресурсах","description":"","frontmatter":{"pageClass":"articles"},"headers":[],"relativePath":"ru/articles/index.md","filePath":"ru/articles/index.md","lastUpdated":1706553672000}'),O={name:"ru/articles/index.md"},T=Object.assign(O,{setup(r){p("some");function n(t){if(!t)return"";const s=t.indexOf("://");s!==-1&&(t=t.slice(s+3));const a=t.indexOf("/");return a!==-1&&(t=t.slice(0,a)),t.split(".").slice(-2).join(".")}return(t,s)=>(i(),o("div",null,[P,x,(i(!0),o(g,null,f(b(S),(a,l)=>(i(),o("div",{key:l,class:"post"},[e("h3",V,[e("a",{href:a.url,target:"_blank",class:"vp-external-link-icon"},c(a.title),9,U)]),e("div",v,[e("div",w,[e("img",{src:a.imageUrl},null,8,j)]),e("div",{class:"desc",innerHTML:a.desc},null,8,A)]),e("div",I,[e("div",C,[e("a",{href:a.url,target:"_blank",class:"vp-external-link-icon"},c(n(a.url)),9,k)]),e("div",N,c(a.date),1)])]))),128))]))}}),L=h(T,[["__scopeId","data-v-502123cd"]]);export{G as __pageData,L as default}; diff --git a/assets/ru_arty-crafty_analysis_architecture-and-design.md.7sPp31hp.js b/assets/ru_arty-crafty_analysis_architecture-and-design.md.eCUc5ji3.js similarity index 99% rename from assets/ru_arty-crafty_analysis_architecture-and-design.md.7sPp31hp.js rename to assets/ru_arty-crafty_analysis_architecture-and-design.md.eCUc5ji3.js index fecd2e172..1dda166b8 100644 --- a/assets/ru_arty-crafty_analysis_architecture-and-design.md.7sPp31hp.js +++ b/assets/ru_arty-crafty_analysis_architecture-and-design.md.eCUc5ji3.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const r="/assets/divide-et-impera.r3XGNBoo.webp",l="/assets/package-diagram.JMparWkb.jpg",o="/assets/three-tier-architecture.ThiUEcp5.png",b=JSON.parse('{"title":"Архитектура и дизайн","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/architecture-and-design.md","filePath":"ru/arty-crafty/analysis/architecture-and-design.md","lastUpdated":1706427418000}'),s={name:"ru/arty-crafty/analysis/architecture-and-design.md"},c=i('

Архитектура и дизайн

Упрощение сложного

Самое главное правило при проектировании любых систем - KISS (keep it simple, stupid). Более благозвучно это формулируется как: "Всё гениальное просто".

Для того, чтобы управлять сложными системами, издревле люди стали разбивать их на более простые. Принцип: "Разделяй и властвуй", относится именно к этому.

image

Любое современное государство управляется через иерархичное разбиение и подчинение, давая возможность любому управляющему быть ответственным за небольшую часть системы, которую он может контролировать.

Аналогично программная система любой сложности может быть разбита на отдельные подсистемы. Чем менее две таких подсистемы будут связаны друг с другом (loosely coupled), тем проще с ними будет работать, исправлять баги, вводить в курс новых разработчиков.

Абстракция и инкапсуляция

Эти два метода объектно-ориентированного программирования хорошо действуют и здесь в веб разработке на Vue, для определения функциональных границ подсистем, и данных, которыми они обменивается между собой и с окружающим миром.

Например, у нас на фронтенде будет два представления на экране (views) - категория товара и сам товар. Кажется, что они связаны друг с другом, потому что оперируют одними сущностями, но на самом деле они вообще никак не связаны (если отвлечься от визуального вида). Каждое получает свои данные с бэкенда. Когда происходит клик на какой-либо товар в списке категории, то id товара отправляется во vue-router, который уже вызывает страницу товара с нужным id.

То же самое в паре меню категорий и самого представления категории с товарами. Меню категорий может быть довольно сложным, и вынести его в отдельную подсистему тогда будет полезно.

Это пример, как можно разбивать систему на несвязанные (или слабосвязанные) подсистемы, что очень сильно облегчает дальнейшую разработку.

Разбиение проекта на подсистемы

Замечание

Иногда будут вставать вопросы, над которыми читателю полезно подумать самому. В таких случаях, я буду формулировать вопрос, а свой ответ прятать под спойлер. Ваш вариант ответа вполне может оказаться полней и точней.

Вопрос: на какие слабосвязанные подсистемы можно разбить наш проект маркетплейса? Имеется ввиду только фронтенд. Предлагаю взять для примера Озон и исследовать его.

Вариант ответа
  • Меню категорий
  • Фильтры поиска
  • Представление категории товара
  • Представление товара
  • Секция "Похожие товары"
  • Отзывы о товаре
  • Рекламные баннеры
  • Блоки спецпредложений и рекомендаций
  • Вспомогательные страницы (подарочные сертификаты, акции и т.п.)
  • Сравнение товаров
  • Избранное
  • Заказы
  • Страница профиля
  • Корзина
  • Модуль оплаты
  • Модуль выбора вида доставки
  • Локация пункта выдачи
  • и ещё другие

Package Diagram

Примерный вид диаграммы пакетов:

image

Пакеты здесь аналоги будущих модулей в нашем приложении.

Клиент-серверная архитектура

Архитектурно приложение будет являться классическим трехуровневых приложением - фронтенд, бэкенд, база данных. На первом этапе бэкенд и база данных представляют собой статичные json файлы. Затем за них будет отвечать Headless CMS

В связи с тем, что мы разрабатываем SPA, часть бизнес логики будет на фронтенде.

image

Routing

Роутинг используется в том числе и для того, чтобы сделать наши подсистемы слабосвязанными.

На первом этапе нам нужны три маршрута:

  • главная страница
  • товары определенной категории
  • страница определенного товара

Для простоты главную страницу оставим пустой.

',29),n=[c];function p(d,m,u,h,g,_){return t(),e("div",null,n)}const k=a(s,[["render",p]]);export{b as __pageData,k as default}; +import{_ as a,c as e,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const r="/assets/divide-et-impera.r3XGNBoo.webp",l="/assets/package-diagram.JMparWkb.jpg",o="/assets/three-tier-architecture.ThiUEcp5.png",b=JSON.parse('{"title":"Архитектура и дизайн","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/architecture-and-design.md","filePath":"ru/arty-crafty/analysis/architecture-and-design.md","lastUpdated":1706553672000}'),s={name:"ru/arty-crafty/analysis/architecture-and-design.md"},c=i('

Архитектура и дизайн

Упрощение сложного

Самое главное правило при проектировании любых систем - KISS (keep it simple, stupid). Более благозвучно это формулируется как: "Всё гениальное просто".

Для того, чтобы управлять сложными системами, издревле люди стали разбивать их на более простые. Принцип: "Разделяй и властвуй", относится именно к этому.

image

Любое современное государство управляется через иерархичное разбиение и подчинение, давая возможность любому управляющему быть ответственным за небольшую часть системы, которую он может контролировать.

Аналогично программная система любой сложности может быть разбита на отдельные подсистемы. Чем менее две таких подсистемы будут связаны друг с другом (loosely coupled), тем проще с ними будет работать, исправлять баги, вводить в курс новых разработчиков.

Абстракция и инкапсуляция

Эти два метода объектно-ориентированного программирования хорошо действуют и здесь в веб разработке на Vue, для определения функциональных границ подсистем, и данных, которыми они обменивается между собой и с окружающим миром.

Например, у нас на фронтенде будет два представления на экране (views) - категория товара и сам товар. Кажется, что они связаны друг с другом, потому что оперируют одними сущностями, но на самом деле они вообще никак не связаны (если отвлечься от визуального вида). Каждое получает свои данные с бэкенда. Когда происходит клик на какой-либо товар в списке категории, то id товара отправляется во vue-router, который уже вызывает страницу товара с нужным id.

То же самое в паре меню категорий и самого представления категории с товарами. Меню категорий может быть довольно сложным, и вынести его в отдельную подсистему тогда будет полезно.

Это пример, как можно разбивать систему на несвязанные (или слабосвязанные) подсистемы, что очень сильно облегчает дальнейшую разработку.

Разбиение проекта на подсистемы

Замечание

Иногда будут вставать вопросы, над которыми читателю полезно подумать самому. В таких случаях, я буду формулировать вопрос, а свой ответ прятать под спойлер. Ваш вариант ответа вполне может оказаться полней и точней.

Вопрос: на какие слабосвязанные подсистемы можно разбить наш проект маркетплейса? Имеется ввиду только фронтенд. Предлагаю взять для примера Озон и исследовать его.

Вариант ответа
  • Меню категорий
  • Фильтры поиска
  • Представление категории товара
  • Представление товара
  • Секция "Похожие товары"
  • Отзывы о товаре
  • Рекламные баннеры
  • Блоки спецпредложений и рекомендаций
  • Вспомогательные страницы (подарочные сертификаты, акции и т.п.)
  • Сравнение товаров
  • Избранное
  • Заказы
  • Страница профиля
  • Корзина
  • Модуль оплаты
  • Модуль выбора вида доставки
  • Локация пункта выдачи
  • и ещё другие

Package Diagram

Примерный вид диаграммы пакетов:

image

Пакеты здесь аналоги будущих модулей в нашем приложении.

Клиент-серверная архитектура

Архитектурно приложение будет являться классическим трехуровневых приложением - фронтенд, бэкенд, база данных. На первом этапе бэкенд и база данных представляют собой статичные json файлы. Затем за них будет отвечать Headless CMS

В связи с тем, что мы разрабатываем SPA, часть бизнес логики будет на фронтенде.

image

Routing

Роутинг используется в том числе и для того, чтобы сделать наши подсистемы слабосвязанными.

На первом этапе нам нужны три маршрута:

  • главная страница
  • товары определенной категории
  • страница определенного товара

Для простоты главную страницу оставим пустой.

',29),n=[c];function p(d,m,u,h,g,_){return t(),e("div",null,n)}const k=a(s,[["render",p]]);export{b as __pageData,k as default}; diff --git a/assets/ru_arty-crafty_analysis_architecture-and-design.md.7sPp31hp.lean.js b/assets/ru_arty-crafty_analysis_architecture-and-design.md.eCUc5ji3.lean.js similarity index 93% rename from assets/ru_arty-crafty_analysis_architecture-and-design.md.7sPp31hp.lean.js rename to assets/ru_arty-crafty_analysis_architecture-and-design.md.eCUc5ji3.lean.js index 51b68f92a..0965bcc6b 100644 --- a/assets/ru_arty-crafty_analysis_architecture-and-design.md.7sPp31hp.lean.js +++ b/assets/ru_arty-crafty_analysis_architecture-and-design.md.eCUc5ji3.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const r="/assets/divide-et-impera.r3XGNBoo.webp",l="/assets/package-diagram.JMparWkb.jpg",o="/assets/three-tier-architecture.ThiUEcp5.png",b=JSON.parse('{"title":"Архитектура и дизайн","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/architecture-and-design.md","filePath":"ru/arty-crafty/analysis/architecture-and-design.md","lastUpdated":1706427418000}'),s={name:"ru/arty-crafty/analysis/architecture-and-design.md"},c=i("",29),n=[c];function p(d,m,u,h,g,_){return t(),e("div",null,n)}const k=a(s,[["render",p]]);export{b as __pageData,k as default}; +import{_ as a,c as e,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const r="/assets/divide-et-impera.r3XGNBoo.webp",l="/assets/package-diagram.JMparWkb.jpg",o="/assets/three-tier-architecture.ThiUEcp5.png",b=JSON.parse('{"title":"Архитектура и дизайн","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/architecture-and-design.md","filePath":"ru/arty-crafty/analysis/architecture-and-design.md","lastUpdated":1706553672000}'),s={name:"ru/arty-crafty/analysis/architecture-and-design.md"},c=i("",29),n=[c];function p(d,m,u,h,g,_){return t(),e("div",null,n)}const k=a(s,[["render",p]]);export{b as __pageData,k as default}; diff --git a/assets/ru_arty-crafty_analysis_business-analysis.md.-3KX24ef.js b/assets/ru_arty-crafty_analysis_business-analysis.md.wAQmXhES.js similarity index 99% rename from assets/ru_arty-crafty_analysis_business-analysis.md.-3KX24ef.js rename to assets/ru_arty-crafty_analysis_business-analysis.md.wAQmXhES.js index 6ada6f12f..af2de2425 100644 --- a/assets/ru_arty-crafty_analysis_business-analysis.md.-3KX24ef.js +++ b/assets/ru_arty-crafty_analysis_business-analysis.md.wAQmXhES.js @@ -1 +1 @@ -import{_ as a,c as e,o as s,U as t}from"./chunks/framework.P5TqXf0g.js";const r="/assets/use-case.LwkV-Tmf.png",o="/assets/use-case-online-shopping-example.SuCWQz4p.jpg",g=JSON.parse('{"title":"Бизнес-анализ","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/business-analysis.md","filePath":"ru/arty-crafty/analysis/business-analysis.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/analysis/business-analysis.md"},c=t('

Бизнес-анализ

Границы проекта

Наш случай (витрина-магазин-маркетплейс) - довольно распространенный, изученный и проверенный. Есть известные решения и лучшие практики для него - как технические (код), так и в плане подбора нужного функционала.

Если бы заказчиком был некий отдельный клиент, необходимо было бы четко задокументировать с ним в SRS каждый функционал, каждый элемент экрана сайта для избежания дальнейших проблем и претензий с обеих сторон, но так как мы "пишем с натуры", то этот момент можно опустить.

Существующие решения

Есть ли решения, который можно использовать? О бэкенде речь ниже, для фронтенда не было найдено ничего. Vue Storefront мутный продукт, предлагаемый в основном как сервис, да еще и написанный на Nuxt 2. Больше серьезных решений на Vue найдено не было.

Рассмотрим намеченные этапы развития проекта.

Витрина

На начальном этапе пользователь должен иметь возможность просматривать каталог и отдельные продукты. Визуально это означает, что в нашем веб приложении будет секция с каталогом категорий, а так же представление (view) со списком продуктов выбранной категории, и представление с описанием продукта.

С точки зрения потоков данных, веб приложение должно получать информацию о каталоге, о продуктах в определенной категории и о конкретном продукте, что означает три типа запросов к бэкенду.

На первом этапе "бэкенд" будет простыми json файлами, отдаваемыми самим сервером фронтенда.

Данные файлы будут: каталог категорий, пара файлов категорий продуктов, несколько файлов продуктов.

Задача первого этапа - настроить маршрутизацию (vue routing) и сделать возможность просматривать каталог продуктов, получая данные по сети. Данный скелет приложения позволит в дальнейшем наращивать на него функциональность.

Магазин

Здесь потребуется добавление Корзины (Shopping cart) и системы заказов (Orders). На этом этапе (и даже чуть раньше) нужно будет подключать полноценный бэкенд. Мы возьмем какое-нибудь Headless CMS e-commerce решение. Если бы это был просто наш магазин, можно было бы написать свой несложный бэкенд, однако нужна полноценная админка для технически неподкованых продавцов (merchants), а это очень трудоемко.

Со сторонним заказчиком необходимо бы было провести анализ существующих подходящих Headless CMS e-commerce решение с расчетом дальнейших затрат. Мы же ориентируемся на наличие open source решений для этого, например medusa.js, в которых есть возможность работы режиме маркетплейса.

В любом случае, решаем задачи по мере их поступления. Если мы остановимся на невозможности что-то реализовать в силу объективных обстоятельств, то как минимум витрина с возможностью сделать заказ (без онлайн оплаты) у нас будет, а значит исходная задача в необходимой мере будет решена.

Маркетплейс

На фронтенде факторизация по продавцам - это, по сути, выборка по специальному аттрибуту, который есть у каждого продукта. Однако в админке этот функционал намного более обширен. В том числе и поэтому мы ориентируемся на стороннее решение для бэкенда.

Use case диаграмма

Одним из методов решения задач бизнес анализа являются UML диаграммы, в частности, Use case диаграмма.

Use case диаграмма нашего проекта может выглядеть примерно так:

image

Разбивка по этапам очень условна.

Вот более детальный пример Use case диаграммы онлайн магазина:

Use case online store example

image

',26),i=[c];function p(l,d,h,m,u,_){return s(),e("div",null,i)}const y=a(n,[["render",p]]);export{g as __pageData,y as default}; +import{_ as a,c as e,o as s,U as t}from"./chunks/framework.P5TqXf0g.js";const r="/assets/use-case.LwkV-Tmf.png",o="/assets/use-case-online-shopping-example.SuCWQz4p.jpg",g=JSON.parse('{"title":"Бизнес-анализ","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/business-analysis.md","filePath":"ru/arty-crafty/analysis/business-analysis.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/analysis/business-analysis.md"},c=t('

Бизнес-анализ

Границы проекта

Наш случай (витрина-магазин-маркетплейс) - довольно распространенный, изученный и проверенный. Есть известные решения и лучшие практики для него - как технические (код), так и в плане подбора нужного функционала.

Если бы заказчиком был некий отдельный клиент, необходимо было бы четко задокументировать с ним в SRS каждый функционал, каждый элемент экрана сайта для избежания дальнейших проблем и претензий с обеих сторон, но так как мы "пишем с натуры", то этот момент можно опустить.

Существующие решения

Есть ли решения, который можно использовать? О бэкенде речь ниже, для фронтенда не было найдено ничего. Vue Storefront мутный продукт, предлагаемый в основном как сервис, да еще и написанный на Nuxt 2. Больше серьезных решений на Vue найдено не было.

Рассмотрим намеченные этапы развития проекта.

Витрина

На начальном этапе пользователь должен иметь возможность просматривать каталог и отдельные продукты. Визуально это означает, что в нашем веб приложении будет секция с каталогом категорий, а так же представление (view) со списком продуктов выбранной категории, и представление с описанием продукта.

С точки зрения потоков данных, веб приложение должно получать информацию о каталоге, о продуктах в определенной категории и о конкретном продукте, что означает три типа запросов к бэкенду.

На первом этапе "бэкенд" будет простыми json файлами, отдаваемыми самим сервером фронтенда.

Данные файлы будут: каталог категорий, пара файлов категорий продуктов, несколько файлов продуктов.

Задача первого этапа - настроить маршрутизацию (vue routing) и сделать возможность просматривать каталог продуктов, получая данные по сети. Данный скелет приложения позволит в дальнейшем наращивать на него функциональность.

Магазин

Здесь потребуется добавление Корзины (Shopping cart) и системы заказов (Orders). На этом этапе (и даже чуть раньше) нужно будет подключать полноценный бэкенд. Мы возьмем какое-нибудь Headless CMS e-commerce решение. Если бы это был просто наш магазин, можно было бы написать свой несложный бэкенд, однако нужна полноценная админка для технически неподкованых продавцов (merchants), а это очень трудоемко.

Со сторонним заказчиком необходимо бы было провести анализ существующих подходящих Headless CMS e-commerce решение с расчетом дальнейших затрат. Мы же ориентируемся на наличие open source решений для этого, например medusa.js, в которых есть возможность работы режиме маркетплейса.

В любом случае, решаем задачи по мере их поступления. Если мы остановимся на невозможности что-то реализовать в силу объективных обстоятельств, то как минимум витрина с возможностью сделать заказ (без онлайн оплаты) у нас будет, а значит исходная задача в необходимой мере будет решена.

Маркетплейс

На фронтенде факторизация по продавцам - это, по сути, выборка по специальному аттрибуту, который есть у каждого продукта. Однако в админке этот функционал намного более обширен. В том числе и поэтому мы ориентируемся на стороннее решение для бэкенда.

Use case диаграмма

Одним из методов решения задач бизнес анализа являются UML диаграммы, в частности, Use case диаграмма.

Use case диаграмма нашего проекта может выглядеть примерно так:

image

Разбивка по этапам очень условна.

Вот более детальный пример Use case диаграммы онлайн магазина:

Use case online store example

image

',26),i=[c];function p(l,d,h,m,u,_){return s(),e("div",null,i)}const y=a(n,[["render",p]]);export{g as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_analysis_business-analysis.md.-3KX24ef.lean.js b/assets/ru_arty-crafty_analysis_business-analysis.md.wAQmXhES.lean.js similarity index 92% rename from assets/ru_arty-crafty_analysis_business-analysis.md.-3KX24ef.lean.js rename to assets/ru_arty-crafty_analysis_business-analysis.md.wAQmXhES.lean.js index c8fdb72c4..9c668ad40 100644 --- a/assets/ru_arty-crafty_analysis_business-analysis.md.-3KX24ef.lean.js +++ b/assets/ru_arty-crafty_analysis_business-analysis.md.wAQmXhES.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as s,U as t}from"./chunks/framework.P5TqXf0g.js";const r="/assets/use-case.LwkV-Tmf.png",o="/assets/use-case-online-shopping-example.SuCWQz4p.jpg",g=JSON.parse('{"title":"Бизнес-анализ","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/business-analysis.md","filePath":"ru/arty-crafty/analysis/business-analysis.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/analysis/business-analysis.md"},c=t("",26),i=[c];function p(l,d,h,m,u,_){return s(),e("div",null,i)}const y=a(n,[["render",p]]);export{g as __pageData,y as default}; +import{_ as a,c as e,o as s,U as t}from"./chunks/framework.P5TqXf0g.js";const r="/assets/use-case.LwkV-Tmf.png",o="/assets/use-case-online-shopping-example.SuCWQz4p.jpg",g=JSON.parse('{"title":"Бизнес-анализ","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/business-analysis.md","filePath":"ru/arty-crafty/analysis/business-analysis.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/analysis/business-analysis.md"},c=t("",26),i=[c];function p(l,d,h,m,u,_){return s(),e("div",null,i)}const y=a(n,[["render",p]]);export{g as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_analysis_data-model.md.sKAmZqDC.js b/assets/ru_arty-crafty_analysis_data-model.md.RIraf0Xk.js similarity index 99% rename from assets/ru_arty-crafty_analysis_data-model.md.sKAmZqDC.js rename to assets/ru_arty-crafty_analysis_data-model.md.RIraf0Xk.js index 3d78dccc3..9a255da20 100644 --- a/assets/ru_arty-crafty_analysis_data-model.md.sKAmZqDC.js +++ b/assets/ru_arty-crafty_analysis_data-model.md.RIraf0Xk.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/oc-product-table.EMrgcWx5.png",e="/assets/product-table-1.y4RldK6M.png",y=JSON.parse('{"title":"Модель данных","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/data-model.md","filePath":"ru/arty-crafty/analysis/data-model.md","lastUpdated":1706427418000}'),p={name:"ru/arty-crafty/analysis/data-model.md"},l=t('

Модель данных

Категория и товар

У нас, очевидно, есть уже две бизнес сущности - категория каталога и товар. На данный момент пусть товар может принадлежать только одной категории. В дальнейшем можно ввести тэги, коллекции, бренды, которые тоже будут объединять товары в множества и по которым будет возможен поиск м фильтрация.

Чтобы определить, какие свойства будут у категории или товара, можно воспользоваться здравым смыслом, а так же посмотреть реализацию данных сущностей в других e-commerce решениях.

Вот, например, какие поля есть в таблице product в OpenCart:

image

Дополнительно к этому в OpenCart у товара есть изображения, его варианты, опции, типы.

Типы баз данных

На первом этапе мы используем JSON файлы в качестве бэкенд данных, но в последующем задействуем настоящую базу данных, конечно.

Для прикладного программирования есть два основных типа баз данных - реляционные (SQL) и объектные (NoSQL). В первой данные хранятся в таблицах, типа Google sheet, со связями между собой, во второй - в виде JSON объектов. Реляционные БД дают структурированность, транзакционность, надежность и производительность, проверенную десятилетиям, NoSQL базы дают удобный формат иерархичного представления данных и возможность по ходу разработки менять структуру второстепенных данных не меняя схему БД.

Самый лучший вариант - использовать SQL базу c JSON полями в таблицах для иерархичных данных. Обычные поля остаются для данных, требующих индексации для быстрого доступа, - по которым нужен поиск или объединение. Таким образом получается преимущество SQL базы данных с опрятностью и удобством работы с JSON данными.

В примере с product у нас в первом приближении будет примерно следующая таблица:

image

Мы создали два индекса - у title и subtitle, потому что по ним будет происходить поиск. Остальные данные могут находиться в data.

То есть, пример соответствующего json файла товара для первого этапа может быть такой:

1.json
json
{
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/oc-product-table.EMrgcWx5.png",e="/assets/product-table-1.y4RldK6M.png",y=JSON.parse('{"title":"Модель данных","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/data-model.md","filePath":"ru/arty-crafty/analysis/data-model.md","lastUpdated":1706553672000}'),p={name:"ru/arty-crafty/analysis/data-model.md"},l=t('

Модель данных

Категория и товар

У нас, очевидно, есть уже две бизнес сущности - категория каталога и товар. На данный момент пусть товар может принадлежать только одной категории. В дальнейшем можно ввести тэги, коллекции, бренды, которые тоже будут объединять товары в множества и по которым будет возможен поиск м фильтрация.

Чтобы определить, какие свойства будут у категории или товара, можно воспользоваться здравым смыслом, а так же посмотреть реализацию данных сущностей в других e-commerce решениях.

Вот, например, какие поля есть в таблице product в OpenCart:

image

Дополнительно к этому в OpenCart у товара есть изображения, его варианты, опции, типы.

Типы баз данных

На первом этапе мы используем JSON файлы в качестве бэкенд данных, но в последующем задействуем настоящую базу данных, конечно.

Для прикладного программирования есть два основных типа баз данных - реляционные (SQL) и объектные (NoSQL). В первой данные хранятся в таблицах, типа Google sheet, со связями между собой, во второй - в виде JSON объектов. Реляционные БД дают структурированность, транзакционность, надежность и производительность, проверенную десятилетиям, NoSQL базы дают удобный формат иерархичного представления данных и возможность по ходу разработки менять структуру второстепенных данных не меняя схему БД.

Самый лучший вариант - использовать SQL базу c JSON полями в таблицах для иерархичных данных. Обычные поля остаются для данных, требующих индексации для быстрого доступа, - по которым нужен поиск или объединение. Таким образом получается преимущество SQL базы данных с опрятностью и удобством работы с JSON данными.

В примере с product у нас в первом приближении будет примерно следующая таблица:

image

Мы создали два индекса - у title и subtitle, потому что по ним будет происходить поиск. Остальные данные могут находиться в data.

То есть, пример соответствующего json файла товара для первого этапа может быть такой:

1.json
json
{
   "id": 1,
   "title": "Garfield",
   "subtitle": "Мягкая игрушка кот Garfield",
diff --git a/assets/ru_arty-crafty_analysis_data-model.md.sKAmZqDC.lean.js b/assets/ru_arty-crafty_analysis_data-model.md.RIraf0Xk.lean.js
similarity index 92%
rename from assets/ru_arty-crafty_analysis_data-model.md.sKAmZqDC.lean.js
rename to assets/ru_arty-crafty_analysis_data-model.md.RIraf0Xk.lean.js
index 9ce8e879e..42c314b56 100644
--- a/assets/ru_arty-crafty_analysis_data-model.md.sKAmZqDC.lean.js
+++ b/assets/ru_arty-crafty_analysis_data-model.md.RIraf0Xk.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/oc-product-table.EMrgcWx5.png",e="/assets/product-table-1.y4RldK6M.png",y=JSON.parse('{"title":"Модель данных","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/data-model.md","filePath":"ru/arty-crafty/analysis/data-model.md","lastUpdated":1706427418000}'),p={name:"ru/arty-crafty/analysis/data-model.md"},l=t("",21),h=[l];function k(o,r,d,E,c,g){return a(),i("div",null,h)}const F=s(p,[["render",k]]);export{y as __pageData,F as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/oc-product-table.EMrgcWx5.png",e="/assets/product-table-1.y4RldK6M.png",y=JSON.parse('{"title":"Модель данных","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/data-model.md","filePath":"ru/arty-crafty/analysis/data-model.md","lastUpdated":1706553672000}'),p={name:"ru/arty-crafty/analysis/data-model.md"},l=t("",21),h=[l];function k(o,r,d,E,c,g){return a(),i("div",null,h)}const F=s(p,[["render",k]]);export{y as __pageData,F as default};
diff --git a/assets/ru_arty-crafty_analysis_research.md.iym1ZPBV.js b/assets/ru_arty-crafty_analysis_research.md.hLSKxFwk.js
similarity index 96%
rename from assets/ru_arty-crafty_analysis_research.md.iym1ZPBV.js
rename to assets/ru_arty-crafty_analysis_research.md.hLSKxFwk.js
index ae2afba37..4dc0143a8 100644
--- a/assets/ru_arty-crafty_analysis_research.md.iym1ZPBV.js
+++ b/assets/ru_arty-crafty_analysis_research.md.hLSKxFwk.js
@@ -1 +1 @@
-import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Анализ рынка","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/research.md","filePath":"ru/arty-crafty/analysis/research.md","lastUpdated":1706427418000}'),o={name:"ru/arty-crafty/analysis/research.md"},s=r('

Анализ рынка

Изучение конкурентов

Исследуем вебсайты других магазинов и маркетплейсов, чтобы изучить, как они выглядят и функционируют.

Сайты-аналоги

Погуглим "best marketplace". Мне выпало в том числе:

Для начала отмечаем, что для фронтенда разница между маркетплейсом и магазином - минимальна. Как функционально, так и в дизайне страницы. В случае маркетплейса на странице товара есть маленькая ссылка на магазин, и есть фильтрация по магазинам, которую можно представлять, как отдельную категорию для каждого магазина. Правда отображение товаров в этой категории отличается от обычных категорий.

Делаем мы на первом этапе витрину, но в уме держим маркетплейс. Мы не должны принимать таких решений, которые бы в будущем заставили сильно рефакторить код. Но, очевидно, что мы можем ориентироваться в дизайне на простые магазины. Расширить потом до маркетплейса будет несложно.

Самый удобный магазин/маркетплейс, с моей точки зрения, Ozon, что подтверждается его успешностью. Его структуру мы и будем копировать.

Совет

Изучать похожие сайты полезно не только для вдохновения по дизайну, но и, например, при выборе наименования того или иного компонента - посмотрите через DevTools какие названия классов используются на аналогичном html блоке у конкурентов.

',10),l=[s];function c(n,i,h,m,p,_){return t(),e("div",null,l)}const u=a(o,[["render",c]]);export{f as __pageData,u as default}; +import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Анализ рынка","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/research.md","filePath":"ru/arty-crafty/analysis/research.md","lastUpdated":1706553672000}'),o={name:"ru/arty-crafty/analysis/research.md"},s=r('

Анализ рынка

Изучение конкурентов

Исследуем вебсайты других магазинов и маркетплейсов, чтобы изучить, как они выглядят и функционируют.

Сайты-аналоги

Погуглим "best marketplace". Мне выпало в том числе:

Для начала отмечаем, что для фронтенда разница между маркетплейсом и магазином - минимальна. Как функционально, так и в дизайне страницы. В случае маркетплейса на странице товара есть маленькая ссылка на магазин, и есть фильтрация по магазинам, которую можно представлять, как отдельную категорию для каждого магазина. Правда отображение товаров в этой категории отличается от обычных категорий.

Делаем мы на первом этапе витрину, но в уме держим маркетплейс. Мы не должны принимать таких решений, которые бы в будущем заставили сильно рефакторить код. Но, очевидно, что мы можем ориентироваться в дизайне на простые магазины. Расширить потом до маркетплейса будет несложно.

Самый удобный магазин/маркетплейс, с моей точки зрения, Ozon, что подтверждается его успешностью. Его структуру мы и будем копировать.

Совет

Изучать похожие сайты полезно не только для вдохновения по дизайну, но и, например, при выборе наименования того или иного компонента - посмотрите через DevTools какие названия классов используются на аналогичном html блоке у конкурентов.

',10),l=[s];function c(n,i,h,m,p,_){return t(),e("div",null,l)}const u=a(o,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ru_arty-crafty_analysis_research.md.iym1ZPBV.lean.js b/assets/ru_arty-crafty_analysis_research.md.hLSKxFwk.lean.js similarity index 83% rename from assets/ru_arty-crafty_analysis_research.md.iym1ZPBV.lean.js rename to assets/ru_arty-crafty_analysis_research.md.hLSKxFwk.lean.js index 3ce4bd467..2c2a46bd8 100644 --- a/assets/ru_arty-crafty_analysis_research.md.iym1ZPBV.lean.js +++ b/assets/ru_arty-crafty_analysis_research.md.hLSKxFwk.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Анализ рынка","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/research.md","filePath":"ru/arty-crafty/analysis/research.md","lastUpdated":1706427418000}'),o={name:"ru/arty-crafty/analysis/research.md"},s=r("",10),l=[s];function c(n,i,h,m,p,_){return t(),e("div",null,l)}const u=a(o,[["render",c]]);export{f as __pageData,u as default}; +import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Анализ рынка","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/research.md","filePath":"ru/arty-crafty/analysis/research.md","lastUpdated":1706553672000}'),o={name:"ru/arty-crafty/analysis/research.md"},s=r("",10),l=[s];function c(n,i,h,m,p,_){return t(),e("div",null,l)}const u=a(o,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ru_arty-crafty_analysis_tech-stack.md.8wEDRqJY.js b/assets/ru_arty-crafty_analysis_tech-stack.md.JdNJDRNI.js similarity index 97% rename from assets/ru_arty-crafty_analysis_tech-stack.md.8wEDRqJY.js rename to assets/ru_arty-crafty_analysis_tech-stack.md.JdNJDRNI.js index 26aee0d12..7d05d9dcd 100644 --- a/assets/ru_arty-crafty_analysis_tech-stack.md.8wEDRqJY.js +++ b/assets/ru_arty-crafty_analysis_tech-stack.md.JdNJDRNI.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Технический стек проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/tech-stack.md","filePath":"ru/arty-crafty/analysis/tech-stack.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/analysis/tech-stack.md"},r=o('

Технический стек проекта

Фронтенд должен писаться на Vue 3, Vite. Из обязательных библиотек - vue-router. Действует правило: если можем обойтись без какой-то зависимости - обходимся без нее. Вместо Pinia используется Composition API напрямую.

Используем TypeScript, но в меру. Типизируем только основные сущности и интерфейсы. TypeScript должен облегчать работу разработчика, а не превращать её в кошмар.

CSS3 лучше любого CSS фреймворка/библиотеки, поэтому используем его (SCSS).

ESlint конфигурация от Antony Fu.

Насчет использования библиотек UI компонент - в идеале постараемся иметь только свои компоненты, однако для быстрого прототипирования мы можем задействовать какую-то библиотеку, оборачивая ее компоненты в свои обертки для последующего безболезненного перехода на свой UI kit. То же относится к VueUse.

Для адаптивности мы устанавливаем на тэг body четыре глобальных класса - mobile, tablet, notebook и desktop, в зависимости от разрешения экрана, и используем их в стилях в компонентах. Это намного удобней прямой работы с CSS media query.

',7),n=[r];function s(d,i,p,_,l,m){return a(),t("div",null,n)}const h=e(c,[["render",s]]);export{f as __pageData,h as default}; +import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Технический стек проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/tech-stack.md","filePath":"ru/arty-crafty/analysis/tech-stack.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/analysis/tech-stack.md"},r=o('

Технический стек проекта

Фронтенд должен писаться на Vue 3, Vite. Из обязательных библиотек - vue-router. Действует правило: если можем обойтись без какой-то зависимости - обходимся без нее. Вместо Pinia используется Composition API напрямую.

Используем TypeScript, но в меру. Типизируем только основные сущности и интерфейсы. TypeScript должен облегчать работу разработчика, а не превращать её в кошмар.

CSS3 лучше любого CSS фреймворка/библиотеки, поэтому используем его (SCSS).

ESlint конфигурация от Antony Fu.

Насчет использования библиотек UI компонент - в идеале постараемся иметь только свои компоненты, однако для быстрого прототипирования мы можем задействовать какую-то библиотеку, оборачивая ее компоненты в свои обертки для последующего безболезненного перехода на свой UI kit. То же относится к VueUse.

Для адаптивности мы устанавливаем на тэг body четыре глобальных класса - mobile, tablet, notebook и desktop, в зависимости от разрешения экрана, и используем их в стилях в компонентах. Это намного удобней прямой работы с CSS media query.

',7),n=[r];function s(d,i,p,_,l,m){return a(),t("div",null,n)}const h=e(c,[["render",s]]);export{f as __pageData,h as default}; diff --git a/assets/ru_arty-crafty_analysis_tech-stack.md.8wEDRqJY.lean.js b/assets/ru_arty-crafty_analysis_tech-stack.md.JdNJDRNI.lean.js similarity index 91% rename from assets/ru_arty-crafty_analysis_tech-stack.md.8wEDRqJY.lean.js rename to assets/ru_arty-crafty_analysis_tech-stack.md.JdNJDRNI.lean.js index 88462a470..167d56050 100644 --- a/assets/ru_arty-crafty_analysis_tech-stack.md.8wEDRqJY.lean.js +++ b/assets/ru_arty-crafty_analysis_tech-stack.md.JdNJDRNI.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Технический стек проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/tech-stack.md","filePath":"ru/arty-crafty/analysis/tech-stack.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/analysis/tech-stack.md"},r=o("",7),n=[r];function s(d,i,p,_,l,m){return a(),t("div",null,n)}const h=e(c,[["render",s]]);export{f as __pageData,h as default}; +import{_ as e,c as t,o as a,U as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Технический стек проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/tech-stack.md","filePath":"ru/arty-crafty/analysis/tech-stack.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/analysis/tech-stack.md"},r=o("",7),n=[r];function s(d,i,p,_,l,m){return a(),t("div",null,n)}const h=e(c,[["render",s]]);export{f as __pageData,h as default}; diff --git a/assets/ru_arty-crafty_analysis_ui-design.md.kn1ra5hl.js b/assets/ru_arty-crafty_analysis_ui-design.md.56SRmB7J.js similarity index 97% rename from assets/ru_arty-crafty_analysis_ui-design.md.kn1ra5hl.js rename to assets/ru_arty-crafty_analysis_ui-design.md.56SRmB7J.js index 75b972c2b..149bfaf92 100644 --- a/assets/ru_arty-crafty_analysis_ui-design.md.kn1ra5hl.js +++ b/assets/ru_arty-crafty_analysis_ui-design.md.56SRmB7J.js @@ -1 +1 @@ -import{_ as a,c as t,o as e,U as r}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"UI дизайн","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/ui-design.md","filePath":"ru/arty-crafty/analysis/ui-design.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/analysis/ui-design.md"},i=r('

UI дизайн

Дизайн сайта

Дизайн в плане визуального оформления сайта - довольно непростая вещь. Вернее, хороший дизайн. Плюс в том, что его всегда можно сделать в самую последнюю очередь.

Пока будем работать над функционалом сайта (в том числе, адаптивностью), а со стилизацией - как будет желание.

Творческие способности

Если вы не сильно творчески одаренный человек, то создать сайт полностью самому вряд ли получится. Это примерно то же, что и написать хорошую картину.

Но в отличие от картины, дизайн сайта можно перенять. Как целиком, так и по частям - главный лэйаут, функционал, типы виджетов, их компоновка, цветовые гаммы, UI компоненты, шрифт, эффекты и многое другое. Может показаться воровством, но представим, что идете вы по улице, и видите дом. Красивый. Рассматриваете кровлю, структуру штукатурки, отделку фундамента. Потом приходите к себе, закупаете стройматериалы, заказываете строительную бригаду, и делаете себе примерно так же, но своё. Воровство?

',7),o=[i];function s(c,d,l,_,m,p){return e(),t("div",null,o)}const f=a(n,[["render",s]]);export{u as __pageData,f as default}; +import{_ as a,c as t,o as e,U as r}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"UI дизайн","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/ui-design.md","filePath":"ru/arty-crafty/analysis/ui-design.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/analysis/ui-design.md"},i=r('

UI дизайн

Дизайн сайта

Дизайн в плане визуального оформления сайта - довольно непростая вещь. Вернее, хороший дизайн. Плюс в том, что его всегда можно сделать в самую последнюю очередь.

Пока будем работать над функционалом сайта (в том числе, адаптивностью), а со стилизацией - как будет желание.

Творческие способности

Если вы не сильно творчески одаренный человек, то создать сайт полностью самому вряд ли получится. Это примерно то же, что и написать хорошую картину.

Но в отличие от картины, дизайн сайта можно перенять. Как целиком, так и по частям - главный лэйаут, функционал, типы виджетов, их компоновка, цветовые гаммы, UI компоненты, шрифт, эффекты и многое другое. Может показаться воровством, но представим, что идете вы по улице, и видите дом. Красивый. Рассматриваете кровлю, структуру штукатурки, отделку фундамента. Потом приходите к себе, закупаете стройматериалы, заказываете строительную бригаду, и делаете себе примерно так же, но своё. Воровство?

',7),o=[i];function s(c,d,l,_,m,p){return e(),t("div",null,o)}const f=a(n,[["render",s]]);export{u as __pageData,f as default}; diff --git a/assets/ru_arty-crafty_analysis_ui-design.md.kn1ra5hl.lean.js b/assets/ru_arty-crafty_analysis_ui-design.md.56SRmB7J.lean.js similarity index 91% rename from assets/ru_arty-crafty_analysis_ui-design.md.kn1ra5hl.lean.js rename to assets/ru_arty-crafty_analysis_ui-design.md.56SRmB7J.lean.js index 4a64043f8..38edb7402 100644 --- a/assets/ru_arty-crafty_analysis_ui-design.md.kn1ra5hl.lean.js +++ b/assets/ru_arty-crafty_analysis_ui-design.md.56SRmB7J.lean.js @@ -1 +1 @@ -import{_ as a,c as t,o as e,U as r}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"UI дизайн","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/ui-design.md","filePath":"ru/arty-crafty/analysis/ui-design.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/analysis/ui-design.md"},i=r("",7),o=[i];function s(c,d,l,_,m,p){return e(),t("div",null,o)}const f=a(n,[["render",s]]);export{u as __pageData,f as default}; +import{_ as a,c as t,o as e,U as r}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"UI дизайн","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/ui-design.md","filePath":"ru/arty-crafty/analysis/ui-design.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/analysis/ui-design.md"},i=r("",7),o=[i];function s(c,d,l,_,m,p){return e(),t("div",null,o)}const f=a(n,[["render",s]]);export{u as __pageData,f as default}; diff --git a/assets/ru_arty-crafty_analysis_ui-layout.md.gF-4He_1.js b/assets/ru_arty-crafty_analysis_ui-layout.md.zk6cqLLW.js similarity index 98% rename from assets/ru_arty-crafty_analysis_ui-layout.md.gF-4He_1.js rename to assets/ru_arty-crafty_analysis_ui-layout.md.zk6cqLLW.js index a22bd670d..f4b97b9de 100644 --- a/assets/ru_arty-crafty_analysis_ui-layout.md.gF-4He_1.js +++ b/assets/ru_arty-crafty_analysis_ui-layout.md.zk6cqLLW.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r,aq as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"UI макет","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/ui-layout.md","filePath":"ru/arty-crafty/analysis/ui-layout.md","lastUpdated":1706427418000}'),i={name:"ru/arty-crafty/analysis/ui-layout.md"},l=r('

UI макет

Подберем подходящий макет (layout) для нашего сайта. Для этого можно еще раз взглянуть на уже найденные онлайн магазины в интернете.

Основные компоненты страницы

У магазинов обычно лэйаут состоит из четырех частей - header, footer, sidebar слева и центральная панель

image

Сверху будет хедер. Слева в нем будет логотип, в середине - строка поиска, справа элементы входа в личный кабинет, корзина, избранное. Сверху основного хедера можно будет добавить дополнительный сабхедер, с ссылками Снизу основного хедера будет подхедер с меню-каталогом. У нас изначально будет всего несколько пунктов там, но в дальнейшем это можно превратить в мегаменю.

В мобильной версии хедер сильно облегчен.

При показе страницы категории товаров, слева показывается сайдбар с различными фильтрами. В мобильной версии он переносится наверх. Когда показывается страница товара, то меню слева обычно нет.

Main panel

В центральной панели показывается список товаров выбранной категории либо информация о товаре.

Футер - самый простой копонент, в нем функционала практически нет, так что ничем он не примечателен.

Мобильная версия

В мобильной версии внизу появляется отдельное зафиксированное меню с ссылками:

  • Главная
  • Каталог
  • Корзина
  • Избранное
  • Логин/личный кабинет

Сразу отметим, что сайдбар, выезжающий слева в мобильной версии (каталог), это не то же самое, что сайдбар на десктопе (фильтры).

Слабая связанность

Подобное разделение на подсистемы позволяет сохранить между ними слабую связанность. Основная логика подсистемы заключена в ней самой, и с окружающим миром она взаимодействует пока только через router.

В дальнейшем, если понадобиться из одной подсистемы вызвать команду в другой, это, скорей всего, будет делаться через Composable с глобальным стейтом.

Адаптивность

Сайдбар с фильтрами, который то слева, то сверху, легко реализовать через CSS Flexbox. То же самое с различным хедером для основной и мобильной версий. Вообще, всё что можно сделать с помощью CSS, лучше делать с помощью CSS.

Вывод

Таким образом, у нас уже намечены пять компонент, которые мы можем расположить на странице, и она будет адаптивная.

На данный момент все страницы можно технически реализовать через один Layout - MainLayout. Если потом понадобится другое расположение (для страниц заказов, личного кабинета и прочего), мы добавим.

',26),n=[l];function h(s,d,p,c,u,m){return t(),e("div",null,n)}const b=a(i,[["render",h]]);export{f as __pageData,b as default}; +import{_ as a,c as e,o as t,U as r,aq as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"UI макет","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/ui-layout.md","filePath":"ru/arty-crafty/analysis/ui-layout.md","lastUpdated":1706553672000}'),i={name:"ru/arty-crafty/analysis/ui-layout.md"},l=r('

UI макет

Подберем подходящий макет (layout) для нашего сайта. Для этого можно еще раз взглянуть на уже найденные онлайн магазины в интернете.

Основные компоненты страницы

У магазинов обычно лэйаут состоит из четырех частей - header, footer, sidebar слева и центральная панель

image

Сверху будет хедер. Слева в нем будет логотип, в середине - строка поиска, справа элементы входа в личный кабинет, корзина, избранное. Сверху основного хедера можно будет добавить дополнительный сабхедер, с ссылками Снизу основного хедера будет подхедер с меню-каталогом. У нас изначально будет всего несколько пунктов там, но в дальнейшем это можно превратить в мегаменю.

В мобильной версии хедер сильно облегчен.

При показе страницы категории товаров, слева показывается сайдбар с различными фильтрами. В мобильной версии он переносится наверх. Когда показывается страница товара, то меню слева обычно нет.

Main panel

В центральной панели показывается список товаров выбранной категории либо информация о товаре.

Футер - самый простой копонент, в нем функционала практически нет, так что ничем он не примечателен.

Мобильная версия

В мобильной версии внизу появляется отдельное зафиксированное меню с ссылками:

  • Главная
  • Каталог
  • Корзина
  • Избранное
  • Логин/личный кабинет

Сразу отметим, что сайдбар, выезжающий слева в мобильной версии (каталог), это не то же самое, что сайдбар на десктопе (фильтры).

Слабая связанность

Подобное разделение на подсистемы позволяет сохранить между ними слабую связанность. Основная логика подсистемы заключена в ней самой, и с окружающим миром она взаимодействует пока только через router.

В дальнейшем, если понадобиться из одной подсистемы вызвать команду в другой, это, скорей всего, будет делаться через Composable с глобальным стейтом.

Адаптивность

Сайдбар с фильтрами, который то слева, то сверху, легко реализовать через CSS Flexbox. То же самое с различным хедером для основной и мобильной версий. Вообще, всё что можно сделать с помощью CSS, лучше делать с помощью CSS.

Вывод

Таким образом, у нас уже намечены пять компонент, которые мы можем расположить на странице, и она будет адаптивная.

На данный момент все страницы можно технически реализовать через один Layout - MainLayout. Если потом понадобится другое расположение (для страниц заказов, личного кабинета и прочего), мы добавим.

',26),n=[l];function h(s,d,p,c,u,m){return t(),e("div",null,n)}const b=a(i,[["render",h]]);export{f as __pageData,b as default}; diff --git a/assets/ru_arty-crafty_analysis_ui-layout.md.gF-4He_1.lean.js b/assets/ru_arty-crafty_analysis_ui-layout.md.zk6cqLLW.lean.js similarity index 83% rename from assets/ru_arty-crafty_analysis_ui-layout.md.gF-4He_1.lean.js rename to assets/ru_arty-crafty_analysis_ui-layout.md.zk6cqLLW.lean.js index 77b9889e7..0626d7827 100644 --- a/assets/ru_arty-crafty_analysis_ui-layout.md.gF-4He_1.lean.js +++ b/assets/ru_arty-crafty_analysis_ui-layout.md.zk6cqLLW.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r,aq as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"UI макет","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/ui-layout.md","filePath":"ru/arty-crafty/analysis/ui-layout.md","lastUpdated":1706427418000}'),i={name:"ru/arty-crafty/analysis/ui-layout.md"},l=r("",26),n=[l];function h(s,d,p,c,u,m){return t(),e("div",null,n)}const b=a(i,[["render",h]]);export{f as __pageData,b as default}; +import{_ as a,c as e,o as t,U as r,aq as o}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"UI макет","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/analysis/ui-layout.md","filePath":"ru/arty-crafty/analysis/ui-layout.md","lastUpdated":1706553672000}'),i={name:"ru/arty-crafty/analysis/ui-layout.md"},l=r("",26),n=[l];function h(s,d,p,c,u,m){return t(),e("div",null,n)}const b=a(i,[["render",h]]);export{f as __pageData,b as default}; diff --git a/assets/ru_arty-crafty_backend_baas-choosing.md.Ahjjvk-8.js b/assets/ru_arty-crafty_backend_baas-choosing.md.QBMw27p7.js similarity index 99% rename from assets/ru_arty-crafty_backend_baas-choosing.md.Ahjjvk-8.js rename to assets/ru_arty-crafty_backend_baas-choosing.md.QBMw27p7.js index 622293c84..79f18e638 100644 --- a/assets/ru_arty-crafty_backend_baas-choosing.md.Ahjjvk-8.js +++ b/assets/ru_arty-crafty_backend_baas-choosing.md.QBMw27p7.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const s="/assets/baas-adapters.lbhAsxW1.webp",S=JSON.parse('{"title":"Выбор BaaS или CMS","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/baas-choosing.md","filePath":"ru/arty-crafty/backend/baas-choosing.md","lastUpdated":1706427418000}'),r={name:"ru/arty-crafty/backend/baas-choosing.md"},c=o('

Выбор BaaS или CMS

JSON файлы товаров

Дальнейшая работа с json файлами продуктов и категорий имеет мало смысла - их придется делать несколько, небольшое изменение схемы потребует изменение всех файлов вручную и т.п.

Проще перейти уже к нормальному бэкенду, с динамичными данными.

Выбор CMS

После довольно долгого исследования рынка для реализации витрины и, частично, магазина, выбор пал на Supabase.

Основными критериями при выборе на этом этапе были:

  • Простота
  • Open source
  • Бесплатность при использовании из облачных сервисов (это нужно не только нам, но и тем, кто будет использовать наш проект)
  • RDBMS (SQL) в качестве базы данных (почему не подошел Firebase)
  • Возможность потом несложно переехать на другой сервис/БД/свой сервер.

Большинство CMS продуктов предлагает платные low-code решения, завязанные на них и оперирующие не с данными, как нам надо, а с более высокоуровневыми конструкциями для построения сайта.

Среди Baas (Backend as a Service) решений были рассмотрены Firebase, Appwrite, Supabase, Amplify.

Модель данных обычного магазина очень хорошо ложится именно на реляционную модель данных, уже давно хорошо зарекомендовавшую себя, в отличие от NoSQL.

Сервисы Supabase

Supabase предлагает непосредственно Postgres базу данных (можно подсоединяться прямо к ней), API сервис для доступа к базе данных посредством REST запросов, сервис для парольной и OAuth аутентификаций, Edge Functions (серверные функции), на которых можно реализовать логику бэкенда. Лимиты бесплатного плана достаточно большие.

В дальнейшем возможно разворачивание Postgres на своем сервере и использование Supabase кода через Docker, либо своего API слоя. При желании можно будет даже поменять базу на MySQL. Всё это очень важная гибкость выстраиваемой архитектуры. Если мы чего-то не учтем сейчас, или ошибемся, то потом можно будет внести изменения с некритичными затратами.

Адаптеры

Мы помним, что одним из факторов успеха при создании сложной системы является её разбиение на слабосвязные более простые подсистемы. Конкретно тут мы имеем подсистемы "База данных", "Бэкенд (API сервис Supabase)", наш фронтенд.

Компоненты фронтенда должны обмениваться данными с API Supabase. Если мы в каждом компоненте будем прописывать обращение к API через Fetch или Axios, то при замене Supabase на другой бэкенд, или на наш свой, по всему коду фронтенда надо будет делать изменения, что очень затратно. Для нивелирования этого вызовы к API выносятся в отдельный модуль - api, и теперь в компонентах будет только вызов api.products(), который при смене бэкенда менять не надо, нужно будет поменять только его реализацию в api.

В этом случае, мы применяем шаблон проектирования "Адаптер". При работе, например, с Firebase нам нужно будет написать другой адаптер, при работе со своим бэкендом - еще один. Каждый из них будет преобразовывать запрос к определенному эндпойнту за списком товаров в массив для возвращения в функции api.products().

Когда делают системы широкого пользования, то предусматривают подключение к различным сервисам. Например, тот же Vue Storefront имеет адаптеры для интеграции с API бэкендов Magento, PrestaShop, Spree и других ecommerce решений.

image

Но у нас пока только Supabase, концентрируемся на нём.

',21),p=[c];function i(n,d,l,u,h,b){return t(),e("div",null,p)}const D=a(r,[["render",i]]);export{S as __pageData,D as default}; +import{_ as a,c as e,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const s="/assets/baas-adapters.lbhAsxW1.webp",S=JSON.parse('{"title":"Выбор BaaS или CMS","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/baas-choosing.md","filePath":"ru/arty-crafty/backend/baas-choosing.md","lastUpdated":1706553672000}'),r={name:"ru/arty-crafty/backend/baas-choosing.md"},c=o('

Выбор BaaS или CMS

JSON файлы товаров

Дальнейшая работа с json файлами продуктов и категорий имеет мало смысла - их придется делать несколько, небольшое изменение схемы потребует изменение всех файлов вручную и т.п.

Проще перейти уже к нормальному бэкенду, с динамичными данными.

Выбор CMS

После довольно долгого исследования рынка для реализации витрины и, частично, магазина, выбор пал на Supabase.

Основными критериями при выборе на этом этапе были:

  • Простота
  • Open source
  • Бесплатность при использовании из облачных сервисов (это нужно не только нам, но и тем, кто будет использовать наш проект)
  • RDBMS (SQL) в качестве базы данных (почему не подошел Firebase)
  • Возможность потом несложно переехать на другой сервис/БД/свой сервер.

Большинство CMS продуктов предлагает платные low-code решения, завязанные на них и оперирующие не с данными, как нам надо, а с более высокоуровневыми конструкциями для построения сайта.

Среди Baas (Backend as a Service) решений были рассмотрены Firebase, Appwrite, Supabase, Amplify.

Модель данных обычного магазина очень хорошо ложится именно на реляционную модель данных, уже давно хорошо зарекомендовавшую себя, в отличие от NoSQL.

Сервисы Supabase

Supabase предлагает непосредственно Postgres базу данных (можно подсоединяться прямо к ней), API сервис для доступа к базе данных посредством REST запросов, сервис для парольной и OAuth аутентификаций, Edge Functions (серверные функции), на которых можно реализовать логику бэкенда. Лимиты бесплатного плана достаточно большие.

В дальнейшем возможно разворачивание Postgres на своем сервере и использование Supabase кода через Docker, либо своего API слоя. При желании можно будет даже поменять базу на MySQL. Всё это очень важная гибкость выстраиваемой архитектуры. Если мы чего-то не учтем сейчас, или ошибемся, то потом можно будет внести изменения с некритичными затратами.

Адаптеры

Мы помним, что одним из факторов успеха при создании сложной системы является её разбиение на слабосвязные более простые подсистемы. Конкретно тут мы имеем подсистемы "База данных", "Бэкенд (API сервис Supabase)", наш фронтенд.

Компоненты фронтенда должны обмениваться данными с API Supabase. Если мы в каждом компоненте будем прописывать обращение к API через Fetch или Axios, то при замене Supabase на другой бэкенд, или на наш свой, по всему коду фронтенда надо будет делать изменения, что очень затратно. Для нивелирования этого вызовы к API выносятся в отдельный модуль - api, и теперь в компонентах будет только вызов api.products(), который при смене бэкенда менять не надо, нужно будет поменять только его реализацию в api.

В этом случае, мы применяем шаблон проектирования "Адаптер". При работе, например, с Firebase нам нужно будет написать другой адаптер, при работе со своим бэкендом - еще один. Каждый из них будет преобразовывать запрос к определенному эндпойнту за списком товаров в массив для возвращения в функции api.products().

Когда делают системы широкого пользования, то предусматривают подключение к различным сервисам. Например, тот же Vue Storefront имеет адаптеры для интеграции с API бэкендов Magento, PrestaShop, Spree и других ecommerce решений.

image

Но у нас пока только Supabase, концентрируемся на нём.

',21),p=[c];function i(n,d,l,u,h,b){return t(),e("div",null,p)}const D=a(r,[["render",i]]);export{S as __pageData,D as default}; diff --git a/assets/ru_arty-crafty_backend_baas-choosing.md.Ahjjvk-8.lean.js b/assets/ru_arty-crafty_backend_baas-choosing.md.QBMw27p7.lean.js similarity index 92% rename from assets/ru_arty-crafty_backend_baas-choosing.md.Ahjjvk-8.lean.js rename to assets/ru_arty-crafty_backend_baas-choosing.md.QBMw27p7.lean.js index 36d2911e1..ca82ba71c 100644 --- a/assets/ru_arty-crafty_backend_baas-choosing.md.Ahjjvk-8.lean.js +++ b/assets/ru_arty-crafty_backend_baas-choosing.md.QBMw27p7.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const s="/assets/baas-adapters.lbhAsxW1.webp",S=JSON.parse('{"title":"Выбор BaaS или CMS","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/baas-choosing.md","filePath":"ru/arty-crafty/backend/baas-choosing.md","lastUpdated":1706427418000}'),r={name:"ru/arty-crafty/backend/baas-choosing.md"},c=o("",21),p=[c];function i(n,d,l,u,h,b){return t(),e("div",null,p)}const D=a(r,[["render",i]]);export{S as __pageData,D as default}; +import{_ as a,c as e,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const s="/assets/baas-adapters.lbhAsxW1.webp",S=JSON.parse('{"title":"Выбор BaaS или CMS","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/baas-choosing.md","filePath":"ru/arty-crafty/backend/baas-choosing.md","lastUpdated":1706553672000}'),r={name:"ru/arty-crafty/backend/baas-choosing.md"},c=o("",21),p=[c];function i(n,d,l,u,h,b){return t(),e("div",null,p)}const D=a(r,[["render",i]]);export{S as __pageData,D as default}; diff --git a/assets/ru_arty-crafty_backend_db-data-model.md.xvWHZ0hs.js b/assets/ru_arty-crafty_backend_db-data-model.md.lSQztL8g.js similarity index 99% rename from assets/ru_arty-crafty_backend_db-data-model.md.xvWHZ0hs.js rename to assets/ru_arty-crafty_backend_db-data-model.md.lSQztL8g.js index 8aec6dcd2..09693857c 100644 --- a/assets/ru_arty-crafty_backend_db-data-model.md.xvWHZ0hs.js +++ b/assets/ru_arty-crafty_backend_db-data-model.md.lSQztL8g.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const s="/assets/db-schema-1.AI4GFKh9.webp",c="/assets/db-categories-data.zpLjtPpl.webp",d="/assets/db-products-data.twuripFM.webp",r="data:image/webp;base64,UklGRmwHAABXRUJQVlA4IGAHAACwNQCdASp1AbwAPtFosVGoJiojolc44UAaCWlu8n1eEWp5F0FNti5o9DH+w6ffoY55zz0elc9T3owfVo/5mTSMZ59QGOgbGbctcgE8+4sUAfjP9E71v939CtJBjg/4Xsuf33j9+vPYKDeJSDHn7O8VHqWwx4ivVtufzJcqmuCs2YMK2Tug6ktu/YJYt1QZ2eggHRrcomRWtsJFAOKqoRB3YjOrsWeElb6I9bQOGQHJ0+FRHGG4LjxaPSffvcPPR0lg6s4l+YLJTEEh/mY7EYvK3+fOQbfDOUVX3D+mFSrNit5uTctcRffg7ABDqgkj5AWtLp5V+6KfYYPaRKMcqEWWwpA1VcedoES9bwy0lN8fYDU9sJkfx5zyHdjkpzeWSbkO7GP7AWN6WG2Dywl/doI/Sw1MWudwraKlV1WRHkO9hz7Y+oiHdjKtBdj3PLF390TT9LDbB5VCYIpfCC7ObngjyHevVinlfEUWdMEeRdKKz0iwWzyxd/dm0/Sw2weWLCGjHDi3xHkParmWVLkOmCP0LNpZqht9r7OG2Dyxc9jKuZ+Sw2weWLtahuX0sNr/7S7+7QR98sAA/v6dLf+r2fogTVtjsZ7chExWxUeC+uvAwsY0j/9+ziMRC4pXy2ccZ++iNXGYvarlYxQSFm21ed+0l1lKcWrquu3yatuGRg0/T79B/KltmtU2DQzQEQdUBF5dy8XHQqUGX7hDNEdTOzW2qOii9adnH6nRfSbltJfvLi3ztxfZH4eZMPp7P+RyFMT0kFCcKsg+Huev69bGkN6zEkRb55y4gKXALZJ9SZgp6oQj61Iomnv2jZ/jOF3BMW6+/BxjyKDstFkQwUeo/CKFKu82bKxlhP96OwXarpWQ1s5UqWfKooaVpKEVX6Eyw8j8x9Nkjb7dtDq5NJudS0qxMcYaAduQ/m1uaU2MvoP0X9avZWbPvEoCP/45S8HFnZROjU9S7cSzKbojkajQaOMeQPF9AO9+NNtTqgJwBw9pPcthi4LWT9ZHafGeT3hlDoCTfH7FPUB43tYwPG0FwX1glJ8k1pG1dsSDnM49DVQXtiHp1fJaYbiv2y94vns8Zo6CXCGWu7uzP072U5Cik/xOUKBxNKyMHbUwkKVcYiTz2ah8Xh0ts8f+Wf8POXl67ZeDSZlvz6U0+WXRE4jvvLPJLpakNwnFOkTeHyFVAMY3//b4fK6loLKXefXxPy0+sBtzTF+/t8Sy3sBSUjkR/4sIUYuZbzNOu26hmUfPxBxZssVNW81/cm68ppsARj9GNKdsg+BlStgGzpn7/jPTaxtn6+hi+FH2Pxin5jKneWLb1fT+fH9tqAbW03UhWY4smQbi5Kqx6+oG589IJZmbO/3s9T+/vn6OEPkQ7e41OjT2Ab86brpKDX344aUy6yLvvT1DoK2YVJQQ8X2rwO4X58jXBfV95PUDtDDlnZ0svL40trqT0oFIuRIk9Fw5crqesQCif5xzS7TpTa+c2J0doLou2OT4jdbqJeTpEtButzSae58b+34fEq/LyFdD3ZRvxSIA7SfiACmSC76eFLoyrW0ENLNXi7i0CU89AMoKtSVf2vYRYt9Qx2oxC84ZMxdJo4c/sndM8XLQ1Z/0EPlpYirgBW4rXXcDg+8HRiO0UqvPAGqDoGDE7Hn8Wr0Acspx7sqddf9EBcTFKyU8NFIgmmH/ks74RSndQFDoEjKF788vURmrGjB7N4SYy9ECN0dzC0gL55Icy3EUtjCrZa0MeChXeV/Nwt3UPZe5npFqTJFk2SUb5IERMh5pEnNGpI/84xYYenY4WqusUMU7RzCNtry/iMOYTFxe0yeyM+dTeKEchdXO0gn7khd4XdpK/SGtQabK1p6mF6kdqzC803RQDVsWbfZukyXecHfEZ+ljw/235imjPDmsOVHSvNYURPMaDNKNrLZqDyQe1I7kXJO0JkKqNyQ3TsrDgcgKCAkmbYUI7ChnNkitCETfUkQToOSwRB+VHiknsr28cObCDw9YU+NAqFeEA5XsYE6lGCWN9/IyXxPfgALH3SZpo20y6Y52KU5mfsfcpa88rxTtUfeDzshNDsCvkAHBaEf08AhhNHl8bOwDzt1Kxt5Q1nnZWJwOGqQTzt8L/NzxDnIFUg/jDFEVVxl31N84I2WqhuttHBs7ARe33jIOxe87OI+/MQxyi66p9WJHXvQPz3SJIeKp1xHP8gGHKExhTGvcAMLYY2auXNayjdPngY8FbFbkBeUvWHDcVz8O8YTtZrN5GN49MSo8QxcUhyYT6RN2xJ8G94+MMVdv4Gc7LtaxlGHlEw64zMxna6hnibc+sfEJB7lNe0+VYrgdVe8ECiv7fNLHC56HPoOgAS7ILczvYWG59FbcvpfmBrZKv4X1Zd5F+08QHRhsTJXSssvt0CE+9gpfATb494f+uvAF1XAC+cnro2T0iFVQ1Ln3lJzAaBlLiCL0FDjMeVSiROOwOXzRkFpAWIXtIGKRAwwzgsZ3L32GIHnzPtiyJPqw5FB6DJ1DjoYAAAAA",P=JSON.parse('{"title":"Модель данных в базе данных","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/db-data-model.md","filePath":"ru/arty-crafty/backend/db-data-model.md","lastUpdated":1706427418000}'),i={name:"ru/arty-crafty/backend/db-data-model.md"},n=o('

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности products и categories. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

В реляционных базах данных такие отношения делаются отдельной таблицей, которая хранит связи между товарами и категориями.

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Categories table

image

Products table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у products есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы, естественно, захотим искать по полному описанию товара, который находится в поле data таблицы products. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое. Таким образом, хранение данных в json полях не ограничивает функционал реляционных баз данных.

',18),l=[n];function p(b,m,f,h,g,u){return t(),e("div",null,l)}const A=a(i,[["render",p]]);export{P as __pageData,A as default}; +import{_ as a,c as e,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const s="/assets/db-schema-1.AI4GFKh9.webp",c="/assets/db-categories-data.zpLjtPpl.webp",d="/assets/db-products-data.twuripFM.webp",r="data:image/webp;base64,UklGRmwHAABXRUJQVlA4IGAHAACwNQCdASp1AbwAPtFosVGoJiojolc44UAaCWlu8n1eEWp5F0FNti5o9DH+w6ffoY55zz0elc9T3owfVo/5mTSMZ59QGOgbGbctcgE8+4sUAfjP9E71v939CtJBjg/4Xsuf33j9+vPYKDeJSDHn7O8VHqWwx4ivVtufzJcqmuCs2YMK2Tug6ktu/YJYt1QZ2eggHRrcomRWtsJFAOKqoRB3YjOrsWeElb6I9bQOGQHJ0+FRHGG4LjxaPSffvcPPR0lg6s4l+YLJTEEh/mY7EYvK3+fOQbfDOUVX3D+mFSrNit5uTctcRffg7ABDqgkj5AWtLp5V+6KfYYPaRKMcqEWWwpA1VcedoES9bwy0lN8fYDU9sJkfx5zyHdjkpzeWSbkO7GP7AWN6WG2Dywl/doI/Sw1MWudwraKlV1WRHkO9hz7Y+oiHdjKtBdj3PLF390TT9LDbB5VCYIpfCC7ObngjyHevVinlfEUWdMEeRdKKz0iwWzyxd/dm0/Sw2weWLCGjHDi3xHkParmWVLkOmCP0LNpZqht9r7OG2Dyxc9jKuZ+Sw2weWLtahuX0sNr/7S7+7QR98sAA/v6dLf+r2fogTVtjsZ7chExWxUeC+uvAwsY0j/9+ziMRC4pXy2ccZ++iNXGYvarlYxQSFm21ed+0l1lKcWrquu3yatuGRg0/T79B/KltmtU2DQzQEQdUBF5dy8XHQqUGX7hDNEdTOzW2qOii9adnH6nRfSbltJfvLi3ztxfZH4eZMPp7P+RyFMT0kFCcKsg+Huev69bGkN6zEkRb55y4gKXALZJ9SZgp6oQj61Iomnv2jZ/jOF3BMW6+/BxjyKDstFkQwUeo/CKFKu82bKxlhP96OwXarpWQ1s5UqWfKooaVpKEVX6Eyw8j8x9Nkjb7dtDq5NJudS0qxMcYaAduQ/m1uaU2MvoP0X9avZWbPvEoCP/45S8HFnZROjU9S7cSzKbojkajQaOMeQPF9AO9+NNtTqgJwBw9pPcthi4LWT9ZHafGeT3hlDoCTfH7FPUB43tYwPG0FwX1glJ8k1pG1dsSDnM49DVQXtiHp1fJaYbiv2y94vns8Zo6CXCGWu7uzP072U5Cik/xOUKBxNKyMHbUwkKVcYiTz2ah8Xh0ts8f+Wf8POXl67ZeDSZlvz6U0+WXRE4jvvLPJLpakNwnFOkTeHyFVAMY3//b4fK6loLKXefXxPy0+sBtzTF+/t8Sy3sBSUjkR/4sIUYuZbzNOu26hmUfPxBxZssVNW81/cm68ppsARj9GNKdsg+BlStgGzpn7/jPTaxtn6+hi+FH2Pxin5jKneWLb1fT+fH9tqAbW03UhWY4smQbi5Kqx6+oG589IJZmbO/3s9T+/vn6OEPkQ7e41OjT2Ab86brpKDX344aUy6yLvvT1DoK2YVJQQ8X2rwO4X58jXBfV95PUDtDDlnZ0svL40trqT0oFIuRIk9Fw5crqesQCif5xzS7TpTa+c2J0doLou2OT4jdbqJeTpEtButzSae58b+34fEq/LyFdD3ZRvxSIA7SfiACmSC76eFLoyrW0ENLNXi7i0CU89AMoKtSVf2vYRYt9Qx2oxC84ZMxdJo4c/sndM8XLQ1Z/0EPlpYirgBW4rXXcDg+8HRiO0UqvPAGqDoGDE7Hn8Wr0Acspx7sqddf9EBcTFKyU8NFIgmmH/ks74RSndQFDoEjKF788vURmrGjB7N4SYy9ECN0dzC0gL55Icy3EUtjCrZa0MeChXeV/Nwt3UPZe5npFqTJFk2SUb5IERMh5pEnNGpI/84xYYenY4WqusUMU7RzCNtry/iMOYTFxe0yeyM+dTeKEchdXO0gn7khd4XdpK/SGtQabK1p6mF6kdqzC803RQDVsWbfZukyXecHfEZ+ljw/235imjPDmsOVHSvNYURPMaDNKNrLZqDyQe1I7kXJO0JkKqNyQ3TsrDgcgKCAkmbYUI7ChnNkitCETfUkQToOSwRB+VHiknsr28cObCDw9YU+NAqFeEA5XsYE6lGCWN9/IyXxPfgALH3SZpo20y6Y52KU5mfsfcpa88rxTtUfeDzshNDsCvkAHBaEf08AhhNHl8bOwDzt1Kxt5Q1nnZWJwOGqQTzt8L/NzxDnIFUg/jDFEVVxl31N84I2WqhuttHBs7ARe33jIOxe87OI+/MQxyi66p9WJHXvQPz3SJIeKp1xHP8gGHKExhTGvcAMLYY2auXNayjdPngY8FbFbkBeUvWHDcVz8O8YTtZrN5GN49MSo8QxcUhyYT6RN2xJ8G94+MMVdv4Gc7LtaxlGHlEw64zMxna6hnibc+sfEJB7lNe0+VYrgdVe8ECiv7fNLHC56HPoOgAS7ILczvYWG59FbcvpfmBrZKv4X1Zd5F+08QHRhsTJXSssvt0CE+9gpfATb494f+uvAF1XAC+cnro2T0iFVQ1Ln3lJzAaBlLiCL0FDjMeVSiROOwOXzRkFpAWIXtIGKRAwwzgsZ3L32GIHnzPtiyJPqw5FB6DJ1DjoYAAAAA",P=JSON.parse('{"title":"Модель данных в базе данных","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/db-data-model.md","filePath":"ru/arty-crafty/backend/db-data-model.md","lastUpdated":1706553672000}'),i={name:"ru/arty-crafty/backend/db-data-model.md"},n=o('

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности products и categories. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

В реляционных базах данных такие отношения делаются отдельной таблицей, которая хранит связи между товарами и категориями.

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Categories table

image

Products table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у products есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы, естественно, захотим искать по полному описанию товара, который находится в поле data таблицы products. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое. Таким образом, хранение данных в json полях не ограничивает функционал реляционных баз данных.

',18),l=[n];function p(b,m,f,h,g,u){return t(),e("div",null,l)}const A=a(i,[["render",p]]);export{P as __pageData,A as default}; diff --git a/assets/ru_arty-crafty_backend_db-data-model.md.xvWHZ0hs.lean.js b/assets/ru_arty-crafty_backend_db-data-model.md.lSQztL8g.lean.js similarity index 98% rename from assets/ru_arty-crafty_backend_db-data-model.md.xvWHZ0hs.lean.js rename to assets/ru_arty-crafty_backend_db-data-model.md.lSQztL8g.lean.js index e1a0c0a39..83594ac3f 100644 --- a/assets/ru_arty-crafty_backend_db-data-model.md.xvWHZ0hs.lean.js +++ b/assets/ru_arty-crafty_backend_db-data-model.md.lSQztL8g.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const s="/assets/db-schema-1.AI4GFKh9.webp",c="/assets/db-categories-data.zpLjtPpl.webp",d="/assets/db-products-data.twuripFM.webp",r="data:image/webp;base64,UklGRmwHAABXRUJQVlA4IGAHAACwNQCdASp1AbwAPtFosVGoJiojolc44UAaCWlu8n1eEWp5F0FNti5o9DH+w6ffoY55zz0elc9T3owfVo/5mTSMZ59QGOgbGbctcgE8+4sUAfjP9E71v939CtJBjg/4Xsuf33j9+vPYKDeJSDHn7O8VHqWwx4ivVtufzJcqmuCs2YMK2Tug6ktu/YJYt1QZ2eggHRrcomRWtsJFAOKqoRB3YjOrsWeElb6I9bQOGQHJ0+FRHGG4LjxaPSffvcPPR0lg6s4l+YLJTEEh/mY7EYvK3+fOQbfDOUVX3D+mFSrNit5uTctcRffg7ABDqgkj5AWtLp5V+6KfYYPaRKMcqEWWwpA1VcedoES9bwy0lN8fYDU9sJkfx5zyHdjkpzeWSbkO7GP7AWN6WG2Dywl/doI/Sw1MWudwraKlV1WRHkO9hz7Y+oiHdjKtBdj3PLF390TT9LDbB5VCYIpfCC7ObngjyHevVinlfEUWdMEeRdKKz0iwWzyxd/dm0/Sw2weWLCGjHDi3xHkParmWVLkOmCP0LNpZqht9r7OG2Dyxc9jKuZ+Sw2weWLtahuX0sNr/7S7+7QR98sAA/v6dLf+r2fogTVtjsZ7chExWxUeC+uvAwsY0j/9+ziMRC4pXy2ccZ++iNXGYvarlYxQSFm21ed+0l1lKcWrquu3yatuGRg0/T79B/KltmtU2DQzQEQdUBF5dy8XHQqUGX7hDNEdTOzW2qOii9adnH6nRfSbltJfvLi3ztxfZH4eZMPp7P+RyFMT0kFCcKsg+Huev69bGkN6zEkRb55y4gKXALZJ9SZgp6oQj61Iomnv2jZ/jOF3BMW6+/BxjyKDstFkQwUeo/CKFKu82bKxlhP96OwXarpWQ1s5UqWfKooaVpKEVX6Eyw8j8x9Nkjb7dtDq5NJudS0qxMcYaAduQ/m1uaU2MvoP0X9avZWbPvEoCP/45S8HFnZROjU9S7cSzKbojkajQaOMeQPF9AO9+NNtTqgJwBw9pPcthi4LWT9ZHafGeT3hlDoCTfH7FPUB43tYwPG0FwX1glJ8k1pG1dsSDnM49DVQXtiHp1fJaYbiv2y94vns8Zo6CXCGWu7uzP072U5Cik/xOUKBxNKyMHbUwkKVcYiTz2ah8Xh0ts8f+Wf8POXl67ZeDSZlvz6U0+WXRE4jvvLPJLpakNwnFOkTeHyFVAMY3//b4fK6loLKXefXxPy0+sBtzTF+/t8Sy3sBSUjkR/4sIUYuZbzNOu26hmUfPxBxZssVNW81/cm68ppsARj9GNKdsg+BlStgGzpn7/jPTaxtn6+hi+FH2Pxin5jKneWLb1fT+fH9tqAbW03UhWY4smQbi5Kqx6+oG589IJZmbO/3s9T+/vn6OEPkQ7e41OjT2Ab86brpKDX344aUy6yLvvT1DoK2YVJQQ8X2rwO4X58jXBfV95PUDtDDlnZ0svL40trqT0oFIuRIk9Fw5crqesQCif5xzS7TpTa+c2J0doLou2OT4jdbqJeTpEtButzSae58b+34fEq/LyFdD3ZRvxSIA7SfiACmSC76eFLoyrW0ENLNXi7i0CU89AMoKtSVf2vYRYt9Qx2oxC84ZMxdJo4c/sndM8XLQ1Z/0EPlpYirgBW4rXXcDg+8HRiO0UqvPAGqDoGDE7Hn8Wr0Acspx7sqddf9EBcTFKyU8NFIgmmH/ks74RSndQFDoEjKF788vURmrGjB7N4SYy9ECN0dzC0gL55Icy3EUtjCrZa0MeChXeV/Nwt3UPZe5npFqTJFk2SUb5IERMh5pEnNGpI/84xYYenY4WqusUMU7RzCNtry/iMOYTFxe0yeyM+dTeKEchdXO0gn7khd4XdpK/SGtQabK1p6mF6kdqzC803RQDVsWbfZukyXecHfEZ+ljw/235imjPDmsOVHSvNYURPMaDNKNrLZqDyQe1I7kXJO0JkKqNyQ3TsrDgcgKCAkmbYUI7ChnNkitCETfUkQToOSwRB+VHiknsr28cObCDw9YU+NAqFeEA5XsYE6lGCWN9/IyXxPfgALH3SZpo20y6Y52KU5mfsfcpa88rxTtUfeDzshNDsCvkAHBaEf08AhhNHl8bOwDzt1Kxt5Q1nnZWJwOGqQTzt8L/NzxDnIFUg/jDFEVVxl31N84I2WqhuttHBs7ARe33jIOxe87OI+/MQxyi66p9WJHXvQPz3SJIeKp1xHP8gGHKExhTGvcAMLYY2auXNayjdPngY8FbFbkBeUvWHDcVz8O8YTtZrN5GN49MSo8QxcUhyYT6RN2xJ8G94+MMVdv4Gc7LtaxlGHlEw64zMxna6hnibc+sfEJB7lNe0+VYrgdVe8ECiv7fNLHC56HPoOgAS7ILczvYWG59FbcvpfmBrZKv4X1Zd5F+08QHRhsTJXSssvt0CE+9gpfATb494f+uvAF1XAC+cnro2T0iFVQ1Ln3lJzAaBlLiCL0FDjMeVSiROOwOXzRkFpAWIXtIGKRAwwzgsZ3L32GIHnzPtiyJPqw5FB6DJ1DjoYAAAAA",P=JSON.parse('{"title":"Модель данных в базе данных","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/db-data-model.md","filePath":"ru/arty-crafty/backend/db-data-model.md","lastUpdated":1706427418000}'),i={name:"ru/arty-crafty/backend/db-data-model.md"},n=o("",18),l=[n];function p(b,m,f,h,g,u){return t(),e("div",null,l)}const A=a(i,[["render",p]]);export{P as __pageData,A as default}; +import{_ as a,c as e,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const s="/assets/db-schema-1.AI4GFKh9.webp",c="/assets/db-categories-data.zpLjtPpl.webp",d="/assets/db-products-data.twuripFM.webp",r="data:image/webp;base64,UklGRmwHAABXRUJQVlA4IGAHAACwNQCdASp1AbwAPtFosVGoJiojolc44UAaCWlu8n1eEWp5F0FNti5o9DH+w6ffoY55zz0elc9T3owfVo/5mTSMZ59QGOgbGbctcgE8+4sUAfjP9E71v939CtJBjg/4Xsuf33j9+vPYKDeJSDHn7O8VHqWwx4ivVtufzJcqmuCs2YMK2Tug6ktu/YJYt1QZ2eggHRrcomRWtsJFAOKqoRB3YjOrsWeElb6I9bQOGQHJ0+FRHGG4LjxaPSffvcPPR0lg6s4l+YLJTEEh/mY7EYvK3+fOQbfDOUVX3D+mFSrNit5uTctcRffg7ABDqgkj5AWtLp5V+6KfYYPaRKMcqEWWwpA1VcedoES9bwy0lN8fYDU9sJkfx5zyHdjkpzeWSbkO7GP7AWN6WG2Dywl/doI/Sw1MWudwraKlV1WRHkO9hz7Y+oiHdjKtBdj3PLF390TT9LDbB5VCYIpfCC7ObngjyHevVinlfEUWdMEeRdKKz0iwWzyxd/dm0/Sw2weWLCGjHDi3xHkParmWVLkOmCP0LNpZqht9r7OG2Dyxc9jKuZ+Sw2weWLtahuX0sNr/7S7+7QR98sAA/v6dLf+r2fogTVtjsZ7chExWxUeC+uvAwsY0j/9+ziMRC4pXy2ccZ++iNXGYvarlYxQSFm21ed+0l1lKcWrquu3yatuGRg0/T79B/KltmtU2DQzQEQdUBF5dy8XHQqUGX7hDNEdTOzW2qOii9adnH6nRfSbltJfvLi3ztxfZH4eZMPp7P+RyFMT0kFCcKsg+Huev69bGkN6zEkRb55y4gKXALZJ9SZgp6oQj61Iomnv2jZ/jOF3BMW6+/BxjyKDstFkQwUeo/CKFKu82bKxlhP96OwXarpWQ1s5UqWfKooaVpKEVX6Eyw8j8x9Nkjb7dtDq5NJudS0qxMcYaAduQ/m1uaU2MvoP0X9avZWbPvEoCP/45S8HFnZROjU9S7cSzKbojkajQaOMeQPF9AO9+NNtTqgJwBw9pPcthi4LWT9ZHafGeT3hlDoCTfH7FPUB43tYwPG0FwX1glJ8k1pG1dsSDnM49DVQXtiHp1fJaYbiv2y94vns8Zo6CXCGWu7uzP072U5Cik/xOUKBxNKyMHbUwkKVcYiTz2ah8Xh0ts8f+Wf8POXl67ZeDSZlvz6U0+WXRE4jvvLPJLpakNwnFOkTeHyFVAMY3//b4fK6loLKXefXxPy0+sBtzTF+/t8Sy3sBSUjkR/4sIUYuZbzNOu26hmUfPxBxZssVNW81/cm68ppsARj9GNKdsg+BlStgGzpn7/jPTaxtn6+hi+FH2Pxin5jKneWLb1fT+fH9tqAbW03UhWY4smQbi5Kqx6+oG589IJZmbO/3s9T+/vn6OEPkQ7e41OjT2Ab86brpKDX344aUy6yLvvT1DoK2YVJQQ8X2rwO4X58jXBfV95PUDtDDlnZ0svL40trqT0oFIuRIk9Fw5crqesQCif5xzS7TpTa+c2J0doLou2OT4jdbqJeTpEtButzSae58b+34fEq/LyFdD3ZRvxSIA7SfiACmSC76eFLoyrW0ENLNXi7i0CU89AMoKtSVf2vYRYt9Qx2oxC84ZMxdJo4c/sndM8XLQ1Z/0EPlpYirgBW4rXXcDg+8HRiO0UqvPAGqDoGDE7Hn8Wr0Acspx7sqddf9EBcTFKyU8NFIgmmH/ks74RSndQFDoEjKF788vURmrGjB7N4SYy9ECN0dzC0gL55Icy3EUtjCrZa0MeChXeV/Nwt3UPZe5npFqTJFk2SUb5IERMh5pEnNGpI/84xYYenY4WqusUMU7RzCNtry/iMOYTFxe0yeyM+dTeKEchdXO0gn7khd4XdpK/SGtQabK1p6mF6kdqzC803RQDVsWbfZukyXecHfEZ+ljw/235imjPDmsOVHSvNYURPMaDNKNrLZqDyQe1I7kXJO0JkKqNyQ3TsrDgcgKCAkmbYUI7ChnNkitCETfUkQToOSwRB+VHiknsr28cObCDw9YU+NAqFeEA5XsYE6lGCWN9/IyXxPfgALH3SZpo20y6Y52KU5mfsfcpa88rxTtUfeDzshNDsCvkAHBaEf08AhhNHl8bOwDzt1Kxt5Q1nnZWJwOGqQTzt8L/NzxDnIFUg/jDFEVVxl31N84I2WqhuttHBs7ARe33jIOxe87OI+/MQxyi66p9WJHXvQPz3SJIeKp1xHP8gGHKExhTGvcAMLYY2auXNayjdPngY8FbFbkBeUvWHDcVz8O8YTtZrN5GN49MSo8QxcUhyYT6RN2xJ8G94+MMVdv4Gc7LtaxlGHlEw64zMxna6hnibc+sfEJB7lNe0+VYrgdVe8ECiv7fNLHC56HPoOgAS7ILczvYWG59FbcvpfmBrZKv4X1Zd5F+08QHRhsTJXSssvt0CE+9gpfATb494f+uvAF1XAC+cnro2T0iFVQ1Ln3lJzAaBlLiCL0FDjMeVSiROOwOXzRkFpAWIXtIGKRAwwzgsZ3L32GIHnzPtiyJPqw5FB6DJ1DjoYAAAAA",P=JSON.parse('{"title":"Модель данных в базе данных","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/db-data-model.md","filePath":"ru/arty-crafty/backend/db-data-model.md","lastUpdated":1706553672000}'),i={name:"ru/arty-crafty/backend/db-data-model.md"},n=o("",18),l=[n];function p(b,m,f,h,g,u){return t(),e("div",null,l)}const A=a(i,[["render",p]]);export{P as __pageData,A as default}; diff --git a/assets/ru_arty-crafty_backend_hoppscotch.md.O6_QBg6u.js b/assets/ru_arty-crafty_backend_hoppscotch.md.HFkvmbIr.js similarity index 98% rename from assets/ru_arty-crafty_backend_hoppscotch.md.O6_QBg6u.js rename to assets/ru_arty-crafty_backend_hoppscotch.md.HFkvmbIr.js index 7ae93e284..2535680df 100644 --- a/assets/ru_arty-crafty_backend_hoppscotch.md.O6_QBg6u.js +++ b/assets/ru_arty-crafty_backend_hoppscotch.md.HFkvmbIr.js @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const e="/assets/hoppscotch.tbrEXPoC.webp",y=JSON.parse('{"title":"Hoppscotch","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/hoppscotch.md","filePath":"ru/arty-crafty/backend/hoppscotch.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/backend/hoppscotch.md"},p=t('

Hoppscotch

Работа с API

Для работы и тестирования API обычно используется инструмент типа Postman, умеющий делать REST запросы и всё остальное, с ним связанное. Однако, как это часто бывает с монополистом, Postman сильно отяжелел за последние годы и работать с ним не очень комфортно.

Одной из удобных альтернатив является Hopscotch, в девичестве - Postwoman. Он работает из браузера или как PWA приложение, имеет весь необходимый нам функционал и написан на Vue.

image

Endpoints

Нам нужны три эндпойнта на текущем этапе:

  • список всех категорий
  • список товаров в определенной категории
  • подробная информация о товаре

Создадим соответствующие запросы в Hoppscotch:

sh
curl --request GET \\
+import{_ as s,c as a,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const e="/assets/hoppscotch.tbrEXPoC.webp",y=JSON.parse('{"title":"Hoppscotch","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/hoppscotch.md","filePath":"ru/arty-crafty/backend/hoppscotch.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/backend/hoppscotch.md"},p=t('

Hoppscotch

Работа с API

Для работы и тестирования API обычно используется инструмент типа Postman, умеющий делать REST запросы и всё остальное, с ним связанное. Однако, как это часто бывает с монополистом, Postman сильно отяжелел за последние годы и работать с ним не очень комфортно.

Одной из удобных альтернатив является Hopscotch, в девичестве - Postwoman. Он работает из браузера или как PWA приложение, имеет весь необходимый нам функционал и написан на Vue.

image

Endpoints

Нам нужны три эндпойнта на текущем этапе:

  • список всех категорий
  • список товаров в определенной категории
  • подробная информация о товаре

Создадим соответствующие запросы в Hoppscotch:

sh
curl --request GET \\
   --url 'https://client_id.supabase.co/rest/v1/categories?select=*' \\
   --header 'Authorization: Bearer $apiKey$' \\
   --header 'apikey: $apiKey$'
diff --git a/assets/ru_arty-crafty_backend_hoppscotch.md.O6_QBg6u.lean.js b/assets/ru_arty-crafty_backend_hoppscotch.md.HFkvmbIr.lean.js
similarity index 91%
rename from assets/ru_arty-crafty_backend_hoppscotch.md.O6_QBg6u.lean.js
rename to assets/ru_arty-crafty_backend_hoppscotch.md.HFkvmbIr.lean.js
index a71d143d5..133711da4 100644
--- a/assets/ru_arty-crafty_backend_hoppscotch.md.O6_QBg6u.lean.js
+++ b/assets/ru_arty-crafty_backend_hoppscotch.md.HFkvmbIr.lean.js
@@ -1 +1 @@
-import{_ as s,c as a,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const e="/assets/hoppscotch.tbrEXPoC.webp",y=JSON.parse('{"title":"Hoppscotch","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/hoppscotch.md","filePath":"ru/arty-crafty/backend/hoppscotch.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/backend/hoppscotch.md"},p=t("",11),h=[p];function l(r,k,c,o,d,F){return i(),a("div",null,h)}const g=s(n,[["render",l]]);export{y as __pageData,g as default};
+import{_ as s,c as a,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const e="/assets/hoppscotch.tbrEXPoC.webp",y=JSON.parse('{"title":"Hoppscotch","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/hoppscotch.md","filePath":"ru/arty-crafty/backend/hoppscotch.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/backend/hoppscotch.md"},p=t("",11),h=[p];function l(r,k,c,o,d,F){return i(),a("div",null,h)}const g=s(n,[["render",l]]);export{y as __pageData,g as default};
diff --git a/assets/ru_arty-crafty_backend_supabase-api.md.CLBPquSJ.js b/assets/ru_arty-crafty_backend_supabase-api.md.DPIT5NhC.js
similarity index 99%
rename from assets/ru_arty-crafty_backend_supabase-api.md.CLBPquSJ.js
rename to assets/ru_arty-crafty_backend_supabase-api.md.DPIT5NhC.js
index 63e91704d..6b11bf354 100644
--- a/assets/ru_arty-crafty_backend_supabase-api.md.CLBPquSJ.js
+++ b/assets/ru_arty-crafty_backend_supabase-api.md.DPIT5NhC.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Supabase REST API","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/supabase-api.md","filePath":"ru/arty-crafty/backend/supabase-api.md","lastUpdated":1706427418000}'),t={name:"ru/arty-crafty/backend/supabase-api.md"},h=n(`

Supabase REST API

Supabase SDK

Supabase автоматически генерит эндпойнты для доступа к нашим таблицам. Обращаться к ним можно либо через Supabase SDK.

Установка:

sh
 pnpm add @supabase/supabase-js

Использование:

js
import { createClient } from "@supabase/supabase-js";
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Supabase REST API","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/supabase-api.md","filePath":"ru/arty-crafty/backend/supabase-api.md","lastUpdated":1706553672000}'),t={name:"ru/arty-crafty/backend/supabase-api.md"},h=n(`

Supabase REST API

Supabase SDK

Supabase автоматически генерит эндпойнты для доступа к нашим таблицам. Обращаться к ним можно либо через Supabase SDK.

Установка:

sh
 pnpm add @supabase/supabase-js

Использование:

js
import { createClient } from "@supabase/supabase-js";
 
 // Create a single supabase client for interacting with your database
 const supabase = createClient("https://client_id.supabase.co", "public-anon-key");
diff --git a/assets/ru_arty-crafty_backend_supabase-api.md.CLBPquSJ.lean.js b/assets/ru_arty-crafty_backend_supabase-api.md.DPIT5NhC.lean.js
similarity index 83%
rename from assets/ru_arty-crafty_backend_supabase-api.md.CLBPquSJ.lean.js
rename to assets/ru_arty-crafty_backend_supabase-api.md.DPIT5NhC.lean.js
index 041f2ab0c..b0d44efc7 100644
--- a/assets/ru_arty-crafty_backend_supabase-api.md.CLBPquSJ.lean.js
+++ b/assets/ru_arty-crafty_backend_supabase-api.md.DPIT5NhC.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Supabase REST API","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/supabase-api.md","filePath":"ru/arty-crafty/backend/supabase-api.md","lastUpdated":1706427418000}'),t={name:"ru/arty-crafty/backend/supabase-api.md"},h=n("",13),p=[h];function l(k,e,E,r,d,o){return a(),i("div",null,p)}const y=s(t,[["render",l]]);export{F as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Supabase REST API","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/supabase-api.md","filePath":"ru/arty-crafty/backend/supabase-api.md","lastUpdated":1706553672000}'),t={name:"ru/arty-crafty/backend/supabase-api.md"},h=n("",13),p=[h];function l(k,e,E,r,d,o){return a(),i("div",null,p)}const y=s(t,[["render",l]]);export{F as __pageData,y as default};
diff --git a/assets/ru_arty-crafty_backend_supabase.md.Tl-sPm4O.js b/assets/ru_arty-crafty_backend_supabase.md.BkSWx3iw.js
similarity index 98%
rename from assets/ru_arty-crafty_backend_supabase.md.Tl-sPm4O.js
rename to assets/ru_arty-crafty_backend_supabase.md.BkSWx3iw.js
index 4e555475f..2da84a747 100644
--- a/assets/ru_arty-crafty_backend_supabase.md.Tl-sPm4O.js
+++ b/assets/ru_arty-crafty_backend_supabase.md.BkSWx3iw.js
@@ -1 +1 @@
-import{_ as a,c as e,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const o="/assets/supabase-api-keys.5Q_Ej9Wh.jpg",r="/assets/supabase-policies.OWee6Ret.jpg",f=JSON.parse('{"title":"Supabase","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/supabase.md","filePath":"ru/arty-crafty/backend/supabase.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/backend/supabase.md"},p=s('

Supabase

Создание проекта

Зарегистрироваться и создать проект на Supabase достаточно несложно. После регистрации предоставляется два API ключа. Один - рутовский secret, и второй - public, для обычного доступа к REST API. В дальнейшем будем говорить только о ключе public.

image

Безопасность и доступ

Доступ к таблицам в базе данных Supabase регулируется ключом и политиками (policies). При отсутствий политик, зная ключ через REST API можно выполнять основные CRUD SQL запросы. Соответственно, если мы делаем запрос, скажем, к таблице product с фронтенда, то ключ будет в бандле приложения, и вытащить его и запустить другие запросы не составит труда.

Соответственно, необходимо разрешить использование ключа для REST запросов только на чтение (select). Делается это созданием соответствующей политики у таблицы.

image

Этого вполне достаточно для варианта "Витрина", в котором не нужно размещать заказы, создавать пользователей и прочее. В дальнейшем, при необходимости записи в базу данных, придется использовать свой слой бэкенда либо иное решение.

Если использовать сервис аутентификации Supabase, то возможно создавать политики для зарегистрированных пользователей - то есть, например, позволить работать со своим профилем, личным кабинетом, заказами. Но для лучшей безопасности лучше все-таки, всё это пропускать через свой бэкенд.

',10),i=[p];function n(d,u,_,l,m,b){return t(),e("div",null,i)}const g=a(c,[["render",n]]);export{f as __pageData,g as default}; +import{_ as a,c as e,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const o="/assets/supabase-api-keys.5Q_Ej9Wh.jpg",r="/assets/supabase-policies.OWee6Ret.jpg",f=JSON.parse('{"title":"Supabase","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/supabase.md","filePath":"ru/arty-crafty/backend/supabase.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/backend/supabase.md"},p=s('

Supabase

Создание проекта

Зарегистрироваться и создать проект на Supabase достаточно несложно. После регистрации предоставляется два API ключа. Один - рутовский secret, и второй - public, для обычного доступа к REST API. В дальнейшем будем говорить только о ключе public.

image

Безопасность и доступ

Доступ к таблицам в базе данных Supabase регулируется ключом и политиками (policies). При отсутствий политик, зная ключ через REST API можно выполнять основные CRUD SQL запросы. Соответственно, если мы делаем запрос, скажем, к таблице product с фронтенда, то ключ будет в бандле приложения, и вытащить его и запустить другие запросы не составит труда.

Соответственно, необходимо разрешить использование ключа для REST запросов только на чтение (select). Делается это созданием соответствующей политики у таблицы.

image

Этого вполне достаточно для варианта "Витрина", в котором не нужно размещать заказы, создавать пользователей и прочее. В дальнейшем, при необходимости записи в базу данных, придется использовать свой слой бэкенда либо иное решение.

Если использовать сервис аутентификации Supabase, то возможно создавать политики для зарегистрированных пользователей - то есть, например, позволить работать со своим профилем, личным кабинетом, заказами. Но для лучшей безопасности лучше все-таки, всё это пропускать через свой бэкенд.

',10),i=[p];function n(d,u,_,l,m,b){return t(),e("div",null,i)}const g=a(c,[["render",n]]);export{f as __pageData,g as default}; diff --git a/assets/ru_arty-crafty_backend_supabase.md.Tl-sPm4O.lean.js b/assets/ru_arty-crafty_backend_supabase.md.BkSWx3iw.lean.js similarity index 92% rename from assets/ru_arty-crafty_backend_supabase.md.Tl-sPm4O.lean.js rename to assets/ru_arty-crafty_backend_supabase.md.BkSWx3iw.lean.js index 03d07d2f3..358f678f2 100644 --- a/assets/ru_arty-crafty_backend_supabase.md.Tl-sPm4O.lean.js +++ b/assets/ru_arty-crafty_backend_supabase.md.BkSWx3iw.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const o="/assets/supabase-api-keys.5Q_Ej9Wh.jpg",r="/assets/supabase-policies.OWee6Ret.jpg",f=JSON.parse('{"title":"Supabase","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/supabase.md","filePath":"ru/arty-crafty/backend/supabase.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/backend/supabase.md"},p=s("",10),i=[p];function n(d,u,_,l,m,b){return t(),e("div",null,i)}const g=a(c,[["render",n]]);export{f as __pageData,g as default}; +import{_ as a,c as e,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const o="/assets/supabase-api-keys.5Q_Ej9Wh.jpg",r="/assets/supabase-policies.OWee6Ret.jpg",f=JSON.parse('{"title":"Supabase","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/backend/supabase.md","filePath":"ru/arty-crafty/backend/supabase.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/backend/supabase.md"},p=s("",10),i=[p];function n(d,u,_,l,m,b){return t(),e("div",null,i)}const g=a(c,[["render",n]]);export{f as __pageData,g as default}; diff --git a/assets/ru_arty-crafty_index.md.pF89O97c.js b/assets/ru_arty-crafty_index.md.0azonwI3.js similarity index 98% rename from assets/ru_arty-crafty_index.md.pF89O97c.js rename to assets/ru_arty-crafty_index.md.0azonwI3.js index e5c8560bb..8812b79d5 100644 --- a/assets/ru_arty-crafty_index.md.pF89O97c.js +++ b/assets/ru_arty-crafty_index.md.0azonwI3.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const o="/assets/toys.UkXYunJK.jpg",s="/assets/path-1000-li.NG4dz4G3.jpg",y=JSON.parse('{"title":"Онлайн маркетплейс","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/index.md","filePath":"ru/arty-crafty/index.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/index.md"},i=r('

Онлайн маркетплейс

Проект Arty-Crafty

Здесь будет описываться процесс разработки онлайн маркетплейса. Разработка будет вестись поэтапно: витрина => магазин => маркетплейс. В некотором виде, туториал создания программного продукта от начала и до конца (какого-то). Репозиторий проекта.

Причины

Однажды я познакомился с мастером, которая вязала вот такие очень красивые интерьерные игрушки:

игрушки

image

Предложил ей сделать в интернете выставочную витрину. Однако когда я попытался найти готовые или полуготовые удобные современные open source решения для этого, оказалось, что их нет. Были опробованы headless e-commerce решения, вроде medusajs, и фронтенды типа VueStorefront, однако единственное, что нормально смогло заработать без значительных вложений времени и средств, был старый добрый php-ный OpenCart. И то, сразу же возникли проблемы при импорте данных.

Так появилось решение об этом проекте.

Цель

Создать e-commerce софт, который можно потом будет легко кастомизировать и настраивать для работы с любыми CMS, выйти на IPO и заработать много миллионов денег. Ниша свободна. Попутно сделать витрину/магазин для игрушек.

Также проект хорошо подходит как сайд или пет-проект, для обучения и развития, так что можно присоединяться к разработке.

Что здесь будет?

Описание организации проекта, его основных этапов, ключевых действий, объяснение причин принятия тех или иных решений. Здесь кода особо не будет (в репозитории). Будут CMV (coding music video).

Youtube-ов не планируется, монетизация от "курсов" не предусмотрена. Фидбеки, вопросы и советы можно оставлять в Telegram в комментариях.

Для чего?

В приличных вузах аспиранты обязаны заниматься преподавательской деятельностью. Подготовка материала и "проговаривание" его другим даёт возможность достичь более глубокого уровня понимания предмета. Поэтому польза тут обоюдная.


Замечание

Основная цель данного проекта - создать продукт высокого качества. Образовательный аспект - попутный. Поэтому стратегии: "Сперва сделаем плохо, а потом будем улучшать", не будет. Сразу делаем хорошо.


image

',20),n=[i];function l(d,p,m,h,u,_){return t(),e("div",null,n)}const g=a(c,[["render",l]]);export{y as __pageData,g as default}; +import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const o="/assets/toys.UkXYunJK.jpg",s="/assets/path-1000-li.NG4dz4G3.jpg",y=JSON.parse('{"title":"Онлайн маркетплейс","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/index.md","filePath":"ru/arty-crafty/index.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/index.md"},i=r('

Онлайн маркетплейс

Проект Arty-Crafty

Здесь будет описываться процесс разработки онлайн маркетплейса. Разработка будет вестись поэтапно: витрина => магазин => маркетплейс. В некотором виде, туториал создания программного продукта от начала и до конца (какого-то). Репозиторий проекта.

Причины

Однажды я познакомился с мастером, которая вязала вот такие очень красивые интерьерные игрушки:

игрушки

image

Предложил ей сделать в интернете выставочную витрину. Однако когда я попытался найти готовые или полуготовые удобные современные open source решения для этого, оказалось, что их нет. Были опробованы headless e-commerce решения, вроде medusajs, и фронтенды типа VueStorefront, однако единственное, что нормально смогло заработать без значительных вложений времени и средств, был старый добрый php-ный OpenCart. И то, сразу же возникли проблемы при импорте данных.

Так появилось решение об этом проекте.

Цель

Создать e-commerce софт, который можно потом будет легко кастомизировать и настраивать для работы с любыми CMS, выйти на IPO и заработать много миллионов денег. Ниша свободна. Попутно сделать витрину/магазин для игрушек.

Также проект хорошо подходит как сайд или пет-проект, для обучения и развития, так что можно присоединяться к разработке.

Что здесь будет?

Описание организации проекта, его основных этапов, ключевых действий, объяснение причин принятия тех или иных решений. Здесь кода особо не будет (в репозитории). Будут CMV (coding music video).

Youtube-ов не планируется, монетизация от "курсов" не предусмотрена. Фидбеки, вопросы и советы можно оставлять в Telegram в комментариях.

Для чего?

В приличных вузах аспиранты обязаны заниматься преподавательской деятельностью. Подготовка материала и "проговаривание" его другим даёт возможность достичь более глубокого уровня понимания предмета. Поэтому польза тут обоюдная.


Замечание

Основная цель данного проекта - создать продукт высокого качества. Образовательный аспект - попутный. Поэтому стратегии: "Сперва сделаем плохо, а потом будем улучшать", не будет. Сразу делаем хорошо.


image

',20),n=[i];function l(d,p,m,h,u,_){return t(),e("div",null,n)}const g=a(c,[["render",l]]);export{y as __pageData,g as default}; diff --git a/assets/ru_arty-crafty_index.md.pF89O97c.lean.js b/assets/ru_arty-crafty_index.md.0azonwI3.lean.js similarity index 92% rename from assets/ru_arty-crafty_index.md.pF89O97c.lean.js rename to assets/ru_arty-crafty_index.md.0azonwI3.lean.js index b4c108112..ff2114870 100644 --- a/assets/ru_arty-crafty_index.md.pF89O97c.lean.js +++ b/assets/ru_arty-crafty_index.md.0azonwI3.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const o="/assets/toys.UkXYunJK.jpg",s="/assets/path-1000-li.NG4dz4G3.jpg",y=JSON.parse('{"title":"Онлайн маркетплейс","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/index.md","filePath":"ru/arty-crafty/index.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/index.md"},i=r("",20),n=[i];function l(d,p,m,h,u,_){return t(),e("div",null,n)}const g=a(c,[["render",l]]);export{y as __pageData,g as default}; +import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const o="/assets/toys.UkXYunJK.jpg",s="/assets/path-1000-li.NG4dz4G3.jpg",y=JSON.parse('{"title":"Онлайн маркетплейс","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/index.md","filePath":"ru/arty-crafty/index.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/index.md"},i=r("",20),n=[i];function l(d,p,m,h,u,_){return t(),e("div",null,n)}const g=a(c,[["render",l]]);export{y as __pageData,g as default}; diff --git a/assets/ru_arty-crafty_introduction_development-stages.md.zIvgLxbC.js b/assets/ru_arty-crafty_introduction_development-stages.md.RbGhkZLY.js similarity index 99% rename from assets/ru_arty-crafty_introduction_development-stages.md.zIvgLxbC.js rename to assets/ru_arty-crafty_introduction_development-stages.md.RbGhkZLY.js index 1e26b7a5a..07821bbaa 100644 --- a/assets/ru_arty-crafty_introduction_development-stages.md.zIvgLxbC.js +++ b/assets/ru_arty-crafty_introduction_development-stages.md.RbGhkZLY.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"План работы","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/development-stages.md","filePath":"ru/arty-crafty/introduction/development-stages.md","lastUpdated":1706427418000}'),l={name:"ru/arty-crafty/introduction/development-stages.md"},r=i('

План работы

Стадии разработки ПО

Классически разработка программного обеспечения состоит из следующих шагов (software development lifecycle - SDLC):

  1. Бизнес-анализ
  2. Архитектура и дизайн
  3. Разработка
  4. Развертывание
  5. Тестирование и QA
  6. Документирование
  7. Поддержка

С пятого шага можно вернуться на второй или третий для корректировки требований и плана, и таких итераций может быть много.

Рассмотрим каждую стадию отдельно.

Бизнес-анализ

Цель данной стадии в том, чтобы изучить представление заказчика о том, что он хочет получить, и перевести его на язык, понятный разработчикам. Даже если клиент и разработчик - это вы. Проблема кроется в восприятии, терминах и понятийном аппарате в целом. Недопонимание может привести к нарушению сроков, «раздутому» бюджету проекта и несоответствию результата целям бизнеса.

В процессе работы аналитика, как интерпретатора с языка бизнеса на язык IT, как правило, возникают следующие артефакты:

  • Видение проекта. Определяются границы проекта.
  • Скоуп задач. Позволяет определить, кто и какие задачи будет выполнять.
  • Описание сущностей. Описание логических связей между сущностями, потоков данных.
  • Диаграммы. Используются для наглядного описания процессов, алгоритмов, взаимосвязей между сущностями и т.д.
  • Описание поведения UI интерфейса. Нужно для более чёткого понимания, как работает интерфейс, какие существуют правила и как обрабатываются альтернативные сценарии.
  • Нефункциональные требования. Касаются производительности, безопасности и т.д.
  • Пользовательская документация. Объясняет, как пользователю использовать программу.

Архитектура и дизайн

Архитектура системы описывает ее основные компоненты, их взаимосвязи и способы взаимодействия друг с другом.

Она определяет структурированное решение, удовлетворяющее всем техническим и эксплуатационным требованиям, оптимизируя при этом общие атрибуты качества, такие как производительность и безопасность.

Кроме того, она включает в себя набор важных решений, связанных с разработкой программного обеспечения, и каждое из этих решений может оказать значительное влияние на качество, сопровождаемость, производительность и общий успех конечного продукта. Эти решения включают в себя:

  • Выбор основных структурных элементов и их интерфейсов, из которых состоит система.
  • Поведение, определяемое взаимодействием между этими элементами.
  • Объединение этих структурных и поведенческих элементов в бОльшую подсистему.
  • Согласование архитектурных решений с бизнес-целями.
  • Архитектурное руководство по стилю (style guide) для дальнейшей разработки.

Хорошая архитектура позволяет комфортно разрабатывать проект и удобно поддерживать и модифицировать его в долгосрочной перспективе.

Дизайн программной системы предусматривает разработку спецификации (software requirements specification - SRS), которая описывает элементы системы, их соответствие и совместную работу для выполнения требований, предъявляемых к системе. Дизайн выполняет роль чертежа в процессе разработки.

Разработка

Разработка включает в себя реализацию поставленных в спецификации задач.

Развертывание

Развертывание на сервере. CI/CD для автоматизации не только доставки, билда и деплоя, но и тестирования, бэкапа, версионности.

Тестирование и QA

Тестирование на первом этапе ручное, после - интеграционные (e2e) тесты.

Документирование

Данное руководство будет служить документацией, пока не понадобится отдельная.

Поддержка

Поддержка включает в себя не только оказание помощи пользователям и исправление ошибок, но и получение обратной связи от них с целью улучшения продукта.

',27),o=[r];function n(s,c,d,h,p,m){return t(),e("div",null,o)}const _=a(l,[["render",n]]);export{f as __pageData,_ as default}; +import{_ as a,c as e,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"План работы","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/development-stages.md","filePath":"ru/arty-crafty/introduction/development-stages.md","lastUpdated":1706553672000}'),l={name:"ru/arty-crafty/introduction/development-stages.md"},r=i('

План работы

Стадии разработки ПО

Классически разработка программного обеспечения состоит из следующих шагов (software development lifecycle - SDLC):

  1. Бизнес-анализ
  2. Архитектура и дизайн
  3. Разработка
  4. Развертывание
  5. Тестирование и QA
  6. Документирование
  7. Поддержка

С пятого шага можно вернуться на второй или третий для корректировки требований и плана, и таких итераций может быть много.

Рассмотрим каждую стадию отдельно.

Бизнес-анализ

Цель данной стадии в том, чтобы изучить представление заказчика о том, что он хочет получить, и перевести его на язык, понятный разработчикам. Даже если клиент и разработчик - это вы. Проблема кроется в восприятии, терминах и понятийном аппарате в целом. Недопонимание может привести к нарушению сроков, «раздутому» бюджету проекта и несоответствию результата целям бизнеса.

В процессе работы аналитика, как интерпретатора с языка бизнеса на язык IT, как правило, возникают следующие артефакты:

  • Видение проекта. Определяются границы проекта.
  • Скоуп задач. Позволяет определить, кто и какие задачи будет выполнять.
  • Описание сущностей. Описание логических связей между сущностями, потоков данных.
  • Диаграммы. Используются для наглядного описания процессов, алгоритмов, взаимосвязей между сущностями и т.д.
  • Описание поведения UI интерфейса. Нужно для более чёткого понимания, как работает интерфейс, какие существуют правила и как обрабатываются альтернативные сценарии.
  • Нефункциональные требования. Касаются производительности, безопасности и т.д.
  • Пользовательская документация. Объясняет, как пользователю использовать программу.

Архитектура и дизайн

Архитектура системы описывает ее основные компоненты, их взаимосвязи и способы взаимодействия друг с другом.

Она определяет структурированное решение, удовлетворяющее всем техническим и эксплуатационным требованиям, оптимизируя при этом общие атрибуты качества, такие как производительность и безопасность.

Кроме того, она включает в себя набор важных решений, связанных с разработкой программного обеспечения, и каждое из этих решений может оказать значительное влияние на качество, сопровождаемость, производительность и общий успех конечного продукта. Эти решения включают в себя:

  • Выбор основных структурных элементов и их интерфейсов, из которых состоит система.
  • Поведение, определяемое взаимодействием между этими элементами.
  • Объединение этих структурных и поведенческих элементов в бОльшую подсистему.
  • Согласование архитектурных решений с бизнес-целями.
  • Архитектурное руководство по стилю (style guide) для дальнейшей разработки.

Хорошая архитектура позволяет комфортно разрабатывать проект и удобно поддерживать и модифицировать его в долгосрочной перспективе.

Дизайн программной системы предусматривает разработку спецификации (software requirements specification - SRS), которая описывает элементы системы, их соответствие и совместную работу для выполнения требований, предъявляемых к системе. Дизайн выполняет роль чертежа в процессе разработки.

Разработка

Разработка включает в себя реализацию поставленных в спецификации задач.

Развертывание

Развертывание на сервере. CI/CD для автоматизации не только доставки, билда и деплоя, но и тестирования, бэкапа, версионности.

Тестирование и QA

Тестирование на первом этапе ручное, после - интеграционные (e2e) тесты.

Документирование

Данное руководство будет служить документацией, пока не понадобится отдельная.

Поддержка

Поддержка включает в себя не только оказание помощи пользователям и исправление ошибок, но и получение обратной связи от них с целью улучшения продукта.

',27),o=[r];function n(s,c,d,h,p,m){return t(),e("div",null,o)}const _=a(l,[["render",n]]);export{f as __pageData,_ as default}; diff --git a/assets/ru_arty-crafty_introduction_development-stages.md.zIvgLxbC.lean.js b/assets/ru_arty-crafty_introduction_development-stages.md.RbGhkZLY.lean.js similarity index 92% rename from assets/ru_arty-crafty_introduction_development-stages.md.zIvgLxbC.lean.js rename to assets/ru_arty-crafty_introduction_development-stages.md.RbGhkZLY.lean.js index 58fdda59f..70db3575e 100644 --- a/assets/ru_arty-crafty_introduction_development-stages.md.zIvgLxbC.lean.js +++ b/assets/ru_arty-crafty_introduction_development-stages.md.RbGhkZLY.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"План работы","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/development-stages.md","filePath":"ru/arty-crafty/introduction/development-stages.md","lastUpdated":1706427418000}'),l={name:"ru/arty-crafty/introduction/development-stages.md"},r=i("",27),o=[r];function n(s,c,d,h,p,m){return t(),e("div",null,o)}const _=a(l,[["render",n]]);export{f as __pageData,_ as default}; +import{_ as a,c as e,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"План работы","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/development-stages.md","filePath":"ru/arty-crafty/introduction/development-stages.md","lastUpdated":1706553672000}'),l={name:"ru/arty-crafty/introduction/development-stages.md"},r=i("",27),o=[r];function n(s,c,d,h,p,m){return t(),e("div",null,o)}const _=a(l,[["render",n]]);export{f as __pageData,_ as default}; diff --git a/assets/ru_arty-crafty_introduction_goals.md.o1PQwptX.js b/assets/ru_arty-crafty_introduction_goals.md.qEMDrY7L.js similarity index 98% rename from assets/ru_arty-crafty_introduction_goals.md.o1PQwptX.js rename to assets/ru_arty-crafty_introduction_goals.md.qEMDrY7L.js index 54bfaf57a..a3e3ac7e8 100644 --- a/assets/ru_arty-crafty_introduction_goals.md.o1PQwptX.js +++ b/assets/ru_arty-crafty_introduction_goals.md.qEMDrY7L.js @@ -1 +1 @@ -import{_ as a,c as t,o as e,U as i}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Цели и задачи проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/goals.md","filePath":"ru/arty-crafty/introduction/goals.md","lastUpdated":1706427418000}'),l={name:"ru/arty-crafty/introduction/goals.md"},o=i('

Цели и задачи проекта

Цели данного проекта:

  1. Постепенное построение продукта: начиная с витрины с простым статичным бэкендом в форме json файлов и заканчивая полноценным маркетплейсом со сторонним headless e-commerce решением.
  2. При разработке должны использоваться последние проверенные достижения Vue.js экосистемы и лучшие практики в разработке программного обеспечения.
  3. Проект должен быть примером грамотной реализации проекта по разработке ПО, начиная с архитектуры и заканчивая кодом.
  4. Программная система должна быть удобна для использования, кастомизации и развертывания для человека, не знакомого с Vue, - то есть, представлять из себя продукт для конечного пользователя.

Нефункциональные требования (software quality attributes)

  1. Высокий UX
  2. Производительность
  3. Безопасность
  4. Функциональность
  5. Расширяемость
  6. Понятный задокументированный чистый код, использование лучших практик

Общие функциональные требования

  1. PWA
  2. Глубоко настраиваемые темы. Как общие, так и для каждого магазина маркетплейса.
  3. i18n (интернационализация)

Этапы развития приложения (приблизительно)

  1. Витрина (показ каталога категорий и товаров из них)
  2. Бэкенд и база данных
  3. Поиск по товарам, маркетплейс (отдельные магазины)
  4. UI/UX
  5. Интеграция с E-commerce headless решением
  6. Аутентификация и авторизация
  7. Корзина для покупок, оформление заказов, личный кабинет покупателя
  8. Добавление различного функционала: методы оплаты, доставки, рейтинги товаров, отзывы покупателей, customer service
  9. SEO оптимизация
  10. Административная панель для магазинов маркетплейса

Разработка будет вестись постепенно, по этапам, описанным выше. После каждого этапа должно получаться рабочее (продуктовое) приложение. Разбиение большой задачи на небольшие подзадачи и всего процесса стадии сильно упрощает управление проектом и повышает вероятность итогового положительного исхода.

',10),r=[o];function s(n,c,d,h,u,m){return e(),t("div",null,r)}const y=a(l,[["render",s]]);export{f as __pageData,y as default}; +import{_ as a,c as t,o as e,U as i}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Цели и задачи проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/goals.md","filePath":"ru/arty-crafty/introduction/goals.md","lastUpdated":1706553672000}'),l={name:"ru/arty-crafty/introduction/goals.md"},o=i('

Цели и задачи проекта

Цели данного проекта:

  1. Постепенное построение продукта: начиная с витрины с простым статичным бэкендом в форме json файлов и заканчивая полноценным маркетплейсом со сторонним headless e-commerce решением.
  2. При разработке должны использоваться последние проверенные достижения Vue.js экосистемы и лучшие практики в разработке программного обеспечения.
  3. Проект должен быть примером грамотной реализации проекта по разработке ПО, начиная с архитектуры и заканчивая кодом.
  4. Программная система должна быть удобна для использования, кастомизации и развертывания для человека, не знакомого с Vue, - то есть, представлять из себя продукт для конечного пользователя.

Нефункциональные требования (software quality attributes)

  1. Высокий UX
  2. Производительность
  3. Безопасность
  4. Функциональность
  5. Расширяемость
  6. Понятный задокументированный чистый код, использование лучших практик

Общие функциональные требования

  1. PWA
  2. Глубоко настраиваемые темы. Как общие, так и для каждого магазина маркетплейса.
  3. i18n (интернационализация)

Этапы развития приложения (приблизительно)

  1. Витрина (показ каталога категорий и товаров из них)
  2. Бэкенд и база данных
  3. Поиск по товарам, маркетплейс (отдельные магазины)
  4. UI/UX
  5. Интеграция с E-commerce headless решением
  6. Аутентификация и авторизация
  7. Корзина для покупок, оформление заказов, личный кабинет покупателя
  8. Добавление различного функционала: методы оплаты, доставки, рейтинги товаров, отзывы покупателей, customer service
  9. SEO оптимизация
  10. Административная панель для магазинов маркетплейса

Разработка будет вестись постепенно, по этапам, описанным выше. После каждого этапа должно получаться рабочее (продуктовое) приложение. Разбиение большой задачи на небольшие подзадачи и всего процесса стадии сильно упрощает управление проектом и повышает вероятность итогового положительного исхода.

',10),r=[o];function s(n,c,d,h,u,m){return e(),t("div",null,r)}const y=a(l,[["render",s]]);export{f as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_introduction_goals.md.o1PQwptX.lean.js b/assets/ru_arty-crafty_introduction_goals.md.qEMDrY7L.lean.js similarity index 91% rename from assets/ru_arty-crafty_introduction_goals.md.o1PQwptX.lean.js rename to assets/ru_arty-crafty_introduction_goals.md.qEMDrY7L.lean.js index 0acc9831f..781153af4 100644 --- a/assets/ru_arty-crafty_introduction_goals.md.o1PQwptX.lean.js +++ b/assets/ru_arty-crafty_introduction_goals.md.qEMDrY7L.lean.js @@ -1 +1 @@ -import{_ as a,c as t,o as e,U as i}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Цели и задачи проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/goals.md","filePath":"ru/arty-crafty/introduction/goals.md","lastUpdated":1706427418000}'),l={name:"ru/arty-crafty/introduction/goals.md"},o=i("",10),r=[o];function s(n,c,d,h,u,m){return e(),t("div",null,r)}const y=a(l,[["render",s]]);export{f as __pageData,y as default}; +import{_ as a,c as t,o as e,U as i}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Цели и задачи проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/goals.md","filePath":"ru/arty-crafty/introduction/goals.md","lastUpdated":1706553672000}'),l={name:"ru/arty-crafty/introduction/goals.md"},o=i("",10),r=[o];function s(n,c,d,h,u,m){return e(),t("div",null,r)}const y=a(l,[["render",s]]);export{f as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_introduction_repository.md.kDvdY_WI.js b/assets/ru_arty-crafty_introduction_repository.md.sRB3gGt5.js similarity index 95% rename from assets/ru_arty-crafty_introduction_repository.md.kDvdY_WI.js rename to assets/ru_arty-crafty_introduction_repository.md.sRB3gGt5.js index c7e698656..5ec3ca507 100644 --- a/assets/ru_arty-crafty_introduction_repository.md.kDvdY_WI.js +++ b/assets/ru_arty-crafty_introduction_repository.md.sRB3gGt5.js @@ -1 +1 @@ -import{_ as a,c as r,o,m as t,a as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Репозиторий и сайт проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/repository.md","filePath":"ru/arty-crafty/introduction/repository.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/introduction/repository.md"},s=t("h1",{id:"репозитории-и-саит-проекта",tabindex:"-1"},[e("Репозиторий и сайт проекта "),t("a",{class:"header-anchor",href:"#репозитории-и-саит-проекта","aria-label":'Permalink to "Репозиторий и сайт проекта"'},"​")],-1),c=t("p",null,[e("Репозиторий - "),t("a",{href:"https://github.com/vuesence/arty-crafty",target:"_blank",rel:"noreferrer"},"https://github.com/vuesence/arty-crafty")],-1),i=t("p",null,[e("Сайт (текущая dev версия) - "),t("a",{href:"https://vuesence.github.io/arty-crafty/",target:"_blank",rel:"noreferrer"},"https://vuesence.github.io/arty-crafty/")],-1),d=[s,c,i];function y(l,p,f,m,h,_){return o(),r("div",null,d)}const b=a(n,[["render",y]]);export{g as __pageData,b as default}; +import{_ as a,c as r,o,m as t,a as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Репозиторий и сайт проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/repository.md","filePath":"ru/arty-crafty/introduction/repository.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/introduction/repository.md"},s=t("h1",{id:"репозитории-и-саит-проекта",tabindex:"-1"},[e("Репозиторий и сайт проекта "),t("a",{class:"header-anchor",href:"#репозитории-и-саит-проекта","aria-label":'Permalink to "Репозиторий и сайт проекта"'},"​")],-1),c=t("p",null,[e("Репозиторий - "),t("a",{href:"https://github.com/vuesence/arty-crafty",target:"_blank",rel:"noreferrer"},"https://github.com/vuesence/arty-crafty")],-1),i=t("p",null,[e("Сайт (текущая dev версия) - "),t("a",{href:"https://vuesence.github.io/arty-crafty/",target:"_blank",rel:"noreferrer"},"https://vuesence.github.io/arty-crafty/")],-1),d=[s,c,i];function y(l,p,f,m,h,_){return o(),r("div",null,d)}const b=a(n,[["render",y]]);export{g as __pageData,b as default}; diff --git a/assets/ru_arty-crafty_introduction_repository.md.kDvdY_WI.lean.js b/assets/ru_arty-crafty_introduction_repository.md.sRB3gGt5.lean.js similarity index 95% rename from assets/ru_arty-crafty_introduction_repository.md.kDvdY_WI.lean.js rename to assets/ru_arty-crafty_introduction_repository.md.sRB3gGt5.lean.js index c7e698656..5ec3ca507 100644 --- a/assets/ru_arty-crafty_introduction_repository.md.kDvdY_WI.lean.js +++ b/assets/ru_arty-crafty_introduction_repository.md.sRB3gGt5.lean.js @@ -1 +1 @@ -import{_ as a,c as r,o,m as t,a as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Репозиторий и сайт проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/repository.md","filePath":"ru/arty-crafty/introduction/repository.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/introduction/repository.md"},s=t("h1",{id:"репозитории-и-саит-проекта",tabindex:"-1"},[e("Репозиторий и сайт проекта "),t("a",{class:"header-anchor",href:"#репозитории-и-саит-проекта","aria-label":'Permalink to "Репозиторий и сайт проекта"'},"​")],-1),c=t("p",null,[e("Репозиторий - "),t("a",{href:"https://github.com/vuesence/arty-crafty",target:"_blank",rel:"noreferrer"},"https://github.com/vuesence/arty-crafty")],-1),i=t("p",null,[e("Сайт (текущая dev версия) - "),t("a",{href:"https://vuesence.github.io/arty-crafty/",target:"_blank",rel:"noreferrer"},"https://vuesence.github.io/arty-crafty/")],-1),d=[s,c,i];function y(l,p,f,m,h,_){return o(),r("div",null,d)}const b=a(n,[["render",y]]);export{g as __pageData,b as default}; +import{_ as a,c as r,o,m as t,a as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Репозиторий и сайт проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/introduction/repository.md","filePath":"ru/arty-crafty/introduction/repository.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/introduction/repository.md"},s=t("h1",{id:"репозитории-и-саит-проекта",tabindex:"-1"},[e("Репозиторий и сайт проекта "),t("a",{class:"header-anchor",href:"#репозитории-и-саит-проекта","aria-label":'Permalink to "Репозиторий и сайт проекта"'},"​")],-1),c=t("p",null,[e("Репозиторий - "),t("a",{href:"https://github.com/vuesence/arty-crafty",target:"_blank",rel:"noreferrer"},"https://github.com/vuesence/arty-crafty")],-1),i=t("p",null,[e("Сайт (текущая dev версия) - "),t("a",{href:"https://vuesence.github.io/arty-crafty/",target:"_blank",rel:"noreferrer"},"https://vuesence.github.io/arty-crafty/")],-1),d=[s,c,i];function y(l,p,f,m,h,_){return o(),r("div",null,d)}const b=a(n,[["render",y]]);export{g as __pageData,b as default}; diff --git a/assets/ru_arty-crafty_showcase-data_api-service-adapter.md.FPYxk1GO.js b/assets/ru_arty-crafty_showcase-data_api-service-adapter.md.8G4m32oB.js similarity index 99% rename from assets/ru_arty-crafty_showcase-data_api-service-adapter.md.FPYxk1GO.js rename to assets/ru_arty-crafty_showcase-data_api-service-adapter.md.8G4m32oB.js index 9d39688c4..523d44101 100644 --- a/assets/ru_arty-crafty_showcase-data_api-service-adapter.md.FPYxk1GO.js +++ b/assets/ru_arty-crafty_showcase-data_api-service-adapter.md.8G4m32oB.js @@ -1 +1 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const o=JSON.parse('{"title":"Работа с API на фронтенде","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase-data/api-service-adapter.md","filePath":"ru/arty-crafty/showcase-data/api-service-adapter.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/showcase-data/api-service-adapter.md"},p=t('

Работа с API на фронтенде

Supabase адаптер

Теперь нужно реализовать такие же как в Hoppscotch запросы в коде нашего фронтенда. Для товаров категории и подробная информации о товаре это можно сделать сразу, заменив всего одну строку:

api/products.ts
js
const products = {\n  async categoryProducts(categoryId) {\n    // return http.get(`/arty-crafty/api/category-products-${categoryId}.json`);\n    const data = await http.get(`${SB}/categories?select=id,title,products(id,title,summary)&id=eq.${categoryId}`);\n    return data[0].products;\n  },\n};

В ProductCard проставляем корректные пути к свойствам товара (product.summary.price) и категория показывается. Ранее product.desc бы переименован в базе данных в product.summary.

Теперь нужно загрузить в самом начале старта приложения все категории товаров, чтобы построить каталог.

js
async categories() {\n  return http.get(`${SB}/categories?select=id,title,data`);\n},

Ну и запрос информации о товаре:

js
async product(id: number) {\n  const data = await http.get(`${SB}/products?select=id,title,summary,data&id=eq.${id}`);\n  return data[0] ?? null;\n},

Как видно, вынос транспортной логики в отдельный сервис сильно облегчает работу при замене бэкенда и делает код в основном приложении чище и понятней.

',11),e=[p];function h(l,k,r,d,c,E){return a(),i("div",null,e)}const y=s(n,[["render",h]]);export{o as __pageData,y as default}; +import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const o=JSON.parse('{"title":"Работа с API на фронтенде","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase-data/api-service-adapter.md","filePath":"ru/arty-crafty/showcase-data/api-service-adapter.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/showcase-data/api-service-adapter.md"},p=t('

Работа с API на фронтенде

Supabase адаптер

Теперь нужно реализовать такие же как в Hoppscotch запросы в коде нашего фронтенда. Для товаров категории и подробная информации о товаре это можно сделать сразу, заменив всего одну строку:

api/products.ts
js
const products = {\n  async categoryProducts(categoryId) {\n    // return http.get(`/arty-crafty/api/category-products-${categoryId}.json`);\n    const data = await http.get(`${SB}/categories?select=id,title,products(id,title,summary)&id=eq.${categoryId}`);\n    return data[0].products;\n  },\n};

В ProductCard проставляем корректные пути к свойствам товара (product.summary.price) и категория показывается. Ранее product.desc бы переименован в базе данных в product.summary.

Теперь нужно загрузить в самом начале старта приложения все категории товаров, чтобы построить каталог.

js
async categories() {\n  return http.get(`${SB}/categories?select=id,title,data`);\n},

Ну и запрос информации о товаре:

js
async product(id: number) {\n  const data = await http.get(`${SB}/products?select=id,title,summary,data&id=eq.${id}`);\n  return data[0] ?? null;\n},

Как видно, вынос транспортной логики в отдельный сервис сильно облегчает работу при замене бэкенда и делает код в основном приложении чище и понятней.

',11),e=[p];function h(l,k,r,d,c,E){return a(),i("div",null,e)}const y=s(n,[["render",h]]);export{o as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase-data_api-service-adapter.md.FPYxk1GO.lean.js b/assets/ru_arty-crafty_showcase-data_api-service-adapter.md.8G4m32oB.lean.js similarity index 92% rename from assets/ru_arty-crafty_showcase-data_api-service-adapter.md.FPYxk1GO.lean.js rename to assets/ru_arty-crafty_showcase-data_api-service-adapter.md.8G4m32oB.lean.js index 880eea8d8..be49128a5 100644 --- a/assets/ru_arty-crafty_showcase-data_api-service-adapter.md.FPYxk1GO.lean.js +++ b/assets/ru_arty-crafty_showcase-data_api-service-adapter.md.8G4m32oB.lean.js @@ -1 +1 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const o=JSON.parse('{"title":"Работа с API на фронтенде","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase-data/api-service-adapter.md","filePath":"ru/arty-crafty/showcase-data/api-service-adapter.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/showcase-data/api-service-adapter.md"},p=t("",11),e=[p];function h(l,k,r,d,c,E){return a(),i("div",null,e)}const y=s(n,[["render",h]]);export{o as __pageData,y as default}; +import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const o=JSON.parse('{"title":"Работа с API на фронтенде","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase-data/api-service-adapter.md","filePath":"ru/arty-crafty/showcase-data/api-service-adapter.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/showcase-data/api-service-adapter.md"},p=t("",11),e=[p];function h(l,k,r,d,c,E){return a(),i("div",null,e)}const y=s(n,[["render",h]]);export{o as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase-data_mobile-menu.md.SSyf7tEn.js b/assets/ru_arty-crafty_showcase-data_mobile-menu.md.NIj8HtJ_.js similarity index 99% rename from assets/ru_arty-crafty_showcase-data_mobile-menu.md.SSyf7tEn.js rename to assets/ru_arty-crafty_showcase-data_mobile-menu.md.NIj8HtJ_.js index 551299d9a..af24d5ee3 100644 --- a/assets/ru_arty-crafty_showcase-data_mobile-menu.md.SSyf7tEn.js +++ b/assets/ru_arty-crafty_showcase-data_mobile-menu.md.NIj8HtJ_.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const n="data:image/webp;base64,UklGRsoGAABXRUJQVlA4IL4GAACQKgCdASqkAUgAPp1Inkylo6KiIfQLYLATiWlu3V9w1VZIHAAeVV7Hvk3arYz3/Z+FPk2ELtM+y+Nfka8T01pwFYyaikn7kd+c+gj0eNBbMgHvqqVJB3+5KqOLIr7MlVHFbVnJd+72uBEzsqWz0D342wKV42LpSJhbxacDp2OwmI+fiHrx/5Q6/WI64gklOFU3sXTuNWX5EgNOIwSHrhtvnGmOAGdYbvuyg1pspMhN0jPkzAXwJqqGC8YqabnBChmZd/qmSOFUDvT90ZJTJiHWX3vNLcDszvU5sJIUdFQfvgcnVaj8iPR2y9by46D3nYqx7AOS1blDll2X0vhzBJl4zPXGgBwWC/e8TbxiVfncRp24UoIgVoX1KeQAJ81k1/d0eX33M7C3O9q3eGQxMQkfgTeCsudTZQxhw0Ektmp2p2w37bp1AOaJ6LMFnWmFShlituF1N2a9arPoURXIAP7+zD3PmfHZPmUKEB/rCyvpz5ROQFLMCLZ0Yjt5ODHcS0m82laTXHdURxu9AhIafUlcSsIH8k2zbc5yJghUvP3C0bv/9neSP8TOwQ7pAk/5QPN31ZH448xZMcu1ugpPv3P723k7/ubHYPmPpCxvcU9w7P4yyM40PNTj9WrAdUVPfzdh/lK6x3+/1D7Tr2W8Fg8bBpHewMFVo9s3PxShBSUzsFnC6vAuSGLyHqa3rVtxVmEvbA/vhJqnNaJMHxlSVwn7kh0yQnNGZJ+EHepQRM1cttwk+8dxadnKDzZCVKXEyrbfAg7J0p/gdN4yjwZD5VvOYWDwNvTCyt/MeW3Xr9sa7CnqGsN+ElVf+WQ0V0vjQ52vwHK+FsTifF7DPzUcYgHJZxltGln8iyU3ZmKZl3ZFscSWu/lN9F9U+HDwvFDpLpve/MnogNgUdri0PCAWXSzWQfcKellrzIq+0ugxdBjgSplKjCDBpBIoxklZLroClWS7dbLhz6G4BNd7ZTxVyuzXgF9wgJ8PiDr247Zg3D3QIIL2VObzdQyrfUMF7glt44A70NTO/ScaRn41Qu4b/4rUhD+HS6fz1e38c8AxKRu04Ix7cK2cVp5qe9pLXMSIMSB6lLsX+WlOypun4fg2XZZi6HT5651q/QG0KVCfEw1cd7vVJ0Uq7kUKUMFkxHjV/y2MI5TGUXZt8iGKRw43ol6NsWOFQ7n85Iyt5nDjlQmK4ndQ4ni2GkuOQO5lMBSmqadffTQAZgW0RsW0NI0p0m9j1lEWPxPQSLUyhAQP+np3twIDHF5Gtlvuw6QzC3TfQdCS3ZyH4PEFl3Ww2z0rtZgPMO0gQe6lSY28UGCu/g0p7eSSAtuy4Y53Jd/uzzhmB+oVMEiBWoLb3bOky0jU89OTXR/jXDvBI1jtZvBnd7w1DZvu+z5AVriy2qyOw9B0GyThZl/S1oKX542Q92TkNEbkEnaBriPBZRISjndHme0vlomXMX45uYeWJQpfZMlhPSRxMfvFh98NXUSTfCp2+KGaCWjfeSRY3KDge8tpG9FvOhzDPr6jz2FlawJuqdvi8xoDxWLooQ5DlqwiCOU6TkleBjnoAQ49g10yVIoH3MWKN9UiQ5pUHATYAzlr2e7qbfIHMv4FtlRbgWNNs3ikpgCx9/h0vUiK5z9dBTiuqPAGiabcUp9Rdexe/cF7qrwBZsjP4nOyzj8t1Z21hA0znJNYj1ykRWluixc3gA3FmqsrFJtWQcu3ouh0FQPTylFNf8OjV0OMaLKVVrJh+0bholj1SKVElpMT3YYVp/Hsk1zQRcv7rhiMocG9sdr1HgmNxOmP2yISfxXwhHUjNU3I5t2S2z1FMKnzOprTLEB7A8AR72GIyDZ30BlW4dzek6g5RESGX8lYfOpWDZjs9l/tw1a6vDybV4ohrtjs8zJXkIrII53QTyLBf6qzVkeBd4rn9PwBndU/UPvionxr08eSyyfLq7g74cEQBUa+KmiatXku19nh5ZyTsdXFby73GKlAG1eZwsqbe65EnNa8F3QEWcxJXu12sgSeHF2/lwfVI0Isew3JeG9FlnJA2WUTJVKaDH2mTq9vfYuCXvnNlB+FYcYcCaN9U1U4JXFEctdPZd6trJz48yhaRBrFF9Nl7MyvExLDbM2ymyE98+hhOIZ6HU1XRM2wa5vHg0R9IFsUBylpEaafGT7paRL9Jz8HiKn51acUDnvtbPp6cEl6L0PkJN4cYkeS9tJI79cSCqGvVwOTUnHJBAW1kjotpqImwg4MvOYdDgAAqfeyv7drP9waO7ogNwsXu4w2Kg1XBcF165xRdgBBqovH/mptykUqx6wA",m=JSON.parse('{"title":"Мобильное меню, CSS","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase-data/mobile-menu.md","filePath":"ru/arty-crafty/showcase-data/mobile-menu.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/showcase-data/mobile-menu.md"},r=o('

Мобильное меню, CSS

IconButton

В мобильном виде обычно на подобных сайтах есть нижнее меню. Кнопки с иконками тут сильно похожи на те, что используются в главном хедере, значит пора выделить их в отдельный компонент BaseIconButton. При создании базовых UI компонент есть искушение сделать его как можно универсальней, со множеством опций, но лучше делать самое необходимое с возможностью расширения позже. В нашем случае добавим только badge.

image

Заменяем в AppHeader кнопки на BaseIconButton.

SCSS => CSS

От SCSS мы используем только nesting (вкладывание селекторов друг в друга). Эта удобная фунциональность уже часть современного CSS, поддерживается последними версиями всех браузеров, но общая поддержка около 90%. Через полгода-год уже должна быть достаточная поддержка браузерами, чтобы мы использовали чистый CSS.

Перейдем на него уже сейчас, и будем использовать postcss-nesting пакет для преобразования CSS с nesting в простой CSS. Это позволит в будущем просто убрать этот пакет из проекта, не меняя код. В противном случае при переходе надо будет немного править каждый блок SCSS в каждом SFC.

Итак, убираем из зависимостей пакет sass, добавляем postcss-nesting, в каждом SFC файле убираем lang="scss", и заменяем двуслешные // ... комментарии SCSS на /* ... */ комментарии CSS. Всё работает.

Есть небольшая терпимая проблема с подсветкой CSS с nesting в VS Code, но есть и "плюс" - теперь по селектору из блока стилей можно по SHIFT+F12 попасть в нужное место в шаблоне. С SCSS это было нельзя.

Tag и CMV

Загружаем в репозиторий и ставим тэг - v0.4

Coding music video

',13),s=[r];function d(l,S,i,p,g,u){return t(),a("div",null,s)}const y=e(c,[["render",d]]);export{m as __pageData,y as default}; +import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const n="data:image/webp;base64,UklGRsoGAABXRUJQVlA4IL4GAACQKgCdASqkAUgAPp1Inkylo6KiIfQLYLATiWlu3V9w1VZIHAAeVV7Hvk3arYz3/Z+FPk2ELtM+y+Nfka8T01pwFYyaikn7kd+c+gj0eNBbMgHvqqVJB3+5KqOLIr7MlVHFbVnJd+72uBEzsqWz0D342wKV42LpSJhbxacDp2OwmI+fiHrx/5Q6/WI64gklOFU3sXTuNWX5EgNOIwSHrhtvnGmOAGdYbvuyg1pspMhN0jPkzAXwJqqGC8YqabnBChmZd/qmSOFUDvT90ZJTJiHWX3vNLcDszvU5sJIUdFQfvgcnVaj8iPR2y9by46D3nYqx7AOS1blDll2X0vhzBJl4zPXGgBwWC/e8TbxiVfncRp24UoIgVoX1KeQAJ81k1/d0eX33M7C3O9q3eGQxMQkfgTeCsudTZQxhw0Ektmp2p2w37bp1AOaJ6LMFnWmFShlituF1N2a9arPoURXIAP7+zD3PmfHZPmUKEB/rCyvpz5ROQFLMCLZ0Yjt5ODHcS0m82laTXHdURxu9AhIafUlcSsIH8k2zbc5yJghUvP3C0bv/9neSP8TOwQ7pAk/5QPN31ZH448xZMcu1ugpPv3P723k7/ubHYPmPpCxvcU9w7P4yyM40PNTj9WrAdUVPfzdh/lK6x3+/1D7Tr2W8Fg8bBpHewMFVo9s3PxShBSUzsFnC6vAuSGLyHqa3rVtxVmEvbA/vhJqnNaJMHxlSVwn7kh0yQnNGZJ+EHepQRM1cttwk+8dxadnKDzZCVKXEyrbfAg7J0p/gdN4yjwZD5VvOYWDwNvTCyt/MeW3Xr9sa7CnqGsN+ElVf+WQ0V0vjQ52vwHK+FsTifF7DPzUcYgHJZxltGln8iyU3ZmKZl3ZFscSWu/lN9F9U+HDwvFDpLpve/MnogNgUdri0PCAWXSzWQfcKellrzIq+0ugxdBjgSplKjCDBpBIoxklZLroClWS7dbLhz6G4BNd7ZTxVyuzXgF9wgJ8PiDr247Zg3D3QIIL2VObzdQyrfUMF7glt44A70NTO/ScaRn41Qu4b/4rUhD+HS6fz1e38c8AxKRu04Ix7cK2cVp5qe9pLXMSIMSB6lLsX+WlOypun4fg2XZZi6HT5651q/QG0KVCfEw1cd7vVJ0Uq7kUKUMFkxHjV/y2MI5TGUXZt8iGKRw43ol6NsWOFQ7n85Iyt5nDjlQmK4ndQ4ni2GkuOQO5lMBSmqadffTQAZgW0RsW0NI0p0m9j1lEWPxPQSLUyhAQP+np3twIDHF5Gtlvuw6QzC3TfQdCS3ZyH4PEFl3Ww2z0rtZgPMO0gQe6lSY28UGCu/g0p7eSSAtuy4Y53Jd/uzzhmB+oVMEiBWoLb3bOky0jU89OTXR/jXDvBI1jtZvBnd7w1DZvu+z5AVriy2qyOw9B0GyThZl/S1oKX542Q92TkNEbkEnaBriPBZRISjndHme0vlomXMX45uYeWJQpfZMlhPSRxMfvFh98NXUSTfCp2+KGaCWjfeSRY3KDge8tpG9FvOhzDPr6jz2FlawJuqdvi8xoDxWLooQ5DlqwiCOU6TkleBjnoAQ49g10yVIoH3MWKN9UiQ5pUHATYAzlr2e7qbfIHMv4FtlRbgWNNs3ikpgCx9/h0vUiK5z9dBTiuqPAGiabcUp9Rdexe/cF7qrwBZsjP4nOyzj8t1Z21hA0znJNYj1ykRWluixc3gA3FmqsrFJtWQcu3ouh0FQPTylFNf8OjV0OMaLKVVrJh+0bholj1SKVElpMT3YYVp/Hsk1zQRcv7rhiMocG9sdr1HgmNxOmP2yISfxXwhHUjNU3I5t2S2z1FMKnzOprTLEB7A8AR72GIyDZ30BlW4dzek6g5RESGX8lYfOpWDZjs9l/tw1a6vDybV4ohrtjs8zJXkIrII53QTyLBf6qzVkeBd4rn9PwBndU/UPvionxr08eSyyfLq7g74cEQBUa+KmiatXku19nh5ZyTsdXFby73GKlAG1eZwsqbe65EnNa8F3QEWcxJXu12sgSeHF2/lwfVI0Isew3JeG9FlnJA2WUTJVKaDH2mTq9vfYuCXvnNlB+FYcYcCaN9U1U4JXFEctdPZd6trJz48yhaRBrFF9Nl7MyvExLDbM2ymyE98+hhOIZ6HU1XRM2wa5vHg0R9IFsUBylpEaafGT7paRL9Jz8HiKn51acUDnvtbPp6cEl6L0PkJN4cYkeS9tJI79cSCqGvVwOTUnHJBAW1kjotpqImwg4MvOYdDgAAqfeyv7drP9waO7ogNwsXu4w2Kg1XBcF165xRdgBBqovH/mptykUqx6wA",m=JSON.parse('{"title":"Мобильное меню, CSS","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase-data/mobile-menu.md","filePath":"ru/arty-crafty/showcase-data/mobile-menu.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/showcase-data/mobile-menu.md"},r=o('

Мобильное меню, CSS

IconButton

В мобильном виде обычно на подобных сайтах есть нижнее меню. Кнопки с иконками тут сильно похожи на те, что используются в главном хедере, значит пора выделить их в отдельный компонент BaseIconButton. При создании базовых UI компонент есть искушение сделать его как можно универсальней, со множеством опций, но лучше делать самое необходимое с возможностью расширения позже. В нашем случае добавим только badge.

image

Заменяем в AppHeader кнопки на BaseIconButton.

SCSS => CSS

От SCSS мы используем только nesting (вкладывание селекторов друг в друга). Эта удобная фунциональность уже часть современного CSS, поддерживается последними версиями всех браузеров, но общая поддержка около 90%. Через полгода-год уже должна быть достаточная поддержка браузерами, чтобы мы использовали чистый CSS.

Перейдем на него уже сейчас, и будем использовать postcss-nesting пакет для преобразования CSS с nesting в простой CSS. Это позволит в будущем просто убрать этот пакет из проекта, не меняя код. В противном случае при переходе надо будет немного править каждый блок SCSS в каждом SFC.

Итак, убираем из зависимостей пакет sass, добавляем postcss-nesting, в каждом SFC файле убираем lang="scss", и заменяем двуслешные // ... комментарии SCSS на /* ... */ комментарии CSS. Всё работает.

Есть небольшая терпимая проблема с подсветкой CSS с nesting в VS Code, но есть и "плюс" - теперь по селектору из блока стилей можно по SHIFT+F12 попасть в нужное место в шаблоне. С SCSS это было нельзя.

Tag и CMV

Загружаем в репозиторий и ставим тэг - v0.4

Coding music video

',13),s=[r];function d(l,S,i,p,g,u){return t(),a("div",null,s)}const y=e(c,[["render",d]]);export{m as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase-data_mobile-menu.md.SSyf7tEn.lean.js b/assets/ru_arty-crafty_showcase-data_mobile-menu.md.NIj8HtJ_.lean.js similarity index 97% rename from assets/ru_arty-crafty_showcase-data_mobile-menu.md.SSyf7tEn.lean.js rename to assets/ru_arty-crafty_showcase-data_mobile-menu.md.NIj8HtJ_.lean.js index fcf9c2d05..f2640c3b1 100644 --- a/assets/ru_arty-crafty_showcase-data_mobile-menu.md.SSyf7tEn.lean.js +++ b/assets/ru_arty-crafty_showcase-data_mobile-menu.md.NIj8HtJ_.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const n="data:image/webp;base64,UklGRsoGAABXRUJQVlA4IL4GAACQKgCdASqkAUgAPp1Inkylo6KiIfQLYLATiWlu3V9w1VZIHAAeVV7Hvk3arYz3/Z+FPk2ELtM+y+Nfka8T01pwFYyaikn7kd+c+gj0eNBbMgHvqqVJB3+5KqOLIr7MlVHFbVnJd+72uBEzsqWz0D342wKV42LpSJhbxacDp2OwmI+fiHrx/5Q6/WI64gklOFU3sXTuNWX5EgNOIwSHrhtvnGmOAGdYbvuyg1pspMhN0jPkzAXwJqqGC8YqabnBChmZd/qmSOFUDvT90ZJTJiHWX3vNLcDszvU5sJIUdFQfvgcnVaj8iPR2y9by46D3nYqx7AOS1blDll2X0vhzBJl4zPXGgBwWC/e8TbxiVfncRp24UoIgVoX1KeQAJ81k1/d0eX33M7C3O9q3eGQxMQkfgTeCsudTZQxhw0Ektmp2p2w37bp1AOaJ6LMFnWmFShlituF1N2a9arPoURXIAP7+zD3PmfHZPmUKEB/rCyvpz5ROQFLMCLZ0Yjt5ODHcS0m82laTXHdURxu9AhIafUlcSsIH8k2zbc5yJghUvP3C0bv/9neSP8TOwQ7pAk/5QPN31ZH448xZMcu1ugpPv3P723k7/ubHYPmPpCxvcU9w7P4yyM40PNTj9WrAdUVPfzdh/lK6x3+/1D7Tr2W8Fg8bBpHewMFVo9s3PxShBSUzsFnC6vAuSGLyHqa3rVtxVmEvbA/vhJqnNaJMHxlSVwn7kh0yQnNGZJ+EHepQRM1cttwk+8dxadnKDzZCVKXEyrbfAg7J0p/gdN4yjwZD5VvOYWDwNvTCyt/MeW3Xr9sa7CnqGsN+ElVf+WQ0V0vjQ52vwHK+FsTifF7DPzUcYgHJZxltGln8iyU3ZmKZl3ZFscSWu/lN9F9U+HDwvFDpLpve/MnogNgUdri0PCAWXSzWQfcKellrzIq+0ugxdBjgSplKjCDBpBIoxklZLroClWS7dbLhz6G4BNd7ZTxVyuzXgF9wgJ8PiDr247Zg3D3QIIL2VObzdQyrfUMF7glt44A70NTO/ScaRn41Qu4b/4rUhD+HS6fz1e38c8AxKRu04Ix7cK2cVp5qe9pLXMSIMSB6lLsX+WlOypun4fg2XZZi6HT5651q/QG0KVCfEw1cd7vVJ0Uq7kUKUMFkxHjV/y2MI5TGUXZt8iGKRw43ol6NsWOFQ7n85Iyt5nDjlQmK4ndQ4ni2GkuOQO5lMBSmqadffTQAZgW0RsW0NI0p0m9j1lEWPxPQSLUyhAQP+np3twIDHF5Gtlvuw6QzC3TfQdCS3ZyH4PEFl3Ww2z0rtZgPMO0gQe6lSY28UGCu/g0p7eSSAtuy4Y53Jd/uzzhmB+oVMEiBWoLb3bOky0jU89OTXR/jXDvBI1jtZvBnd7w1DZvu+z5AVriy2qyOw9B0GyThZl/S1oKX542Q92TkNEbkEnaBriPBZRISjndHme0vlomXMX45uYeWJQpfZMlhPSRxMfvFh98NXUSTfCp2+KGaCWjfeSRY3KDge8tpG9FvOhzDPr6jz2FlawJuqdvi8xoDxWLooQ5DlqwiCOU6TkleBjnoAQ49g10yVIoH3MWKN9UiQ5pUHATYAzlr2e7qbfIHMv4FtlRbgWNNs3ikpgCx9/h0vUiK5z9dBTiuqPAGiabcUp9Rdexe/cF7qrwBZsjP4nOyzj8t1Z21hA0znJNYj1ykRWluixc3gA3FmqsrFJtWQcu3ouh0FQPTylFNf8OjV0OMaLKVVrJh+0bholj1SKVElpMT3YYVp/Hsk1zQRcv7rhiMocG9sdr1HgmNxOmP2yISfxXwhHUjNU3I5t2S2z1FMKnzOprTLEB7A8AR72GIyDZ30BlW4dzek6g5RESGX8lYfOpWDZjs9l/tw1a6vDybV4ohrtjs8zJXkIrII53QTyLBf6qzVkeBd4rn9PwBndU/UPvionxr08eSyyfLq7g74cEQBUa+KmiatXku19nh5ZyTsdXFby73GKlAG1eZwsqbe65EnNa8F3QEWcxJXu12sgSeHF2/lwfVI0Isew3JeG9FlnJA2WUTJVKaDH2mTq9vfYuCXvnNlB+FYcYcCaN9U1U4JXFEctdPZd6trJz48yhaRBrFF9Nl7MyvExLDbM2ymyE98+hhOIZ6HU1XRM2wa5vHg0R9IFsUBylpEaafGT7paRL9Jz8HiKn51acUDnvtbPp6cEl6L0PkJN4cYkeS9tJI79cSCqGvVwOTUnHJBAW1kjotpqImwg4MvOYdDgAAqfeyv7drP9waO7ogNwsXu4w2Kg1XBcF165xRdgBBqovH/mptykUqx6wA",m=JSON.parse('{"title":"Мобильное меню, CSS","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase-data/mobile-menu.md","filePath":"ru/arty-crafty/showcase-data/mobile-menu.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/showcase-data/mobile-menu.md"},r=o("",13),s=[r];function d(l,S,i,p,g,u){return t(),a("div",null,s)}const y=e(c,[["render",d]]);export{m as __pageData,y as default}; +import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const n="data:image/webp;base64,UklGRsoGAABXRUJQVlA4IL4GAACQKgCdASqkAUgAPp1Inkylo6KiIfQLYLATiWlu3V9w1VZIHAAeVV7Hvk3arYz3/Z+FPk2ELtM+y+Nfka8T01pwFYyaikn7kd+c+gj0eNBbMgHvqqVJB3+5KqOLIr7MlVHFbVnJd+72uBEzsqWz0D342wKV42LpSJhbxacDp2OwmI+fiHrx/5Q6/WI64gklOFU3sXTuNWX5EgNOIwSHrhtvnGmOAGdYbvuyg1pspMhN0jPkzAXwJqqGC8YqabnBChmZd/qmSOFUDvT90ZJTJiHWX3vNLcDszvU5sJIUdFQfvgcnVaj8iPR2y9by46D3nYqx7AOS1blDll2X0vhzBJl4zPXGgBwWC/e8TbxiVfncRp24UoIgVoX1KeQAJ81k1/d0eX33M7C3O9q3eGQxMQkfgTeCsudTZQxhw0Ektmp2p2w37bp1AOaJ6LMFnWmFShlituF1N2a9arPoURXIAP7+zD3PmfHZPmUKEB/rCyvpz5ROQFLMCLZ0Yjt5ODHcS0m82laTXHdURxu9AhIafUlcSsIH8k2zbc5yJghUvP3C0bv/9neSP8TOwQ7pAk/5QPN31ZH448xZMcu1ugpPv3P723k7/ubHYPmPpCxvcU9w7P4yyM40PNTj9WrAdUVPfzdh/lK6x3+/1D7Tr2W8Fg8bBpHewMFVo9s3PxShBSUzsFnC6vAuSGLyHqa3rVtxVmEvbA/vhJqnNaJMHxlSVwn7kh0yQnNGZJ+EHepQRM1cttwk+8dxadnKDzZCVKXEyrbfAg7J0p/gdN4yjwZD5VvOYWDwNvTCyt/MeW3Xr9sa7CnqGsN+ElVf+WQ0V0vjQ52vwHK+FsTifF7DPzUcYgHJZxltGln8iyU3ZmKZl3ZFscSWu/lN9F9U+HDwvFDpLpve/MnogNgUdri0PCAWXSzWQfcKellrzIq+0ugxdBjgSplKjCDBpBIoxklZLroClWS7dbLhz6G4BNd7ZTxVyuzXgF9wgJ8PiDr247Zg3D3QIIL2VObzdQyrfUMF7glt44A70NTO/ScaRn41Qu4b/4rUhD+HS6fz1e38c8AxKRu04Ix7cK2cVp5qe9pLXMSIMSB6lLsX+WlOypun4fg2XZZi6HT5651q/QG0KVCfEw1cd7vVJ0Uq7kUKUMFkxHjV/y2MI5TGUXZt8iGKRw43ol6NsWOFQ7n85Iyt5nDjlQmK4ndQ4ni2GkuOQO5lMBSmqadffTQAZgW0RsW0NI0p0m9j1lEWPxPQSLUyhAQP+np3twIDHF5Gtlvuw6QzC3TfQdCS3ZyH4PEFl3Ww2z0rtZgPMO0gQe6lSY28UGCu/g0p7eSSAtuy4Y53Jd/uzzhmB+oVMEiBWoLb3bOky0jU89OTXR/jXDvBI1jtZvBnd7w1DZvu+z5AVriy2qyOw9B0GyThZl/S1oKX542Q92TkNEbkEnaBriPBZRISjndHme0vlomXMX45uYeWJQpfZMlhPSRxMfvFh98NXUSTfCp2+KGaCWjfeSRY3KDge8tpG9FvOhzDPr6jz2FlawJuqdvi8xoDxWLooQ5DlqwiCOU6TkleBjnoAQ49g10yVIoH3MWKN9UiQ5pUHATYAzlr2e7qbfIHMv4FtlRbgWNNs3ikpgCx9/h0vUiK5z9dBTiuqPAGiabcUp9Rdexe/cF7qrwBZsjP4nOyzj8t1Z21hA0znJNYj1ykRWluixc3gA3FmqsrFJtWQcu3ouh0FQPTylFNf8OjV0OMaLKVVrJh+0bholj1SKVElpMT3YYVp/Hsk1zQRcv7rhiMocG9sdr1HgmNxOmP2yISfxXwhHUjNU3I5t2S2z1FMKnzOprTLEB7A8AR72GIyDZ30BlW4dzek6g5RESGX8lYfOpWDZjs9l/tw1a6vDybV4ohrtjs8zJXkIrII53QTyLBf6qzVkeBd4rn9PwBndU/UPvionxr08eSyyfLq7g74cEQBUa+KmiatXku19nh5ZyTsdXFby73GKlAG1eZwsqbe65EnNa8F3QEWcxJXu12sgSeHF2/lwfVI0Isew3JeG9FlnJA2WUTJVKaDH2mTq9vfYuCXvnNlB+FYcYcCaN9U1U4JXFEctdPZd6trJz48yhaRBrFF9Nl7MyvExLDbM2ymyE98+hhOIZ6HU1XRM2wa5vHg0R9IFsUBylpEaafGT7paRL9Jz8HiKn51acUDnvtbPp6cEl6L0PkJN4cYkeS9tJI79cSCqGvVwOTUnHJBAW1kjotpqImwg4MvOYdDgAAqfeyv7drP9waO7ogNwsXu4w2Kg1XBcF165xRdgBBqovH/mptykUqx6wA",m=JSON.parse('{"title":"Мобильное меню, CSS","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase-data/mobile-menu.md","filePath":"ru/arty-crafty/showcase-data/mobile-menu.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/showcase-data/mobile-menu.md"},r=o("",13),s=[r];function d(l,S,i,p,g,u){return t(),a("div",null,s)}const y=e(c,[["render",d]]);export{m as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase_codeium.md.dlQlpzmR.js b/assets/ru_arty-crafty_showcase_codeium.md.vavWD1Qd.js similarity index 99% rename from assets/ru_arty-crafty_showcase_codeium.md.dlQlpzmR.js rename to assets/ru_arty-crafty_showcase_codeium.md.vavWD1Qd.js index 373310201..40ea32884 100644 --- a/assets/ru_arty-crafty_showcase_codeium.md.dlQlpzmR.js +++ b/assets/ru_arty-crafty_showcase_codeium.md.vavWD1Qd.js @@ -1,4 +1,4 @@ -import{_ as a,c as s,o as e,U as i}from"./chunks/framework.P5TqXf0g.js";const t="/assets/codeium-1.gKCzPkWo.jpg",o="/assets/codeium-2.OnH7ZaKW.jpg",n="/assets/codeium-3.gOzFtH7_.jpg",f=JSON.parse('{"title":"Codeium","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/codeium.md","filePath":"ru/arty-crafty/showcase/codeium.md","lastUpdated":1706427418000}'),r={name:"ru/arty-crafty/showcase/codeium.md"},p=i('

Codeium

Автокомплит

Codeium - это AI помощник, аналогичный Copilot, его бесплатная альтернатива. У него есть расширение для VS Code и других IDE.

В прошлой главе useFavourites был на 80% написан им с помощью автокомплита. Ты начинаешь писать название функции, он генерит её тело на основании контекста, ты клавишей Tab принимаешь его решение, либо выбираешь другое из предложенных с помощью комбинаций клавиш Alt + ] и Alt + [ (⌥ + ] и ⌥ + [ ):

image

Для подобных довольно простых по логике модулей и компонент Codeium генерит код достаточно точно. Удобно пользоваться.

Чтобы поточнее подсказать Codeium, что тебе надо, можно сперва написать комментарий о функции, которую надо сгенерить, и затем на следующей строке использовать автокомплит.

Чат-бот

Чат-бот для промптов есть в отдельной Codeium панели

Explain, Refactor, JSDoc

Над каждой функцией Codeium позволяет совершать определенные действия:

image

Например, Refactor -> Make this code strongly typed с небольшими правками дает следующее на listFavourites():

js
/**
+import{_ as a,c as s,o as e,U as i}from"./chunks/framework.P5TqXf0g.js";const t="/assets/codeium-1.gKCzPkWo.jpg",o="/assets/codeium-2.OnH7ZaKW.jpg",n="/assets/codeium-3.gOzFtH7_.jpg",f=JSON.parse('{"title":"Codeium","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/codeium.md","filePath":"ru/arty-crafty/showcase/codeium.md","lastUpdated":1706553672000}'),r={name:"ru/arty-crafty/showcase/codeium.md"},p=i('

Codeium

Автокомплит

Codeium - это AI помощник, аналогичный Copilot, его бесплатная альтернатива. У него есть расширение для VS Code и других IDE.

В прошлой главе useFavourites был на 80% написан им с помощью автокомплита. Ты начинаешь писать название функции, он генерит её тело на основании контекста, ты клавишей Tab принимаешь его решение, либо выбираешь другое из предложенных с помощью комбинаций клавиш Alt + ] и Alt + [ (⌥ + ] и ⌥ + [ ):

image

Для подобных довольно простых по логике модулей и компонент Codeium генерит код достаточно точно. Удобно пользоваться.

Чтобы поточнее подсказать Codeium, что тебе надо, можно сперва написать комментарий о функции, которую надо сгенерить, и затем на следующей строке использовать автокомплит.

Чат-бот

Чат-бот для промптов есть в отдельной Codeium панели

Explain, Refactor, JSDoc

Над каждой функцией Codeium позволяет совершать определенные действия:

image

Например, Refactor -> Make this code strongly typed с небольшими правками дает следующее на listFavourites():

js
/**
  * Returns a list of favorite products.
  *
  * @returns {Array<number>} - The list of favorite product IDs.
diff --git a/assets/ru_arty-crafty_showcase_codeium.md.dlQlpzmR.lean.js b/assets/ru_arty-crafty_showcase_codeium.md.vavWD1Qd.lean.js
similarity index 92%
rename from assets/ru_arty-crafty_showcase_codeium.md.dlQlpzmR.lean.js
rename to assets/ru_arty-crafty_showcase_codeium.md.vavWD1Qd.lean.js
index ed70b2935..290410c9e 100644
--- a/assets/ru_arty-crafty_showcase_codeium.md.dlQlpzmR.lean.js
+++ b/assets/ru_arty-crafty_showcase_codeium.md.vavWD1Qd.lean.js
@@ -1 +1 @@
-import{_ as a,c as s,o as e,U as i}from"./chunks/framework.P5TqXf0g.js";const t="/assets/codeium-1.gKCzPkWo.jpg",o="/assets/codeium-2.OnH7ZaKW.jpg",n="/assets/codeium-3.gOzFtH7_.jpg",f=JSON.parse('{"title":"Codeium","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/codeium.md","filePath":"ru/arty-crafty/showcase/codeium.md","lastUpdated":1706427418000}'),r={name:"ru/arty-crafty/showcase/codeium.md"},p=i("",23),l=[p];function c(h,d,k,u,m,g){return e(),s("div",null,l)}const _=a(r,[["render",c]]);export{f as __pageData,_ as default};
+import{_ as a,c as s,o as e,U as i}from"./chunks/framework.P5TqXf0g.js";const t="/assets/codeium-1.gKCzPkWo.jpg",o="/assets/codeium-2.OnH7ZaKW.jpg",n="/assets/codeium-3.gOzFtH7_.jpg",f=JSON.parse('{"title":"Codeium","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/codeium.md","filePath":"ru/arty-crafty/showcase/codeium.md","lastUpdated":1706553672000}'),r={name:"ru/arty-crafty/showcase/codeium.md"},p=i("",23),l=[p];function c(h,d,k,u,m,g){return e(),s("div",null,l)}const _=a(r,[["render",c]]);export{f as __pageData,_ as default};
diff --git a/assets/ru_arty-crafty_showcase_customization.md.Le45mzmr.js b/assets/ru_arty-crafty_showcase_customization.md.Le45mzmr.js
deleted file mode 100644
index 32ffff7ea..000000000
--- a/assets/ru_arty-crafty_showcase_customization.md.Le45mzmr.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import{_ as a,c,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const e="/assets/header-1.2JwfDLlb.gif",i="/assets/website-1.oaXSktFw.gif",E=JSON.parse('{"title":"Кастомизация","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/customization.md","filePath":"ru/arty-crafty/showcase/customization.md","lastUpdated":1706427418000}'),d={name:"ru/arty-crafty/showcase/customization.md"},b=s(`

Кастомизация

Персонализация

Заменим везде имя на "Arty-Crafty", изменим описание в package.json. Найдем в интернете подходящую иконку для логотипа, и заменим штатную.

Теперь скроем сайдбар в tablet и desktop режимах, потому что в нем должен быть каталог только в мобильном режиме. Для других каталог будет из меню в хедере.

Далее, мы будем делать приложение в модульной архитектуре. Общие компоненты, утилиты, композаблы и ресурсы у нас будут в модуле app, то, что относится к каталогу, категориям товаров и самим товарам - в products, и так далее. Поэтому нужно в src создать дирректорию app и перенести всё в неё, с заменой путей, где надо.

Загружаем все на GitHub и ставим тэг - v0.1. Для этого нужно опубликовать релиз.

Views

Чистим главную страницу, i18n убираем пока подальше. Переименовываем основные view на:

  • HomeView (остается)
  • ProductCategoryView
  • ProductView

Замечание

Предпочтительно использовать термин View, а не Page потому, что View может быть частью другого View, а Page - нет (семантически).

ProductCategoryView и ProductView убираем в директорию views модуля products.

Routes

Обновляем routes. Добавляем роуты для product, category, favourites, cart и login

js
const routes: RouteRecordRaw[] = [
-  // ...
-  {
-    path: "/product/:productId",
-    name: "product",
-    component: ProductView,
-  },
-  {
-    path: "/category/:categoryId",
-    name: "category",
-    component: ProductCategoryView,
-  },
-  {
-    path: "/favourites",
-    name: "favourites",
-    component: ProductCategoryView,
-  },
-  // ...
-];

Маршруты пока оставляем в главном модуле, при росте их числа - разобьем.

Отмечаем, что в солидных магазинах ссылка на категорию выглядит примерно так: /category/muzhskaya-odezhda-7542/. То есть, slug названия категории и её id. У нас будет пока только categoryId, но в дальнейшем мы сделаем такую человеко-понятную ссылку - это полезно для UX и для SEO. То же самое с продуктами.

Делаем хедер - с лого, поисковой строкой, иконками корзины, логина/аккаунта, избранного справа, и снизу меню с 2-3 категориями.

На аналогичных сайтах поисковая строка может быть весьма непростой - с выпадающим меню с подсказками, например, или каталогом. Поэтому сразу выделим её в отдельный компонент - AppSearchBar. Находим в интернете подходящую стилизацию input и используем её.

Подходящие иконки можно поискать на iconbuddy.app и icones.js.org. Для их отображения используем BaseIcon.

Добавляем немного эффектов, адаптивности, и получаем:

image

В выдвигающемся слева сайдбаре также захардкодим несколько категорий. Более тщательную кастомизацию оставим на потом.

В итоге:

image

Небольшой рефакторинг

Переименуем наш кастомизированный компонент MantineSimpleHeader в AppHeader и все остальные также.

Загружаем в репозиторий и ставим тэг - v0.2.

',29),n=[b];function o(p,r,l,h,f,v){return t(),c("div",null,n)}const g=a(d,[["render",o],["__scopeId","data-v-bf9cac6b"]]);export{E as __pageData,g as default}; diff --git a/assets/ru_arty-crafty_showcase_customization.md.Le45mzmr.lean.js b/assets/ru_arty-crafty_showcase_customization.md.Le45mzmr.lean.js deleted file mode 100644 index 9af477c26..000000000 --- a/assets/ru_arty-crafty_showcase_customization.md.Le45mzmr.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const e="/assets/header-1.2JwfDLlb.gif",i="/assets/website-1.oaXSktFw.gif",E=JSON.parse('{"title":"Кастомизация","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/customization.md","filePath":"ru/arty-crafty/showcase/customization.md","lastUpdated":1706427418000}'),d={name:"ru/arty-crafty/showcase/customization.md"},b=s("",29),n=[b];function o(p,r,l,h,f,v){return t(),c("div",null,n)}const g=a(d,[["render",o],["__scopeId","data-v-bf9cac6b"]]);export{E as __pageData,g as default}; diff --git a/assets/ru_arty-crafty_showcase_customization.md.ZXmxQW2W.js b/assets/ru_arty-crafty_showcase_customization.md.ZXmxQW2W.js new file mode 100644 index 000000000..39690170d --- /dev/null +++ b/assets/ru_arty-crafty_showcase_customization.md.ZXmxQW2W.js @@ -0,0 +1,19 @@ +import{_ as a,c as e,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const i="/assets/header-1.2JwfDLlb.gif",c="/assets/website-1.oaXSktFw.gif",u=JSON.parse('{"title":"Кастомизация","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/customization.md","filePath":"ru/arty-crafty/showcase/customization.md","lastUpdated":1706553672000}'),d={name:"ru/arty-crafty/showcase/customization.md"},n=s(`

Кастомизация

Персонализация

Заменим везде имя на "Arty-Crafty", изменим описание в package.json. Найдем в интернете подходящую иконку для логотипа, и заменим штатную.

Теперь скроем сайдбар в tablet и desktop режимах, потому что в нем должен быть каталог только в мобильном режиме. Для других каталог будет из меню в хедере.

Далее, мы будем делать приложение в модульной архитектуре. Общие компоненты, утилиты, композаблы и ресурсы у нас будут в модуле app, то, что относится к каталогу, категориям товаров и самим товарам - в products, и так далее. Поэтому нужно в src создать дирректорию app и перенести всё в неё, с заменой путей, где надо.

Загружаем все на GitHub и ставим тэг - v0.1. Для этого нужно опубликовать релиз.

Views

Чистим главную страницу, i18n убираем пока подальше. Переименовываем основные view на:

  • HomeView (остается)
  • ProductCategoryView
  • ProductView

Замечание

Предпочтительно использовать термин View, а не Page потому, что View может быть частью другого View, а Page - нет (семантически).

ProductCategoryView и ProductView убираем в директорию views модуля products.

Routes

Обновляем routes. Добавляем роуты для product, category, favourites, cart и login

js
const routes: RouteRecordRaw[] = [
+  // ...
+  {
+    path: "/product/:productId",
+    name: "product",
+    component: ProductView,
+  },
+  {
+    path: "/category/:categoryId",
+    name: "category",
+    component: ProductCategoryView,
+  },
+  {
+    path: "/favourites",
+    name: "favourites",
+    component: ProductCategoryView,
+  },
+  // ...
+];

Маршруты пока оставляем в главном модуле, при росте их числа - разобьем.

Отмечаем, что в солидных магазинах ссылка на категорию выглядит примерно так: /category/muzhskaya-odezhda-7542/. То есть, slug названия категории и её id. У нас будет пока только categoryId, но в дальнейшем мы сделаем такую человеко-понятную ссылку - это полезно для UX и для SEO. То же самое с продуктами.

Делаем хедер - с лого, поисковой строкой, иконками корзины, логина/аккаунта, избранного справа, и снизу меню с 2-3 категориями.

На аналогичных сайтах поисковая строка может быть весьма непростой - с выпадающим меню с подсказками, например, или каталогом. Поэтому сразу выделим её в отдельный компонент - AppSearchBar. Находим в интернете подходящую стилизацию input и используем её.

Подходящие иконки можно поискать на iconbuddy.app и icones.js.org. Для их отображения используем BaseIcon.

Добавляем немного эффектов, адаптивности, и получаем:

image

В выдвигающемся слева сайдбаре также захардкодим несколько категорий. Более тщательную кастомизацию оставим на потом.

В итоге:

image

Небольшой рефакторинг

Переименуем наш кастомизированный компонент MantineSimpleHeader в AppHeader и все остальные также.

Загружаем в репозиторий и ставим тэг - v0.2.

',29),o=[n];function p(r,l,h,v,k,E){return t(),e("div",null,o)}const y=a(d,[["render",p],["__scopeId","data-v-c283e5e5"]]);export{u as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase_customization.md.ZXmxQW2W.lean.js b/assets/ru_arty-crafty_showcase_customization.md.ZXmxQW2W.lean.js new file mode 100644 index 000000000..919e0940f --- /dev/null +++ b/assets/ru_arty-crafty_showcase_customization.md.ZXmxQW2W.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const i="/assets/header-1.2JwfDLlb.gif",c="/assets/website-1.oaXSktFw.gif",u=JSON.parse('{"title":"Кастомизация","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/customization.md","filePath":"ru/arty-crafty/showcase/customization.md","lastUpdated":1706553672000}'),d={name:"ru/arty-crafty/showcase/customization.md"},n=s("",29),o=[n];function p(r,l,h,v,k,E){return t(),e("div",null,o)}const y=a(d,[["render",p],["__scopeId","data-v-c283e5e5"]]);export{u as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase_favourites.md.vOEdr0Y2.js b/assets/ru_arty-crafty_showcase_favourites.md.UXzQaial.js similarity index 99% rename from assets/ru_arty-crafty_showcase_favourites.md.vOEdr0Y2.js rename to assets/ru_arty-crafty_showcase_favourites.md.UXzQaial.js index 5e6af335a..36d1d33cc 100644 --- a/assets/ru_arty-crafty_showcase_favourites.md.vOEdr0Y2.js +++ b/assets/ru_arty-crafty_showcase_favourites.md.UXzQaial.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Избранное","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/favourites.md","filePath":"ru/arty-crafty/showcase/favourites.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/showcase/favourites.md"},h=t(`

Избранное

Иконка на карточке товара

При работе в карточками товара у нас появилась необходимость в "Избранном". На каждой карточке есть иконка "сердечка", которая при клике загорается или гаснет, - товар кладется в "Избранное" или убирается оттуда. Кроме того, есть отдельная страница "Избранное", показывающая все товары из него в том же виде, что и любая категория. А так же в главном AppHeader у нас есть иконка/ссылка "Избранное" с бэджиком, показывающим число товаров в нём.

Это первый случай, когда в приложении нужно использовать то, что на фронтенде гордо называется state, для своей работы требующий отдельный state manager. Благо, Vue 3 Composition API низвело этого царька до рядового члена команды, и с ним теперь можно работать как с обычной переменной, только реактивной.

Композабл useFavourites

В композабле useFavourites для вышеуказанных задач нужны три функции: toggleFavourite, listFavourites, isInFavourites (чтобы подсвечивать иконку "сердечка").

Сам код
js
// src/producs/composables/useFavourites.ts
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Избранное","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/favourites.md","filePath":"ru/arty-crafty/showcase/favourites.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/showcase/favourites.md"},h=t(`

Избранное

Иконка на карточке товара

При работе в карточками товара у нас появилась необходимость в "Избранном". На каждой карточке есть иконка "сердечка", которая при клике загорается или гаснет, - товар кладется в "Избранное" или убирается оттуда. Кроме того, есть отдельная страница "Избранное", показывающая все товары из него в том же виде, что и любая категория. А так же в главном AppHeader у нас есть иконка/ссылка "Избранное" с бэджиком, показывающим число товаров в нём.

Это первый случай, когда в приложении нужно использовать то, что на фронтенде гордо называется state, для своей работы требующий отдельный state manager. Благо, Vue 3 Composition API низвело этого царька до рядового члена команды, и с ним теперь можно работать как с обычной переменной, только реактивной.

Композабл useFavourites

В композабле useFavourites для вышеуказанных задач нужны три функции: toggleFavourite, listFavourites, isInFavourites (чтобы подсвечивать иконку "сердечка").

Сам код
js
// src/producs/composables/useFavourites.ts
 import { ref } from "vue";
 
 const favourites = ref < Set < number >> (new Set());
diff --git a/assets/ru_arty-crafty_showcase_favourites.md.vOEdr0Y2.lean.js b/assets/ru_arty-crafty_showcase_favourites.md.UXzQaial.lean.js
similarity index 83%
rename from assets/ru_arty-crafty_showcase_favourites.md.vOEdr0Y2.lean.js
rename to assets/ru_arty-crafty_showcase_favourites.md.UXzQaial.lean.js
index 22487ad5d..b6bde4912 100644
--- a/assets/ru_arty-crafty_showcase_favourites.md.vOEdr0Y2.lean.js
+++ b/assets/ru_arty-crafty_showcase_favourites.md.UXzQaial.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Избранное","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/favourites.md","filePath":"ru/arty-crafty/showcase/favourites.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/showcase/favourites.md"},h=t("",25),e=[h];function l(k,p,r,E,d,o){return a(),i("div",null,e)}const y=s(n,[["render",l]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Избранное","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/favourites.md","filePath":"ru/arty-crafty/showcase/favourites.md","lastUpdated":1706553672000}'),n={name:"ru/arty-crafty/showcase/favourites.md"},h=t("",25),e=[h];function l(k,p,r,E,d,o){return a(),i("div",null,e)}const y=s(n,[["render",l]]);export{c as __pageData,y as default};
diff --git a/assets/ru_arty-crafty_showcase_product-category.md.tupoR0jK.js b/assets/ru_arty-crafty_showcase_product-category.md.D13vdiVu.js
similarity index 98%
rename from assets/ru_arty-crafty_showcase_product-category.md.tupoR0jK.js
rename to assets/ru_arty-crafty_showcase_product-category.md.D13vdiVu.js
index 416c8916a..b1913392d 100644
--- a/assets/ru_arty-crafty_showcase_product-category.md.tupoR0jK.js
+++ b/assets/ru_arty-crafty_showcase_product-category.md.D13vdiVu.js
@@ -1 +1 @@
-import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const r="/assets/product-category.K5z70KMk.jpg",g=JSON.parse('{"title":"Категория товаров","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/product-category.md","filePath":"ru/arty-crafty/showcase/product-category.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/showcase/product-category.md"},s=o('

Категория товаров

Layout

Страница категории товаров выглядит как идущие рядами и колонками карточки товаров. Число колонок зависит от ширины экрана. В мобильном варианте - только одна колонка на ширину устройства.

Сверху страницы название категории, возможно её описание и breadcrumbs (путь к категории в каталоге).

Карточки разместить можно с помощью flexbox (flex-wrap) и grid. Мне привычнее первый, поэтому использую его. Для самой карточки товара создаем компонент ProductCard.

image

Данные и API

Если посмотреть другие магазины, то на карточках товара обычно одна или несколько картинок, название, краткое описание, стоимость, дополнительная информация (рейтинг, скидка, вес, материал и т.п.)

Данные будем получать по сети. Лежать они будут в json файлах в директории public/api. Создадим несколько файлов вроде category-products-3.json.

Как может быть устроена схема REST API на бэкенде для серьезных магазинов можно посмотреть на примере Magento WebAPI.

',10),d=[s];function n(p,i,l,_,m,u){return t(),a("div",null,d)}const y=e(c,[["render",n]]);export{g as __pageData,y as default}; +import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const r="/assets/product-category.K5z70KMk.jpg",g=JSON.parse('{"title":"Категория товаров","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/product-category.md","filePath":"ru/arty-crafty/showcase/product-category.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/showcase/product-category.md"},s=o('

Категория товаров

Layout

Страница категории товаров выглядит как идущие рядами и колонками карточки товаров. Число колонок зависит от ширины экрана. В мобильном варианте - только одна колонка на ширину устройства.

Сверху страницы название категории, возможно её описание и breadcrumbs (путь к категории в каталоге).

Карточки разместить можно с помощью flexbox (flex-wrap) и grid. Мне привычнее первый, поэтому использую его. Для самой карточки товара создаем компонент ProductCard.

image

Данные и API

Если посмотреть другие магазины, то на карточках товара обычно одна или несколько картинок, название, краткое описание, стоимость, дополнительная информация (рейтинг, скидка, вес, материал и т.п.)

Данные будем получать по сети. Лежать они будут в json файлах в директории public/api. Создадим несколько файлов вроде category-products-3.json.

Как может быть устроена схема REST API на бэкенде для серьезных магазинов можно посмотреть на примере Magento WebAPI.

',10),d=[s];function n(p,i,l,_,m,u){return t(),a("div",null,d)}const y=e(c,[["render",n]]);export{g as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase_product-category.md.tupoR0jK.lean.js b/assets/ru_arty-crafty_showcase_product-category.md.D13vdiVu.lean.js similarity index 92% rename from assets/ru_arty-crafty_showcase_product-category.md.tupoR0jK.lean.js rename to assets/ru_arty-crafty_showcase_product-category.md.D13vdiVu.lean.js index 285d44fd1..32ce83fbd 100644 --- a/assets/ru_arty-crafty_showcase_product-category.md.tupoR0jK.lean.js +++ b/assets/ru_arty-crafty_showcase_product-category.md.D13vdiVu.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const r="/assets/product-category.K5z70KMk.jpg",g=JSON.parse('{"title":"Категория товаров","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/product-category.md","filePath":"ru/arty-crafty/showcase/product-category.md","lastUpdated":1706427418000}'),c={name:"ru/arty-crafty/showcase/product-category.md"},s=o("",10),d=[s];function n(p,i,l,_,m,u){return t(),a("div",null,d)}const y=e(c,[["render",n]]);export{g as __pageData,y as default}; +import{_ as e,c as a,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const r="/assets/product-category.K5z70KMk.jpg",g=JSON.parse('{"title":"Категория товаров","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/product-category.md","filePath":"ru/arty-crafty/showcase/product-category.md","lastUpdated":1706553672000}'),c={name:"ru/arty-crafty/showcase/product-category.md"},s=o("",10),d=[s];function n(p,i,l,_,m,u){return t(),a("div",null,d)}const y=e(c,[["render",n]]);export{g as __pageData,y as default}; diff --git a/assets/ru_arty-crafty_showcase_project-setup.md.CqGYaox8.js b/assets/ru_arty-crafty_showcase_project-setup.md.CqGYaox8.js new file mode 100644 index 000000000..97b060cad --- /dev/null +++ b/assets/ru_arty-crafty_showcase_project-setup.md.CqGYaox8.js @@ -0,0 +1,21 @@ +import{_ as a,c as d,o as s,U as i}from"./chunks/framework.P5TqXf0g.js";const t="/assets/project-setup.hs31F5ED.png",y=JSON.parse('{"title":"Создание проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/project-setup.md","filePath":"ru/arty-crafty/showcase/project-setup.md","lastUpdated":1706553672000}'),h={name:"ru/arty-crafty/showcase/project-setup.md"},n=i(`

Создание проекта

Репозиторий на GitHub

Создаем репозиторий на GitHub, клонируем локально

sh
$ git clone https://github.com/vuesence/arty-crafty.git

vue-webapp

Используем, естественно, vue-webapp для создания скелета проекта со следующими опциями:

sh
$ cd arty-crafty
+$ pnpm create vue-webapp .
+
+ Project name: ... arty-crafty
+ Add a Splash screen? ... yes
+ Make it PWA (adds service worker and manifest)? ... yes
+ Add Open Graph meta tags? ... yes
+ Add Google Analytics code? ... no
+ Add Github Action Workflow for publishing it on GitHub Pages? ... yes
+ Select application layout » MainLayout
+ Select navigation drawer » TouchSlideoutDrawer
+ Select webapp navbar » MantineSimpleNavbar
+ Select webapp header » MantineSimpleHeader
+ Select webapp footer » MantineSimpleFooter
+ Add light version of i18n? ... yes
+ Add API layer (REST)? ... yes
+ Add JSON-RPC adapter? ... no
+ Current directory is not empty. Please choose how to proceed: » Ignore files and continue
+
+Scaffolding project in \\Vuesence\\arty-crafty...

Запускаем:

sh
$ pnpm i
+$ pnpm dev

Работает:

image

Теперь ставим base: "/arty-crafty/" в vite.config.ts. Также надо поставить этот префикс перед путями в инъекциях sw.js и splash-screen.html, и в путях к иконкам в manifest.json. При хостинге со своим доменом нужно будет этот префикс убрать.

Загружаем все на GitHub.

Далее настраиваем GitHub Pages и получаем наш сайт по адресу: https://vuesence.github.io/arty-crafty/

Сайт задеплоится сам автоматически из-за того, что у нас есть соответствующий GitHub Actions Workflow файл в проекте. Ветка gh-pages тоже создастся автоматически.

Теперь закомментируем подключение service-worker.js в файле sw.js - во время разработки кэширование сильно мешает. Включим его уже в продакшне.

',16),p=[n];function k(e,l,F,r,f,v){return s(),d("div",null,p)}const C=a(h,[["render",k],["__scopeId","data-v-ad8ddfa1"]]);export{y as __pageData,C as default}; diff --git a/assets/ru_arty-crafty_showcase_project-setup.md._7BDFCyp.lean.js b/assets/ru_arty-crafty_showcase_project-setup.md.CqGYaox8.lean.js similarity index 55% rename from assets/ru_arty-crafty_showcase_project-setup.md._7BDFCyp.lean.js rename to assets/ru_arty-crafty_showcase_project-setup.md.CqGYaox8.lean.js index 9882b27a0..cfb530594 100644 --- a/assets/ru_arty-crafty_showcase_project-setup.md._7BDFCyp.lean.js +++ b/assets/ru_arty-crafty_showcase_project-setup.md.CqGYaox8.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const h="/assets/project-setup.hs31F5ED.png",y=JSON.parse('{"title":"Создание проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/project-setup.md","filePath":"ru/arty-crafty/showcase/project-setup.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/showcase/project-setup.md"},p=t("",16),k=[p];function d(e,l,F,r,b,v){return i(),s("div",null,k)}const C=a(n,[["render",d],["__scopeId","data-v-339a24b8"]]);export{y as __pageData,C as default}; +import{_ as a,c as d,o as s,U as i}from"./chunks/framework.P5TqXf0g.js";const t="/assets/project-setup.hs31F5ED.png",y=JSON.parse('{"title":"Создание проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/project-setup.md","filePath":"ru/arty-crafty/showcase/project-setup.md","lastUpdated":1706553672000}'),h={name:"ru/arty-crafty/showcase/project-setup.md"},n=i("",16),p=[n];function k(e,l,F,r,f,v){return s(),d("div",null,p)}const C=a(h,[["render",k],["__scopeId","data-v-ad8ddfa1"]]);export{y as __pageData,C as default}; diff --git a/assets/ru_arty-crafty_showcase_project-setup.md._7BDFCyp.js b/assets/ru_arty-crafty_showcase_project-setup.md._7BDFCyp.js deleted file mode 100644 index b516b54d7..000000000 --- a/assets/ru_arty-crafty_showcase_project-setup.md._7BDFCyp.js +++ /dev/null @@ -1,21 +0,0 @@ -import{_ as a,c as s,o as i,U as t}from"./chunks/framework.P5TqXf0g.js";const h="/assets/project-setup.hs31F5ED.png",y=JSON.parse('{"title":"Создание проекта","description":"","frontmatter":{"pageClass":"arty-crafty","head":[["meta",{"name":"og:site_name","content":"Arty-Crafty - проект онлайн магазина"}],["meta",{"name":"og:image","content":"/images/arty-crafty-logo.png"}],["meta",{"name":"twitter:image","content":"/images/arty-crafty-logo.png"}]]},"headers":[],"relativePath":"ru/arty-crafty/showcase/project-setup.md","filePath":"ru/arty-crafty/showcase/project-setup.md","lastUpdated":1706427418000}'),n={name:"ru/arty-crafty/showcase/project-setup.md"},p=t(`

Создание проекта

Репозиторий на GitHub

Создаем репозиторий на GitHub, клонируем локально

sh
$ git clone https://github.com/vuesence/arty-crafty.git

vue-webapp

Используем, естественно, vue-webapp для создания скелета проекта со следующими опциями:

sh
$ cd arty-crafty
-$ pnpm create vue-webapp .
-
- Project name: ... arty-crafty
- Add a Splash screen? ... yes
- Make it PWA (adds service worker and manifest)? ... yes
- Add Open Graph meta tags? ... yes
- Add Google Analytics code? ... no
- Add Github Action Workflow for publishing it on GitHub Pages? ... yes
- Select application layout » MainLayout
- Select navigation drawer » TouchSlideoutDrawer
- Select webapp navbar » MantineSimpleNavbar
- Select webapp header » MantineSimpleHeader
- Select webapp footer » MantineSimpleFooter
- Add light version of i18n? ... yes
- Add API layer (REST)? ... yes
- Add JSON-RPC adapter? ... no
- Current directory is not empty. Please choose how to proceed: » Ignore files and continue
-
-Scaffolding project in \\Vuesence\\arty-crafty...

Запускаем:

sh
$ pnpm i
-$ pnpm dev

Работает:

image

Теперь ставим base: "/arty-crafty/" в vite.config.ts. Также надо поставить этот префикс перед путями в инъекциях sw.js и splash-screen.html, и в путях к иконкам в manifest.json. При хостинге со своим доменом нужно будет этот префикс убрать.

Загружаем все на GitHub.

Далее настраиваем GitHub Pages и получаем наш сайт по адресу: https://vuesence.github.io/arty-crafty/

Сайт задеплоится сам автоматически из-за того, что у нас есть соответствующий GitHub Actions Workflow файл в проекте. Ветка gh-pages тоже создастся автоматически.

Теперь закомментируем подключение service-worker.js в файле sw.js - во время разработки кэширование сильно мешает. Включим его уже в продакшне.

',16),k=[p];function d(e,l,F,r,b,v){return i(),s("div",null,k)}const C=a(n,[["render",d],["__scopeId","data-v-339a24b8"]]);export{y as __pageData,C as default}; diff --git a/assets/ru_backend_api.md.adFG6R4x.js b/assets/ru_backend_api.md.Dzes0lIw.js similarity index 99% rename from assets/ru_backend_api.md.adFG6R4x.js rename to assets/ru_backend_api.md.Dzes0lIw.js index d2b7a6124..b142199a3 100644 --- a/assets/ru_backend_api.md.adFG6R4x.js +++ b/assets/ru_backend_api.md.Dzes0lIw.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Абстракция канала связи с бэкендом","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/api.md","filePath":"ru/backend/api.md","lastUpdated":1706427418000}'),t={name:"ru/backend/api.md"},p=n(`

Абстракция канала связи с бэкендом

API сервис

Для осуществления вызовов на бэк удобно выделить код, связанный с транспортным уровнем (формирование и отправка запроса) в отдельный js модуль.

Тогда в вашем компоненте доступ к вашему бэкенду будет выглядеть примерно так:

js
import { api } from "@/services/api";
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Абстракция канала связи с бэкендом","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/api.md","filePath":"ru/backend/api.md","lastUpdated":1706553672000}'),t={name:"ru/backend/api.md"},p=n(`

Абстракция канала связи с бэкендом

API сервис

Для осуществления вызовов на бэк удобно выделить код, связанный с транспортным уровнем (формирование и отправка запроса) в отдельный js модуль.

Тогда в вашем компоненте доступ к вашему бэкенду будет выглядеть примерно так:

js
import { api } from "@/services/api";
 
 // loading.value = true;
 const userData = await api.users.getUserData({ userId });
diff --git a/assets/ru_backend_api.md.adFG6R4x.lean.js b/assets/ru_backend_api.md.Dzes0lIw.lean.js
similarity index 86%
rename from assets/ru_backend_api.md.adFG6R4x.lean.js
rename to assets/ru_backend_api.md.Dzes0lIw.lean.js
index e3204a80a..cedf7d035 100644
--- a/assets/ru_backend_api.md.adFG6R4x.lean.js
+++ b/assets/ru_backend_api.md.Dzes0lIw.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Абстракция канала связи с бэкендом","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/api.md","filePath":"ru/backend/api.md","lastUpdated":1706427418000}'),t={name:"ru/backend/api.md"},p=n("",13),h=[p];function k(l,e,E,r,d,o){return a(),i("div",null,h)}const y=s(t,[["render",k]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Абстракция канала связи с бэкендом","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/api.md","filePath":"ru/backend/api.md","lastUpdated":1706553672000}'),t={name:"ru/backend/api.md"},p=n("",13),h=[p];function k(l,e,E,r,d,o){return a(),i("div",null,h)}const y=s(t,[["render",k]]);export{c as __pageData,y as default};
diff --git a/assets/ru_backend_auth.md.RuQFau0I.js b/assets/ru_backend_auth.md.DlcF9MHz.js
similarity index 99%
rename from assets/ru_backend_auth.md.RuQFau0I.js
rename to assets/ru_backend_auth.md.DlcF9MHz.js
index be0e2f36c..ba4c8d82a 100644
--- a/assets/ru_backend_auth.md.RuQFau0I.js
+++ b/assets/ru_backend_auth.md.DlcF9MHz.js
@@ -1 +1 @@
-import{_ as e,c as a,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Аутентификация и авторизация","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/auth.md","filePath":"ru/backend/auth.md","lastUpdated":1706427418000}'),o={name:"ru/backend/auth.md"},l=s('

Аутентификация и авторизация

Что такое аутентификация и авторизация

Грубо говоря:

Аутентификация - когда система удостоверяется, что в неё залогинился именно Вася Пупкин, например, проверив его логин и пароль

Авторизация - когда система удостоверяется, что запрашивающий ресурс/действие пользователь имеет право доступа к нему. Например, старший менеджер имеет право удаления товара в админке, а простой менеджер - нет.

Как сделать систему аутентификации на сайта

Для SPA самый распространенный способ - на JWT токенах. Вариантов это сделать много, в зависимости от требований уровня безопасности (личный блог Васи Пупкина с комментариями гостей и онлайн магазин с депозитами и бонусами - две большие разницы).

JWT - это стандарт записи небольшого количества информации в строку (токен) и подписывания её (криптография). Делает это бэкенд. Таким образом только бэкенд может удостовериться, что токен выписан им, и в нем действительная информация.

Стандарта аутентификация на токенах как такового нет, есть лучшие практики.

Варианты:

  1. Бэкенд генерит токен (access token - AT) и кладет в httpOnly cookie. Фронтэнд доступа к токену не имеет, браузер просто возвращает куку. Метод незаслужено редко используемый, но вполне надежный. С фронта снимаются все заморочки по манипуляции с АТ.

Сценарий:

  • Фронт логинится, получает данные пользователя с бэка и работает с ними. При получении при любом запросе 401 - направляет пользователя на форму логина, обнуляет данные пользователя.
  • Бэк при логине создает httpOnly cookie с токеном с определенным сроком жизни. На каждом запросе проверяет токен, определяет того, кому выписан этот токен и его права, и дальше решает разрешать ли доступ. Если срок жизни токена кончился - возвращает 401.
  1. Бэкенд генерит токен (access token - AT) и передаёт фронту. Фронт сохраняет его и каждый раз отправляет его обратно. По сути то же самое, что и в первом случае, плюс лишние телодвижения и возможность потерять токен через XSS.

  2. Используются два токена - короткоживущий access token (AT) и дольше живущий refresh token (RT) пересылаемый в httpOnly cookie. AT работает как во втором случае. Когда записанный в нем срок его жизни кончается, бэкенд проверяет RT, и если он валиден, обновляет AT. Кончается RT - пользователь направляется на перелогин.

Подробнее по данной теме можно ознакомиться в, например, этой статье

Где хранить access token на фронте?

В 95% случаев в LocalStorage. Необходимо также дублировать его в обычной JS переменной, потому что, например, у iPhone при слабом заряде включается политика энергосбережения, в результате чего localStorage может постоянно очищаться браузером.

Что такое oAuth и SSO?

oAuth - Логин "через Google". Также когда, например, у пользователь есть возможность на твоем сайте сохранить что-то в Google Drive. Чтобы получить разрешение для твоего сайта работы с Google Drive аккаунтом пользователя, ты просишь его дать через Google разрешения твоему сайту лазить в его аккаунт. Итого у нас есть четыре части - Google (авторизационный центр), сторонний ресурс (Google Drive), твой сайт и пользователь

SSO - single sign-on - логин пользователя на портал некой компании один раз, и затем прозрачный доступ на разные его сервисы. Например, логин в GMail и доступ в сразу в Google Диск, Google Photo и так далее.

Дает ли аутентификация через JWT безопасность?

Безопасность - очень комплексное понятие, аутентификация через JWT - всего лишь один из её элементов. Для критичных приложений можно снимать отпечаток системы пользователя (browser fingerprint) и заставлять пользователя перелогиниваться как только он изменился. То же самое с IP. Таким образом можно бороться с кражей АТ. Также ставить очень маленький срок жизни AT, если используется RT. Но основные меры безопасности связаны не с аутентификацией, а с постоянным мониторингом системы на подозрительные действия.

Авторизация

Если нужно давать пользователям разный уровень доступа к ресурсам сайта, то обычно применяется или RBAC (Role-based access control) или PBA - Policy-Based Authorization (Permission-Based Authorization).

В первом случае пользователи распределяются по ролям (админ, менеджер, юзер) и уровень доступа определяется ролью.

Во-втором можно более гранулировано задать разрешение каждому пользователю индивидуально на любое действие.

Нужно понимать, что на фронте авторизация делается для удобства (пользователь не видит разделы сайта, которые ему запрещены), но за безопасность отвечает бэк - он должен проверять каждый раз, имеет ли пользователь право доступа к запрашиваемому ресурсу, даже если на фронте его как бы видно не должно быть. Сломать фронт - очень несложно.

',7),i=[l];function r(c,p,n,d,m,u){return t(),a("div",null,i)}const k=e(o,[["render",r]]);export{_ as __pageData,k as default}; +import{_ as e,c as a,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Аутентификация и авторизация","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/auth.md","filePath":"ru/backend/auth.md","lastUpdated":1706553672000}'),o={name:"ru/backend/auth.md"},l=s('

Аутентификация и авторизация

Что такое аутентификация и авторизация

Грубо говоря:

Аутентификация - когда система удостоверяется, что в неё залогинился именно Вася Пупкин, например, проверив его логин и пароль

Авторизация - когда система удостоверяется, что запрашивающий ресурс/действие пользователь имеет право доступа к нему. Например, старший менеджер имеет право удаления товара в админке, а простой менеджер - нет.

Как сделать систему аутентификации на сайта

Для SPA самый распространенный способ - на JWT токенах. Вариантов это сделать много, в зависимости от требований уровня безопасности (личный блог Васи Пупкина с комментариями гостей и онлайн магазин с депозитами и бонусами - две большие разницы).

JWT - это стандарт записи небольшого количества информации в строку (токен) и подписывания её (криптография). Делает это бэкенд. Таким образом только бэкенд может удостовериться, что токен выписан им, и в нем действительная информация.

Стандарта аутентификация на токенах как такового нет, есть лучшие практики.

Варианты:

  1. Бэкенд генерит токен (access token - AT) и кладет в httpOnly cookie. Фронтэнд доступа к токену не имеет, браузер просто возвращает куку. Метод незаслужено редко используемый, но вполне надежный. С фронта снимаются все заморочки по манипуляции с АТ.

Сценарий:

  • Фронт логинится, получает данные пользователя с бэка и работает с ними. При получении при любом запросе 401 - направляет пользователя на форму логина, обнуляет данные пользователя.
  • Бэк при логине создает httpOnly cookie с токеном с определенным сроком жизни. На каждом запросе проверяет токен, определяет того, кому выписан этот токен и его права, и дальше решает разрешать ли доступ. Если срок жизни токена кончился - возвращает 401.
  1. Бэкенд генерит токен (access token - AT) и передаёт фронту. Фронт сохраняет его и каждый раз отправляет его обратно. По сути то же самое, что и в первом случае, плюс лишние телодвижения и возможность потерять токен через XSS.

  2. Используются два токена - короткоживущий access token (AT) и дольше живущий refresh token (RT) пересылаемый в httpOnly cookie. AT работает как во втором случае. Когда записанный в нем срок его жизни кончается, бэкенд проверяет RT, и если он валиден, обновляет AT. Кончается RT - пользователь направляется на перелогин.

Подробнее по данной теме можно ознакомиться в, например, этой статье

Где хранить access token на фронте?

В 95% случаев в LocalStorage. Необходимо также дублировать его в обычной JS переменной, потому что, например, у iPhone при слабом заряде включается политика энергосбережения, в результате чего localStorage может постоянно очищаться браузером.

Что такое oAuth и SSO?

oAuth - Логин "через Google". Также когда, например, у пользователь есть возможность на твоем сайте сохранить что-то в Google Drive. Чтобы получить разрешение для твоего сайта работы с Google Drive аккаунтом пользователя, ты просишь его дать через Google разрешения твоему сайту лазить в его аккаунт. Итого у нас есть четыре части - Google (авторизационный центр), сторонний ресурс (Google Drive), твой сайт и пользователь

SSO - single sign-on - логин пользователя на портал некой компании один раз, и затем прозрачный доступ на разные его сервисы. Например, логин в GMail и доступ в сразу в Google Диск, Google Photo и так далее.

Дает ли аутентификация через JWT безопасность?

Безопасность - очень комплексное понятие, аутентификация через JWT - всего лишь один из её элементов. Для критичных приложений можно снимать отпечаток системы пользователя (browser fingerprint) и заставлять пользователя перелогиниваться как только он изменился. То же самое с IP. Таким образом можно бороться с кражей АТ. Также ставить очень маленький срок жизни AT, если используется RT. Но основные меры безопасности связаны не с аутентификацией, а с постоянным мониторингом системы на подозрительные действия.

Авторизация

Если нужно давать пользователям разный уровень доступа к ресурсам сайта, то обычно применяется или RBAC (Role-based access control) или PBA - Policy-Based Authorization (Permission-Based Authorization).

В первом случае пользователи распределяются по ролям (админ, менеджер, юзер) и уровень доступа определяется ролью.

Во-втором можно более гранулировано задать разрешение каждому пользователю индивидуально на любое действие.

Нужно понимать, что на фронте авторизация делается для удобства (пользователь не видит разделы сайта, которые ему запрещены), но за безопасность отвечает бэк - он должен проверять каждый раз, имеет ли пользователь право доступа к запрашиваемому ресурсу, даже если на фронте его как бы видно не должно быть. Сломать фронт - очень несложно.

',7),i=[l];function r(c,p,n,d,m,u){return t(),a("div",null,i)}const k=e(o,[["render",r]]);export{_ as __pageData,k as default}; diff --git a/assets/ru_backend_auth.md.RuQFau0I.lean.js b/assets/ru_backend_auth.md.DlcF9MHz.lean.js similarity index 86% rename from assets/ru_backend_auth.md.RuQFau0I.lean.js rename to assets/ru_backend_auth.md.DlcF9MHz.lean.js index f6ced8011..3c46820df 100644 --- a/assets/ru_backend_auth.md.RuQFau0I.lean.js +++ b/assets/ru_backend_auth.md.DlcF9MHz.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Аутентификация и авторизация","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/auth.md","filePath":"ru/backend/auth.md","lastUpdated":1706427418000}'),o={name:"ru/backend/auth.md"},l=s("",7),i=[l];function r(c,p,n,d,m,u){return t(),a("div",null,i)}const k=e(o,[["render",r]]);export{_ as __pageData,k as default}; +import{_ as e,c as a,o as t,U as s}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Аутентификация и авторизация","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/auth.md","filePath":"ru/backend/auth.md","lastUpdated":1706553672000}'),o={name:"ru/backend/auth.md"},l=s("",7),i=[l];function r(c,p,n,d,m,u){return t(),a("div",null,i)}const k=e(o,[["render",r]]);export{_ as __pageData,k as default}; diff --git a/assets/ru_backend_backend.md.a0tcM5iL.js b/assets/ru_backend_backend.md.WOTwKYpp.js similarity index 99% rename from assets/ru_backend_backend.md.a0tcM5iL.js rename to assets/ru_backend_backend.md.WOTwKYpp.js index 66ecb0cd5..3b8401065 100644 --- a/assets/ru_backend_backend.md.a0tcM5iL.js +++ b/assets/ru_backend_backend.md.WOTwKYpp.js @@ -1 +1 @@ -import{_ as a,c as e,o as s,U as t}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Варианты задействовать свой бэкенд для фронтендера","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/backend.md","filePath":"ru/backend/backend.md","lastUpdated":1706427418000}'),o={name:"ru/backend/backend.md"},p=t('

Варианты задействовать свой бэкенд для фронтендера

Как протестировать фронт на данных с бэка?

Есть много сервисов, предлагающих свой API с различными данными для тестирования либо полноценной работы

Например, jsonplaceholder.typicode.com

Гуглить по "json placeholder"

Есть ли бесплатные открытые API с реальными данными?

Полно. Например, тут

Гуглить по "public api"

Также можно похакать релевантные сайты в DevTools / Network на предмет эндпойнтов с данными в подходящем формате

Как сделать свой бэкенд?

Если уже знаете JavaScript, поставить и запустить Node.js с HTTP сервером проблем вызвать не должно.

Node.js далеко не очень популярный сервер для интернета, но для небольшого проекта пойдет.

В абсолютном значении проще всего установить и начать работать с Nginx и PHP

Большинство крупных облачных провайдеров (Amazon, Google, Oracle, Microsoft) предоставляет бесплатные планы с возможностью запустить виртуальный сервер. Поставив туда что требуется, можно захостить и бэк, и бандл фронта.

Что такое BaaS (Backend as a service)?

Это облачное решение, когда бэкенд в виде базы данных и интерфейса доступа к ней, а возможно и возможность использовать некоторую логику, предоставляет BaaS провайдер.

Например, NoSQL базу данных и доступ к ней предоставляет Google с помощью своего сервиcа Firebase

Альтернатива с PostgreSQL - Supabase

То есть, ваш фронтэнд будет обращаться к их определенным эндпойнтам и получать нужные сервисы - например, сохранять и запрашивать данные в базе данных.

Оба сервиса предоставляют возможность сделать аутентификацию на сайте. Таким образом, фронтэндер может написать приложение используя подобный сервис без написания своего бэкенд кода и без размещения его где-то на сервере в интернете.

У данных сервисов есть бесплатные планы с довольно большими ресурсами.

Бизнес логика на BaaS

Большинство BaaS сервисов предоставляет не только CRUD доступ к своей базе данных, но и возможность написать кастомную логику в виде Cloud Functions у Firebase, Edge Functions у Supabase, AWS Lambda у Amazon и т.д.

Данные функции являются кодом на каком-то языке программирования, который будет вызываться при обращении к определенному эндпойнту бэкенда.

В случае, если фронтенд разработчик хочет сделать полноценное приложение, но заморачиваться на самостоятельный бэкенд не хочет, это является довольно неплохим и очень экономичным решением.

Как работают Edge/Cloud/Lamda функции

По сути, это бэкенд в миниатюре

Твой фронт обращаешься к заданному эндпойнту (через API gateway сервиса BaaS провайдера) - например, /api/somefunc

Там лежит написанный тобой скрипт на js или другом языке программирования который выполняется, имеет доступ к базе данных и может делать другие вещи (грузить данные из инета например)

Затем скрипт формирует результат и возвращает его твоему фронту

',7),c=[p];function r(d,l,i,m,n,u){return s(),e("div",null,c)}const k=a(o,[["render",r]]);export{b as __pageData,k as default}; +import{_ as a,c as e,o as s,U as t}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Варианты задействовать свой бэкенд для фронтендера","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/backend.md","filePath":"ru/backend/backend.md","lastUpdated":1706553672000}'),o={name:"ru/backend/backend.md"},p=t('

Варианты задействовать свой бэкенд для фронтендера

Как протестировать фронт на данных с бэка?

Есть много сервисов, предлагающих свой API с различными данными для тестирования либо полноценной работы

Например, jsonplaceholder.typicode.com

Гуглить по "json placeholder"

Есть ли бесплатные открытые API с реальными данными?

Полно. Например, тут

Гуглить по "public api"

Также можно похакать релевантные сайты в DevTools / Network на предмет эндпойнтов с данными в подходящем формате

Как сделать свой бэкенд?

Если уже знаете JavaScript, поставить и запустить Node.js с HTTP сервером проблем вызвать не должно.

Node.js далеко не очень популярный сервер для интернета, но для небольшого проекта пойдет.

В абсолютном значении проще всего установить и начать работать с Nginx и PHP

Большинство крупных облачных провайдеров (Amazon, Google, Oracle, Microsoft) предоставляет бесплатные планы с возможностью запустить виртуальный сервер. Поставив туда что требуется, можно захостить и бэк, и бандл фронта.

Что такое BaaS (Backend as a service)?

Это облачное решение, когда бэкенд в виде базы данных и интерфейса доступа к ней, а возможно и возможность использовать некоторую логику, предоставляет BaaS провайдер.

Например, NoSQL базу данных и доступ к ней предоставляет Google с помощью своего сервиcа Firebase

Альтернатива с PostgreSQL - Supabase

То есть, ваш фронтэнд будет обращаться к их определенным эндпойнтам и получать нужные сервисы - например, сохранять и запрашивать данные в базе данных.

Оба сервиса предоставляют возможность сделать аутентификацию на сайте. Таким образом, фронтэндер может написать приложение используя подобный сервис без написания своего бэкенд кода и без размещения его где-то на сервере в интернете.

У данных сервисов есть бесплатные планы с довольно большими ресурсами.

Бизнес логика на BaaS

Большинство BaaS сервисов предоставляет не только CRUD доступ к своей базе данных, но и возможность написать кастомную логику в виде Cloud Functions у Firebase, Edge Functions у Supabase, AWS Lambda у Amazon и т.д.

Данные функции являются кодом на каком-то языке программирования, который будет вызываться при обращении к определенному эндпойнту бэкенда.

В случае, если фронтенд разработчик хочет сделать полноценное приложение, но заморачиваться на самостоятельный бэкенд не хочет, это является довольно неплохим и очень экономичным решением.

Как работают Edge/Cloud/Lamda функции

По сути, это бэкенд в миниатюре

Твой фронт обращаешься к заданному эндпойнту (через API gateway сервиса BaaS провайдера) - например, /api/somefunc

Там лежит написанный тобой скрипт на js или другом языке программирования который выполняется, имеет доступ к базе данных и может делать другие вещи (грузить данные из инета например)

Затем скрипт формирует результат и возвращает его твоему фронту

',7),c=[p];function r(d,l,i,m,n,u){return s(),e("div",null,c)}const k=a(o,[["render",r]]);export{b as __pageData,k as default}; diff --git a/assets/ru_backend_backend.md.a0tcM5iL.lean.js b/assets/ru_backend_backend.md.WOTwKYpp.lean.js similarity index 87% rename from assets/ru_backend_backend.md.a0tcM5iL.lean.js rename to assets/ru_backend_backend.md.WOTwKYpp.lean.js index d47ada5d2..0bc095681 100644 --- a/assets/ru_backend_backend.md.a0tcM5iL.lean.js +++ b/assets/ru_backend_backend.md.WOTwKYpp.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as s,U as t}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Варианты задействовать свой бэкенд для фронтендера","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/backend.md","filePath":"ru/backend/backend.md","lastUpdated":1706427418000}'),o={name:"ru/backend/backend.md"},p=t("",7),c=[p];function r(d,l,i,m,n,u){return s(),e("div",null,c)}const k=a(o,[["render",r]]);export{b as __pageData,k as default}; +import{_ as a,c as e,o as s,U as t}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Варианты задействовать свой бэкенд для фронтендера","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/backend.md","filePath":"ru/backend/backend.md","lastUpdated":1706553672000}'),o={name:"ru/backend/backend.md"},p=t("",7),c=[p];function r(d,l,i,m,n,u){return s(),e("div",null,c)}const k=a(o,[["render",r]]);export{b as __pageData,k as default}; diff --git a/assets/ru_backend_cors.md.acP7AuFL.js b/assets/ru_backend_cors.md.ipRg9p-1.js similarity index 99% rename from assets/ru_backend_cors.md.acP7AuFL.js rename to assets/ru_backend_cors.md.ipRg9p-1.js index 80d373e01..f89afed76 100644 --- a/assets/ru_backend_cors.md.acP7AuFL.js +++ b/assets/ru_backend_cors.md.ipRg9p-1.js @@ -1,3 +1,3 @@ -import{_ as e,c as s,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"CORS","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/cors.md","filePath":"ru/backend/cors.md","lastUpdated":1706427418000}'),o={name:"ru/backend/cors.md"},r=t(`

CORS

Что такое CORS?

Грубо говоря, CORS служит для защиты вашего бэкенда от запросов к нему со стороны путем установки специальных HTTP заголовков.

Более точно, CORS (Cross-Origin Resource Sharing, англ.  «совместное использование ресурсов разных источников») — это стандарт, позволяющий предоставлять веб-страницам доступ к объектам сторонних интернет-ресурсов. Сторонним считается любой интернет-ресурс, который отличается от запрашиваемого протоколом, доменом или портом.

Доступ предоставляется по специализированным запросам. Интернет-ресурс, принимающий запрос, содержит список доверенных источников, которым разрешен доступ к объектам. Страница-источник запроса получает доступ, если входит в список доверенных источников. Для предоставления доступа всем сторонним интернет-страницам используется маска «*».

Соответственно, делать всё это может только бэкенд, и настраивается это на нем. Конкретное решение зависит от языка бэкенда, используемого фреймворка и даже вебсервера.

Принцип работы CORS

При создании перекрестного HTTP-запроса браузер клиента добавляет в него объявление домена веб-страницы, инициирующей запрос. Домен объявляется в разделе Origin.

Например, страница https://client-1.com/page.html запрашивает данные со страницы https://server-site.com/info. Пример запроса от браузера клиента, использующего методы CORS, приведен ниже:

GET /info HTTP/1.1
+import{_ as e,c as s,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"CORS","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/cors.md","filePath":"ru/backend/cors.md","lastUpdated":1706553672000}'),o={name:"ru/backend/cors.md"},r=t(`

CORS

Что такое CORS?

Грубо говоря, CORS служит для защиты вашего бэкенда от запросов к нему со стороны путем установки специальных HTTP заголовков.

Более точно, CORS (Cross-Origin Resource Sharing, англ.  «совместное использование ресурсов разных источников») — это стандарт, позволяющий предоставлять веб-страницам доступ к объектам сторонних интернет-ресурсов. Сторонним считается любой интернет-ресурс, который отличается от запрашиваемого протоколом, доменом или портом.

Доступ предоставляется по специализированным запросам. Интернет-ресурс, принимающий запрос, содержит список доверенных источников, которым разрешен доступ к объектам. Страница-источник запроса получает доступ, если входит в список доверенных источников. Для предоставления доступа всем сторонним интернет-страницам используется маска «*».

Соответственно, делать всё это может только бэкенд, и настраивается это на нем. Конкретное решение зависит от языка бэкенда, используемого фреймворка и даже вебсервера.

Принцип работы CORS

При создании перекрестного HTTP-запроса браузер клиента добавляет в него объявление домена веб-страницы, инициирующей запрос. Домен объявляется в разделе Origin.

Например, страница https://client-1.com/page.html запрашивает данные со страницы https://server-site.com/info. Пример запроса от браузера клиента, использующего методы CORS, приведен ниже:

GET /info HTTP/1.1
 Host: server-site.com
 Origin: client-1.com

В случае, если сервер по адресу www.server-site.com разрешает странице-источнику запроса доступ к данным с домена, в его ответе на запрос появится строка Access-Control-Allow-Origin с именем объявленного домена:

Access-Control-Allow-Origin: https://client-1.com

Если сервер, на который запрошен доступ, не добавит в ответ указанную строку, браузер клиента вместо данных файла info вернет код ошибки.

Если на сервере разрешен доступ к ресурсу страницам любого стороннего домена, в ответе будет указана маска «*».

Access-Control-Allow-Origin: *

Если на сервере разрешен доступ не всем, а нескольким сторонним клиентам, ответ сервера содержит имена всех этих доменов, выведенных отдельными строками или разделенных пробелами:

Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com

В стандарте CORS много нюансов. Вот более подробная статья по теме CORS

Проблемы с CORS

CORS проблемы могут возникнуть только когда к ресурсу обращается браузер, а не отдельная программа типа Postman или другой бэкенд.

Как временное решение при разработке могут помочь CORS proxy, которые становятся посредником между фронтендом и бэкендом, или расширения браузера.

Vite предоставляет подобный прокси для dev режима.

`,4),c=[r];function n(p,l,i,d,h,m){return a(),s("div",null,c)}const b=e(o,[["render",n]]);export{u as __pageData,b as default}; diff --git a/assets/ru_backend_cors.md.acP7AuFL.lean.js b/assets/ru_backend_cors.md.ipRg9p-1.lean.js similarity index 84% rename from assets/ru_backend_cors.md.acP7AuFL.lean.js rename to assets/ru_backend_cors.md.ipRg9p-1.lean.js index eefb1e192..c3ffc7b53 100644 --- a/assets/ru_backend_cors.md.acP7AuFL.lean.js +++ b/assets/ru_backend_cors.md.ipRg9p-1.lean.js @@ -1 +1 @@ -import{_ as e,c as s,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"CORS","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/cors.md","filePath":"ru/backend/cors.md","lastUpdated":1706427418000}'),o={name:"ru/backend/cors.md"},r=t("",4),c=[r];function n(p,l,i,d,h,m){return a(),s("div",null,c)}const b=e(o,[["render",n]]);export{u as __pageData,b as default}; +import{_ as e,c as s,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"CORS","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/cors.md","filePath":"ru/backend/cors.md","lastUpdated":1706553672000}'),o={name:"ru/backend/cors.md"},r=t("",4),c=[r];function n(p,l,i,d,h,m){return a(),s("div",null,c)}const b=e(o,[["render",n]]);export{u as __pageData,b as default}; diff --git a/assets/ru_backend_protocols.md.ynkMm8xX.js b/assets/ru_backend_protocols.md.2ctpmcpi.js similarity index 98% rename from assets/ru_backend_protocols.md.ynkMm8xX.js rename to assets/ru_backend_protocols.md.2ctpmcpi.js index d22483b51..7fe130be6 100644 --- a/assets/ru_backend_protocols.md.ynkMm8xX.js +++ b/assets/ru_backend_protocols.md.2ctpmcpi.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Протоколы. To REST или не REST?","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/protocols.md","filePath":"ru/backend/protocols.md","lastUpdated":1706427418000}'),s={name:"ru/backend/protocols.md"},o=r('

Протоколы. To REST или не REST?

REST, WebSockets, JSON-RPC

Для новичка, конечно, удобнее начинать с REST - запросы на сервер абы как.

Для более опытных, особенно, фулстеков, предлагаю взглянуть на JSON-RPC

WebSockets удобен тем, что дает двунаправленную связь (сервер может посылать сообщения на клиент), но требует специального программного обеспечения на бэкенде.

Почему JSON-RPC?

После опыта с JSON-RPC общение с бэком обычно уже никогда не бывает прежним.

Он дает порядок, четкость, строгость и вместе с тем гибкость. Сильно упрощает и делает понятным код как на фронте, так и на бэке.

Кроме того, JSON-RPC - де-факто стандарт для Web 3.0 коммуникаций.

Вот две мои статьи на эту тему - Популяризация JSON-RPC (часть 1) и Популяризация JSON-RPC (часть 2)

Вариант TypeScript реализации фронтэнд api сервиса на JSON-RPC - здесь

При использовании JSON-RPC переход на WebSockets или другие транспортные протоколы не вызовет никаких трудностей из-за унификации формата сообщений.

Как организовать реконнект WebSocket соединения на фронте?

Нужна шина, или Еvent bus, которая будет работать как прокси для приходящих сообщений.

Можно использовать mitt.

Что такое GraphGL?

Сложная штука, попытка перевести язык запросов SQL для клиент-серверных запросов в интернете.

Имеет довольно специфичное применение, преимущественно у сторонних поставщиков данных через API.

Для своего фулстек приложения - на 99% ненужное решение.

',5),c=[o];function p(l,d,i,m,n,_){return a(),t("div",null,c)}const b=e(s,[["render",p]]);export{S as __pageData,b as default}; +import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Протоколы. To REST или не REST?","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/protocols.md","filePath":"ru/backend/protocols.md","lastUpdated":1706553672000}'),s={name:"ru/backend/protocols.md"},o=r('

Протоколы. To REST или не REST?

REST, WebSockets, JSON-RPC

Для новичка, конечно, удобнее начинать с REST - запросы на сервер абы как.

Для более опытных, особенно, фулстеков, предлагаю взглянуть на JSON-RPC

WebSockets удобен тем, что дает двунаправленную связь (сервер может посылать сообщения на клиент), но требует специального программного обеспечения на бэкенде.

Почему JSON-RPC?

После опыта с JSON-RPC общение с бэком обычно уже никогда не бывает прежним.

Он дает порядок, четкость, строгость и вместе с тем гибкость. Сильно упрощает и делает понятным код как на фронте, так и на бэке.

Кроме того, JSON-RPC - де-факто стандарт для Web 3.0 коммуникаций.

Вот две мои статьи на эту тему - Популяризация JSON-RPC (часть 1) и Популяризация JSON-RPC (часть 2)

Вариант TypeScript реализации фронтэнд api сервиса на JSON-RPC - здесь

При использовании JSON-RPC переход на WebSockets или другие транспортные протоколы не вызовет никаких трудностей из-за унификации формата сообщений.

Как организовать реконнект WebSocket соединения на фронте?

Нужна шина, или Еvent bus, которая будет работать как прокси для приходящих сообщений.

Можно использовать mitt.

Что такое GraphGL?

Сложная штука, попытка перевести язык запросов SQL для клиент-серверных запросов в интернете.

Имеет довольно специфичное применение, преимущественно у сторонних поставщиков данных через API.

Для своего фулстек приложения - на 99% ненужное решение.

',5),c=[o];function p(l,d,i,m,n,_){return a(),t("div",null,c)}const b=e(s,[["render",p]]);export{S as __pageData,b as default}; diff --git a/assets/ru_backend_protocols.md.ynkMm8xX.lean.js b/assets/ru_backend_protocols.md.2ctpmcpi.lean.js similarity index 86% rename from assets/ru_backend_protocols.md.ynkMm8xX.lean.js rename to assets/ru_backend_protocols.md.2ctpmcpi.lean.js index 19718d589..be6f2972d 100644 --- a/assets/ru_backend_protocols.md.ynkMm8xX.lean.js +++ b/assets/ru_backend_protocols.md.2ctpmcpi.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Протоколы. To REST или не REST?","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/protocols.md","filePath":"ru/backend/protocols.md","lastUpdated":1706427418000}'),s={name:"ru/backend/protocols.md"},o=r("",5),c=[o];function p(l,d,i,m,n,_){return a(),t("div",null,c)}const b=e(s,[["render",p]]);export{S as __pageData,b as default}; +import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Протоколы. To REST или не REST?","description":"","frontmatter":{},"headers":[],"relativePath":"ru/backend/protocols.md","filePath":"ru/backend/protocols.md","lastUpdated":1706553672000}'),s={name:"ru/backend/protocols.md"},o=r("",5),c=[o];function p(l,d,i,m,n,_){return a(),t("div",null,c)}const b=e(s,[["render",p]]);export{S as __pageData,b as default}; diff --git a/assets/ru_book_Appendix__Migrating_from_Vue_2.md.auFSlyEb.js b/assets/ru_book_Appendix__Migrating_from_Vue_2.md.PHMdkqfb.js similarity index 99% rename from assets/ru_book_Appendix__Migrating_from_Vue_2.md.auFSlyEb.js rename to assets/ru_book_Appendix__Migrating_from_Vue_2.md.PHMdkqfb.js index ac2fd4b3a..699973fe0 100644 --- a/assets/ru_book_Appendix__Migrating_from_Vue_2.md.auFSlyEb.js +++ b/assets/ru_book_Appendix__Migrating_from_Vue_2.md.PHMdkqfb.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Приложение: Миграция с Vue 2","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Appendix__Migrating_from_Vue_2.md","filePath":"ru/book/Appendix__Migrating_from_Vue_2.md","lastUpdated":1706427418000}'),n={name:"ru/book/Appendix__Migrating_from_Vue_2.md"},e=t(`

Приложение: Миграция с Vue 2

Переход приложения Vue 2 на Vue 3 не так прост, как простая замена фреймворка. Хотя API Options остается полностью совместимым, и нет необходимости переходить на API Composition, есть и другие изменения, о которых следует знать.

Изменения между версиями затрагивают не только основной фреймворк, но и экосистему (новый vue-router, state manager и т.д.), а также другие зависимости. В Vue 3 также появился новый официальный сборщик Vite (заменяющий WebPack), новый роутер и управление состоянием (Pinia, замена Vuex), а также другие плагины.

Приведенный здесь список изменений является кратким справочником, который поможет вам в миграции вашего приложения, но не может быть исчерпывающим с учетом всех нюансов, необходимых для каждого конкретного проекта. В связи с этим я отсылаю вас к официальной документации.

Здесь приведен неполный список основных изменений, помимо нового Composition API:

  • Иной способ загрузки и запуска приложения
  • Изменения в регистрации глобальных компонентов и плагинов
  • Изменения в свойстве data
  • Изменения в v-model, props и emits
  • Варианты реактивности
  • Совместимость с браузерами
  • Изменения в организации каталогов и файлов
  • Изменения в маршрутизаторе и управлении состояниями

Этот список не показывает всех изменений под капотом, через которые прошел фреймворк, но он даст вам отправную точку для миграции вашего рабочего приложения с Vue 2 на Vue 3. Теперь давайте рассмотрим каждый из этих пунктов более подробно.

Другой способ загрузки и запуска приложения

Изменился способ загрузки и запуска нашего приложения. Теперь требуется импортировать конструктор из пакета Vue. Давайте сравним обе реализации из main.js:

Vue 2 инстанцирование приложения:

js
import Vue from "vue"
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Приложение: Миграция с Vue 2","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Appendix__Migrating_from_Vue_2.md","filePath":"ru/book/Appendix__Migrating_from_Vue_2.md","lastUpdated":1706553672000}'),n={name:"ru/book/Appendix__Migrating_from_Vue_2.md"},e=t(`

Приложение: Миграция с Vue 2

Переход приложения Vue 2 на Vue 3 не так прост, как простая замена фреймворка. Хотя API Options остается полностью совместимым, и нет необходимости переходить на API Composition, есть и другие изменения, о которых следует знать.

Изменения между версиями затрагивают не только основной фреймворк, но и экосистему (новый vue-router, state manager и т.д.), а также другие зависимости. В Vue 3 также появился новый официальный сборщик Vite (заменяющий WebPack), новый роутер и управление состоянием (Pinia, замена Vuex), а также другие плагины.

Приведенный здесь список изменений является кратким справочником, который поможет вам в миграции вашего приложения, но не может быть исчерпывающим с учетом всех нюансов, необходимых для каждого конкретного проекта. В связи с этим я отсылаю вас к официальной документации.

Здесь приведен неполный список основных изменений, помимо нового Composition API:

  • Иной способ загрузки и запуска приложения
  • Изменения в регистрации глобальных компонентов и плагинов
  • Изменения в свойстве data
  • Изменения в v-model, props и emits
  • Варианты реактивности
  • Совместимость с браузерами
  • Изменения в организации каталогов и файлов
  • Изменения в маршрутизаторе и управлении состояниями

Этот список не показывает всех изменений под капотом, через которые прошел фреймворк, но он даст вам отправную точку для миграции вашего рабочего приложения с Vue 2 на Vue 3. Теперь давайте рассмотрим каждый из этих пунктов более подробно.

Другой способ загрузки и запуска приложения

Изменился способ загрузки и запуска нашего приложения. Теперь требуется импортировать конструктор из пакета Vue. Давайте сравним обе реализации из main.js:

Vue 2 инстанцирование приложения:

js
import Vue from "vue"
 const app = new Vue({el: "#app"})

В Vue 2 мы импортируем конструктор Vue и передаем объект с опциями. В Vue 3 после создания приложения мы подключаем компоненты, плагины и т.д., а затем монтируем наше приложение к компоненту верхнего уровня. Вот пример, переписанный для Vue 3:

Vue 3 инстанцирование приложения:

js
import {createApp} from "vue"
 const app = createApp({..})
 app.mount("#app")

Положение файла index.html также изменилось, и теперь он располагается в корне нашего приложения. Более подробно изменения в структуре документа описаны в главе 3, Установка рабочего проекта.

Регистрация глобальных компонентов, плагинов и так далее

В Vue 2 мы объявляем компонент для всего приложения (глобальный), прикрепляя его к корневому экземпляру Vue. Вот пример:

js
import Vue from "vue"
diff --git a/assets/ru_book_Appendix__Migrating_from_Vue_2.md.auFSlyEb.lean.js b/assets/ru_book_Appendix__Migrating_from_Vue_2.md.PHMdkqfb.lean.js
similarity index 93%
rename from assets/ru_book_Appendix__Migrating_from_Vue_2.md.auFSlyEb.lean.js
rename to assets/ru_book_Appendix__Migrating_from_Vue_2.md.PHMdkqfb.lean.js
index 4dc7f4663..0e8fd5349 100644
--- a/assets/ru_book_Appendix__Migrating_from_Vue_2.md.auFSlyEb.lean.js
+++ b/assets/ru_book_Appendix__Migrating_from_Vue_2.md.PHMdkqfb.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Приложение: Миграция с Vue 2","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Appendix__Migrating_from_Vue_2.md","filePath":"ru/book/Appendix__Migrating_from_Vue_2.md","lastUpdated":1706427418000}'),n={name:"ru/book/Appendix__Migrating_from_Vue_2.md"},e=t("",65),p=[e];function h(l,k,r,o,g,d){return a(),i("div",null,p)}const y=s(n,[["render",h]]);export{u as __pageData,y as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Приложение: Миграция с Vue 2","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Appendix__Migrating_from_Vue_2.md","filePath":"ru/book/Appendix__Migrating_from_Vue_2.md","lastUpdated":1706553672000}'),n={name:"ru/book/Appendix__Migrating_from_Vue_2.md"},e=t("",65),p=[e];function h(l,k,r,o,g,d){return a(),i("div",null,p)}const y=s(n,[["render",h]]);export{u as __pageData,y as default};
diff --git a/assets/ru_book_Chapter_10__Deploying_Your_Application.md.-FlkJQ-f.js b/assets/ru_book_Chapter_10__Deploying_Your_Application.md.MNTrkDv9.js
similarity index 99%
rename from assets/ru_book_Chapter_10__Deploying_Your_Application.md.-FlkJQ-f.js
rename to assets/ru_book_Chapter_10__Deploying_Your_Application.md.MNTrkDv9.js
index d2d832d0a..e6e54281d 100644
--- a/assets/ru_book_Chapter_10__Deploying_Your_Application.md.-FlkJQ-f.js
+++ b/assets/ru_book_Chapter_10__Deploying_Your_Application.md.MNTrkDv9.js
@@ -1,4 +1,4 @@
-import{_ as t,c as s,o as n,U as a}from"./chunks/framework.P5TqXf0g.js";const e="/assets/Figure_10.01_B18602._OtkN9gD.jpg",i="/assets/Figure_10.02_B18602.TR1jYBN0.jpg",E=JSON.parse('{"title":"Развертывание приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_10__Deploying_Your_Application.md","filePath":"ru/book/Chapter_10__Deploying_Your_Application.md","lastUpdated":1706427418000}'),r={name:"ru/book/Chapter_10__Deploying_Your_Application.md"},o=a('

Развертывание приложения

Работа над приложением закончилась бы печально, если бы мы не смогли опубликовать конечный продукт. Представление приложения в Интернете требует внимания к некоторым деталям и знакомства с некоторыми терминами и возможностями хостинга.

Хотя это и довольно просто, но все же требует внимания к некоторым деталям и знакомства с некоторыми терминами и возможностями хостинга.

В этой главе мы познакомимся со следующим:

  • Что включает в себя публикация веб-приложения в Интернете
  • Вопросы, связанные с созданием приложения для развертывания
  • Знакомство с условиями и процессами регистрации домена
  • Настройка веб-сервера для размещения одностраничного приложения (SPA) или прогрессивного веб-приложения (PWA)
  • Защита сервера нашего веб-приложения с помощью Let's Encrypt

Основная цель этой главы - дать вам инструменты для понимания шагов, необходимых для публикации и защиты веб-сайта и, соответственно, нашего SPA или PWA.

Технические требования

Эта глава носит в основном информационный характер, однако в качестве примеров в репозиторий книги было загружено несколько конфигурационных файлов, с которыми можно ознакомиться здесь.

Что включает в себя публикация веб-приложения?

Публикация веб-приложения Vue 3 не сильно отличается от публикации любого другого сайта, за исключением нескольких ключевых отличий. В этой главе мы рассмотрим чистую установку, т.е. все необходимые элементы мы создадим самостоятельно. В самом общем случае нам необходимо учесть следующее:

  • Доменное имя для нашего сайта/приложения
  • Путь назначения для нашего приложения
  • Услуга хостинга
  • Программное обеспечение веб-сервера
  • Получение сертификата безопасности

Предыдущие пункты также дают нам простую формулу для подготовки. Давайте пойдем по порядку, объясняя по мере продвижения каждый необходимый термин и проблему.

Домены, серверы доменных имен (DNS) и записи DNS

Каждый компьютер, подключенный к сети, получает уникальный идентификационный адрес, отличающий его от других компьютеров в той же сети. Такие адреса называются Internet Protocol (IP), и в настоящее время их существует два - IP версий 4 и 6.

  • IPv4: Адреса состоят из четырех чисел, разделенных точкой. Диапазон чисел составляет от 0 до 255. Существует несколько зарезервированных адресов, имеющих особое значение, например 127.0.0.1, который представляет собой обратную петлю к нашему собственному компьютеру. Эти адреса также могут иметь маску, определяющую подсегмент в сети. Скорее всего, в вашей домашней сети используется именно этот протокол.
  • IPv6: Этот протокол предоставляет значительно большее адресное пространство, состоящее из восьми групп по четыре шестнадцатеричных цифры, разделенных точкой с запятой. Благодаря такому большому размеру протокол также позволяет упростить обозначения, удаляя ведущие нули и заменяя все нулевые сегменты пустым сегментом. Например, адрес loopback, эквивалентный адресу IPv4 127.0.0.1 в IPv6 - это 0000:0000:0000:0000:0000:0000:0000:0001, который затем можно сократить как 0:0:0:0:0:0:0:1 или просто ::1 .

Есть еще много интересного о сетевых адресах, но только из этого краткого введения уже можно увидеть проблему удобства использования. Эти адреса отлично подходят для компьютеров, но не подходят для "человеческой памяти". В огромном Интернете, с миллионами подключенных компьютеров, использование только IP-адресов для навигации было бы невозможно.

Поэтому в инфраструктуре Сети существуют специальные серверы, обеспечивающие преобразование "дружественного человеку имени" в нужный IP-адрес. Такие дружественные имена называются доменами, а серверы, обеспечивающие преобразование, - Сервисами доменных имен (DNS). Все это регулируется организацией Internet Corporation for Assigned Names and Numbers (ICANN).

Доменные имена - это то, что мы используем каждый день для доступа к любому сайту или приложению в Интернете. Они приобретаются на ограниченное время у организации, уполномоченной продавать их, называемой регистратором.

По истечении этого срока есть возможность в течение ограниченного времени продлить домен, а если нет, то он может быть приобретен любым другим лицом. Обычно домены продаются в пересчете на годы, и цены на них сильно варьируются - от нескольких центов до тысяч долларов. Домены также объединяются в группы, разделенные точками справа налево, как показано здесь:

image

Рисунок 10.1 - Части, составляющие полное доменное имя

Домен верхнего уровня управляется ICANN, и хотя наиболее известным является .com для коммерческих сайтов, существует множество других, например, следующие:

  • .org: Для организаций
  • .net: Для сетей или порталов корпоративных интрасетей и других организаций
  • .mil: Для военного использования
  • .gov: Для официальных правительственных сайтов

Новые домены верхнего уровня создаются часто. С их растущим списком можно ознакомиться здесь.

Когда мы покупаем домен (например, mydomain на предыдущем рисунке), он привязывается к выбранному нами домену верхнего уровня. Регистраторы предоставляют нам возможность выбрать домен и проверить, доступен ли он для покупки.

Чтобы домен был полезен, он должен быть зарегистрирован в DNS и указывать на IP-адрес. Для этого необходимо создать DNS-записи, что часто делается через того же регистратора, который продает домен, или же мы можем записать в регистраторе DNS, который будет иметь целевой IP. Подробнее об этом будет сказано позже, а пока просто представьте эту концепцию в уме. Наиболее часто встречающиеся DNS-записи для домена выглядят следующим образом:

Тип записи (имя)Значение и описание
AАдрес IPv4. Это основная запись, указывающая на публичный IP-адрес вашего сервера.
AAAAАдрес IPv6. Указывает на публичный IPv6-адрес вашего сервера.
CNAMEСоздает псевдоним для домена, что позволяет направлять несколько доменов к одному адресату без создания нескольких записей A/AAAA. Это может быть использовано для создания поддоменов.
TXTОбычная текстовая запись, которая часто используется при подтверждении права собственности на домен.

Таблица 10.1 - Типы записей DNS.

В зависимости от регистратора и нанимаемой услуги, вы можете никогда не увидеть эти записи или не иметь с ними дела, поскольку некоторые регистраторы/веб-хостинги управляют ими автоматически.

Поддомены не нужно покупать у регистратора, их нужно только настроить. Вы можете создать сколько угодно поддоменов для своего домена. Некоторые распространенные поддомены выглядят следующим образом:

  • www: Обозначает World Wide Web, или веб-страницу. В настоящее время этот поддомен часто используется как синоним домена.
  • app: Для приложений.
  • admin: Для административного доступа.
  • mail: Для служб электронной почты.

Используя поддомены, можно размещать несколько сайтов на одном домене/хосте. Позже мы рассмотрим, как настроить один из них для нашего приложения на нашем веб-сервере. На данный момент необходимо помнить, что домен или поддомен будет указывать в качестве конечного адресата на ваш сервер.

Примечание о loopback-адресе

Согласно предыдущим примерам, "доменное" имя, зарезервированное для loopback (домашнего) адреса, - localhost.

Домен, на котором будет размещено наше приложение, - это первый шаг к присутствию в Интернете. С ним мы переходим к следующему вопросу - где будет размещено приложение в этом домене.

Размышления о создании приложения для развертывания

После того как мы получили домен/поддомен, нам необходимо решить (или узнать), на каком пути будет располагаться приложение. Путь - это то, что следует за доменом, в сегментах, разделенных прямой косой чертой (/) - например, mydomain.com/store/product.html. Эти участки называются "путями", поскольку они соответствуют той же структуре каталогов, что и зеркальное отображение в локальном хранилище.

Наше приложение будет обслуживаться через веб-сервер. Эти удивительные программы построены на концепции обслуживания файлов в соответствии со структурой каталогов (папка/подпапка/файл...). Внутри нашего сервера запрос домена будет соответствовать файлам в локальной директории.

Здесь нам необходимо знать, будет ли приложение Vue размещено в корне или по пути (директории), поскольку нам необходимо указать это в процессе сборки, если мы используем Vue Router в режиме веб-истории (пересмотрите главу 5, Одностраничные приложения, если вам необходимо освежить эту тему). В данном случае нам необходимо сделать две модификации:

  • Указать корневой путь для приложения в конфигурации Router
  • Настроить веб-сервер на изменение службы каталогов/файлов и направлять все запросы к файлу index.html

Если наше приложение размещено на mydomain.com/app с использованием режима web history, то нам необходимо изменить определение роутера, передав "базовый путь" в функцию creator. Так, если мы рассмотрим роутер из нашего примера SPA-приложения в главе 5, Одностраничные приложения, то мы можем изменить его следующим образом:

/chapter 5/to-do SPA/src/router/index.js
js
import { createWebHistory } from "vue-router"
+import{_ as t,c as s,o as n,U as a}from"./chunks/framework.P5TqXf0g.js";const e="/assets/Figure_10.01_B18602._OtkN9gD.jpg",i="/assets/Figure_10.02_B18602.TR1jYBN0.jpg",E=JSON.parse('{"title":"Развертывание приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_10__Deploying_Your_Application.md","filePath":"ru/book/Chapter_10__Deploying_Your_Application.md","lastUpdated":1706553672000}'),r={name:"ru/book/Chapter_10__Deploying_Your_Application.md"},o=a('

Развертывание приложения

Работа над приложением закончилась бы печально, если бы мы не смогли опубликовать конечный продукт. Представление приложения в Интернете требует внимания к некоторым деталям и знакомства с некоторыми терминами и возможностями хостинга.

Хотя это и довольно просто, но все же требует внимания к некоторым деталям и знакомства с некоторыми терминами и возможностями хостинга.

В этой главе мы познакомимся со следующим:

  • Что включает в себя публикация веб-приложения в Интернете
  • Вопросы, связанные с созданием приложения для развертывания
  • Знакомство с условиями и процессами регистрации домена
  • Настройка веб-сервера для размещения одностраничного приложения (SPA) или прогрессивного веб-приложения (PWA)
  • Защита сервера нашего веб-приложения с помощью Let's Encrypt

Основная цель этой главы - дать вам инструменты для понимания шагов, необходимых для публикации и защиты веб-сайта и, соответственно, нашего SPA или PWA.

Технические требования

Эта глава носит в основном информационный характер, однако в качестве примеров в репозиторий книги было загружено несколько конфигурационных файлов, с которыми можно ознакомиться здесь.

Что включает в себя публикация веб-приложения?

Публикация веб-приложения Vue 3 не сильно отличается от публикации любого другого сайта, за исключением нескольких ключевых отличий. В этой главе мы рассмотрим чистую установку, т.е. все необходимые элементы мы создадим самостоятельно. В самом общем случае нам необходимо учесть следующее:

  • Доменное имя для нашего сайта/приложения
  • Путь назначения для нашего приложения
  • Услуга хостинга
  • Программное обеспечение веб-сервера
  • Получение сертификата безопасности

Предыдущие пункты также дают нам простую формулу для подготовки. Давайте пойдем по порядку, объясняя по мере продвижения каждый необходимый термин и проблему.

Домены, серверы доменных имен (DNS) и записи DNS

Каждый компьютер, подключенный к сети, получает уникальный идентификационный адрес, отличающий его от других компьютеров в той же сети. Такие адреса называются Internet Protocol (IP), и в настоящее время их существует два - IP версий 4 и 6.

  • IPv4: Адреса состоят из четырех чисел, разделенных точкой. Диапазон чисел составляет от 0 до 255. Существует несколько зарезервированных адресов, имеющих особое значение, например 127.0.0.1, который представляет собой обратную петлю к нашему собственному компьютеру. Эти адреса также могут иметь маску, определяющую подсегмент в сети. Скорее всего, в вашей домашней сети используется именно этот протокол.
  • IPv6: Этот протокол предоставляет значительно большее адресное пространство, состоящее из восьми групп по четыре шестнадцатеричных цифры, разделенных точкой с запятой. Благодаря такому большому размеру протокол также позволяет упростить обозначения, удаляя ведущие нули и заменяя все нулевые сегменты пустым сегментом. Например, адрес loopback, эквивалентный адресу IPv4 127.0.0.1 в IPv6 - это 0000:0000:0000:0000:0000:0000:0000:0001, который затем можно сократить как 0:0:0:0:0:0:0:1 или просто ::1 .

Есть еще много интересного о сетевых адресах, но только из этого краткого введения уже можно увидеть проблему удобства использования. Эти адреса отлично подходят для компьютеров, но не подходят для "человеческой памяти". В огромном Интернете, с миллионами подключенных компьютеров, использование только IP-адресов для навигации было бы невозможно.

Поэтому в инфраструктуре Сети существуют специальные серверы, обеспечивающие преобразование "дружественного человеку имени" в нужный IP-адрес. Такие дружественные имена называются доменами, а серверы, обеспечивающие преобразование, - Сервисами доменных имен (DNS). Все это регулируется организацией Internet Corporation for Assigned Names and Numbers (ICANN).

Доменные имена - это то, что мы используем каждый день для доступа к любому сайту или приложению в Интернете. Они приобретаются на ограниченное время у организации, уполномоченной продавать их, называемой регистратором.

По истечении этого срока есть возможность в течение ограниченного времени продлить домен, а если нет, то он может быть приобретен любым другим лицом. Обычно домены продаются в пересчете на годы, и цены на них сильно варьируются - от нескольких центов до тысяч долларов. Домены также объединяются в группы, разделенные точками справа налево, как показано здесь:

image

Рисунок 10.1 - Части, составляющие полное доменное имя

Домен верхнего уровня управляется ICANN, и хотя наиболее известным является .com для коммерческих сайтов, существует множество других, например, следующие:

  • .org: Для организаций
  • .net: Для сетей или порталов корпоративных интрасетей и других организаций
  • .mil: Для военного использования
  • .gov: Для официальных правительственных сайтов

Новые домены верхнего уровня создаются часто. С их растущим списком можно ознакомиться здесь.

Когда мы покупаем домен (например, mydomain на предыдущем рисунке), он привязывается к выбранному нами домену верхнего уровня. Регистраторы предоставляют нам возможность выбрать домен и проверить, доступен ли он для покупки.

Чтобы домен был полезен, он должен быть зарегистрирован в DNS и указывать на IP-адрес. Для этого необходимо создать DNS-записи, что часто делается через того же регистратора, который продает домен, или же мы можем записать в регистраторе DNS, который будет иметь целевой IP. Подробнее об этом будет сказано позже, а пока просто представьте эту концепцию в уме. Наиболее часто встречающиеся DNS-записи для домена выглядят следующим образом:

Тип записи (имя)Значение и описание
AАдрес IPv4. Это основная запись, указывающая на публичный IP-адрес вашего сервера.
AAAAАдрес IPv6. Указывает на публичный IPv6-адрес вашего сервера.
CNAMEСоздает псевдоним для домена, что позволяет направлять несколько доменов к одному адресату без создания нескольких записей A/AAAA. Это может быть использовано для создания поддоменов.
TXTОбычная текстовая запись, которая часто используется при подтверждении права собственности на домен.

Таблица 10.1 - Типы записей DNS.

В зависимости от регистратора и нанимаемой услуги, вы можете никогда не увидеть эти записи или не иметь с ними дела, поскольку некоторые регистраторы/веб-хостинги управляют ими автоматически.

Поддомены не нужно покупать у регистратора, их нужно только настроить. Вы можете создать сколько угодно поддоменов для своего домена. Некоторые распространенные поддомены выглядят следующим образом:

  • www: Обозначает World Wide Web, или веб-страницу. В настоящее время этот поддомен часто используется как синоним домена.
  • app: Для приложений.
  • admin: Для административного доступа.
  • mail: Для служб электронной почты.

Используя поддомены, можно размещать несколько сайтов на одном домене/хосте. Позже мы рассмотрим, как настроить один из них для нашего приложения на нашем веб-сервере. На данный момент необходимо помнить, что домен или поддомен будет указывать в качестве конечного адресата на ваш сервер.

Примечание о loopback-адресе

Согласно предыдущим примерам, "доменное" имя, зарезервированное для loopback (домашнего) адреса, - localhost.

Домен, на котором будет размещено наше приложение, - это первый шаг к присутствию в Интернете. С ним мы переходим к следующему вопросу - где будет размещено приложение в этом домене.

Размышления о создании приложения для развертывания

После того как мы получили домен/поддомен, нам необходимо решить (или узнать), на каком пути будет располагаться приложение. Путь - это то, что следует за доменом, в сегментах, разделенных прямой косой чертой (/) - например, mydomain.com/store/product.html. Эти участки называются "путями", поскольку они соответствуют той же структуре каталогов, что и зеркальное отображение в локальном хранилище.

Наше приложение будет обслуживаться через веб-сервер. Эти удивительные программы построены на концепции обслуживания файлов в соответствии со структурой каталогов (папка/подпапка/файл...). Внутри нашего сервера запрос домена будет соответствовать файлам в локальной директории.

Здесь нам необходимо знать, будет ли приложение Vue размещено в корне или по пути (директории), поскольку нам необходимо указать это в процессе сборки, если мы используем Vue Router в режиме веб-истории (пересмотрите главу 5, Одностраничные приложения, если вам необходимо освежить эту тему). В данном случае нам необходимо сделать две модификации:

  • Указать корневой путь для приложения в конфигурации Router
  • Настроить веб-сервер на изменение службы каталогов/файлов и направлять все запросы к файлу index.html

Если наше приложение размещено на mydomain.com/app с использованием режима web history, то нам необходимо изменить определение роутера, передав "базовый путь" в функцию creator. Так, если мы рассмотрим роутер из нашего примера SPA-приложения в главе 5, Одностраничные приложения, то мы можем изменить его следующим образом:

/chapter 5/to-do SPA/src/router/index.js
js
import { createWebHistory } from "vue-router"
 // ...
 router = createRouter({
     history: createWebHistory('/app'),
diff --git a/assets/ru_book_Chapter_10__Deploying_Your_Application.md.-FlkJQ-f.lean.js b/assets/ru_book_Chapter_10__Deploying_Your_Application.md.MNTrkDv9.lean.js
similarity index 93%
rename from assets/ru_book_Chapter_10__Deploying_Your_Application.md.-FlkJQ-f.lean.js
rename to assets/ru_book_Chapter_10__Deploying_Your_Application.md.MNTrkDv9.lean.js
index 3e8f2f9bf..457347611 100644
--- a/assets/ru_book_Chapter_10__Deploying_Your_Application.md.-FlkJQ-f.lean.js
+++ b/assets/ru_book_Chapter_10__Deploying_Your_Application.md.MNTrkDv9.lean.js
@@ -1 +1 @@
-import{_ as t,c as s,o as n,U as a}from"./chunks/framework.P5TqXf0g.js";const e="/assets/Figure_10.01_B18602._OtkN9gD.jpg",i="/assets/Figure_10.02_B18602.TR1jYBN0.jpg",E=JSON.parse('{"title":"Развертывание приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_10__Deploying_Your_Application.md","filePath":"ru/book/Chapter_10__Deploying_Your_Application.md","lastUpdated":1706427418000}'),r={name:"ru/book/Chapter_10__Deploying_Your_Application.md"},o=a("",103),l=[o];function p(g,h,d,c,u,k){return n(),s("div",null,l)}const b=t(r,[["render",p]]);export{E as __pageData,b as default};
+import{_ as t,c as s,o as n,U as a}from"./chunks/framework.P5TqXf0g.js";const e="/assets/Figure_10.01_B18602._OtkN9gD.jpg",i="/assets/Figure_10.02_B18602.TR1jYBN0.jpg",E=JSON.parse('{"title":"Развертывание приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_10__Deploying_Your_Application.md","filePath":"ru/book/Chapter_10__Deploying_Your_Application.md","lastUpdated":1706553672000}'),r={name:"ru/book/Chapter_10__Deploying_Your_Application.md"},o=a("",103),l=[o];function p(g,h,d,c,u,k){return n(),s("div",null,l)}const b=t(r,[["render",p]]);export{E as __pageData,b as default};
diff --git a/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.gta8mx10.js b/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.VFEWywZs.js
similarity index 99%
rename from assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.gta8mx10.js
rename to assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.VFEWywZs.js
index c55ba7eef..eadd8ad3b 100644
--- a/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.gta8mx10.js
+++ b/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.VFEWywZs.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_11.01_B18602.9gVX-hPu.jpg",e="/assets/Figure_11.02_B18602.g7Q6Bksk.jpg",p="/assets/Figure_11.03_B18602.m2o8p7ZT.jpg",l="/assets/Figure_11.04_B18602.DW3JuX3p.jpg",r="/assets/Figure_11.05_B18602.zi8HDppJ.jpg",h="/assets/Figure_11.06_B18602.__Czl0tA.jpg",o="/assets/Figure_11.07_B18602.es0qyzEq.jpg",k="/assets/Figure_11.08_B18602.5xuKdkg_.jpg",g="/assets/Figure_11.09_B18602.iF3e21zi.jpg",d="/assets/Figure_11.10_B18602.xLDSic7c.jpg",E="/assets/Figure_11.11_B18602.JuyjmRMv.jpg",c="/assets/Figure_11.12_B18602.S-sAtWaD.jpg",u="/assets/Figure_11.13_B18602.FSUpsZw2.jpg",m="/assets/Figure_11.14_B18602.WFs_mB4Q.jpg",y="/assets/Figure_11.15_B18602.QhMlytyc.jpg",q="/assets/Figure_11.16_B18602.ToPrRINz.jpg",F="/assets/Figure_11.17_B18602.Z-aHALz-.jpg",_="/assets/Figure_11.18_B18602.OwywRA41.jpg",b="/assets/Figure_11.19_B18602.N-yvPScp.jpg",C="/assets/Figure_11.20_B18602._nXSvuhE.jpg",f="/assets/Figure_11.21_B18602.lOPQxe6B.jpg",B="/assets/Figure_11.22_B18602.a-2Cxypm.jpg",v="/assets/Figure_11.23_B18602.nXH4iMLi.jpg",P="/assets/Figure_11.24_B18602.KfeqX3Fo.jpg",x="/assets/Figure_11.25_B18602.SvrXsFhY.jpg",A="/assets/Figure_11.26_B18602.eGNr1fa4.jpg",D="/assets/Figure_11.27_B18602.k83TOZ79.jpg",w="/assets/Figure_11.28_B18602.T9ki_wfT.jpg",U="/assets/Figure_11.29_B18602.m3z1ZZ7u.jpg",S="/assets/Figure_11.30_B18602.MkNHb0lz.jpg",N=JSON.parse('{"title":"Бонусная глава - Шаблоны UX","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md","filePath":"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md","lastUpdated":1706427418000}'),j={name:"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md"},X=t('

Бонусная глава - Шаблоны UX

Давным-давно компьютерное программное обеспечение продавалось вместе с увесистыми печатными руководствами, а во многих случаях и со специализированным обучением. Если в корпоративных приложениях и специализированном оборудовании это еще как-то применимо, то на потребительском рынке такая концепция практически полностью исчезла.

Представьте себе, что для каждого веб-сайта нужно было прочитать руководство и пройти трехмесячные курсы обучения, прежде чем начать его использовать. Как же так получается, что сегодня пользователь, познакомившись с новым приложением, может с первого взгляда справиться с основными задачами?

Несомненно, большой вклад в эту ситуацию внесли многолетние исследования и прогресс в области человеко-компьютерного взаимодействия - дисциплины, практически такой же древней, как и сами компьютеры.

В этой главе мы сделаем шаг назад от тонкостей внутренних шаблонов и архитектуры программного обеспечения и рассмотрим некоторые из устоявшихся шаблонов для проектирования пользовательского интерфейса (UI) и пользовательского опыта (UX). Мы сделаем следующее:

  • Поймем различия между UI и UX
  • Познакомимся с распространенными шаблонами UX в веб-приложениях
  • Узнаем о злой стороне UX с помощью "темных" шаблонов

К концу этой главы вы получите широкое представление о том, что такое UX-шаблоны, на каких принципах они основаны, каковы наиболее распространенные на сегодняшний день подходы и какие эффекты они вызывают у пользователя - положительные или отрицательные. Вы также изучите и выработаете общий язык для взаимодействия с дизайнерами UI и UX и другими разработчиками.

Технические требования

Эта глава носит в основном информационный характер, однако в ней рассматриваются небольшие примеры, реализованные на Vue 3, поскольку они демонстрируют использование техники, не встречавшейся до сих пор в книге. Полный исходный код можно найти в папке проекта главы в репозитории книги по адресу: https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter11.

Посмотрите следующее видео, чтобы увидеть код в действии.

UI-дизайн против UX-дизайна

Очень часто можно услышать, что эти два термина ассоциируются или используются неразличенно, а в некоторых случаях обе обязанности объединяются в одну роль в команде, что еще больше усиливает путаницу.

  • Дизайн пользовательского интерфейса (User Inteface - UI) отвечает за определение визуального языка для представления информации и сбора пользовательских данных для взаимодействия с приложением. Он включает в себя разработку визуальных стилей, типографики, взаимодействия, цветов, размеров, анимации, звуков и т.д., которые составляют интерфейс между человеком и компьютером (программным и аппаратным обеспечением).

    Это относится как к визуальным средам (веб, мобильные устройства и т.д.), так и к другим типам, таким как интерфейсы на естественном языке (вспомните помощников искусственного интеллекта, таких как Siri, Alexa и т.д.).

  • UX-дизайн (User eXperience) включает условия, которые влияют на дизайн пользовательского интерфейса и направляют его, но охватывает более широкий взгляд на восприятие пользователем системы, компании или функции, с которой он взаимодействует.

    Он включает в себя не только программные или аппаратные элементы, но и такие аспекты, как поддержка, продвижение, постсервисное обслуживание и т.д. Цель - создать широкий и, надеюсь, успешный положительный опыт с точки зрения пользователя.

    Под этим определением подразумевается взаимодействие с другими дисциплинами, такими как маркетинг, поддержка клиентов, дистрибуция, управление продуктом, узнаваемость бренда и т.д.

    Его основная цель - изменить или создать у пользователя представление о том, что продукт, услуга или система просты в использовании, эффективны и, прежде всего, полезны для его целей.

Понимание принципов и целей каждой дисциплины поможет нам разрабатывать более качественное программное обеспечение и находить общую почву для понимания при сотрудничестве с теми, кто занимается этими дисциплинами. Без UI и UX даже самое лучшее программное обеспечение может кануть в Лету. История программного обеспечения полна примеров того, как компании, даже имея продукты, превосходящие своих конкурентов, становились на путь птицы Додо, поскольку пренебрегали пользовательским опытом или имели плохой визуальный дизайн. Иногда обложка книги так же важна, как и ее содержание.

Принципы проектирования пользовательского интерфейса

В основе дизайна пользовательского интерфейса лежит задача создания интерфейса, который будет удобен для пользователя, эффективен, информативен и приятен. Такие маркетинговые концепции, как удержание и удовлетворение пользователей, в значительной степени зависят от дизайна продукта.

Для наших целей мы ограничим рассмотрение пользовательских интерфейсов интерфейсами приложений на дисплее (представленных с помощью визуальных средств, таких как экран или сенсорное устройство).

Существует большое количество документации, детально изучающей проектирование пользовательских интерфейсов с инженерной точностью и четко определенными отраслевыми стандартами. Каждый аспект имеет свой собственный набор правил, которые необходимо учитывать хорошему дизайнеру пользовательского интерфейса. Например, веб-дизайнер будет видеть вещи иначе, чем промышленный дизайнер.

В нашем случае большинство шаблонов для проектирования пользовательского интерфейса с самого начала были включены в стандарт HTML, поэтому большинство, если не все, из того, что мы будем рассматривать как шаблоны, уже знакомо вам и конечному пользователю. Однако то, как они работают, или принципы, которым они следуют, - это не то, что обычно обсуждается или является очевидным.

Например, почему символ "X" для закрытия окна находится в правом верхнем углу? Что означает каждый значок меню? Почему кнопка Start расположена в верхнем или левом нижнем углу экрана? Почему некоторые функции трудно найти, а другие доступны с первого взгляда? Все эти вопросы имеют решение, которое коренится в дизайне пользовательского интерфейса и UX-шаблонах. Поэтому давайте рассмотрим некоторые принципы пользовательского интерфейса, а затем перейдем к шаблонам UX.

Достаточный контраст или различие между элементами

Этот принцип гласит, что элементы страницы должны быть четко отличимы друг от друга и отражать свою функцию. Он отражает необходимость выстраивания визуальных элементов в иерархию с использованием размера, цвета, типографики, полей и белого пространства таким образом, чтобы каждая функция была четко представлена и отличалась от других. Основная задача - направить внимание пользователя на центральную точку интерфейса. Рассмотрим в качестве примера домашнюю страницу Packt:

Рисунок 11.1 - Главная страница Packt и цветовой контраст.

В данном примере большая часть контента использует ограниченное количество цветов ("палитру"), а две кнопки имеют высокий контраст, что привлекает внимание пользователя: это кнопки TRY FOR FREE и START LEARNING NOW. Очевидно, что дизайнер установил точку фокусировки на этих двух действиях.

В связи с этим принципом на данном снимке экрана применено "правило" дизайна, которое удобно иметь в виду: 60-30-10 color rule. Это означает, что 60% раздела должны иметь основной цвет (здесь он темно-коричневый), 30% - первичный (используется для обычного текста, меню и изображения, которое здесь белое), а 10% отводится под вторичный цвет или высокий контраст (используется для фокусной точки, или кнопок "призыва к действию" оранжевого цвета). Продолжим анализ этой страницы, чтобы ознакомиться с другими принципами проектирования пользовательского интерфейса.

Стимулировать повторение и быть последовательным.

Этот принцип основан на концепции, согласно которой люди учатся через повторение. Он указывает на то, что одна и та же задача, даже выполняемая через разные интерфейсы, должна вызывать у пользователя более или менее одинаковое повторяющееся поведение.

Например, если вы попросите пользователя открыть текстовый процессор, а потом предложите ему открыть файл, куда он попытается нажать? Большинство "опытных" пользователей подведут мышь к левой верхней части окна и будут искать либо значок, обозначающий "Открыть", либо меню Файл. Почему так? Потому что такое размещение стало стандартным, и мы путем повторения узнали, где его искать. Если бы вы разместили меню File в правом нижнем углу экрана, то большинство, если не все, пользователи не смогли бы найти его без подсказок.

Еще один пример повторения и согласованности возникает при отображении визуальных элементов - что более важно, когда они являются частью списка или общего набора. Приведем пример с сайта Packt Publishing:

Рисунок 11.2 - Карточки с книгами

В предыдущем примере дизайнер использовал повторение для отображения книг в прайм-тайм, используя вертикальные "карточки" для каждого предмета. Каждая карточка повторяет аналогичный макет, цвета и формат. Как только вы поймете, что отображает одна из них, то же самое можно сказать и обо всех остальных: это повторение визуального дизайна, и оно важно, чтобы пользователю не пришлось "заново" изучать интерфейс для каждой книги.

Кроче говоря, это повторение расположения, действий и визуальных стилей. Перейдем к следующему.

Внимательно следите за выравниванием и направлением

Выравнивание элементов (графики, шрифтов и т.д.) создает ощущение порядка и организованности, показывая, что эти элементы принадлежат к одной группе или имеют одинаковый вес или важность. В основном мы знакомы с выравниванием (и интервалом) при работе со шрифтами, но эта же концепция применима и к графическим элементам, таким как пиктограммы, секции, изображения и т.д. Из предыдущего рисунка обратите внимание на то, как выровнены вкладки, а также карточки и их содержимое. Только по выравниванию и стилю можно определить, что относится к той или иной естественной группе.

Другой пример выравнивания хорошо виден при использовании типографики только для меню и функций.

Рисунок 11.3 - Нижний колонтитул сайта Packt, использующий выравнивание для отображения естественных групп.

Этот пример, хотя и простой, уже демонстрирует использование контраста (жирный шрифт против обычного), последовательности за счет повторения, выравнивания, а также следующего принципа, который мы здесь рассмотрим: близости.

Используйте близость и расстояние, чтобы показать естественные группы

Этот принцип прост: размещайте элементы, которые естественным образом связаны друг с другом, близко друг к другу. Это облегчает пользователю поиск и понимание. Типографика и иконография также могут быть использованы для демонстрации близости и схожести функциональных возможностей. Знаменитая "ленточная панель", введенная компанией Microsoft в своих приложениях Office, в значительной степени использует эту концепцию и вскоре стала стандартом. Например, вот фрагмент вкладки Home, посвященный выравниванию, спискам, интервалам и отступам:

Рисунок 11.4 - Значки абзацев

Обратите внимание, что пиктограммы, изменяющие тип абзаца, интервал и выравнивание, находятся рядом друг с другом, не "смешиваясь".

Это не единственные принципы проектирования пользовательского интерфейса, но самые основные, которые мы должны иметь в виду при разработке наших компонентов. Если вы работаете с командой, в которую входит дизайнер пользовательского интерфейса, вы можете получить шаблоны или макеты, даже раскадровки, для реализации в компонентах Vue, как мы видели в главе 4, Композиция пользовательского интерфейса с компонентами.

Если же вы работаете в команде "one-man band team" и проектирование интерфейсов лежит на ваших плечах, то эти принципы очень помогут вам создать профессиональный и полезный пользовательский интерфейс. Но это еще не все.

Законы проектирования пользовательского интерфейса

Как и в случае с принципами, в ряде исследований были выведены или определены "законы" дизайна, которые представляют собой измеримые функции для предсказания определенных атрибутов программного обеспечения, таких как удобство и дружелюбие. В частности, выделяются следующие.

Закон Фитта

Этот закон определяет, что время, необходимое пользователю для захвата цели, зависит от расстояния до указателя и размера цели. Важными понятиями здесь являются расстояние и размер цели: чем больше расстояние между целями, тем больше они должны быть.

В результате применения этого закона кнопка закрытия окна (X) располагается в одном из углов экрана (при максимизации окна), кнопка Start - в левом нижнем углу экрана, Show desktop - в правом нижнем углу экрана и так далее. Если пользователь перемещает мышь в любом из этих направлений, то рано или поздно он попадет на эти цели, и продолжение движения в том же направлении не повлияет на результат. На языке дизайна пользовательского интерфейса эти кнопки являются "бесконечными", поскольку, как только курсор достигнет угла у края экрана, продолжение прокрутки мышью в том же направлении все равно приведет к достижению цели.

Другим следствием этого закона является то, что похожие функции также должны располагаться рядом друг с другом (как, например, в примерах на Рисунке 11.4). Более подробную информацию об этом законе можно найти в Википедии по адресу https://en.wikipedia.org/wiki/Fitts's_law.

Закон Хика

Этот закон гласит, что время, которое требуется пользователю для того, чтобы сделать выбор, является логарифмической функцией, зависящей от количества доступных вариантов и их сложности. Проще говоря, слишком большое количество вариантов запутывает пользователя и заставляет его тратить больше времени на принятие решения. Некоторые следствия из этого закона выглядят следующим образом:

  • Разбивайте сложные задачи на более мелкие группы, которыми может управлять пользователь, чтобы ускорить время принятия решения
  • Избегайте создания интерфейсов, перегруженных опциями, так как они будут перегружать пользователя
  • Если функция чувствительна ко времени, сведите количество опций к минимуму, необходимому в данной ситуации

В повседневном программном обеспечении мы можем наблюдать применение этого закона во многих местах - например, в "инсталляторах" для конкретного программного обеспечения, где во время или перед началом установки пользователю последовательно представляются окна с опциями, в отличие от формы для заполнения. Более подробную информацию об этом законе можно найти в Википедии.

Восемь правил Бена Шнайдермана

В 1986 году профессор Бен Шнайдерман опубликовал свою книгу под названием Designing the User Interface: Strategies for Effective Human-Computer Interaction, в которой он сформулировал восемь правил проектирования интерфейсов. Сегодня эти правила так же актуальны, как и в день их создания, поэтому их стоит упомянуть здесь:

  1. Стремитесь к последовательности (в действиях, шагах, расположении и т.д.).
  2. Обеспечьте использование быстрых клавиш для выполнения общих задач (будь то клавиатура или пиктограммы).
  3. Предлагайте информативную обратную связь (особенно при возникновении ошибок).
  4. Дизайн диалогов с окончанием.
  5. Предлагайте простую обработку ошибок, чтобы пользователь мог быстро принять меры и избежать серьезных ошибок со стороны пользователя. Классической реализацией правил #4 и #5 являются "диалоги подтверждения" перед выполнением постоянных действий, таких как удаление содержимого.
  6. Позволяйте легко и просто выполнять действия, связанные с удалением содержимого.
  7. Позволяйте легко отменять действия (благодаря этому у нас есть Ctrl + Z!).
  8. Поддерживайте чувство контроля у пользователя. Нет ничего хуже для пользователя, чем чувствовать, что машина "делает все сама, без контроля". Если вы когда-нибудь по ошибке отправляли на печать 800-страничный файл, и у вас ушло с десяток страниц, прежде чем вы смогли отменить операцию. Вот о чем идет речь.
  9. Сокращенайте время на печать.
  10. Сокращайте кратковременную память. Пользователь может одновременно удерживать в своей кратковременной памяти лишь несколько элементов и задач, а слишком большое количество элементов на экране (меню и т.д.) вызывает отторжение. Этот принцип также связан с законом Хика.

Для практического применения и введения в тему эти принципы, правила и законы должны дать нам уверенную опору.

Больше информации об этих правилах и Бене Шнайдермане можно найти в Википедии.

Принципы проектирования UX

UX-дизайн также имеет свои цели и принципы, которые распространяются на шаблоны. Прежде всего, основная цель UX - обеспечить хорошее восприятие пользователя, создать связь с брендом или продуктом, тщательно выстроив поток взаимодействий. В данном случае решения должны быть следующими:

  • Полезность и удобство использования: Прежде всего, приложение должно делать то, для чего оно предназначено, делать это хорошо и быть простым для пользователя
  • Узнаваемость и запоминаемость: пользователь должен иметь возможность изучить и понять представленную информацию, а также усвоить ее для дальнейшего использования
  • Креативность и предоставление контроля пользователю: Когда пользователь взаимодействует с приложением, он должен чувствовать, что делает то, что задумал пользователь, и что результат "безопасен" для пользователя

Последний принцип очень важен. Если пользователь чувствует, что приложение где-то в процессе взаимодействия "потеряло контроль" над происходящим, то это залог катастрофы. К сожалению, это слишком часто происходит с темным шаблонами, которые мы рассмотрим далее в этой главе, но сейчас давайте посмотрим на хорошие шаблоны, которые приводят к хорошему опыту для пользователя.

Общие шаблоны для работы с данными

Чаще всего этим шаблонам соответствуют чистые HTML-элементы, другие же появились в последние годы благодаря грамотному использованию стилизации таких элементов. Они стали стандартными в отрасли и хорошо понимаются пользователями с первого взгляда. Ниже приводится неполный список с кратким описанием того, когда следует использовать каждый из них.

Элементы ввода HTML

Стандартные поля ввода, предусмотренные в HTML, представляют собой четкий шаблон для получения информации от пользователя. В настоящее время элемент input имеет множество вариантов благодаря атрибуту type, позволяющему вводить не только обычный текст. Используемые в формах и библиотеках проверки, эти элементы не уступают по своим возможностям: они готовы к чтению и форматированию от текста и чисел до URL, даты, времени, изображений и цветов. Полный список доступных типов, поддерживаемых современными браузерами, можно найти здесь.

По большей части эти элементы используются с базовой функциональностью и некоторым тяжелым CSS-стилем. Используйте inputtextarea) в тех случаях, когда пользователю необходимо ввести текстовую информацию. Для более сложных типов, таких как выбор даты или цвета, браузеры сегодня предлагают собственные виджеты.

Чекбоксы, радиокнопки и тумблеры

Клавиши и радиокнопки предоставляются HTML нативно и представляются пользователю в соответствии с форматом локальной ОС или среды. button представляют пользователю несколько вариантов, которые он может свободно выбрать из группы. В отличие от них, кнопки radio позволяют выбрать только один вариант из списка:

Рисунок 11.5 - Чекбоксы слева и радиокнопки справа

С выходом оригинального iPhone стал очень популярен новый вариант флажка: тумблер (toggle switch). Он не предусмотрен стандартом HTML, но его можно легко стилизовать с помощью CSS, чтобы "замаскировать" чекбокс. Тумблер имеет два состояния, включенное и выключенное, и часто используется для активации или деактивации функции или возможности. Это важное различие, поскольку флажок должен фокусироваться на вариантах или альтернативах. Вот пример:

Рисунок 11.6 - Тумблеры в каждом состоянии

Тумблер находится в состоянии "выключено" (или false), когда тумблер находится слева, и "включено", когда справа. Часто переключение также влияет на цвет, показывая его в неяркой серой гамме, когда он выключен, или в ярких цветах, когда активирован. Внутри системы эти два состояния часто обозначаются true (включено) и false (выключено), и их следует использовать для активации или деактивации настроек, функций и т.д. Компонент Toggle, реализующий стилизацию, и код v-модели вы можете найти в репозитории к этой главе.

Чипы, таблетки или теги

Этот шаблон включает в себя короткий текст (или "копию" на языке пользовательского интерфейса) внутри круглой рамки. Копия может сопровождаться значком, подчеркивающим ее состояние при выделении, или действием, например, символом "X" для ее удаления. Обычно тэги используются в списках для отображения атрибутов, тегов, категорий или других типов классификаторов для данного элемента.

В некоторых случаях они могут использоваться и для выбора (переключения) элементов из списка. В этом случае они конкурируют или ведут себя так же, как чекбокс, но в более наглядной форме. Реализация фишек достаточно тривиальна и может быть выполнена с помощью обычного CSS в одном HTML-элементе (например, в элементе span).

Рисунок 11.7 - Список элементов с таблетками

Это краткий список шаблонов пользовательского интерфейса для сбора пользовательского ввода, но он охватывает наиболее распространенные типы: HTML-вводы и вариации стилей.

##№ Общие шаблоны для визуализации данных

Эти шаблоны отображают информацию обратно пользователю, либо в ответ на действие пользователя, либо на событие приложения. Ниже приведен неполный список шаблонов.

Подсказки (tooltips)

Этот шаблон показывает пользователю плавающий небольшой текст с информацией о целевом элементе, обычно когда пользователь активирует элемент с помощью какого-либо действия (наведение, щелчок, выделение и т.д.). Информация отображается над, под или сбоку от элемента в виде "речевого пузыря" (как в комиксах). Вот пример:

Рисунок 11.8 - Всплывающая подсказка, отображающая название/действие пиктограммы и ярлыка.

В основном этот шаблон используется для отображения справки по целевому объекту, но может применяться и для отображения контекстных меню. Например, при выделении слова из этого абзаца в текстовом редакторе в режиме онлайн отобразится всплывающее окно с меню:

Рисунок 11.9 - Шаблон всплывающей подсказки, используемый для отображения контекстного меню.

Может возникнуть дискуссия по поводу того, является ли последнее использование всплывающей подсказкой или контекстным меню, но тот факт, что оно открывается при выборе, указывает на первое. Традиционно контекстные меню открываются вторичным действием, например, нажатием правой кнопки мыши (в Windows и Linux). В любом случае, концепция, которую следует запомнить для этого шаблона, заключается в том, чтобы показывать пользователю информацию при выборе или предварительной активации, чтобы помочь ему решить, что делать дальше.

Уведомляющие точки, пузырьки, метки или значки

Этот шаблон заключается в отображении маленького значка поверх более крупного значка, чтобы показать, что произошло событие, требующее внимания пользователя, но не являющееся срочным. Этот маленький значок может быть точкой, пузырьком и т.д. Если в уведомлении есть цифра, его также называют значком (badge) Ниже приведены примеры этого шаблона:

  • Маленький кружок с цифрой для новых полученных писем в значке электронной почты
  • Двойная галочка в приложении чата, указывающая на то, что собеседник получил и прочитал сообщение
  • Маленькая отметка на панели задач, показывающая, что приложение было открыто

Основная концепция заключается в том, чтобы использовать некое небольшое отклонение от пиктограммы, указывающее на необходимость обратить на себя внимание в будущем, но при этом не являющееся срочным и не влияющее на текущую деятельность пользователя.

Тостовые уведомления

Этот шаблон используется во многих приложениях и ОС. Он заключается в отображении на короткое время плавающего окна с быстрой информацией для пользователя. Часто оно включает в себя короткий текстовый фрагмент в сочетании с понятной пиктограммой.

В зависимости от ОС оно может отображаться вверху по центру, справа от экрана или внизу справа над системным лотком. Веб-приложения могут либо реализовать собственное тостовое уведомление в окне браузера, либо запросить разрешение у пользователя и отобразить "родное тостовое уведомление" с помощью локальной ОС. Вот пример уведомления о тосте:

Рисунок 11.10 - Нативное уведомление о тостах на рабочем столе

Эти уведомления полезны для информирования пользователя об изменениях в окружении, требующих его внимания, для сообщения о результате выполнения асинхронной операции (успех, ошибка и т.д.) и т.п. Эти призывы к вниманию эфемерны, поэтому они не должны быть критической частью важного рабочего процесса, за исключением только что упомянутых условий.

Карусель или слайдеры изображений

Карусель или слайдеры изображений - это шаблон для последовательного отображения в одном пространстве различных секций с изображениями и контентом. Как правило, с помощью таймера эти разделы представляются пользователю с интервалом в несколько секунд, при этом есть возможность перейти к любому из них с помощью точечной навигации. Несмотря на то, что несколько лет назад эти карусели были очень популярны, существуют и противоположные мнения, поскольку "нетерпеливые" пользователи могут так и не увидеть всего содержимого карусели. На практике рекомендуется делать список разделов как можно короче, где-то между тремя и пятью элементами.

Примеров такой реализации в Интернете множество, поскольку они реализуются в основном на посадочной странице сайта. Практически все торговые и новостные сайты используют этот шаблон - например, посадочная страница Amazon (www.amazon.de):

Рисунок 11.11 - Карусель Amazon отображает предложения из магазина

Слайдеры изображений могут быть такими же большими, как карусель, но могут быть и гораздо меньше и использоваться для отображения миниатюр. Вот еще один пример из Amazon:

Рисунок 11.12 - Amazon использует слайдеры изображений для отображения товаров пользователю

Несмотря на тривиальную реализацию, использование каруселей и слайдеров изображений является хорошим способом отображения информации для пользователя. Однако стоит предупредить, что злоупотребление этим шаблоном может привести к перегруженности и перенасыщенности интерфейса, вызвать путаницу и даже спровоцировать нежелательные побочные эффекты, такие как сенсорное подавление и избегание контента.

Панели прогресса (progress bars) и спиннеры

Панель прогресса - это любой элемент, который дает пользователю представление о том, на каком этапе рабочего процесса находится его текущее состояние. Хотя название, казалось бы, указывает на "полосу", на практике в эту категорию попадает любой элемент, отображающий прогресс выполнения ограниченного числа действий.

Основная цель - уведомить пользователя о ходе выполнения задач, требующих длительного времени, и показать, что система "занята" их выполнением, тем самым обеспечивая наглядность и чувство контроля для пользователя.

Прогресс-бары очень важны для предотвращения непроизвольных негативных действий со стороны пользователя. Если длительное задание выполняется в фоновом режиме (например, в веб-рабочем) без какой-либо обратной связи о ходе его выполнения, пользователь может подумать, что задание не началось, не удалось или компьютер "завис". Оставлять пользователя в недоумении по поводу происходящего - это негативный опыт. Вот некоторые примеры элементов индикатора выполнения:

Рисунок 11.13 - Пример прогресс-бара

Помимо стилизации, индикаторы выполнения могут использоваться и в "неопределенном состоянии", то есть приложение не может рассчитать, сколько времени или сколько шагов может занять процесс, но при этом хочет сообщить пользователю, что система занята и не должна быть прервана. В стандарте HTML предусмотрен элемент, специально предназначенный для индикаторов выполнения, который позволяет справиться с подобными ситуациями (элемент progress), но есть и другие шаблоны, которые можно использовать в таких случаях, например спиннеры.

Как видно из названия "спиннер", это иконка, которая "крутится" сама по себе, создавая впечатление, что приложение занято и работает. Вот пример спиннера с текстовым индикатором:

Рисунок 11.14 - Кружок спиннера, указывающий на занятость приложения

Этот подход уже давно используется в ОС и приложениях, поэтому пользователи понимают его смысл. Есть одно предостережение при использовании этого шаблона - после длительного использования он может вызывать беспокойство, поэтому рекомендуется сопровождать его каким-либо индикатором действия. Реализация компонента спиннера в Vue достаточно тривиальна, и в основном это CSS:

./components/Spinner.vue
vue
<script setup>
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_11.01_B18602.9gVX-hPu.jpg",e="/assets/Figure_11.02_B18602.g7Q6Bksk.jpg",p="/assets/Figure_11.03_B18602.m2o8p7ZT.jpg",l="/assets/Figure_11.04_B18602.DW3JuX3p.jpg",r="/assets/Figure_11.05_B18602.zi8HDppJ.jpg",h="/assets/Figure_11.06_B18602.__Czl0tA.jpg",o="/assets/Figure_11.07_B18602.es0qyzEq.jpg",k="/assets/Figure_11.08_B18602.5xuKdkg_.jpg",g="/assets/Figure_11.09_B18602.iF3e21zi.jpg",d="/assets/Figure_11.10_B18602.xLDSic7c.jpg",E="/assets/Figure_11.11_B18602.JuyjmRMv.jpg",c="/assets/Figure_11.12_B18602.S-sAtWaD.jpg",u="/assets/Figure_11.13_B18602.FSUpsZw2.jpg",m="/assets/Figure_11.14_B18602.WFs_mB4Q.jpg",y="/assets/Figure_11.15_B18602.QhMlytyc.jpg",q="/assets/Figure_11.16_B18602.ToPrRINz.jpg",F="/assets/Figure_11.17_B18602.Z-aHALz-.jpg",_="/assets/Figure_11.18_B18602.OwywRA41.jpg",b="/assets/Figure_11.19_B18602.N-yvPScp.jpg",C="/assets/Figure_11.20_B18602._nXSvuhE.jpg",f="/assets/Figure_11.21_B18602.lOPQxe6B.jpg",B="/assets/Figure_11.22_B18602.a-2Cxypm.jpg",v="/assets/Figure_11.23_B18602.nXH4iMLi.jpg",P="/assets/Figure_11.24_B18602.KfeqX3Fo.jpg",x="/assets/Figure_11.25_B18602.SvrXsFhY.jpg",A="/assets/Figure_11.26_B18602.eGNr1fa4.jpg",D="/assets/Figure_11.27_B18602.k83TOZ79.jpg",w="/assets/Figure_11.28_B18602.T9ki_wfT.jpg",U="/assets/Figure_11.29_B18602.m3z1ZZ7u.jpg",S="/assets/Figure_11.30_B18602.MkNHb0lz.jpg",N=JSON.parse('{"title":"Бонусная глава - Шаблоны UX","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md","filePath":"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md","lastUpdated":1706553672000}'),j={name:"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md"},X=t('

Бонусная глава - Шаблоны UX

Давным-давно компьютерное программное обеспечение продавалось вместе с увесистыми печатными руководствами, а во многих случаях и со специализированным обучением. Если в корпоративных приложениях и специализированном оборудовании это еще как-то применимо, то на потребительском рынке такая концепция практически полностью исчезла.

Представьте себе, что для каждого веб-сайта нужно было прочитать руководство и пройти трехмесячные курсы обучения, прежде чем начать его использовать. Как же так получается, что сегодня пользователь, познакомившись с новым приложением, может с первого взгляда справиться с основными задачами?

Несомненно, большой вклад в эту ситуацию внесли многолетние исследования и прогресс в области человеко-компьютерного взаимодействия - дисциплины, практически такой же древней, как и сами компьютеры.

В этой главе мы сделаем шаг назад от тонкостей внутренних шаблонов и архитектуры программного обеспечения и рассмотрим некоторые из устоявшихся шаблонов для проектирования пользовательского интерфейса (UI) и пользовательского опыта (UX). Мы сделаем следующее:

  • Поймем различия между UI и UX
  • Познакомимся с распространенными шаблонами UX в веб-приложениях
  • Узнаем о злой стороне UX с помощью "темных" шаблонов

К концу этой главы вы получите широкое представление о том, что такое UX-шаблоны, на каких принципах они основаны, каковы наиболее распространенные на сегодняшний день подходы и какие эффекты они вызывают у пользователя - положительные или отрицательные. Вы также изучите и выработаете общий язык для взаимодействия с дизайнерами UI и UX и другими разработчиками.

Технические требования

Эта глава носит в основном информационный характер, однако в ней рассматриваются небольшие примеры, реализованные на Vue 3, поскольку они демонстрируют использование техники, не встречавшейся до сих пор в книге. Полный исходный код можно найти в папке проекта главы в репозитории книги по адресу: https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter11.

Посмотрите следующее видео, чтобы увидеть код в действии.

UI-дизайн против UX-дизайна

Очень часто можно услышать, что эти два термина ассоциируются или используются неразличенно, а в некоторых случаях обе обязанности объединяются в одну роль в команде, что еще больше усиливает путаницу.

  • Дизайн пользовательского интерфейса (User Inteface - UI) отвечает за определение визуального языка для представления информации и сбора пользовательских данных для взаимодействия с приложением. Он включает в себя разработку визуальных стилей, типографики, взаимодействия, цветов, размеров, анимации, звуков и т.д., которые составляют интерфейс между человеком и компьютером (программным и аппаратным обеспечением).

    Это относится как к визуальным средам (веб, мобильные устройства и т.д.), так и к другим типам, таким как интерфейсы на естественном языке (вспомните помощников искусственного интеллекта, таких как Siri, Alexa и т.д.).

  • UX-дизайн (User eXperience) включает условия, которые влияют на дизайн пользовательского интерфейса и направляют его, но охватывает более широкий взгляд на восприятие пользователем системы, компании или функции, с которой он взаимодействует.

    Он включает в себя не только программные или аппаратные элементы, но и такие аспекты, как поддержка, продвижение, постсервисное обслуживание и т.д. Цель - создать широкий и, надеюсь, успешный положительный опыт с точки зрения пользователя.

    Под этим определением подразумевается взаимодействие с другими дисциплинами, такими как маркетинг, поддержка клиентов, дистрибуция, управление продуктом, узнаваемость бренда и т.д.

    Его основная цель - изменить или создать у пользователя представление о том, что продукт, услуга или система просты в использовании, эффективны и, прежде всего, полезны для его целей.

Понимание принципов и целей каждой дисциплины поможет нам разрабатывать более качественное программное обеспечение и находить общую почву для понимания при сотрудничестве с теми, кто занимается этими дисциплинами. Без UI и UX даже самое лучшее программное обеспечение может кануть в Лету. История программного обеспечения полна примеров того, как компании, даже имея продукты, превосходящие своих конкурентов, становились на путь птицы Додо, поскольку пренебрегали пользовательским опытом или имели плохой визуальный дизайн. Иногда обложка книги так же важна, как и ее содержание.

Принципы проектирования пользовательского интерфейса

В основе дизайна пользовательского интерфейса лежит задача создания интерфейса, который будет удобен для пользователя, эффективен, информативен и приятен. Такие маркетинговые концепции, как удержание и удовлетворение пользователей, в значительной степени зависят от дизайна продукта.

Для наших целей мы ограничим рассмотрение пользовательских интерфейсов интерфейсами приложений на дисплее (представленных с помощью визуальных средств, таких как экран или сенсорное устройство).

Существует большое количество документации, детально изучающей проектирование пользовательских интерфейсов с инженерной точностью и четко определенными отраслевыми стандартами. Каждый аспект имеет свой собственный набор правил, которые необходимо учитывать хорошему дизайнеру пользовательского интерфейса. Например, веб-дизайнер будет видеть вещи иначе, чем промышленный дизайнер.

В нашем случае большинство шаблонов для проектирования пользовательского интерфейса с самого начала были включены в стандарт HTML, поэтому большинство, если не все, из того, что мы будем рассматривать как шаблоны, уже знакомо вам и конечному пользователю. Однако то, как они работают, или принципы, которым они следуют, - это не то, что обычно обсуждается или является очевидным.

Например, почему символ "X" для закрытия окна находится в правом верхнем углу? Что означает каждый значок меню? Почему кнопка Start расположена в верхнем или левом нижнем углу экрана? Почему некоторые функции трудно найти, а другие доступны с первого взгляда? Все эти вопросы имеют решение, которое коренится в дизайне пользовательского интерфейса и UX-шаблонах. Поэтому давайте рассмотрим некоторые принципы пользовательского интерфейса, а затем перейдем к шаблонам UX.

Достаточный контраст или различие между элементами

Этот принцип гласит, что элементы страницы должны быть четко отличимы друг от друга и отражать свою функцию. Он отражает необходимость выстраивания визуальных элементов в иерархию с использованием размера, цвета, типографики, полей и белого пространства таким образом, чтобы каждая функция была четко представлена и отличалась от других. Основная задача - направить внимание пользователя на центральную точку интерфейса. Рассмотрим в качестве примера домашнюю страницу Packt:

Рисунок 11.1 - Главная страница Packt и цветовой контраст.

В данном примере большая часть контента использует ограниченное количество цветов ("палитру"), а две кнопки имеют высокий контраст, что привлекает внимание пользователя: это кнопки TRY FOR FREE и START LEARNING NOW. Очевидно, что дизайнер установил точку фокусировки на этих двух действиях.

В связи с этим принципом на данном снимке экрана применено "правило" дизайна, которое удобно иметь в виду: 60-30-10 color rule. Это означает, что 60% раздела должны иметь основной цвет (здесь он темно-коричневый), 30% - первичный (используется для обычного текста, меню и изображения, которое здесь белое), а 10% отводится под вторичный цвет или высокий контраст (используется для фокусной точки, или кнопок "призыва к действию" оранжевого цвета). Продолжим анализ этой страницы, чтобы ознакомиться с другими принципами проектирования пользовательского интерфейса.

Стимулировать повторение и быть последовательным.

Этот принцип основан на концепции, согласно которой люди учатся через повторение. Он указывает на то, что одна и та же задача, даже выполняемая через разные интерфейсы, должна вызывать у пользователя более или менее одинаковое повторяющееся поведение.

Например, если вы попросите пользователя открыть текстовый процессор, а потом предложите ему открыть файл, куда он попытается нажать? Большинство "опытных" пользователей подведут мышь к левой верхней части окна и будут искать либо значок, обозначающий "Открыть", либо меню Файл. Почему так? Потому что такое размещение стало стандартным, и мы путем повторения узнали, где его искать. Если бы вы разместили меню File в правом нижнем углу экрана, то большинство, если не все, пользователи не смогли бы найти его без подсказок.

Еще один пример повторения и согласованности возникает при отображении визуальных элементов - что более важно, когда они являются частью списка или общего набора. Приведем пример с сайта Packt Publishing:

Рисунок 11.2 - Карточки с книгами

В предыдущем примере дизайнер использовал повторение для отображения книг в прайм-тайм, используя вертикальные "карточки" для каждого предмета. Каждая карточка повторяет аналогичный макет, цвета и формат. Как только вы поймете, что отображает одна из них, то же самое можно сказать и обо всех остальных: это повторение визуального дизайна, и оно важно, чтобы пользователю не пришлось "заново" изучать интерфейс для каждой книги.

Кроче говоря, это повторение расположения, действий и визуальных стилей. Перейдем к следующему.

Внимательно следите за выравниванием и направлением

Выравнивание элементов (графики, шрифтов и т.д.) создает ощущение порядка и организованности, показывая, что эти элементы принадлежат к одной группе или имеют одинаковый вес или важность. В основном мы знакомы с выравниванием (и интервалом) при работе со шрифтами, но эта же концепция применима и к графическим элементам, таким как пиктограммы, секции, изображения и т.д. Из предыдущего рисунка обратите внимание на то, как выровнены вкладки, а также карточки и их содержимое. Только по выравниванию и стилю можно определить, что относится к той или иной естественной группе.

Другой пример выравнивания хорошо виден при использовании типографики только для меню и функций.

Рисунок 11.3 - Нижний колонтитул сайта Packt, использующий выравнивание для отображения естественных групп.

Этот пример, хотя и простой, уже демонстрирует использование контраста (жирный шрифт против обычного), последовательности за счет повторения, выравнивания, а также следующего принципа, который мы здесь рассмотрим: близости.

Используйте близость и расстояние, чтобы показать естественные группы

Этот принцип прост: размещайте элементы, которые естественным образом связаны друг с другом, близко друг к другу. Это облегчает пользователю поиск и понимание. Типографика и иконография также могут быть использованы для демонстрации близости и схожести функциональных возможностей. Знаменитая "ленточная панель", введенная компанией Microsoft в своих приложениях Office, в значительной степени использует эту концепцию и вскоре стала стандартом. Например, вот фрагмент вкладки Home, посвященный выравниванию, спискам, интервалам и отступам:

Рисунок 11.4 - Значки абзацев

Обратите внимание, что пиктограммы, изменяющие тип абзаца, интервал и выравнивание, находятся рядом друг с другом, не "смешиваясь".

Это не единственные принципы проектирования пользовательского интерфейса, но самые основные, которые мы должны иметь в виду при разработке наших компонентов. Если вы работаете с командой, в которую входит дизайнер пользовательского интерфейса, вы можете получить шаблоны или макеты, даже раскадровки, для реализации в компонентах Vue, как мы видели в главе 4, Композиция пользовательского интерфейса с компонентами.

Если же вы работаете в команде "one-man band team" и проектирование интерфейсов лежит на ваших плечах, то эти принципы очень помогут вам создать профессиональный и полезный пользовательский интерфейс. Но это еще не все.

Законы проектирования пользовательского интерфейса

Как и в случае с принципами, в ряде исследований были выведены или определены "законы" дизайна, которые представляют собой измеримые функции для предсказания определенных атрибутов программного обеспечения, таких как удобство и дружелюбие. В частности, выделяются следующие.

Закон Фитта

Этот закон определяет, что время, необходимое пользователю для захвата цели, зависит от расстояния до указателя и размера цели. Важными понятиями здесь являются расстояние и размер цели: чем больше расстояние между целями, тем больше они должны быть.

В результате применения этого закона кнопка закрытия окна (X) располагается в одном из углов экрана (при максимизации окна), кнопка Start - в левом нижнем углу экрана, Show desktop - в правом нижнем углу экрана и так далее. Если пользователь перемещает мышь в любом из этих направлений, то рано или поздно он попадет на эти цели, и продолжение движения в том же направлении не повлияет на результат. На языке дизайна пользовательского интерфейса эти кнопки являются "бесконечными", поскольку, как только курсор достигнет угла у края экрана, продолжение прокрутки мышью в том же направлении все равно приведет к достижению цели.

Другим следствием этого закона является то, что похожие функции также должны располагаться рядом друг с другом (как, например, в примерах на Рисунке 11.4). Более подробную информацию об этом законе можно найти в Википедии по адресу https://en.wikipedia.org/wiki/Fitts's_law.

Закон Хика

Этот закон гласит, что время, которое требуется пользователю для того, чтобы сделать выбор, является логарифмической функцией, зависящей от количества доступных вариантов и их сложности. Проще говоря, слишком большое количество вариантов запутывает пользователя и заставляет его тратить больше времени на принятие решения. Некоторые следствия из этого закона выглядят следующим образом:

  • Разбивайте сложные задачи на более мелкие группы, которыми может управлять пользователь, чтобы ускорить время принятия решения
  • Избегайте создания интерфейсов, перегруженных опциями, так как они будут перегружать пользователя
  • Если функция чувствительна ко времени, сведите количество опций к минимуму, необходимому в данной ситуации

В повседневном программном обеспечении мы можем наблюдать применение этого закона во многих местах - например, в "инсталляторах" для конкретного программного обеспечения, где во время или перед началом установки пользователю последовательно представляются окна с опциями, в отличие от формы для заполнения. Более подробную информацию об этом законе можно найти в Википедии.

Восемь правил Бена Шнайдермана

В 1986 году профессор Бен Шнайдерман опубликовал свою книгу под названием Designing the User Interface: Strategies for Effective Human-Computer Interaction, в которой он сформулировал восемь правил проектирования интерфейсов. Сегодня эти правила так же актуальны, как и в день их создания, поэтому их стоит упомянуть здесь:

  1. Стремитесь к последовательности (в действиях, шагах, расположении и т.д.).
  2. Обеспечьте использование быстрых клавиш для выполнения общих задач (будь то клавиатура или пиктограммы).
  3. Предлагайте информативную обратную связь (особенно при возникновении ошибок).
  4. Дизайн диалогов с окончанием.
  5. Предлагайте простую обработку ошибок, чтобы пользователь мог быстро принять меры и избежать серьезных ошибок со стороны пользователя. Классической реализацией правил #4 и #5 являются "диалоги подтверждения" перед выполнением постоянных действий, таких как удаление содержимого.
  6. Позволяйте легко и просто выполнять действия, связанные с удалением содержимого.
  7. Позволяйте легко отменять действия (благодаря этому у нас есть Ctrl + Z!).
  8. Поддерживайте чувство контроля у пользователя. Нет ничего хуже для пользователя, чем чувствовать, что машина "делает все сама, без контроля". Если вы когда-нибудь по ошибке отправляли на печать 800-страничный файл, и у вас ушло с десяток страниц, прежде чем вы смогли отменить операцию. Вот о чем идет речь.
  9. Сокращенайте время на печать.
  10. Сокращайте кратковременную память. Пользователь может одновременно удерживать в своей кратковременной памяти лишь несколько элементов и задач, а слишком большое количество элементов на экране (меню и т.д.) вызывает отторжение. Этот принцип также связан с законом Хика.

Для практического применения и введения в тему эти принципы, правила и законы должны дать нам уверенную опору.

Больше информации об этих правилах и Бене Шнайдермане можно найти в Википедии.

Принципы проектирования UX

UX-дизайн также имеет свои цели и принципы, которые распространяются на шаблоны. Прежде всего, основная цель UX - обеспечить хорошее восприятие пользователя, создать связь с брендом или продуктом, тщательно выстроив поток взаимодействий. В данном случае решения должны быть следующими:

  • Полезность и удобство использования: Прежде всего, приложение должно делать то, для чего оно предназначено, делать это хорошо и быть простым для пользователя
  • Узнаваемость и запоминаемость: пользователь должен иметь возможность изучить и понять представленную информацию, а также усвоить ее для дальнейшего использования
  • Креативность и предоставление контроля пользователю: Когда пользователь взаимодействует с приложением, он должен чувствовать, что делает то, что задумал пользователь, и что результат "безопасен" для пользователя

Последний принцип очень важен. Если пользователь чувствует, что приложение где-то в процессе взаимодействия "потеряло контроль" над происходящим, то это залог катастрофы. К сожалению, это слишком часто происходит с темным шаблонами, которые мы рассмотрим далее в этой главе, но сейчас давайте посмотрим на хорошие шаблоны, которые приводят к хорошему опыту для пользователя.

Общие шаблоны для работы с данными

Чаще всего этим шаблонам соответствуют чистые HTML-элементы, другие же появились в последние годы благодаря грамотному использованию стилизации таких элементов. Они стали стандартными в отрасли и хорошо понимаются пользователями с первого взгляда. Ниже приводится неполный список с кратким описанием того, когда следует использовать каждый из них.

Элементы ввода HTML

Стандартные поля ввода, предусмотренные в HTML, представляют собой четкий шаблон для получения информации от пользователя. В настоящее время элемент input имеет множество вариантов благодаря атрибуту type, позволяющему вводить не только обычный текст. Используемые в формах и библиотеках проверки, эти элементы не уступают по своим возможностям: они готовы к чтению и форматированию от текста и чисел до URL, даты, времени, изображений и цветов. Полный список доступных типов, поддерживаемых современными браузерами, можно найти здесь.

По большей части эти элементы используются с базовой функциональностью и некоторым тяжелым CSS-стилем. Используйте inputtextarea) в тех случаях, когда пользователю необходимо ввести текстовую информацию. Для более сложных типов, таких как выбор даты или цвета, браузеры сегодня предлагают собственные виджеты.

Чекбоксы, радиокнопки и тумблеры

Клавиши и радиокнопки предоставляются HTML нативно и представляются пользователю в соответствии с форматом локальной ОС или среды. button представляют пользователю несколько вариантов, которые он может свободно выбрать из группы. В отличие от них, кнопки radio позволяют выбрать только один вариант из списка:

Рисунок 11.5 - Чекбоксы слева и радиокнопки справа

С выходом оригинального iPhone стал очень популярен новый вариант флажка: тумблер (toggle switch). Он не предусмотрен стандартом HTML, но его можно легко стилизовать с помощью CSS, чтобы "замаскировать" чекбокс. Тумблер имеет два состояния, включенное и выключенное, и часто используется для активации или деактивации функции или возможности. Это важное различие, поскольку флажок должен фокусироваться на вариантах или альтернативах. Вот пример:

Рисунок 11.6 - Тумблеры в каждом состоянии

Тумблер находится в состоянии "выключено" (или false), когда тумблер находится слева, и "включено", когда справа. Часто переключение также влияет на цвет, показывая его в неяркой серой гамме, когда он выключен, или в ярких цветах, когда активирован. Внутри системы эти два состояния часто обозначаются true (включено) и false (выключено), и их следует использовать для активации или деактивации настроек, функций и т.д. Компонент Toggle, реализующий стилизацию, и код v-модели вы можете найти в репозитории к этой главе.

Чипы, таблетки или теги

Этот шаблон включает в себя короткий текст (или "копию" на языке пользовательского интерфейса) внутри круглой рамки. Копия может сопровождаться значком, подчеркивающим ее состояние при выделении, или действием, например, символом "X" для ее удаления. Обычно тэги используются в списках для отображения атрибутов, тегов, категорий или других типов классификаторов для данного элемента.

В некоторых случаях они могут использоваться и для выбора (переключения) элементов из списка. В этом случае они конкурируют или ведут себя так же, как чекбокс, но в более наглядной форме. Реализация фишек достаточно тривиальна и может быть выполнена с помощью обычного CSS в одном HTML-элементе (например, в элементе span).

Рисунок 11.7 - Список элементов с таблетками

Это краткий список шаблонов пользовательского интерфейса для сбора пользовательского ввода, но он охватывает наиболее распространенные типы: HTML-вводы и вариации стилей.

##№ Общие шаблоны для визуализации данных

Эти шаблоны отображают информацию обратно пользователю, либо в ответ на действие пользователя, либо на событие приложения. Ниже приведен неполный список шаблонов.

Подсказки (tooltips)

Этот шаблон показывает пользователю плавающий небольшой текст с информацией о целевом элементе, обычно когда пользователь активирует элемент с помощью какого-либо действия (наведение, щелчок, выделение и т.д.). Информация отображается над, под или сбоку от элемента в виде "речевого пузыря" (как в комиксах). Вот пример:

Рисунок 11.8 - Всплывающая подсказка, отображающая название/действие пиктограммы и ярлыка.

В основном этот шаблон используется для отображения справки по целевому объекту, но может применяться и для отображения контекстных меню. Например, при выделении слова из этого абзаца в текстовом редакторе в режиме онлайн отобразится всплывающее окно с меню:

Рисунок 11.9 - Шаблон всплывающей подсказки, используемый для отображения контекстного меню.

Может возникнуть дискуссия по поводу того, является ли последнее использование всплывающей подсказкой или контекстным меню, но тот факт, что оно открывается при выборе, указывает на первое. Традиционно контекстные меню открываются вторичным действием, например, нажатием правой кнопки мыши (в Windows и Linux). В любом случае, концепция, которую следует запомнить для этого шаблона, заключается в том, чтобы показывать пользователю информацию при выборе или предварительной активации, чтобы помочь ему решить, что делать дальше.

Уведомляющие точки, пузырьки, метки или значки

Этот шаблон заключается в отображении маленького значка поверх более крупного значка, чтобы показать, что произошло событие, требующее внимания пользователя, но не являющееся срочным. Этот маленький значок может быть точкой, пузырьком и т.д. Если в уведомлении есть цифра, его также называют значком (badge) Ниже приведены примеры этого шаблона:

  • Маленький кружок с цифрой для новых полученных писем в значке электронной почты
  • Двойная галочка в приложении чата, указывающая на то, что собеседник получил и прочитал сообщение
  • Маленькая отметка на панели задач, показывающая, что приложение было открыто

Основная концепция заключается в том, чтобы использовать некое небольшое отклонение от пиктограммы, указывающее на необходимость обратить на себя внимание в будущем, но при этом не являющееся срочным и не влияющее на текущую деятельность пользователя.

Тостовые уведомления

Этот шаблон используется во многих приложениях и ОС. Он заключается в отображении на короткое время плавающего окна с быстрой информацией для пользователя. Часто оно включает в себя короткий текстовый фрагмент в сочетании с понятной пиктограммой.

В зависимости от ОС оно может отображаться вверху по центру, справа от экрана или внизу справа над системным лотком. Веб-приложения могут либо реализовать собственное тостовое уведомление в окне браузера, либо запросить разрешение у пользователя и отобразить "родное тостовое уведомление" с помощью локальной ОС. Вот пример уведомления о тосте:

Рисунок 11.10 - Нативное уведомление о тостах на рабочем столе

Эти уведомления полезны для информирования пользователя об изменениях в окружении, требующих его внимания, для сообщения о результате выполнения асинхронной операции (успех, ошибка и т.д.) и т.п. Эти призывы к вниманию эфемерны, поэтому они не должны быть критической частью важного рабочего процесса, за исключением только что упомянутых условий.

Карусель или слайдеры изображений

Карусель или слайдеры изображений - это шаблон для последовательного отображения в одном пространстве различных секций с изображениями и контентом. Как правило, с помощью таймера эти разделы представляются пользователю с интервалом в несколько секунд, при этом есть возможность перейти к любому из них с помощью точечной навигации. Несмотря на то, что несколько лет назад эти карусели были очень популярны, существуют и противоположные мнения, поскольку "нетерпеливые" пользователи могут так и не увидеть всего содержимого карусели. На практике рекомендуется делать список разделов как можно короче, где-то между тремя и пятью элементами.

Примеров такой реализации в Интернете множество, поскольку они реализуются в основном на посадочной странице сайта. Практически все торговые и новостные сайты используют этот шаблон - например, посадочная страница Amazon (www.amazon.de):

Рисунок 11.11 - Карусель Amazon отображает предложения из магазина

Слайдеры изображений могут быть такими же большими, как карусель, но могут быть и гораздо меньше и использоваться для отображения миниатюр. Вот еще один пример из Amazon:

Рисунок 11.12 - Amazon использует слайдеры изображений для отображения товаров пользователю

Несмотря на тривиальную реализацию, использование каруселей и слайдеров изображений является хорошим способом отображения информации для пользователя. Однако стоит предупредить, что злоупотребление этим шаблоном может привести к перегруженности и перенасыщенности интерфейса, вызвать путаницу и даже спровоцировать нежелательные побочные эффекты, такие как сенсорное подавление и избегание контента.

Панели прогресса (progress bars) и спиннеры

Панель прогресса - это любой элемент, который дает пользователю представление о том, на каком этапе рабочего процесса находится его текущее состояние. Хотя название, казалось бы, указывает на "полосу", на практике в эту категорию попадает любой элемент, отображающий прогресс выполнения ограниченного числа действий.

Основная цель - уведомить пользователя о ходе выполнения задач, требующих длительного времени, и показать, что система "занята" их выполнением, тем самым обеспечивая наглядность и чувство контроля для пользователя.

Прогресс-бары очень важны для предотвращения непроизвольных негативных действий со стороны пользователя. Если длительное задание выполняется в фоновом режиме (например, в веб-рабочем) без какой-либо обратной связи о ходе его выполнения, пользователь может подумать, что задание не началось, не удалось или компьютер "завис". Оставлять пользователя в недоумении по поводу происходящего - это негативный опыт. Вот некоторые примеры элементов индикатора выполнения:

Рисунок 11.13 - Пример прогресс-бара

Помимо стилизации, индикаторы выполнения могут использоваться и в "неопределенном состоянии", то есть приложение не может рассчитать, сколько времени или сколько шагов может занять процесс, но при этом хочет сообщить пользователю, что система занята и не должна быть прервана. В стандарте HTML предусмотрен элемент, специально предназначенный для индикаторов выполнения, который позволяет справиться с подобными ситуациями (элемент progress), но есть и другие шаблоны, которые можно использовать в таких случаях, например спиннеры.

Как видно из названия "спиннер", это иконка, которая "крутится" сама по себе, создавая впечатление, что приложение занято и работает. Вот пример спиннера с текстовым индикатором:

Рисунок 11.14 - Кружок спиннера, указывающий на занятость приложения

Этот подход уже давно используется в ОС и приложениях, поэтому пользователи понимают его смысл. Есть одно предостережение при использовании этого шаблона - после длительного использования он может вызывать беспокойство, поэтому рекомендуется сопровождать его каким-либо индикатором действия. Реализация компонента спиннера в Vue достаточно тривиальна, и в основном это CSS:

./components/Spinner.vue
vue
<script setup>
     const $props = defineProps(['caption'])
 </script>
 <template>
diff --git a/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.gta8mx10.lean.js b/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.VFEWywZs.lean.js
similarity index 97%
rename from assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.gta8mx10.lean.js
rename to assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.VFEWywZs.lean.js
index 2b7027325..f42590966 100644
--- a/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.gta8mx10.lean.js
+++ b/assets/ru_book_Chapter_11__Bonus_Chapter_-_UX_Patterns.md.VFEWywZs.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_11.01_B18602.9gVX-hPu.jpg",e="/assets/Figure_11.02_B18602.g7Q6Bksk.jpg",p="/assets/Figure_11.03_B18602.m2o8p7ZT.jpg",l="/assets/Figure_11.04_B18602.DW3JuX3p.jpg",r="/assets/Figure_11.05_B18602.zi8HDppJ.jpg",h="/assets/Figure_11.06_B18602.__Czl0tA.jpg",o="/assets/Figure_11.07_B18602.es0qyzEq.jpg",k="/assets/Figure_11.08_B18602.5xuKdkg_.jpg",g="/assets/Figure_11.09_B18602.iF3e21zi.jpg",d="/assets/Figure_11.10_B18602.xLDSic7c.jpg",E="/assets/Figure_11.11_B18602.JuyjmRMv.jpg",c="/assets/Figure_11.12_B18602.S-sAtWaD.jpg",u="/assets/Figure_11.13_B18602.FSUpsZw2.jpg",m="/assets/Figure_11.14_B18602.WFs_mB4Q.jpg",y="/assets/Figure_11.15_B18602.QhMlytyc.jpg",q="/assets/Figure_11.16_B18602.ToPrRINz.jpg",F="/assets/Figure_11.17_B18602.Z-aHALz-.jpg",_="/assets/Figure_11.18_B18602.OwywRA41.jpg",b="/assets/Figure_11.19_B18602.N-yvPScp.jpg",C="/assets/Figure_11.20_B18602._nXSvuhE.jpg",f="/assets/Figure_11.21_B18602.lOPQxe6B.jpg",B="/assets/Figure_11.22_B18602.a-2Cxypm.jpg",v="/assets/Figure_11.23_B18602.nXH4iMLi.jpg",P="/assets/Figure_11.24_B18602.KfeqX3Fo.jpg",x="/assets/Figure_11.25_B18602.SvrXsFhY.jpg",A="/assets/Figure_11.26_B18602.eGNr1fa4.jpg",D="/assets/Figure_11.27_B18602.k83TOZ79.jpg",w="/assets/Figure_11.28_B18602.T9ki_wfT.jpg",U="/assets/Figure_11.29_B18602.m3z1ZZ7u.jpg",S="/assets/Figure_11.30_B18602.MkNHb0lz.jpg",N=JSON.parse('{"title":"Бонусная глава - Шаблоны UX","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md","filePath":"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md","lastUpdated":1706427418000}'),j={name:"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md"},X=t("",270),T=[X];function L(H,M,I,V,z,R){return a(),i("div",null,T)}const Z=s(j,[["render",L]]);export{N as __pageData,Z as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_11.01_B18602.9gVX-hPu.jpg",e="/assets/Figure_11.02_B18602.g7Q6Bksk.jpg",p="/assets/Figure_11.03_B18602.m2o8p7ZT.jpg",l="/assets/Figure_11.04_B18602.DW3JuX3p.jpg",r="/assets/Figure_11.05_B18602.zi8HDppJ.jpg",h="/assets/Figure_11.06_B18602.__Czl0tA.jpg",o="/assets/Figure_11.07_B18602.es0qyzEq.jpg",k="/assets/Figure_11.08_B18602.5xuKdkg_.jpg",g="/assets/Figure_11.09_B18602.iF3e21zi.jpg",d="/assets/Figure_11.10_B18602.xLDSic7c.jpg",E="/assets/Figure_11.11_B18602.JuyjmRMv.jpg",c="/assets/Figure_11.12_B18602.S-sAtWaD.jpg",u="/assets/Figure_11.13_B18602.FSUpsZw2.jpg",m="/assets/Figure_11.14_B18602.WFs_mB4Q.jpg",y="/assets/Figure_11.15_B18602.QhMlytyc.jpg",q="/assets/Figure_11.16_B18602.ToPrRINz.jpg",F="/assets/Figure_11.17_B18602.Z-aHALz-.jpg",_="/assets/Figure_11.18_B18602.OwywRA41.jpg",b="/assets/Figure_11.19_B18602.N-yvPScp.jpg",C="/assets/Figure_11.20_B18602._nXSvuhE.jpg",f="/assets/Figure_11.21_B18602.lOPQxe6B.jpg",B="/assets/Figure_11.22_B18602.a-2Cxypm.jpg",v="/assets/Figure_11.23_B18602.nXH4iMLi.jpg",P="/assets/Figure_11.24_B18602.KfeqX3Fo.jpg",x="/assets/Figure_11.25_B18602.SvrXsFhY.jpg",A="/assets/Figure_11.26_B18602.eGNr1fa4.jpg",D="/assets/Figure_11.27_B18602.k83TOZ79.jpg",w="/assets/Figure_11.28_B18602.T9ki_wfT.jpg",U="/assets/Figure_11.29_B18602.m3z1ZZ7u.jpg",S="/assets/Figure_11.30_B18602.MkNHb0lz.jpg",N=JSON.parse('{"title":"Бонусная глава - Шаблоны UX","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md","filePath":"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md","lastUpdated":1706553672000}'),j={name:"ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.md"},X=t("",270),T=[X];function L(H,M,I,V,z,R){return a(),i("div",null,T)}const Z=s(j,[["render",L]]);export{N as __pageData,Z as default};
diff --git a/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.2KhDHAc_.js b/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.hRH8uAb3.js
similarity index 99%
rename from assets/ru_book_Chapter_1__The_Vue_3_Framework.md.2KhDHAc_.js
rename to assets/ru_book_Chapter_1__The_Vue_3_Framework.md.hRH8uAb3.js
index c450108de..8ca80152f 100644
--- a/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.2KhDHAc_.js
+++ b/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.hRH8uAb3.js
@@ -1,4 +1,4 @@
-import{_ as n,c as p,m as i,a as s,t as l,U as a,o as e}from"./chunks/framework.P5TqXf0g.js";const h="/assets/Figure_1.01_B18602.CWBkZpEz.jpg",V=JSON.parse('{"title":"Фреймворк Vue 3","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_1__The_Vue_3_Framework.md","filePath":"ru/book/Chapter_1__The_Vue_3_Framework.md","lastUpdated":1706427418000}'),k={name:"ru/book/Chapter_1__The_Vue_3_Framework.md"},r=a(`

Фреймворк Vue 3

Современная всемирная паутина (World Wide Web) претерпела значительные изменения по сравнению с теми временами, когда Интернет представлял собой лишь набор связанных между собой страниц, предназначенных для академических и научных целей. По мере развития технологий и увеличения мощности машин к прежним протоколам добавлялись все новые и новые возможности, конкурировали новые методы и технологии, пока, наконец, не были приняты стандарты. Дополнительные возможности появились в виде плагинов для браузера и встроенного контента. Распространенными были Java-апплеты, Flash, Macromedia, Quicktime и другие плагины. Именно с появлением HTML5 большинство из них, если не все, были постепенно вытеснены стандартами.

Сегодня существует четкое различие между структурой, стилем и поведением. Язык разметки гипертекста (HTML) определяет структурные элементы, из которых состоит веб-страница. Каскадные таблицы стилей (CSS) предоставляют правила, изменяющие внешний вид HTML-элементов, включая даже анимацию и трансформацию. И, наконец, JavaScript - язык программирования, который обеспечивает поведение и может обращаться и изменять как HTML, так и CSS. Такое количество различных возможностей также привело к высокой сложности и несовместимости между браузерами. Именно здесь и зародились библиотеки и фреймворки, которые сначала решали проблемы несовместимости и стандартизации внешнего вида, но вскоре стали включать в себя и другие парадигмы программирования, выходящие за рамки простого манипулирования HTML и CSS.

Некоторые из наиболее популярных сегодня библиотек и фреймворков используют реактивную парадигму. Они умело вносят изменения в JavaScript, которые автоматически отражаются в HTML/CSS. Vue 3 - это последняя версия прогрессивного фреймворка, в котором в значительной степени используется концепция реактивности. В нем также реализованы другие парадигмы и паттерны проектирования программного обеспечения, позволяющие создавать все: от простых взаимодействий на статичной веб-странице до сложных приложений, которые могут даже устанавливаться локально и конкурировать с нативными настольными приложениями.

В этой книге мы познакомимся с фреймворком Vue 3 и изучим различные шаблоны проектирования, которые помогут нам создавать первоклассные приложения: от простых веб-страниц до мощных прогрессивных веб-приложений (PWA). Попутно мы рассмотрим лучшие практики и хорошо зарекомендовавшие себя паттерны в программной инженерии.

В этой главе рассматриваются следующие темы:

  • Прогрессивный фреймворк
  • Однофайловые компоненты
  • Различные варианты синтаксиса для написания компонентов

К концу этой главы вы будете иметь базовое представление о том, какое место Vue 3 занимает в ландшафте JavaScript и какие возможности он предоставляет. Для пользователей Vue 2 в этой книге есть приложение, в котором описаны изменения, на которые необходимо обратить внимание при переносе приложения. По мере продвижения по книге мы будем наращивать знания на основе этих концепций.

Прогрессивный фреймворк

Перед тем как рассказать о том, что представляет собой Vue, необходимо провести различие между терминами библиотека и фреймворк. Они часто используются как взаимозаменяемые, но разница между ними есть, и хороший разработчик должен знать об этом, выбирая тот или иной вариант для создания веб-приложения.

Выбирая тот или иной вариант для создания веб-приложения, мы должны понимать, что это такое.

Давайте рассмотрим определения этих терминов:

  • Библиотека - это коллекция многократно используемого кода в виде функций, классов и т.д., который был разработан кем-то другим и может быть легко импортирован в вашу программу. Они не предписывают, как и где их использовать, но обычно предоставляют документацию по их применению. Программист сам решает, когда и как их применять. Эта концепция существует в большинстве языков разработки, вплоть до того, что некоторые из них полностью основаны на понятии импорта библиотек для обеспечения функциональности.
  • В фреймворке также есть наборы классов и функций для использования, но в нем прописаны спецификации, определяющие, как должна работать программа, с какой архитектурой, в каких условиях может быть использован ваш код. Ключевой атрибут, на который следует обратить внимание, заключается в том, что фреймворк инвертирует управление в приложении, то есть определяет поток программы и данных. Тем самым он подчеркивает структуры или стандарты, которых должен придерживаться программист.

Разделив понятия, теперь возникает вопрос, когда использовать библиотеку, а когда фреймворк. Прежде чем ответить на этот вопрос, давайте поймем, что при создании реальных приложений между ними существует огромная "серая зона". Теоретически одно и то же приложение можно построить, используя любой из этих двух вариантов. Как и всегда в программной инженерии, необходимо определиться с компромиссами для каждого подхода. Так что воспринимайте то, что будет написано дальше, с щепоткой соли; это не закон, написанный на камне:

  • Вы можете использовать библиотеку при создании приложений малого и среднего размера или при необходимости добавления дополнительной функциональности в приложение (в общем случае, вы можете использовать дополнительные библиотеки внутри фреймворков). Существуют и исключения из правила "размера". Например, React - это библиотека, но на ее основе построены огромные приложения, такие как Facebook. Компромисс заключается в том, что использование только библиотек без фреймворка потребует выработки общих подходов и большей координации внутри команды, поэтому усилия по управлению и руководству могут значительно возрасти. С другой стороны, библиотека, используемая в рамках обычного программирования на JavaScript, может предложить некоторые важные улучшения производительности и обеспечить значительную гибкость.
  • Вы можете захотеть использовать фреймворк при создании приложений среднего и большого размера, когда вам нужна структура, помогающая координировать разработку, или когда вы хотите быстро начать, минуя "азы" разработки общей функциональности с нуля. Существуют фреймворки, построенные поверх других фреймворков, например, Nuxt построен поверх Vue. Компромисс заключается в том, что для построения приложения вам предписывается архитектурная модель, которая часто соответствует определенному подходу и образу мышления. Вам и вашей команде придется изучить фреймворк и его ограничения и жить в этих границах. Всегда есть вероятность того, что в будущем ваше приложение может перерасти рамки. В то же время некоторые из преимуществ таковы: более легкая координация работы, значительный выигрыш от стартового рывка, верное и проверенное решение общих проблем, ориентация на конкретные ситуации (например, торговые приложения в сравнении с социальными сетями) и многое другое. Однако в зависимости от фреймворка вы можете столкнуться с небольшим снижением производительности за счет дополнительной обработки данных или трудностями масштабирования. Вам предстоит взвесить компромиссы в каждом конкретном случае.

Итак, что же такое Vue? По определению, Vue - это прогрессивный фреймворк для создания пользовательских интерфейсов. Прогрессивность означает, что он обладает архитектурными преимуществами фреймворка, а также скоростью и модульными преимуществами библиотеки, поскольку функции и функциональность могут быть реализованы постепенно. На практике это означает, что Vue предписывает определенные модели построения приложения, но в то же время позволяет начинать с малого и расширять его настолько, насколько это необходимо. Вы даже можете использовать несколько приложений Vue на одной странице или взять на себя все приложение. При необходимости можно даже импортировать и использовать другие библиотеки и фреймворки. Весьма причудливо!

Еще одной фундаментальной концепцией Vue является реактивность. Она подразумевает возможность автоматического отображения в HTML значения или изменений, внесенных в переменную в JavaScript, а также внутри вашего кода. В этом заключается большая часть волшебства, предлагаемого Vue.

В традиционном программировании, когда переменной присваивается значение, оно сохраняется до тех пор, пока не будет программно изменено. Однако в реактивном программировании, если значение переменной зависит от других переменных, то при изменении одной из этих зависимостей переменная примет новое результирующее значение. Возьмем, к примеру, следующую простую формулу:

sh
A = B + C

В реактивном программировании каждый раз, когда B или C меняют значение, изменяется и A. Как вы увидите далее в этой книге, это очень мощная модель для построения пользовательских интерфейсов. В данном примере, в соответствии с терминологией, A - это зависимое, а B и C - зависимости.

В следующих главах мы будем изучать этот прогрессивный атрибут в процессе создания примеров приложений. Но перед этим нам нужно посмотреть, что предлагает Vue 3 в самом базовом виде.

Использование Vue в веб-приложении

Существует несколько вариантов использования Vue в веб-приложении, и это во многом зависит от того, какую цель вы преследуете:

  • Для размещения на странице небольшого автономного приложения или фрагмента кода можно напрямую импортировать Vue и код внутри тега script
  • Для создания более крупного приложения вам понадобится инструмент сборки, который возьмет ваш код и соберет его для распространения

Обратите внимание, что я использую слово сборка, а не компиляция, поскольку JavaScript-приложения интерпретируются и выполняются во время исполнения в браузере. Это станет очевидным позже, когда мы введем понятие однофайловых компонентов

Давайте кратко рассмотрим пример первого случая на примере очень простой HTML-страницы:

html
<html>
+import{_ as n,c as p,m as i,a as s,t as l,U as a,o as e}from"./chunks/framework.P5TqXf0g.js";const h="/assets/Figure_1.01_B18602.CWBkZpEz.jpg",V=JSON.parse('{"title":"Фреймворк Vue 3","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_1__The_Vue_3_Framework.md","filePath":"ru/book/Chapter_1__The_Vue_3_Framework.md","lastUpdated":1706553672000}'),k={name:"ru/book/Chapter_1__The_Vue_3_Framework.md"},r=a(`

Фреймворк Vue 3

Современная всемирная паутина (World Wide Web) претерпела значительные изменения по сравнению с теми временами, когда Интернет представлял собой лишь набор связанных между собой страниц, предназначенных для академических и научных целей. По мере развития технологий и увеличения мощности машин к прежним протоколам добавлялись все новые и новые возможности, конкурировали новые методы и технологии, пока, наконец, не были приняты стандарты. Дополнительные возможности появились в виде плагинов для браузера и встроенного контента. Распространенными были Java-апплеты, Flash, Macromedia, Quicktime и другие плагины. Именно с появлением HTML5 большинство из них, если не все, были постепенно вытеснены стандартами.

Сегодня существует четкое различие между структурой, стилем и поведением. Язык разметки гипертекста (HTML) определяет структурные элементы, из которых состоит веб-страница. Каскадные таблицы стилей (CSS) предоставляют правила, изменяющие внешний вид HTML-элементов, включая даже анимацию и трансформацию. И, наконец, JavaScript - язык программирования, который обеспечивает поведение и может обращаться и изменять как HTML, так и CSS. Такое количество различных возможностей также привело к высокой сложности и несовместимости между браузерами. Именно здесь и зародились библиотеки и фреймворки, которые сначала решали проблемы несовместимости и стандартизации внешнего вида, но вскоре стали включать в себя и другие парадигмы программирования, выходящие за рамки простого манипулирования HTML и CSS.

Некоторые из наиболее популярных сегодня библиотек и фреймворков используют реактивную парадигму. Они умело вносят изменения в JavaScript, которые автоматически отражаются в HTML/CSS. Vue 3 - это последняя версия прогрессивного фреймворка, в котором в значительной степени используется концепция реактивности. В нем также реализованы другие парадигмы и паттерны проектирования программного обеспечения, позволяющие создавать все: от простых взаимодействий на статичной веб-странице до сложных приложений, которые могут даже устанавливаться локально и конкурировать с нативными настольными приложениями.

В этой книге мы познакомимся с фреймворком Vue 3 и изучим различные шаблоны проектирования, которые помогут нам создавать первоклассные приложения: от простых веб-страниц до мощных прогрессивных веб-приложений (PWA). Попутно мы рассмотрим лучшие практики и хорошо зарекомендовавшие себя паттерны в программной инженерии.

В этой главе рассматриваются следующие темы:

  • Прогрессивный фреймворк
  • Однофайловые компоненты
  • Различные варианты синтаксиса для написания компонентов

К концу этой главы вы будете иметь базовое представление о том, какое место Vue 3 занимает в ландшафте JavaScript и какие возможности он предоставляет. Для пользователей Vue 2 в этой книге есть приложение, в котором описаны изменения, на которые необходимо обратить внимание при переносе приложения. По мере продвижения по книге мы будем наращивать знания на основе этих концепций.

Прогрессивный фреймворк

Перед тем как рассказать о том, что представляет собой Vue, необходимо провести различие между терминами библиотека и фреймворк. Они часто используются как взаимозаменяемые, но разница между ними есть, и хороший разработчик должен знать об этом, выбирая тот или иной вариант для создания веб-приложения.

Выбирая тот или иной вариант для создания веб-приложения, мы должны понимать, что это такое.

Давайте рассмотрим определения этих терминов:

  • Библиотека - это коллекция многократно используемого кода в виде функций, классов и т.д., который был разработан кем-то другим и может быть легко импортирован в вашу программу. Они не предписывают, как и где их использовать, но обычно предоставляют документацию по их применению. Программист сам решает, когда и как их применять. Эта концепция существует в большинстве языков разработки, вплоть до того, что некоторые из них полностью основаны на понятии импорта библиотек для обеспечения функциональности.
  • В фреймворке также есть наборы классов и функций для использования, но в нем прописаны спецификации, определяющие, как должна работать программа, с какой архитектурой, в каких условиях может быть использован ваш код. Ключевой атрибут, на который следует обратить внимание, заключается в том, что фреймворк инвертирует управление в приложении, то есть определяет поток программы и данных. Тем самым он подчеркивает структуры или стандарты, которых должен придерживаться программист.

Разделив понятия, теперь возникает вопрос, когда использовать библиотеку, а когда фреймворк. Прежде чем ответить на этот вопрос, давайте поймем, что при создании реальных приложений между ними существует огромная "серая зона". Теоретически одно и то же приложение можно построить, используя любой из этих двух вариантов. Как и всегда в программной инженерии, необходимо определиться с компромиссами для каждого подхода. Так что воспринимайте то, что будет написано дальше, с щепоткой соли; это не закон, написанный на камне:

  • Вы можете использовать библиотеку при создании приложений малого и среднего размера или при необходимости добавления дополнительной функциональности в приложение (в общем случае, вы можете использовать дополнительные библиотеки внутри фреймворков). Существуют и исключения из правила "размера". Например, React - это библиотека, но на ее основе построены огромные приложения, такие как Facebook. Компромисс заключается в том, что использование только библиотек без фреймворка потребует выработки общих подходов и большей координации внутри команды, поэтому усилия по управлению и руководству могут значительно возрасти. С другой стороны, библиотека, используемая в рамках обычного программирования на JavaScript, может предложить некоторые важные улучшения производительности и обеспечить значительную гибкость.
  • Вы можете захотеть использовать фреймворк при создании приложений среднего и большого размера, когда вам нужна структура, помогающая координировать разработку, или когда вы хотите быстро начать, минуя "азы" разработки общей функциональности с нуля. Существуют фреймворки, построенные поверх других фреймворков, например, Nuxt построен поверх Vue. Компромисс заключается в том, что для построения приложения вам предписывается архитектурная модель, которая часто соответствует определенному подходу и образу мышления. Вам и вашей команде придется изучить фреймворк и его ограничения и жить в этих границах. Всегда есть вероятность того, что в будущем ваше приложение может перерасти рамки. В то же время некоторые из преимуществ таковы: более легкая координация работы, значительный выигрыш от стартового рывка, верное и проверенное решение общих проблем, ориентация на конкретные ситуации (например, торговые приложения в сравнении с социальными сетями) и многое другое. Однако в зависимости от фреймворка вы можете столкнуться с небольшим снижением производительности за счет дополнительной обработки данных или трудностями масштабирования. Вам предстоит взвесить компромиссы в каждом конкретном случае.

Итак, что же такое Vue? По определению, Vue - это прогрессивный фреймворк для создания пользовательских интерфейсов. Прогрессивность означает, что он обладает архитектурными преимуществами фреймворка, а также скоростью и модульными преимуществами библиотеки, поскольку функции и функциональность могут быть реализованы постепенно. На практике это означает, что Vue предписывает определенные модели построения приложения, но в то же время позволяет начинать с малого и расширять его настолько, насколько это необходимо. Вы даже можете использовать несколько приложений Vue на одной странице или взять на себя все приложение. При необходимости можно даже импортировать и использовать другие библиотеки и фреймворки. Весьма причудливо!

Еще одной фундаментальной концепцией Vue является реактивность. Она подразумевает возможность автоматического отображения в HTML значения или изменений, внесенных в переменную в JavaScript, а также внутри вашего кода. В этом заключается большая часть волшебства, предлагаемого Vue.

В традиционном программировании, когда переменной присваивается значение, оно сохраняется до тех пор, пока не будет программно изменено. Однако в реактивном программировании, если значение переменной зависит от других переменных, то при изменении одной из этих зависимостей переменная примет новое результирующее значение. Возьмем, к примеру, следующую простую формулу:

sh
A = B + C

В реактивном программировании каждый раз, когда B или C меняют значение, изменяется и A. Как вы увидите далее в этой книге, это очень мощная модель для построения пользовательских интерфейсов. В данном примере, в соответствии с терминологией, A - это зависимое, а B и C - зависимости.

В следующих главах мы будем изучать этот прогрессивный атрибут в процессе создания примеров приложений. Но перед этим нам нужно посмотреть, что предлагает Vue 3 в самом базовом виде.

Использование Vue в веб-приложении

Существует несколько вариантов использования Vue в веб-приложении, и это во многом зависит от того, какую цель вы преследуете:

  • Для размещения на странице небольшого автономного приложения или фрагмента кода можно напрямую импортировать Vue и код внутри тега script
  • Для создания более крупного приложения вам понадобится инструмент сборки, который возьмет ваш код и соберет его для распространения

Обратите внимание, что я использую слово сборка, а не компиляция, поскольку JavaScript-приложения интерпретируются и выполняются во время исполнения в браузере. Это станет очевидным позже, когда мы введем понятие однофайловых компонентов

Давайте кратко рассмотрим пример первого случая на примере очень простой HTML-страницы:

html
<html>
   <head>         
     <script src="https://unpkg.com/vue@3"></script>
   </head>
diff --git a/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.2KhDHAc_.lean.js b/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.hRH8uAb3.lean.js
similarity index 97%
rename from assets/ru_book_Chapter_1__The_Vue_3_Framework.md.2KhDHAc_.lean.js
rename to assets/ru_book_Chapter_1__The_Vue_3_Framework.md.hRH8uAb3.lean.js
index d80da03b3..8579a0879 100644
--- a/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.2KhDHAc_.lean.js
+++ b/assets/ru_book_Chapter_1__The_Vue_3_Framework.md.hRH8uAb3.lean.js
@@ -1 +1 @@
-import{_ as n,c as p,m as i,a as s,t as l,U as a,o as e}from"./chunks/framework.P5TqXf0g.js";const h="/assets/Figure_1.01_B18602.CWBkZpEz.jpg",V=JSON.parse('{"title":"Фреймворк Vue 3","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_1__The_Vue_3_Framework.md","filePath":"ru/book/Chapter_1__The_Vue_3_Framework.md","lastUpdated":1706427418000}'),k={name:"ru/book/Chapter_1__The_Vue_3_Framework.md"},r=a("",27),o=i("strong",null,"head",-1),g=i("strong",null,"script",-1),E=i("strong",null,"сети доставки контента",-1),d=i("strong",null,"CDN",-1),c=i("strong",null,"Vue",-1),u=i("strong",null,"body",-1),y=i("strong",null,"div",-1),m=i("strong",null,'id="app"',-1),v=i("strong",null,"message",-1),F=i("strong",null,"интерполяцией",-1),C=a("",102);function b(t,q,A,_,D,B){return e(),p("div",null,[r,i("p",null,[s("В разделе "),o,s(" мы определяем тег "),g,s(" и импортируем Vue из бесплатной "),E,s(" ("),d,s("). При этом создается глобальная переменная "),c,s(", которая открывает все методы и функции фреймворка. Внутри нашего тега "),u,s(" мы объявляем элемент "),y,s(" с "),m,s(". Это определяет, где будет размещено наше небольшое приложение и какой частью страницы будет управлять фреймворк Vue. Обратите внимание на содержимое "),i("strong",null,"div: "+l(t.message),1),s(". Двойные фигурные скобки определяют точку, в которой содержимое будет заменено во время выполнения на значение переменной "),v,s(", которую мы определяем в JavaScript. Это называется "),F,s(" и является основным способом отображения значения (строки, числа и т.д.) на веб-странице.")]),C])}const S=n(k,[["render",b]]);export{V as __pageData,S as default};
+import{_ as n,c as p,m as i,a as s,t as l,U as a,o as e}from"./chunks/framework.P5TqXf0g.js";const h="/assets/Figure_1.01_B18602.CWBkZpEz.jpg",V=JSON.parse('{"title":"Фреймворк Vue 3","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_1__The_Vue_3_Framework.md","filePath":"ru/book/Chapter_1__The_Vue_3_Framework.md","lastUpdated":1706553672000}'),k={name:"ru/book/Chapter_1__The_Vue_3_Framework.md"},r=a("",27),o=i("strong",null,"head",-1),g=i("strong",null,"script",-1),E=i("strong",null,"сети доставки контента",-1),d=i("strong",null,"CDN",-1),c=i("strong",null,"Vue",-1),u=i("strong",null,"body",-1),y=i("strong",null,"div",-1),m=i("strong",null,'id="app"',-1),v=i("strong",null,"message",-1),F=i("strong",null,"интерполяцией",-1),C=a("",102);function b(t,q,A,_,D,B){return e(),p("div",null,[r,i("p",null,[s("В разделе "),o,s(" мы определяем тег "),g,s(" и импортируем Vue из бесплатной "),E,s(" ("),d,s("). При этом создается глобальная переменная "),c,s(", которая открывает все методы и функции фреймворка. Внутри нашего тега "),u,s(" мы объявляем элемент "),y,s(" с "),m,s(". Это определяет, где будет размещено наше небольшое приложение и какой частью страницы будет управлять фреймворк Vue. Обратите внимание на содержимое "),i("strong",null,"div: "+l(t.message),1),s(". Двойные фигурные скобки определяют точку, в которой содержимое будет заменено во время выполнения на значение переменной "),v,s(", которую мы определяем в JavaScript. Это называется "),F,s(" и является основным способом отображения значения (строки, числа и т.д.) на веб-странице.")]),C])}const S=n(k,[["render",b]]);export{V as __pageData,S as default};
diff --git a/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.TPYeksQI.js b/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.PaigrACQ.js
similarity index 99%
rename from assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.TPYeksQI.js
rename to assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.PaigrACQ.js
index c8a96113e..bb819375f 100644
--- a/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.TPYeksQI.js
+++ b/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.PaigrACQ.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_2.01_B18602.Y1QJMT4N.jpg",h="/assets/Figure_2.02_B18602.tdHn7N3v.jpg",p="/assets/Figure_2.03_B18602.dju0kKlQ.jpg",l="/assets/Figure_2.04_B18602.K1bdQpXb.jpg",k="/assets/Figure_2.05_B18602.cJq19GKo.jpg",e="/assets/Figure_2.06_B18602.FZ_XlTQ4.jpg",r="/assets/Figure_2.07_B18602.ImQBxd1k.jpg",E="/assets/Figure_2.08_B18602.qJ3S_5JY.jpg",b=JSON.parse('{"title":"Принципы и шаблоны проектирования программного обеспечения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md","filePath":"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md","lastUpdated":1706427418000}'),d={name:"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md"},g=n('

Принципы и шаблоны проектирования программного обеспечения

Разработка программного обеспечения по своей сути является человекоемкой дисциплиной. Это означает, что она требует не только знания техники и технологии, но и понимания проблемы и умения принимать решения для реализации решения на нескольких уровнях абстракции.

Программирование во многом зависит от того, как мыслит разработчик. С годами в каждом контексте и языке появились рекомендации и решения для решения повторяющихся проблем. Знание этих паттернов (шаблонов) поможет вам определить, когда их следует применять, и ускорить разработку. С другой стороны, принципы - это руководящие концепции, которые должны применяться на каждом этапе процесса, и они в большей степени зависят от того, как вы подходите к процессу.

В этой главе мы рассмотрим неполный и не исчерпывающий список принципов и шаблонов, которые часто встречаются при разработке приложений на Vue 3.

Принципы разработки ПО

  • Separation of concerns (Разделение ответственности)
  • Composition over inheritance (Композиция вместо наследования)
  • Single responsibility (Единая ответственность)
  • Encapsulation (Инкапсуляция)
  • KIC - keep it clean (держи это чистым)
  • DRY - don’t repeat yourself (не повторяться)
  • KISS - keep it simple stupid (держи это максимально простым)
  • Code for the next (пиши код для следующего программиста)

Шаблоны проектирования

  • Singleton (Синглтон)
  • Dependency injection (Инъекция зависимостей)
  • Observer (Обсервер)
  • Command (Команда)
  • Proxy (Прокси)
  • Decorator (Декоратор)
  • Façade (Фасад)
  • Callbacks (Обратные вызовы)
  • Promises (Промисы)

Понимание этих принципов и шаблонов поможет вам использовать фреймворк более эффективно и чаще всего не позволит вам "изобретать велосипед". Вместе с первой главой эта глава завершает фундаментальную часть данной книги и дает основу для изучения практической части и реализации примеров приложений в остальных частях книги.

Каковы принципы проектирования программного обеспечения?

При разработке программного обеспечения принципы проектирования - это концептуальные рекомендации высокого уровня, которые должны применяться ко всему процессу. Не в каждом проекте будут использоваться одни и те же принципы, и это не обязательные правила, которые должны соблюдаться. Они могут проявляться в проекте, начиная с архитектуры и заканчивая пользовательским интерфейсом (UI) и последним фрагментом кода. На практике некоторые из этих принципов могут также влиять на такие атрибуты программного обеспечения, как сопровождаемость (maintainability) и возможность повторного использования (re-usability).

Неполный список принципов проектирования

Принципы проектирования несколько различаются в зависимости от контекста, области и даже команды, в которой человек работает в данный момент. Поэтому принципы, включенные в данную главу, являются неисчерпывающими.

Separation of concerns (Разделение ответственности)

Это, пожалуй, самый важный принцип в программной инженерии. Разделение ответственности подразумевает, что система должна быть разделена на подсистемы элементов, сгруппированных по их функциям или услугам (ответственности). Например, мы можем рассматривать человеческий организм как систему, состоящую из множества подсистем (дыхательной, кровеносной, пищеварительной и т.д.). Они, в свою очередь, объединены различными органами, которые состоят из тканей, и так далее, вплоть до мельчайшей клетки. Следуя той же идее в программном обеспечении, приложение можно разделить на элементы, сгруппированные по проблемам, начиная с большой архитектуры и заканчивая последней функцией. Без такого разделения сложности на управляемые части создать функциональную систему было бы гораздо сложнее, а то и вовсе невозможно.

В общем случае применение этого принципа начинается с общей картины того, какой должна быть система, рассматривает, что она должна делать для достижения этой цели, а затем разбивает ее на управляемые рабочие части.

В качестве примера приведем грубое графическое представление разделения задач для веб-приложения. Каждый квадрат на этой диаграмме обозначает отдельную зону ответственности, которая, в свою очередь, может быть детализирована на более мелкие функциональные части. Еще лучше, если вы увидите, как этот принцип позволяет выявить интегрирующие части системы.

image

Рисунок 2.1 - Простой архитектурный вид веб-приложения, демонстрирующий разделение ответственности

Если мы будем углубляться в любую из этих маленьких ячеек внутри соответствующих доменов, мы сможем найти еще больше проблем, которые можно разделить, пока не достигнем неделимого атомарного элемента (компонента или функции, например). Этот принцип имеет много общего с другими принципами, такими как абстракция и единая ответственность, и выигрывает от них. Мы рассмотрим их далее в этой же главе.

Composition over inheritance (Композиция над наследованием)

Принцип композиции над наследованием заимствован непосредственно из объектно-ориентированного программирования (ООП). Он гласит, что объект должен пытаться использовать функциональность других объектов, когда это необходимо, путем ссылки на них или инстанцирования, а не создавать большое и сложное дерево классов наследования для добавления такой функциональности.

В наши дни, JavaScript по своей сути является функциональным языком, хотя и поддерживает множество парадигм, включая черты ООП, поэтому этот принцип также применим. Есть одно предостережение для тех, кто переходит с ООП на JavaScript - не поддавайтесь искушению рассматривать JavaScript как чистый ООП-язык. Это может привести к ненужным сложностям, вместо того чтобы воспользоваться достоинствами языка.

В Vue 3 не существует расширения или наследования компонентов. Когда нам нужна общая или наследуемая функциональность, у нас есть хороший набор инструментов для замены парадигмы наследования. Как соблюсти этот принцип, используя композитные компоненты, мы увидим позже в главе 4, Композиция пользовательского интерфейса с помощью компонентов.

Single responsibility principle (Принцип единой ответственности)

Этот принцип можно встретить как в ООП, так и в функциональном программировании. Проще говоря, он гласит, что класс, метод, функция или компонент должны иметь дело только с одной ответственностью или функциональностью.

Если вы работали в других дисциплинах и языках, то это естественно. Многоцелевые функции трудно поддерживать и они имеют тенденцию выходить из-под контроля, особенно в таких языках, как JavaScript, который является слабо типизированным и очень динамичным. Эта же концепция напрямую относится и к компонентам Vue 3. Каждый компонент должен выполнять одну конкретную операцию и не пытаться делать слишком много самостоятельно.

На практике, когда компонент выходит за определенные рамки, лучше разделить его на несколько компонентов или вынести поведение во внешние модули. Бывают случаи, когда в итоге получается компонент длиной в несколько тысяч строк, но, по моему опыту, это редко бывает необходимо, и этого можно и нужно избегать. Однако следует предупредить, что излишняя конкретика также может привести к ненужному усложнению.

В качестве примера представим себе экран входа в систему, на котором также отображается опция регистрации. Такой подход встречается сегодня на многих сайтах. Можно включить все функции в один компонент, но это нарушит данный принцип. Лучшей альтернативой будет разделение компонентов как минимум на три компонента для решения этой задачи:

  • Родительский компонент, который управляет логикой пользовательского интерфейса. Этот компонент решает, когда показывать/скрывать компоненты входа и регистрации.
  • Дочерний компонент, выполняющий функцию входа.
  • Дочерний компонент, выполняющий функцию регистрации.

Здесь представлено графическое представление данной конфигурации:

image

Рисунок 2.2 - Композиция интерфейса входа/регистрации с использованием нескольких компонентов.

Я думаю, что вы быстро поймете преимущества этого принципа. Он облегчает управление, поддержку и адаптацию кода, поскольку веб-приложения имеют свойство очень и очень быстро мутировать и развиваться.

Совет из Лучших практик

Наделите компоненты единой ответственностью и функциональностью. По возможности избегайте монолитных компонентов.

Encapsulation (Инкапсуляция)

Инкапсуляция - это представление о том, что данные и методы должны быть обернуты в единое целое и при этом предоставлять четко определенный интерфейс прикладного программирования (API).

Часто это делается в виде классов, модулей или библиотек. JavaScript не является исключением, и настоятельно рекомендуется следовать этому принципу. В Vue 3 эта концепция распространяется не только на компоненты, но и на стили CSS и HTML. Введение однофайловых компонентов - яркий пример того, как фреймворк продвигает этот принцип в действии и насколько он важен для современной разработки.

За исключением некоторых редких случаев мы должны рассматривать компоненты (UI) как "черные ящики", которые принимают входящие параметры и предоставляют исходящие данные. Другие компоненты не должны быть знакомы с их внутренним устройством, только с API. По мере создания примеров приложений, описанных в этой книге, вы увидите этот принцип в действии.

KIC - keep it clean

Этот принцип относится главным образом к тому, как вы пишете код. Здесь я должен подчеркнуть, что KIC непосредственно относится к двум категориям, которые сильно влияют на веб-приложения и приложения Vue 3:

  • Как вы форматируете свой код
  • Как вы упорядочиваете события и переменные

Первый пункт включает в себя использование кодовых соглашений, комментариев и отступов для организации кода и логической группировки функций. Например, если у вас есть методы, которые работают с операциями создания, чтения, обновления и удаления (CRUD), то лучше всего разместить их в коде рядом друг с другом, а не разбрасывать по всему исходному файлу.

Многие интегрированные среды разработки (IDE) содержат функции, позволяющие сворачивать или разворачивать внутренний код функций. Это помогает быстро просматривать и находить в коде участки с похожей логикой.

Вторая часть этого принципа связана с обработкой памяти и ссылок. JavaScript имеет очень хороший сборщик мусора, функция которого заключается в отбрасывании неиспользуемых данных для освобождения памяти. Однако бывают случаи, когда алгоритм не может освободить ресурсы из-за наличия оставшихся ссылок. Если вы работали с другими языками, такими как C/C++, то эта проблема может показаться вам знакомой, поскольку вам необходимо вручную резервировать и освобождать память, когда она не используется.

В JavaScript, если вы регистрируете функцию для прослушивания события, лучше всего вручную снять ее с регистрации в соответствующем событии жизненного цикла компонента, когда она больше не нужна. Это позволит избежать утечек и нерационального использования памяти, а также предотвратить некоторые риски безопасности (которые выходят за рамки данной книги).

Мы рассмотрим жизненный цикл компонента в главе 4, Композиция пользовательского интерфейса с помощью компонентов, а пока возьмем следующий пример в качестве хорошего применения этого принципа и сохраним его в качестве лучшей практики. В этом примере мы создадим компонуемый компонент для обнаружения изменения размера окна, поэтому в разделе script setup мы найдем что-то подобное этому:

  1. Регистрируем функцию на событие изменения размера объекта окна в состоянии монтирования.
  2. Снимаем регистрацию события перед размонтированием компонента.

Здесь приведен фрагмент кода:

vue
<script setup>
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_2.01_B18602.Y1QJMT4N.jpg",h="/assets/Figure_2.02_B18602.tdHn7N3v.jpg",p="/assets/Figure_2.03_B18602.dju0kKlQ.jpg",l="/assets/Figure_2.04_B18602.K1bdQpXb.jpg",k="/assets/Figure_2.05_B18602.cJq19GKo.jpg",e="/assets/Figure_2.06_B18602.FZ_XlTQ4.jpg",r="/assets/Figure_2.07_B18602.ImQBxd1k.jpg",E="/assets/Figure_2.08_B18602.qJ3S_5JY.jpg",b=JSON.parse('{"title":"Принципы и шаблоны проектирования программного обеспечения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md","filePath":"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md","lastUpdated":1706553672000}'),d={name:"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md"},g=n('

Принципы и шаблоны проектирования программного обеспечения

Разработка программного обеспечения по своей сути является человекоемкой дисциплиной. Это означает, что она требует не только знания техники и технологии, но и понимания проблемы и умения принимать решения для реализации решения на нескольких уровнях абстракции.

Программирование во многом зависит от того, как мыслит разработчик. С годами в каждом контексте и языке появились рекомендации и решения для решения повторяющихся проблем. Знание этих паттернов (шаблонов) поможет вам определить, когда их следует применять, и ускорить разработку. С другой стороны, принципы - это руководящие концепции, которые должны применяться на каждом этапе процесса, и они в большей степени зависят от того, как вы подходите к процессу.

В этой главе мы рассмотрим неполный и не исчерпывающий список принципов и шаблонов, которые часто встречаются при разработке приложений на Vue 3.

Принципы разработки ПО

  • Separation of concerns (Разделение ответственности)
  • Composition over inheritance (Композиция вместо наследования)
  • Single responsibility (Единая ответственность)
  • Encapsulation (Инкапсуляция)
  • KIC - keep it clean (держи это чистым)
  • DRY - don’t repeat yourself (не повторяться)
  • KISS - keep it simple stupid (держи это максимально простым)
  • Code for the next (пиши код для следующего программиста)

Шаблоны проектирования

  • Singleton (Синглтон)
  • Dependency injection (Инъекция зависимостей)
  • Observer (Обсервер)
  • Command (Команда)
  • Proxy (Прокси)
  • Decorator (Декоратор)
  • Façade (Фасад)
  • Callbacks (Обратные вызовы)
  • Promises (Промисы)

Понимание этих принципов и шаблонов поможет вам использовать фреймворк более эффективно и чаще всего не позволит вам "изобретать велосипед". Вместе с первой главой эта глава завершает фундаментальную часть данной книги и дает основу для изучения практической части и реализации примеров приложений в остальных частях книги.

Каковы принципы проектирования программного обеспечения?

При разработке программного обеспечения принципы проектирования - это концептуальные рекомендации высокого уровня, которые должны применяться ко всему процессу. Не в каждом проекте будут использоваться одни и те же принципы, и это не обязательные правила, которые должны соблюдаться. Они могут проявляться в проекте, начиная с архитектуры и заканчивая пользовательским интерфейсом (UI) и последним фрагментом кода. На практике некоторые из этих принципов могут также влиять на такие атрибуты программного обеспечения, как сопровождаемость (maintainability) и возможность повторного использования (re-usability).

Неполный список принципов проектирования

Принципы проектирования несколько различаются в зависимости от контекста, области и даже команды, в которой человек работает в данный момент. Поэтому принципы, включенные в данную главу, являются неисчерпывающими.

Separation of concerns (Разделение ответственности)

Это, пожалуй, самый важный принцип в программной инженерии. Разделение ответственности подразумевает, что система должна быть разделена на подсистемы элементов, сгруппированных по их функциям или услугам (ответственности). Например, мы можем рассматривать человеческий организм как систему, состоящую из множества подсистем (дыхательной, кровеносной, пищеварительной и т.д.). Они, в свою очередь, объединены различными органами, которые состоят из тканей, и так далее, вплоть до мельчайшей клетки. Следуя той же идее в программном обеспечении, приложение можно разделить на элементы, сгруппированные по проблемам, начиная с большой архитектуры и заканчивая последней функцией. Без такого разделения сложности на управляемые части создать функциональную систему было бы гораздо сложнее, а то и вовсе невозможно.

В общем случае применение этого принципа начинается с общей картины того, какой должна быть система, рассматривает, что она должна делать для достижения этой цели, а затем разбивает ее на управляемые рабочие части.

В качестве примера приведем грубое графическое представление разделения задач для веб-приложения. Каждый квадрат на этой диаграмме обозначает отдельную зону ответственности, которая, в свою очередь, может быть детализирована на более мелкие функциональные части. Еще лучше, если вы увидите, как этот принцип позволяет выявить интегрирующие части системы.

image

Рисунок 2.1 - Простой архитектурный вид веб-приложения, демонстрирующий разделение ответственности

Если мы будем углубляться в любую из этих маленьких ячеек внутри соответствующих доменов, мы сможем найти еще больше проблем, которые можно разделить, пока не достигнем неделимого атомарного элемента (компонента или функции, например). Этот принцип имеет много общего с другими принципами, такими как абстракция и единая ответственность, и выигрывает от них. Мы рассмотрим их далее в этой же главе.

Composition over inheritance (Композиция над наследованием)

Принцип композиции над наследованием заимствован непосредственно из объектно-ориентированного программирования (ООП). Он гласит, что объект должен пытаться использовать функциональность других объектов, когда это необходимо, путем ссылки на них или инстанцирования, а не создавать большое и сложное дерево классов наследования для добавления такой функциональности.

В наши дни, JavaScript по своей сути является функциональным языком, хотя и поддерживает множество парадигм, включая черты ООП, поэтому этот принцип также применим. Есть одно предостережение для тех, кто переходит с ООП на JavaScript - не поддавайтесь искушению рассматривать JavaScript как чистый ООП-язык. Это может привести к ненужным сложностям, вместо того чтобы воспользоваться достоинствами языка.

В Vue 3 не существует расширения или наследования компонентов. Когда нам нужна общая или наследуемая функциональность, у нас есть хороший набор инструментов для замены парадигмы наследования. Как соблюсти этот принцип, используя композитные компоненты, мы увидим позже в главе 4, Композиция пользовательского интерфейса с помощью компонентов.

Single responsibility principle (Принцип единой ответственности)

Этот принцип можно встретить как в ООП, так и в функциональном программировании. Проще говоря, он гласит, что класс, метод, функция или компонент должны иметь дело только с одной ответственностью или функциональностью.

Если вы работали в других дисциплинах и языках, то это естественно. Многоцелевые функции трудно поддерживать и они имеют тенденцию выходить из-под контроля, особенно в таких языках, как JavaScript, который является слабо типизированным и очень динамичным. Эта же концепция напрямую относится и к компонентам Vue 3. Каждый компонент должен выполнять одну конкретную операцию и не пытаться делать слишком много самостоятельно.

На практике, когда компонент выходит за определенные рамки, лучше разделить его на несколько компонентов или вынести поведение во внешние модули. Бывают случаи, когда в итоге получается компонент длиной в несколько тысяч строк, но, по моему опыту, это редко бывает необходимо, и этого можно и нужно избегать. Однако следует предупредить, что излишняя конкретика также может привести к ненужному усложнению.

В качестве примера представим себе экран входа в систему, на котором также отображается опция регистрации. Такой подход встречается сегодня на многих сайтах. Можно включить все функции в один компонент, но это нарушит данный принцип. Лучшей альтернативой будет разделение компонентов как минимум на три компонента для решения этой задачи:

  • Родительский компонент, который управляет логикой пользовательского интерфейса. Этот компонент решает, когда показывать/скрывать компоненты входа и регистрации.
  • Дочерний компонент, выполняющий функцию входа.
  • Дочерний компонент, выполняющий функцию регистрации.

Здесь представлено графическое представление данной конфигурации:

image

Рисунок 2.2 - Композиция интерфейса входа/регистрации с использованием нескольких компонентов.

Я думаю, что вы быстро поймете преимущества этого принципа. Он облегчает управление, поддержку и адаптацию кода, поскольку веб-приложения имеют свойство очень и очень быстро мутировать и развиваться.

Совет из Лучших практик

Наделите компоненты единой ответственностью и функциональностью. По возможности избегайте монолитных компонентов.

Encapsulation (Инкапсуляция)

Инкапсуляция - это представление о том, что данные и методы должны быть обернуты в единое целое и при этом предоставлять четко определенный интерфейс прикладного программирования (API).

Часто это делается в виде классов, модулей или библиотек. JavaScript не является исключением, и настоятельно рекомендуется следовать этому принципу. В Vue 3 эта концепция распространяется не только на компоненты, но и на стили CSS и HTML. Введение однофайловых компонентов - яркий пример того, как фреймворк продвигает этот принцип в действии и насколько он важен для современной разработки.

За исключением некоторых редких случаев мы должны рассматривать компоненты (UI) как "черные ящики", которые принимают входящие параметры и предоставляют исходящие данные. Другие компоненты не должны быть знакомы с их внутренним устройством, только с API. По мере создания примеров приложений, описанных в этой книге, вы увидите этот принцип в действии.

KIC - keep it clean

Этот принцип относится главным образом к тому, как вы пишете код. Здесь я должен подчеркнуть, что KIC непосредственно относится к двум категориям, которые сильно влияют на веб-приложения и приложения Vue 3:

  • Как вы форматируете свой код
  • Как вы упорядочиваете события и переменные

Первый пункт включает в себя использование кодовых соглашений, комментариев и отступов для организации кода и логической группировки функций. Например, если у вас есть методы, которые работают с операциями создания, чтения, обновления и удаления (CRUD), то лучше всего разместить их в коде рядом друг с другом, а не разбрасывать по всему исходному файлу.

Многие интегрированные среды разработки (IDE) содержат функции, позволяющие сворачивать или разворачивать внутренний код функций. Это помогает быстро просматривать и находить в коде участки с похожей логикой.

Вторая часть этого принципа связана с обработкой памяти и ссылок. JavaScript имеет очень хороший сборщик мусора, функция которого заключается в отбрасывании неиспользуемых данных для освобождения памяти. Однако бывают случаи, когда алгоритм не может освободить ресурсы из-за наличия оставшихся ссылок. Если вы работали с другими языками, такими как C/C++, то эта проблема может показаться вам знакомой, поскольку вам необходимо вручную резервировать и освобождать память, когда она не используется.

В JavaScript, если вы регистрируете функцию для прослушивания события, лучше всего вручную снять ее с регистрации в соответствующем событии жизненного цикла компонента, когда она больше не нужна. Это позволит избежать утечек и нерационального использования памяти, а также предотвратить некоторые риски безопасности (которые выходят за рамки данной книги).

Мы рассмотрим жизненный цикл компонента в главе 4, Композиция пользовательского интерфейса с помощью компонентов, а пока возьмем следующий пример в качестве хорошего применения этого принципа и сохраним его в качестве лучшей практики. В этом примере мы создадим компонуемый компонент для обнаружения изменения размера окна, поэтому в разделе script setup мы найдем что-то подобное этому:

  1. Регистрируем функцию на событие изменения размера объекта окна в состоянии монтирования.
  2. Снимаем регистрацию события перед размонтированием компонента.

Здесь приведен фрагмент кода:

vue
<script setup>
    import {onMounted, onBeforeUnmount} from "vue";
    onMounted(() => {
        window.addEventListener("resize", myFunction);
diff --git a/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.TPYeksQI.lean.js b/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.PaigrACQ.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.TPYeksQI.lean.js
rename to assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.PaigrACQ.lean.js
index 7485b8824..7efb7e433 100644
--- a/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.TPYeksQI.lean.js
+++ b/assets/ru_book_Chapter_2__Software_Design_Principles_and_Patterns.md.PaigrACQ.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_2.01_B18602.Y1QJMT4N.jpg",h="/assets/Figure_2.02_B18602.tdHn7N3v.jpg",p="/assets/Figure_2.03_B18602.dju0kKlQ.jpg",l="/assets/Figure_2.04_B18602.K1bdQpXb.jpg",k="/assets/Figure_2.05_B18602.cJq19GKo.jpg",e="/assets/Figure_2.06_B18602.FZ_XlTQ4.jpg",r="/assets/Figure_2.07_B18602.ImQBxd1k.jpg",E="/assets/Figure_2.08_B18602.qJ3S_5JY.jpg",b=JSON.parse('{"title":"Принципы и шаблоны проектирования программного обеспечения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md","filePath":"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md","lastUpdated":1706427418000}'),d={name:"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md"},g=n("",291),o=[g];function y(c,F,u,A,m,D){return a(),i("div",null,o)}const v=s(d,[["render",y]]);export{b as __pageData,v as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_2.01_B18602.Y1QJMT4N.jpg",h="/assets/Figure_2.02_B18602.tdHn7N3v.jpg",p="/assets/Figure_2.03_B18602.dju0kKlQ.jpg",l="/assets/Figure_2.04_B18602.K1bdQpXb.jpg",k="/assets/Figure_2.05_B18602.cJq19GKo.jpg",e="/assets/Figure_2.06_B18602.FZ_XlTQ4.jpg",r="/assets/Figure_2.07_B18602.ImQBxd1k.jpg",E="/assets/Figure_2.08_B18602.qJ3S_5JY.jpg",b=JSON.parse('{"title":"Принципы и шаблоны проектирования программного обеспечения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md","filePath":"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md","lastUpdated":1706553672000}'),d={name:"ru/book/Chapter_2__Software_Design_Principles_and_Patterns.md"},g=n("",291),o=[g];function y(c,F,u,A,m,D){return a(),i("div",null,o)}const v=s(d,[["render",y]]);export{b as __pageData,v as default};
diff --git a/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.TT0BrNOD.js b/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.dySWkMvT.js
similarity index 99%
rename from assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.TT0BrNOD.js
rename to assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.dySWkMvT.js
index aa1e1c72b..99c7fe604 100644
--- a/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.TT0BrNOD.js
+++ b/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.dySWkMvT.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_3.01_B18602.enF_BUF6.jpg",l="/assets/Figure_3.02_B18602.j1J6DNDF.jpg",p="/assets/Figure_3.03_B18602.E7RmQ8rX.jpg",h="/assets/Figure_3.04_B18602.fPqZWq_k.jpg",e="/assets/Figure_3.05_B18602.1H_EUIcs.jpg",k="/assets/Figure_3.06_B18602.j291nky-.jpg",v=JSON.parse('{"title":"Установка рабочего проекта","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_3__Setting_Up_a_Working_Project.md","filePath":"ru/book/Chapter_3__Setting_Up_a_Working_Project.md","lastUpdated":1706427418000}'),r={name:"ru/book/Chapter_3__Setting_Up_a_Working_Project.md"},o=t('

Установка рабочего проекта

В предыдущих главах мы заложили теоретические основы проектирования веб-приложений на JavaScript с использованием фреймворка Vue 3. Однако до сих пор мы не приступили к реальному проекту. Именно этому и посвящена данная глава. С помощью нового набора инструментов, поставляемых вместе с Vue 3, мы создадим проект с нуля и подготовим шаблон, который будем использовать в других проектах. Как обычно, начальным проектом для веб-приложения является создание списка дел To-Do (эквивалент Hello World). По мере внедрения каждой новой концепции мы будем дорабатывать приложение, превращая его в нечто гораздо более полезное или, по крайней мере, более интересное.

Некоторые из практических навыков, которые мы будем осваивать здесь, следующие:

  • Настройка рабочей среды и интегрированной среды разработки (IDE)
  • Использование новых инструментов командной строки и нового сборщика Vite для создания каркаса нашего приложения
  • Модификация базового шаблона и структуры папок с учетом лучших практик и продвинутых архитектурных шаблонов
  • Интеграция готовых CSS-фреймворков в наше приложение
  • Конфигурирование сборщика Vite под наши нужды

В отличие от предыдущих глав, эта будет в основном практической, и в ней будут даны ссылки на официальную документацию по каждому элементу экосистемы, поскольку они периодически меняются. Запоминать шаги не нужно, так как начало проекта с нуля не так часто встречается в крупных проектах, а инструменты для их реализации развиваются. Давайте начнем.

Технические требования

Для выполнения практических шагов, описанных в этой главе, вам потребуется следующее:

  • Компьютер под управлением Windows, Linux или macOS с 64-разрядной архитектурой. Я буду использовать Ubuntu 22.04, но эти инструменты являются кроссплатформенными, и все шаги можно выполнять на разных ОС (если что-то будет отличаться, я укажу на это).
  • Node.js 16.16.0 LTS (рекомендуется ставить последнюю версию - прим. переводчика) с установленным npm (node package manager). Шаги по установке Node.js можно найти в официальной документации по адресу https://nodejs.org/. Инструменты сборки работают поверх Node.js, так что без него вы не сможете продвинуться далеко. Node.js - это версия JavaScript, адаптированная для работы на серверах и в системах "вне" браузера, что делает ее очень и очень удобной и мощной. Большинство современных пакетных программ для веб-разработки так или иначе используют Node.js, хотя бы из-за большого удобства, которое он обеспечивает.
  • Текстовый редактор, работающий с обычным текстом в формате UTF-8, желательно IDE. Для этого инструмента нет недостатка в выборе. Теоретически можно обойтись и без IDE, но я настоятельно рекомендую ее приобрести, хотя бы ради помощи в работе с кодом (известной также как IntelliSense, code completion и т.д.). Вот некоторые из наиболее популярных вариантов:
  • Visual Studio Code (бесплатный): Отличный и очень популярный среди разработчиков вариант от Microsoft, который обеспечивает хорошую поддержку Vue 3 через плагин Volar. Официальный сайт, и в этой книге мы будем использовать этот редактор в качестве рекомендуемой IDE для работы с Vue и Vite.
  • Sublime Text (бесплатная пробная/платная версия): Это еще один популярный вариант, особенно среди пользователей macOS. Официальный сайт
  • Jetbrains WebStorm (бесплатная пробная версия, платная): Официальный сайт
  • Komodo IDE (бесплатно): Официальный сайт
  • NetBeans IDE (бесплатно): Официальный сайт
  • Консоль или эмулятор терминала. Наиболее знакома эта концепция пользователям Linux и macOS. Пользователи Windows могут использовать Command Prompt, встроенный в некоторые IDE терминал, или установить Windows Terminal из Microsoft Store.
  • Современный веб-браузер, основанный на движке Chromium (Google Chrome, Microsoft Edge, Opera, Brave, Vivaldi и др.) или Mozilla Firefox.

Установив все это, мы готовы к рассмотрению примеров и базовых проектов. Однако я рекомендую также установить Git для контроля версий кода. Мы будем использовать его позже в этой книге, в главе 9, Тестирование и контроль исходных текстов.

В современной разработке трудно представить себе работу над проектом без какого-либо инструмента для отслеживания изменений кода и контроля версий. Git стал отраслевым стандартом. Установить его можно, руководствуясь документацией с официального сайта https://git-scm.com/

Файлы кода этой главы можно найти на GitHub здесь

Посмотрите следующее видео, чтобы увидеть код в действии.

Теперь, имея все необходимые инструменты, мы готовы начать наш первый проект на Vue 3.

Настройка проекта и инструменты

Мы создадим новый проект, используя Vite в качестве нашего сборщика, непосредственно из командной строки. Откройте окно терминала в каталоге, где будет размещен наш проект, и выполните следующие шаги:

  1. Наберите следующую команду:
sh
$ npm create vite@latest
  1. Если появится запрос на установку дополнительных пакетов, введите Y (да).

  2. Следующим шагом вам будет предложено ввести информацию о проекте в следующем порядке:

  3. Имя проекта: Оно будет использоваться для идентификации проекта и создания новой папки для его размещения. Если вы хотите, чтобы проект был установлен в текущую папку, введите точку (.) в качестве.

  4. Имя пакета: Это имя будет использоваться для внутренней конфигурации пакета. В данном примере введите chapter-3 (или любое другое имя по вашему выбору). Эта опция может не отображаться, если вы ввели или приняли имя проекта или приняли предложенное по умолчанию имя. Если вы ввели точку (.) в качестве имени для создания проекта в текущем каталоге, то эта опция будет обязательной.

  5. Выбрать фреймворк: Здесь помощник отобразит меню с вариантами. Выберите vue с помощью клавиш со стрелками и нажмите Enter.

  6. Выберите вариант: Как и раньше, используйте клавиши со стрелками и выберите JavaScript (или TypeScript, но мы будем использовать обычный JavaScript на протяжении всей этой книги).

Далее вы увидите, как помощник загружает дополнительное содержимое на основе выбранных вами параметров и формирует проект. Он создаст структуру каталогов с множеством файлов. Однако если мы собираемся запустить проект, то вскоре обнаруживаем, что он просто не работает. Это связано с тем, что при установке каркаса приложения не устанавливаются зависимости, а только скелет. Поэтому остается сделать еще один шаг - установить зависимости с помощью npm. В терминале введите следующую команду и нажмите Enter (если установка производилась в текущий каталог; если нет, то сначала войдите в только что созданный каталог):

sh
$ npm install

Менеджер пакетов скачает и установит зависимости для нашего проекта и поместит их в новый каталог node_modules. Как вы уже догадались, наша среда разработки для Vue с Vite - это Node.js проект.

После установки зависимостей настало время запустить проект и посмотреть, что у нас получилось. В терминале введите следующую команду:

sh
$ npm run dev

То, что произойдет дальше, может оказаться довольно быстрым. Vite разберет файлы вашего проекта и запустит на вашей машине сервер разработчика с веб-адресом, который вы можете использовать в браузере. В терминале вы увидите примерно следующее:

image

Рисунок 3.1 - Результат работы сервера разработки с Vite

Самой важной информацией здесь является localhost и порт, на котором обслуживается сайт вашего проекта. Миллисекунды здесь указаны только для того, чтобы вы поняли, насколько быстро Vite может запустить сервер разработки (хвастовство, если хотите знать мое мнение). Далее, чтобы увидеть результаты наших трудов, откройте в браузере локальный адрес, и перед вами должен появиться сайт, выглядящий примерно так:

image

Рисунок 3.2: Базовый проект Vite + Vue в браузере

Этот сайт вполне работоспособен, хотя и не очень производителен. Чтобы проверить, что Vue 3 работает, нажмите на кнопку в центре экрана, и вы увидите, как счетчик увеличивается с каждым нажатием. Это и есть реактивность в действии! Кроме того, Vite предлагает нам сервер разработки с функцией живого обновления и Hot Module Replacement (HMR), то есть как только мы внесем изменения в код и сохраним файлы, сайт обновится автоматически. На практике при разработке пользовательских интерфейсов очень часто приходится держать этот самообновляющийся сайт открытым в браузере для предварительного просмотра нашей работы, а в некоторых случаях и в нескольких браузерах одновременно. Очень удобно!

Мы продвинулись в нашем путешествии, но это еще далеко не конец. Сайт в виде каркаса - это не более чем отправная точка. В оставшейся части главы мы модифицируем его, чтобы он лучше соответствовал нашим целям, и создадим простое приложение To-Do.

В следующем разделе мы более подробно рассмотрим структуру и организацию нашего стартового проекта.

Структура папок и её модификации

В главе 1, Фреймворк Vue 3, мы упоминали, что фреймворки предписывают определенную структуру приложению. Vue 3 не является исключением, но соглашения, используемые в структуре каталогов, минимальны по сравнению с другими фреймворками. Если открыть каталог, в который вы установили проект, в проводнике Files Explorer (либо в ОС, либо в IDE), то вы обнаружите структуру, подобную этой:

image

Рисунок 3.3: Структура проекта в Visual Code

Папка .vscode была создана IDE, а node_modules была создана npm для распределения зависимостей. Мы их проигнорируем, так как нам не нужно беспокоиться или работать с ними. Начиная с самого верха, рассмотрим, что представляет собой каждый каталог:

  • public

Эта папка содержит структуру каталогов и файлы, которые не будут обрабатываться сборщиком и будут скопированы непосредственно в конечный сайт. Вы можете свободно размещать здесь свое собственное статическое содержимое. Сюда помещаются изображения, веб-шрифты, сторонние CSS-библиотеки, иконки и т.д. Как правило, здесь размещаются файлы, на которые никогда не будет ссылаться ваш код, например manifest.json, favicon.ico, robots.txt и т.д.

  • src

Здесь мы будем размещать наш JavaScript, динамический CSS, компоненты и т.д. Внутри неё распологаются:

  • Папка assets с SVG-файлом. В эту папку мы можем включить файлы, с которыми будет работать либо код, либо сборщик. Вы можете импортировать их непосредственно в код, а сборщик позаботится об их корректном отображении при передаче на веб-сервер.
  • Папка components, в которую мы поместим наши однофайловые компоненты (SFC) с расширением .vue. Здесь мы можем создать структуру каталогов по своему усмотрению. Здесь размещен компонент HelloWorld.vue.
  • Файл App.vue. Это основной компонент нашего приложения и корневой компонент нашей иерархии. Его принято называть именно так.
  • Файл main.js, который является начальной точкой нашего приложения. Он отвечает за загрузку начальных зависимостей, главного компонента (App.vue), создание приложения Vue 3 со всеми дополнительными функциями (плагины, глобальные директивы и компоненты), а также запуск и установку приложения на веб-страницу.
  • Файл styles.css, представляющий собой глобальную таблицу стилей, которая будет применяться ко всему нашему приложению. В предыдущих версиях инструмента создания структуры проекта его размещали в папке assets, но теперь он переместился в корень src/, заняв более значимое место. Этот файл при импорте в файл main.js будет разобран и объединен с нашим JavaScript.

Настало время исследовать файлы в корне проекта в том же порядке, в котором они появляются:

  • .gitignore - это файл, который управляет тем, что исключается из контроля исходных текстов Git. Мы познакомимся с Git-ом в главе 9, Тестирование и контроль исходных текстов.
  • index.html - это главный файл и отправная точка нашего веб-приложения. Пакет будет обращаться к другим файлам и обрабатывать их в порядке их появления, начиная с index.html. Вы можете изменить его в соответствии со своими потребностями, так как сгенерированный файл является достаточно базовым. Обратите внимание, что в конце тега body инструмент включен тег script для загрузки нашего файла main.js. Именно этот файл создает наше приложение Vue. В отличие от других сборщиков, которые автоматически генерируют этот файл и затем внедряют его в index.html, Vite требует, чтобы он был импортирован явно. Помимо прочих преимуществ, это позволяет контролировать, когда приложение Vue будет загружаться внутри веб-страницы.
  • package-lock.json используется npm для управления зависимостями в node_modules. Игнорируйте его.
  • package.json очень важен. Этот файл определяет проект, отслеживает зависимости для разработки и производства, а также предоставляет некоторые приятные возможности, например, автоматизацию некоторых задач с помощью простых команд. На данный момент интерес представляет секция scripts, в которой задаются простые псевдонимы для команд. Мы можем запускать их из командной строки, набрав npm run <имя скрипта>. Также уже подготовлены для нас три команды Vite:
  • npm run dev: Это запустит сайт в режиме разработчика, с локальным сервером и живой перезагрузкой (hot reload).
  • npm run build: Это позволит собрать наш код в пакет и оптимизировать его для создания готовой продакшен версии.
  • npm run preview: Это промежуточный вариант между двумя предыдущими. Он позволяет локально увидеть собранную версию, готовую к производству. Это может показаться непонятным, если не учитывать, что в процессе разработки адреса и ресурсы, к которым обращается приложение, а также публичный URL, могут отличаться от тех, что используются в производстве. Эта опция позволяет запускать приложение локально, но при этом ссылаться на производственные конечные точки и ресурсы и использовать их. Рекомендуется запускать "предварительный просмотр" перед развертыванием вашего приложения.
  • vite.config.js - это конфигурационный файл, определяющий поведение Vite во время разработки и при сборке для производства. Некоторые из наиболее важных и распространенных опций мы рассмотрим далее в этой главе.

Теперь, когда мы имеем более четкое представление о том, что нам дал инструмент Vite scaffolding, самое время приступить к созданию нашего примера приложения. Прежде чем углубиться в код, необходимо рассмотреть еще несколько вопросов: как интегрировать сторонние таблицы стилей и CSS-фреймворки, а также некоторые конфигурации Vite, которые облегчат нам жизнь.

Интеграция с CSS-фреймворками

Если вспомнить три последних принципа, рассмотренных в главе 2, Принципы и паттерны проектирования программного обеспечения, (не повторяться, сохранять чистоту и код для следующего), то изобретать велосипед в вопросах внешнего вида и графического языка - вещь в большинстве случаев нежелательная.

В Интернете существует постоянно растущая коллекция CSS-фреймворков и библиотек, которые мы можем легко внедрять в наши приложения. От старого популярного Bootstrap до атомарного дизайна, от утилитарных классов, таких как Tailwind, до графических языков, таких как Material Design и skeuomorphism - спектр возможностей огромен.

В Vue уже имеется достаточное количество библиотек компонентов, реализующих некоторые из них, которые можно найти в репозиториях npm. Используя их, вы будете ограничены в изучении и применении соглашений, применяемых дизайнером, которые в некоторых случаях могут полностью определять, как вы можете построить свой пользовательский интерфейс. Типичными примерами являются использование Vue-material (и других), соответствующих спецификациям Material Design от Google, или применение веб-шрифтов и шрифтов-иконок.

Невозможно рассказать о каждом из них, но здесь приведены рекомендации и некоторые примеры включения этих библиотек в ваш проект:

  1. Поместите статические активы, предоставляемые фреймворком или библиотекой, в папку public, следуя их требуемой структуре и соблюдая любую структуру дерева.
  2. Включите зависимости для CSS-фреймворка или библиотек в файл index.html, следуя их инструкциям. Часто это подразумевает импорт таблиц стилей и файлов JavaScript в раздел head или в тег body. В любом случае убедитесь, что они размещены до загрузки нашего приложения (тег script, ссылающийся на наш файл main.js).
  3. Если фреймворк или библиотеку необходимо инстанцировать, сделайте это до того, как мы смонтируем наше приложение. Это можно сделать непосредственно в index.html в теге script, в main.js или в другом модуле.
  4. Используйте классы (и JavaScript-функции) в секции шаблона вашего компонента обычным образом, как и в обычном HTML, используя эти библиотеки. Некоторые фреймворки создают глобальные объекты JavaScript, привязанные к объекту window, поэтому к ним можно обращаться непосредственно в секции script компонента. Если это не так, рассмотрите возможность инкапсуляции функциональности, чтобы использовать ее в своем приложении, используя паттерны проектирования, такие как синглтон, прокси или декоратор.

А теперь давайте применим эти простые инструкции на примере нашего проекта. Мы включим в него фреймворк, работающий только на CSS (это означает, что он не использует дополнительный JavaScript), а значки шрифтов будут включать базовую иконографию. В промышленной сборке мы должны удалить неиспользуемые правила CSS. Некоторые CSS-фреймворки предоставляют эту возможность из коробки, например, Tailwind. Однако эта тема выходит за рамки данной книги, но ее можно изучить в Интернете.

Фреймворк w3.css

На сайте w3schools.com предлагается бесплатный CSS фреймворк, частично основанный на языке Material Design, популярном в Google и используемом во многих мобильных приложениях. Он предлагает множество полезных классов, которые можно без лицензии применять в своих приложениях. Более подробную информацию можно найти на официальном сайте: https://www.w3schools.com/w3css/.

Мы будем следовать рекомендациям, указанным ранее, поэтому давайте выполним следующие шаги:

  1. Скачайте файл w3.css с сайта https://www.w3schools.com/w3css/w3css_downloads.asp и поместите его в новую папку с именем css в каталоге public. По окончании работы он должен выглядеть следующим образом:

image

Рисунок 3.4 - Расположение файла w3.css

  1. Модифицируем index.html в корне нашего проекта, добавив ссылку на файл w3.css с помощью тега link следующим образом:
html
<link rel="stylesheet" href="/css/w3.css">

Таким образом, классы, определенные в CSS-файле, теперь готовы к использованию в шаблонах нашего компонента. Также, чтобы избежать нежелательных стилей при начальном развертывании приложения, не забудьте очистить файл styles.css, предоставляемый программой установки. Если теперь запустить сервер разработки с помощью команды npm run dev, то мы увидим, что внешний вид сайта немного изменился, так как новая таблица стилей была успешно применена.

Следующим шагом будет добавление шрифта icon.

FontAwesome - это просто замечательно

Одним из способов экономии ресурсов разработчиков при работе с множеством значков является использование шрифтовых иконок. Это файлы шрифтов, в которых вместо символов отображаются значки. Эта концепция не нова, но она находит широкое применение в веб-разработке.

Использование шрифтов для иконок в отличие от других приемов (например, спрайтовых листов CSS) имеет массу преимуществ. Одним из наиболее значимых является то, что с такими иконками можно работать так же, как и с обычными шрифтами, поэтому мы можем легко изменять их размер, цвет и т.д., сохраняя при этом согласованность с остальным текстом. Но не все так радужно и счастливо, поскольку теперь основной компромисс заключается в том, что эти значки отображаются только одним или максимум двумя цветами и по необходимости должны быть довольно простыми.

FontAwesome - это сайт, предлагающий шрифты-иконки для использования в наших приложениях, как веб, так и десктопных. Он занимается этим уже много лет и располагает одними из лучших коллекций иконок. Мы можем скачать и использовать его бесплатный уровень для нашего проекта. Давайте еще раз проследим за тем, как их использовать в нашем проекте:

  1. Скачайте шрифты для web с сайта https://fontawesome.com/download. При этом будет загружен довольно большой ZIP-файл со всеми различными вариантами.

  2. Из ZIP-файла скопируйте директории css/ и webfonts/ как есть, в нашу папку public/. Мы не будем использовать все, что находится в этой папке, в наших проектах, поэтому то, что мы не используем, можно будет удалить позже.

  3. Редактируем файл index.html, чтобы добавить таблицы стилей, которые мы будем использовать. Эти CSS-файлы будут автоматически загружать шрифты иконок из папки /webfonts/:

html
<link rel="stylesheet" href="/css/fontawesome.min.css">
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_3.01_B18602.enF_BUF6.jpg",l="/assets/Figure_3.02_B18602.j1J6DNDF.jpg",p="/assets/Figure_3.03_B18602.E7RmQ8rX.jpg",h="/assets/Figure_3.04_B18602.fPqZWq_k.jpg",e="/assets/Figure_3.05_B18602.1H_EUIcs.jpg",k="/assets/Figure_3.06_B18602.j291nky-.jpg",v=JSON.parse('{"title":"Установка рабочего проекта","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_3__Setting_Up_a_Working_Project.md","filePath":"ru/book/Chapter_3__Setting_Up_a_Working_Project.md","lastUpdated":1706553672000}'),r={name:"ru/book/Chapter_3__Setting_Up_a_Working_Project.md"},o=t('

Установка рабочего проекта

В предыдущих главах мы заложили теоретические основы проектирования веб-приложений на JavaScript с использованием фреймворка Vue 3. Однако до сих пор мы не приступили к реальному проекту. Именно этому и посвящена данная глава. С помощью нового набора инструментов, поставляемых вместе с Vue 3, мы создадим проект с нуля и подготовим шаблон, который будем использовать в других проектах. Как обычно, начальным проектом для веб-приложения является создание списка дел To-Do (эквивалент Hello World). По мере внедрения каждой новой концепции мы будем дорабатывать приложение, превращая его в нечто гораздо более полезное или, по крайней мере, более интересное.

Некоторые из практических навыков, которые мы будем осваивать здесь, следующие:

  • Настройка рабочей среды и интегрированной среды разработки (IDE)
  • Использование новых инструментов командной строки и нового сборщика Vite для создания каркаса нашего приложения
  • Модификация базового шаблона и структуры папок с учетом лучших практик и продвинутых архитектурных шаблонов
  • Интеграция готовых CSS-фреймворков в наше приложение
  • Конфигурирование сборщика Vite под наши нужды

В отличие от предыдущих глав, эта будет в основном практической, и в ней будут даны ссылки на официальную документацию по каждому элементу экосистемы, поскольку они периодически меняются. Запоминать шаги не нужно, так как начало проекта с нуля не так часто встречается в крупных проектах, а инструменты для их реализации развиваются. Давайте начнем.

Технические требования

Для выполнения практических шагов, описанных в этой главе, вам потребуется следующее:

  • Компьютер под управлением Windows, Linux или macOS с 64-разрядной архитектурой. Я буду использовать Ubuntu 22.04, но эти инструменты являются кроссплатформенными, и все шаги можно выполнять на разных ОС (если что-то будет отличаться, я укажу на это).
  • Node.js 16.16.0 LTS (рекомендуется ставить последнюю версию - прим. переводчика) с установленным npm (node package manager). Шаги по установке Node.js можно найти в официальной документации по адресу https://nodejs.org/. Инструменты сборки работают поверх Node.js, так что без него вы не сможете продвинуться далеко. Node.js - это версия JavaScript, адаптированная для работы на серверах и в системах "вне" браузера, что делает ее очень и очень удобной и мощной. Большинство современных пакетных программ для веб-разработки так или иначе используют Node.js, хотя бы из-за большого удобства, которое он обеспечивает.
  • Текстовый редактор, работающий с обычным текстом в формате UTF-8, желательно IDE. Для этого инструмента нет недостатка в выборе. Теоретически можно обойтись и без IDE, но я настоятельно рекомендую ее приобрести, хотя бы ради помощи в работе с кодом (известной также как IntelliSense, code completion и т.д.). Вот некоторые из наиболее популярных вариантов:
  • Visual Studio Code (бесплатный): Отличный и очень популярный среди разработчиков вариант от Microsoft, который обеспечивает хорошую поддержку Vue 3 через плагин Volar. Официальный сайт, и в этой книге мы будем использовать этот редактор в качестве рекомендуемой IDE для работы с Vue и Vite.
  • Sublime Text (бесплатная пробная/платная версия): Это еще один популярный вариант, особенно среди пользователей macOS. Официальный сайт
  • Jetbrains WebStorm (бесплатная пробная версия, платная): Официальный сайт
  • Komodo IDE (бесплатно): Официальный сайт
  • NetBeans IDE (бесплатно): Официальный сайт
  • Консоль или эмулятор терминала. Наиболее знакома эта концепция пользователям Linux и macOS. Пользователи Windows могут использовать Command Prompt, встроенный в некоторые IDE терминал, или установить Windows Terminal из Microsoft Store.
  • Современный веб-браузер, основанный на движке Chromium (Google Chrome, Microsoft Edge, Opera, Brave, Vivaldi и др.) или Mozilla Firefox.

Установив все это, мы готовы к рассмотрению примеров и базовых проектов. Однако я рекомендую также установить Git для контроля версий кода. Мы будем использовать его позже в этой книге, в главе 9, Тестирование и контроль исходных текстов.

В современной разработке трудно представить себе работу над проектом без какого-либо инструмента для отслеживания изменений кода и контроля версий. Git стал отраслевым стандартом. Установить его можно, руководствуясь документацией с официального сайта https://git-scm.com/

Файлы кода этой главы можно найти на GitHub здесь

Посмотрите следующее видео, чтобы увидеть код в действии.

Теперь, имея все необходимые инструменты, мы готовы начать наш первый проект на Vue 3.

Настройка проекта и инструменты

Мы создадим новый проект, используя Vite в качестве нашего сборщика, непосредственно из командной строки. Откройте окно терминала в каталоге, где будет размещен наш проект, и выполните следующие шаги:

  1. Наберите следующую команду:
sh
$ npm create vite@latest
  1. Если появится запрос на установку дополнительных пакетов, введите Y (да).

  2. Следующим шагом вам будет предложено ввести информацию о проекте в следующем порядке:

  3. Имя проекта: Оно будет использоваться для идентификации проекта и создания новой папки для его размещения. Если вы хотите, чтобы проект был установлен в текущую папку, введите точку (.) в качестве.

  4. Имя пакета: Это имя будет использоваться для внутренней конфигурации пакета. В данном примере введите chapter-3 (или любое другое имя по вашему выбору). Эта опция может не отображаться, если вы ввели или приняли имя проекта или приняли предложенное по умолчанию имя. Если вы ввели точку (.) в качестве имени для создания проекта в текущем каталоге, то эта опция будет обязательной.

  5. Выбрать фреймворк: Здесь помощник отобразит меню с вариантами. Выберите vue с помощью клавиш со стрелками и нажмите Enter.

  6. Выберите вариант: Как и раньше, используйте клавиши со стрелками и выберите JavaScript (или TypeScript, но мы будем использовать обычный JavaScript на протяжении всей этой книги).

Далее вы увидите, как помощник загружает дополнительное содержимое на основе выбранных вами параметров и формирует проект. Он создаст структуру каталогов с множеством файлов. Однако если мы собираемся запустить проект, то вскоре обнаруживаем, что он просто не работает. Это связано с тем, что при установке каркаса приложения не устанавливаются зависимости, а только скелет. Поэтому остается сделать еще один шаг - установить зависимости с помощью npm. В терминале введите следующую команду и нажмите Enter (если установка производилась в текущий каталог; если нет, то сначала войдите в только что созданный каталог):

sh
$ npm install

Менеджер пакетов скачает и установит зависимости для нашего проекта и поместит их в новый каталог node_modules. Как вы уже догадались, наша среда разработки для Vue с Vite - это Node.js проект.

После установки зависимостей настало время запустить проект и посмотреть, что у нас получилось. В терминале введите следующую команду:

sh
$ npm run dev

То, что произойдет дальше, может оказаться довольно быстрым. Vite разберет файлы вашего проекта и запустит на вашей машине сервер разработчика с веб-адресом, который вы можете использовать в браузере. В терминале вы увидите примерно следующее:

image

Рисунок 3.1 - Результат работы сервера разработки с Vite

Самой важной информацией здесь является localhost и порт, на котором обслуживается сайт вашего проекта. Миллисекунды здесь указаны только для того, чтобы вы поняли, насколько быстро Vite может запустить сервер разработки (хвастовство, если хотите знать мое мнение). Далее, чтобы увидеть результаты наших трудов, откройте в браузере локальный адрес, и перед вами должен появиться сайт, выглядящий примерно так:

image

Рисунок 3.2: Базовый проект Vite + Vue в браузере

Этот сайт вполне работоспособен, хотя и не очень производителен. Чтобы проверить, что Vue 3 работает, нажмите на кнопку в центре экрана, и вы увидите, как счетчик увеличивается с каждым нажатием. Это и есть реактивность в действии! Кроме того, Vite предлагает нам сервер разработки с функцией живого обновления и Hot Module Replacement (HMR), то есть как только мы внесем изменения в код и сохраним файлы, сайт обновится автоматически. На практике при разработке пользовательских интерфейсов очень часто приходится держать этот самообновляющийся сайт открытым в браузере для предварительного просмотра нашей работы, а в некоторых случаях и в нескольких браузерах одновременно. Очень удобно!

Мы продвинулись в нашем путешествии, но это еще далеко не конец. Сайт в виде каркаса - это не более чем отправная точка. В оставшейся части главы мы модифицируем его, чтобы он лучше соответствовал нашим целям, и создадим простое приложение To-Do.

В следующем разделе мы более подробно рассмотрим структуру и организацию нашего стартового проекта.

Структура папок и её модификации

В главе 1, Фреймворк Vue 3, мы упоминали, что фреймворки предписывают определенную структуру приложению. Vue 3 не является исключением, но соглашения, используемые в структуре каталогов, минимальны по сравнению с другими фреймворками. Если открыть каталог, в который вы установили проект, в проводнике Files Explorer (либо в ОС, либо в IDE), то вы обнаружите структуру, подобную этой:

image

Рисунок 3.3: Структура проекта в Visual Code

Папка .vscode была создана IDE, а node_modules была создана npm для распределения зависимостей. Мы их проигнорируем, так как нам не нужно беспокоиться или работать с ними. Начиная с самого верха, рассмотрим, что представляет собой каждый каталог:

  • public

Эта папка содержит структуру каталогов и файлы, которые не будут обрабатываться сборщиком и будут скопированы непосредственно в конечный сайт. Вы можете свободно размещать здесь свое собственное статическое содержимое. Сюда помещаются изображения, веб-шрифты, сторонние CSS-библиотеки, иконки и т.д. Как правило, здесь размещаются файлы, на которые никогда не будет ссылаться ваш код, например manifest.json, favicon.ico, robots.txt и т.д.

  • src

Здесь мы будем размещать наш JavaScript, динамический CSS, компоненты и т.д. Внутри неё распологаются:

  • Папка assets с SVG-файлом. В эту папку мы можем включить файлы, с которыми будет работать либо код, либо сборщик. Вы можете импортировать их непосредственно в код, а сборщик позаботится об их корректном отображении при передаче на веб-сервер.
  • Папка components, в которую мы поместим наши однофайловые компоненты (SFC) с расширением .vue. Здесь мы можем создать структуру каталогов по своему усмотрению. Здесь размещен компонент HelloWorld.vue.
  • Файл App.vue. Это основной компонент нашего приложения и корневой компонент нашей иерархии. Его принято называть именно так.
  • Файл main.js, который является начальной точкой нашего приложения. Он отвечает за загрузку начальных зависимостей, главного компонента (App.vue), создание приложения Vue 3 со всеми дополнительными функциями (плагины, глобальные директивы и компоненты), а также запуск и установку приложения на веб-страницу.
  • Файл styles.css, представляющий собой глобальную таблицу стилей, которая будет применяться ко всему нашему приложению. В предыдущих версиях инструмента создания структуры проекта его размещали в папке assets, но теперь он переместился в корень src/, заняв более значимое место. Этот файл при импорте в файл main.js будет разобран и объединен с нашим JavaScript.

Настало время исследовать файлы в корне проекта в том же порядке, в котором они появляются:

  • .gitignore - это файл, который управляет тем, что исключается из контроля исходных текстов Git. Мы познакомимся с Git-ом в главе 9, Тестирование и контроль исходных текстов.
  • index.html - это главный файл и отправная точка нашего веб-приложения. Пакет будет обращаться к другим файлам и обрабатывать их в порядке их появления, начиная с index.html. Вы можете изменить его в соответствии со своими потребностями, так как сгенерированный файл является достаточно базовым. Обратите внимание, что в конце тега body инструмент включен тег script для загрузки нашего файла main.js. Именно этот файл создает наше приложение Vue. В отличие от других сборщиков, которые автоматически генерируют этот файл и затем внедряют его в index.html, Vite требует, чтобы он был импортирован явно. Помимо прочих преимуществ, это позволяет контролировать, когда приложение Vue будет загружаться внутри веб-страницы.
  • package-lock.json используется npm для управления зависимостями в node_modules. Игнорируйте его.
  • package.json очень важен. Этот файл определяет проект, отслеживает зависимости для разработки и производства, а также предоставляет некоторые приятные возможности, например, автоматизацию некоторых задач с помощью простых команд. На данный момент интерес представляет секция scripts, в которой задаются простые псевдонимы для команд. Мы можем запускать их из командной строки, набрав npm run <имя скрипта>. Также уже подготовлены для нас три команды Vite:
  • npm run dev: Это запустит сайт в режиме разработчика, с локальным сервером и живой перезагрузкой (hot reload).
  • npm run build: Это позволит собрать наш код в пакет и оптимизировать его для создания готовой продакшен версии.
  • npm run preview: Это промежуточный вариант между двумя предыдущими. Он позволяет локально увидеть собранную версию, готовую к производству. Это может показаться непонятным, если не учитывать, что в процессе разработки адреса и ресурсы, к которым обращается приложение, а также публичный URL, могут отличаться от тех, что используются в производстве. Эта опция позволяет запускать приложение локально, но при этом ссылаться на производственные конечные точки и ресурсы и использовать их. Рекомендуется запускать "предварительный просмотр" перед развертыванием вашего приложения.
  • vite.config.js - это конфигурационный файл, определяющий поведение Vite во время разработки и при сборке для производства. Некоторые из наиболее важных и распространенных опций мы рассмотрим далее в этой главе.

Теперь, когда мы имеем более четкое представление о том, что нам дал инструмент Vite scaffolding, самое время приступить к созданию нашего примера приложения. Прежде чем углубиться в код, необходимо рассмотреть еще несколько вопросов: как интегрировать сторонние таблицы стилей и CSS-фреймворки, а также некоторые конфигурации Vite, которые облегчат нам жизнь.

Интеграция с CSS-фреймворками

Если вспомнить три последних принципа, рассмотренных в главе 2, Принципы и паттерны проектирования программного обеспечения, (не повторяться, сохранять чистоту и код для следующего), то изобретать велосипед в вопросах внешнего вида и графического языка - вещь в большинстве случаев нежелательная.

В Интернете существует постоянно растущая коллекция CSS-фреймворков и библиотек, которые мы можем легко внедрять в наши приложения. От старого популярного Bootstrap до атомарного дизайна, от утилитарных классов, таких как Tailwind, до графических языков, таких как Material Design и skeuomorphism - спектр возможностей огромен.

В Vue уже имеется достаточное количество библиотек компонентов, реализующих некоторые из них, которые можно найти в репозиториях npm. Используя их, вы будете ограничены в изучении и применении соглашений, применяемых дизайнером, которые в некоторых случаях могут полностью определять, как вы можете построить свой пользовательский интерфейс. Типичными примерами являются использование Vue-material (и других), соответствующих спецификациям Material Design от Google, или применение веб-шрифтов и шрифтов-иконок.

Невозможно рассказать о каждом из них, но здесь приведены рекомендации и некоторые примеры включения этих библиотек в ваш проект:

  1. Поместите статические активы, предоставляемые фреймворком или библиотекой, в папку public, следуя их требуемой структуре и соблюдая любую структуру дерева.
  2. Включите зависимости для CSS-фреймворка или библиотек в файл index.html, следуя их инструкциям. Часто это подразумевает импорт таблиц стилей и файлов JavaScript в раздел head или в тег body. В любом случае убедитесь, что они размещены до загрузки нашего приложения (тег script, ссылающийся на наш файл main.js).
  3. Если фреймворк или библиотеку необходимо инстанцировать, сделайте это до того, как мы смонтируем наше приложение. Это можно сделать непосредственно в index.html в теге script, в main.js или в другом модуле.
  4. Используйте классы (и JavaScript-функции) в секции шаблона вашего компонента обычным образом, как и в обычном HTML, используя эти библиотеки. Некоторые фреймворки создают глобальные объекты JavaScript, привязанные к объекту window, поэтому к ним можно обращаться непосредственно в секции script компонента. Если это не так, рассмотрите возможность инкапсуляции функциональности, чтобы использовать ее в своем приложении, используя паттерны проектирования, такие как синглтон, прокси или декоратор.

А теперь давайте применим эти простые инструкции на примере нашего проекта. Мы включим в него фреймворк, работающий только на CSS (это означает, что он не использует дополнительный JavaScript), а значки шрифтов будут включать базовую иконографию. В промышленной сборке мы должны удалить неиспользуемые правила CSS. Некоторые CSS-фреймворки предоставляют эту возможность из коробки, например, Tailwind. Однако эта тема выходит за рамки данной книги, но ее можно изучить в Интернете.

Фреймворк w3.css

На сайте w3schools.com предлагается бесплатный CSS фреймворк, частично основанный на языке Material Design, популярном в Google и используемом во многих мобильных приложениях. Он предлагает множество полезных классов, которые можно без лицензии применять в своих приложениях. Более подробную информацию можно найти на официальном сайте: https://www.w3schools.com/w3css/.

Мы будем следовать рекомендациям, указанным ранее, поэтому давайте выполним следующие шаги:

  1. Скачайте файл w3.css с сайта https://www.w3schools.com/w3css/w3css_downloads.asp и поместите его в новую папку с именем css в каталоге public. По окончании работы он должен выглядеть следующим образом:

image

Рисунок 3.4 - Расположение файла w3.css

  1. Модифицируем index.html в корне нашего проекта, добавив ссылку на файл w3.css с помощью тега link следующим образом:
html
<link rel="stylesheet" href="/css/w3.css">

Таким образом, классы, определенные в CSS-файле, теперь готовы к использованию в шаблонах нашего компонента. Также, чтобы избежать нежелательных стилей при начальном развертывании приложения, не забудьте очистить файл styles.css, предоставляемый программой установки. Если теперь запустить сервер разработки с помощью команды npm run dev, то мы увидим, что внешний вид сайта немного изменился, так как новая таблица стилей была успешно применена.

Следующим шагом будет добавление шрифта icon.

FontAwesome - это просто замечательно

Одним из способов экономии ресурсов разработчиков при работе с множеством значков является использование шрифтовых иконок. Это файлы шрифтов, в которых вместо символов отображаются значки. Эта концепция не нова, но она находит широкое применение в веб-разработке.

Использование шрифтов для иконок в отличие от других приемов (например, спрайтовых листов CSS) имеет массу преимуществ. Одним из наиболее значимых является то, что с такими иконками можно работать так же, как и с обычными шрифтами, поэтому мы можем легко изменять их размер, цвет и т.д., сохраняя при этом согласованность с остальным текстом. Но не все так радужно и счастливо, поскольку теперь основной компромисс заключается в том, что эти значки отображаются только одним или максимум двумя цветами и по необходимости должны быть довольно простыми.

FontAwesome - это сайт, предлагающий шрифты-иконки для использования в наших приложениях, как веб, так и десктопных. Он занимается этим уже много лет и располагает одними из лучших коллекций иконок. Мы можем скачать и использовать его бесплатный уровень для нашего проекта. Давайте еще раз проследим за тем, как их использовать в нашем проекте:

  1. Скачайте шрифты для web с сайта https://fontawesome.com/download. При этом будет загружен довольно большой ZIP-файл со всеми различными вариантами.

  2. Из ZIP-файла скопируйте директории css/ и webfonts/ как есть, в нашу папку public/. Мы не будем использовать все, что находится в этой папке, в наших проектах, поэтому то, что мы не используем, можно будет удалить позже.

  3. Редактируем файл index.html, чтобы добавить таблицы стилей, которые мы будем использовать. Эти CSS-файлы будут автоматически загружать шрифты иконок из папки /webfonts/:

html
<link rel="stylesheet" href="/css/fontawesome.min.css">
 <link rel="stylesheet" href="/css/solid.min.css">
 <link rel="stylesheet" href="/css/brands.min.css">

Вот и все, что нам нужно сделать, чтобы включить FontAwesome в наш проект. Существуют и другие альтернативы, которые инкапсулируют шрифты в компоненты Vue, и даже веб-сайт предоставляет реализацию Vue. Однако для наших целей в этой книге мы будем использовать прямой подход. Если мы откроем раздел "Значки" на сайте, то сможем просмотреть и найти все доступные значки. Можно ограничить поиск значками "solid" и "brands", поскольку именно их мы включили в наш проект. Например, если необходимо отобразить значок Vue с помощью FontAwesome, мы можем включить в наш шаблон следующее:

html
<i class="fa-brands fa-vuejs"></i>

Эти классы делают всю магию в любом пустом элементе, но по традиции и для удобства мы всегда используем тег i. Более того, их даже не нужно вводить. Как только вы найдете нужный значок, на сайте появится удобная функция "нажать и скопировать" код. Предыдущая строка взята отсюда:

image

Рисунок 3.5 - Страница иконок FontAwesome.

Следует помнить, что включение большой библиотеки иконок при использовании лишь некоторых из них скажется на производительности. Для производственных сборок следует включать только те значки, которые будут использоваться в приложении, создавая шрифты значков только с необходимыми значками. Для целей нашей книги и во время разработки мы можем пропустить эту практику.

Получив хорошую таблицу стилей и несколько хороших шрифтов иконок, мы почти готовы приступить к написанию кода. Осталось сделать еще одну вещь - включить несколько дополнительных опций в конфигурацию Vite.

Опции конфигурации Vite

Файл vite.config.js экспортирует конфигурацию, которую Vite будет использовать для разработки, а также для производства. Vite был задуман как функциональный инструмент для различных фреймворков, а не только для Vue 3, хотя он и является официальным сборщиком для него. Открыв файл, мы видим, что Vue является плагином для Vite. Внутри Vite использует Rollup.js https://www.rollupjs.org/ и esbuild https://esbuild.github.io/, соответственно, для разработки и сборки.

Это означает, что мы можем передавать опции в Vite, но также иметь еще более тонкий контроль над некоторыми крайними случаями, передавая аргументы этим двум инструментам. Кроме того, для каждого режима обработки (разработка и сборка) можно передавать различные конфигурации, так что без вариантов здесь не обойтись.

Некоторые специфические конфигурации для развертывания мы рассмотрим в главе 10, Развертывание приложения, а пока мы сосредоточимся только на части разработки с несколькими дополнениями, чтобы не набирать слишком много текста и не повторяться в коде.

Откройте файл vite.config.js и добавьте следующий импорт:

js
import path from "path"

Да, импортирование path - это не JavaScript, а Node.js, и мы можем это сделать, потому что этот файл читается и выполняется в контексте Node.js. Он никогда не попадет в браузер или какой-либо JavaScript контекст.

Измените конфигурацию экспорта так, чтобы она выглядела следующим образом:

js
export default defineConfig({
     plugins: [vue()],
diff --git a/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.TT0BrNOD.lean.js b/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.dySWkMvT.lean.js
similarity index 94%
rename from assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.TT0BrNOD.lean.js
rename to assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.dySWkMvT.lean.js
index e1fc48caf..e0008fa76 100644
--- a/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.TT0BrNOD.lean.js
+++ b/assets/ru_book_Chapter_3__Setting_Up_a_Working_Project.md.dySWkMvT.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_3.01_B18602.enF_BUF6.jpg",l="/assets/Figure_3.02_B18602.j1J6DNDF.jpg",p="/assets/Figure_3.03_B18602.E7RmQ8rX.jpg",h="/assets/Figure_3.04_B18602.fPqZWq_k.jpg",e="/assets/Figure_3.05_B18602.1H_EUIcs.jpg",k="/assets/Figure_3.06_B18602.j291nky-.jpg",v=JSON.parse('{"title":"Установка рабочего проекта","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_3__Setting_Up_a_Working_Project.md","filePath":"ru/book/Chapter_3__Setting_Up_a_Working_Project.md","lastUpdated":1706427418000}'),r={name:"ru/book/Chapter_3__Setting_Up_a_Working_Project.md"},o=t("",154),g=[o];function E(d,c,y,u,F,m){return a(),i("div",null,g)}const b=s(r,[["render",E]]);export{v as __pageData,b as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_3.01_B18602.enF_BUF6.jpg",l="/assets/Figure_3.02_B18602.j1J6DNDF.jpg",p="/assets/Figure_3.03_B18602.E7RmQ8rX.jpg",h="/assets/Figure_3.04_B18602.fPqZWq_k.jpg",e="/assets/Figure_3.05_B18602.1H_EUIcs.jpg",k="/assets/Figure_3.06_B18602.j291nky-.jpg",v=JSON.parse('{"title":"Установка рабочего проекта","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_3__Setting_Up_a_Working_Project.md","filePath":"ru/book/Chapter_3__Setting_Up_a_Working_Project.md","lastUpdated":1706553672000}'),r={name:"ru/book/Chapter_3__Setting_Up_a_Working_Project.md"},o=t("",154),g=[o];function E(d,c,y,u,F,m){return a(),i("div",null,g)}const b=s(r,[["render",E]]);export{v as __pageData,b as default};
diff --git a/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.pb7O2bym.js b/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.gcbH8GXH.js
similarity index 99%
rename from assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.pb7O2bym.js
rename to assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.gcbH8GXH.js
index 91bbd72de..fd95e69bf 100644
--- a/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.pb7O2bym.js
+++ b/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.gcbH8GXH.js
@@ -1,4 +1,4 @@
-import{_ as p,c as l,m as s,a as i,r as n,U as a,o as h}from"./chunks/framework.P5TqXf0g.js";const e="/assets/Figure_4.01_B18602.SPbcrJCD.jpg",k="/assets/Figure_4.02_B18602.S0uEx0XK.jpg",r="/assets/Figure_4.03_B18602.i1E5UmX8.jpg",o="/assets/Figure_4.04_B18602.kc3WbINr.jpg",E="/assets/Figure_4.05_B18602.FYQh43XK.jpg",g="/assets/Figure_4.06_B18602.2VaSMX-o.jpg",d="/assets/Figure_4.07_B18602.8hQGINdN.jpg",j=JSON.parse('{"title":"Композиция пользовательского интерфейса с помощью компонентов","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_4__User_Interface_Composition_with_Components.md","filePath":"ru/book/Chapter_4__User_Interface_Composition_with_Components.md","lastUpdated":1706427418000}'),y={name:"ru/book/Chapter_4__User_Interface_Composition_with_Components.md"},c=a('

Композиция пользовательского интерфейса с помощью компонентов

В этой главе мы подробно рассмотрим, как строить пользовательские интерфейсы с помощью компонентов. Хотя мы могли бы просто создать всю веб-страницу с помощью одного компонента, как мы это сделали с нашим начальным приложением Список дел в главе 3, Установка рабочего проекта, такой подход не является хорошей практикой, за исключением простых приложений, частичного переноса функциональности в существующих веб-приложениях или некоторых крайних случаев, когда другого варианта быть не может.

Компоненты занимают центральное место в подходе Vue к построению интерфейсов.

В этой главе мы сделаем следующее:

  • Узнаем, как строить пользовательские интерфейсы с помощью иерархии компонентов
  • Познакомимся с различными способами взаимодействия и связи компонентов друг с другом
  • Рассмотрим специальные и пользовательские компоненты
  • Создать пример плагина с применением шаблонов проектирования
  • Перепишите наше приложение для выполнения дел, используя наш плагин и композицию компонентов

В этой главе мы познакомимся с основными и расширенными концепциями и получим инструменты для создания надежных веб-приложений с многократно используемыми компонентами. В частности, мы применим наши знания о шаблонах проектирования из главы 2, Принципы и шаблоны проектирования программного обеспечения, при реализации кода.

Примечание о стилях

Чтобы избежать длинных текстов кода, мы опустим примеры иконок и стилей в примерах кода. Полный код, а также стили и иконки можно найти в репозитории GitHub этой книги по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices.

Технические требования

Требования к выполнению этой главы такие же, как и в главе 3, Установка рабочего проекта.

Посмотрите следующее видео, чтобы увидеть код в действии.

Файлы кода этой главы можно найти на GitHub здесь.

Составление страницы с помощью компонентов

Для создания пользовательского интерфейса необходимо иметь отправную точку, будь то грубый набросок или фантазийный полноценный дизайн. Графический дизайн веб-приложения выходит за рамки данной книги, поэтому мы будем считать, что он уже создан. Чтобы воплотить дизайн в компоненты, мы можем подойти к этому как к процессу, который отвечает на следующие вопросы:

  1. Как мы можем представить макет и множество элементов с помощью компонентов?
  2. Как эти компоненты будут взаимодействовать друг с другом и связаны между собой?
  3. Какие динамические элементы будут входить и выходить из сцены, и какие события или состояния приложения будут их вызывать?
  4. Какие шаблоны проектирования мы можем применить, чтобы наилучшим образом удовлетворить требованиям данного сценария использования, учитывая компромиссы?

Vue 3 специально подходит для создания динамичных, интерактивных интерфейсов. Эти вопросы приводят нас к повторяемому подходу к реализации. Итак, давайте определим общий процесс с четко определенными этапами, шаг за шагом.

Этап 1 - определение макетов и элементов пользовательского интерфейса

Этот этап отвечает на вопрос: Как мы можем представить макет и множество элементов с помощью компонентов?

Мы возьмем страницу в целом и подумаем, какой макет подходит лучше всего, учитывая дизайн. Следует ли использовать колонки? Разделы? Навигационные меню? Острова контента? Есть ли диалоговые или модальные окна? Простой подход заключается в том, чтобы взять изображение дизайна и обозначить прямоугольниками участки, которые могут представлять собой компоненты, начиная с самого большого и заканчивая наименьшей единицей интерактивности. Итерируйте эту нарезку страницы до тех пор, пока не получите комфортное количество компонентов. Если рассматривать новый дизайн приложения To-Do, то этот шаг может выглядеть следующим образом:

image

Рисунок 4.1 - Разбивка конструкции на компоненты с пунктирными рамками

После того как мы определили компоненты, необходимо выявить связи между ними, создав иерархию от самого верхнего корневого компонента (обычно это наш App.vue). Новые компоненты могут появиться в результате группировки компонентов по контексту или функциональности. Это подходящее время для присвоения имен компонентам. Эта начальная архитектура будет развиваться по мере реализации шаблонов проектирования. В соответствии с этим примером иерархия может выглядеть следующим образом:

image

Рисунок 4.2 - Начальный подход к иерархии компонентов

Заметьте, как из группировки других компонентов появился новый компонент ToDoProject.vue. Компонент App обычно имеет дело с основным макетом приложения и является отправной точкой в иерархии. Теперь, когда мы создали первоначальный дизайн, пора переходить к следующему шагу.

Шаг 2 - определение связей, потока данных, взаимодействий и событий

Этот шаг отвечает на вопрос: Как эти компоненты будут взаимодействовать и относиться друг к другу?

На этом этапе нам необходимо понять, как будет взаимодействовать пользователь (с помощью use-case нотаций, user story или чем-то еще). Для каждого компонента мы решаем, какую информацию он будет хранить (состояние), что будет передавать своим дочерним компонентам, что ему нужно от родителя и какие события он будет вызывать.

Во Vue компоненты могут соотноситься друг с другом только по вертикали. Братья и сестры по большей части игнорируют существование друг друга. Если компоненту-сиблингу необходимо поделиться данными с другим компонентом, то эти данные должны быть размещены у общей третьей стороны, которая может поделиться ими с обоими компонентами, обычно это родитель, который имеет общую видимость. Для этого существуют и другие решения, например, реактивное управление состоянием, которое мы подробно рассмотрим в главе 7, Управление потоками данных. В этой главе мы остановимся на базовой функциональности отношений.

Существует множество способов документирования собранной информации: заметки в дереве иерархии (см. Рисунок 4.2), описательная формальная документация, UML-диаграммы (UML означает Universal Modeling Language, иконографическое представление компонентов программного обеспечения) и многое другое. Для простоты запишем только один сегмент дерева в формате таблицы:

КомпонентФункцияСостояние, ввод/вывод, события
ToDoProject.vueСодержит список дел и координирует взаимодействие с пользователем. Этот компонент будет активно изменять элементы.Состояние: Список дел

События: Открытие новых, редактирование и удаление модалов.
ToDoSummary.vueОтображает суммарный подсчет элементов дел по состоянию.Ввод: Список дел

Состояние: Счетчики для каждого состояния элемента
ToDoFilter.vueСобирает строку для фильтрации списка дел.Выход: Строка фильтра

Состояние: Вспомогательная переменная
ToDoList.vueОтображает список дел и сигнальные операции для каждого из них.Входные данные: Список дел, строка фильтра

События: Переключение состояния элемента, редактирование и удаление элемента.

Для краткости я опустил компоненты и взаимодействия, которые будут составлять пользовательские диалоги. Мы увидим их позже в этой главе, но достаточно сказать, что за управление взаимодействием с помощью модальных диалогов отвечает ToDoProject.vue.

Шаг 3 - определение элементов пользовательской интерактивности (входов, диалогов, уведомлений и т.д.)

Этот шаг отвечает на вопрос: Какие динамические элементы будут выходить на сцену или покидать ее, и какие события или состояния приложения будут их вызывать?

В нашем приложении основные CRUD-операции (CRUD расшифровывается как Create, Read, Update, Delete данных) связаны с использованием модальных диалогов, представляемых пользователю. Как уже говорилось, именно компонент ToDoProject.vue управляет этим взаимодействием в ответ на определенные события. Этот процесс проиллюстрирован на данной диаграмме последовательности:

image

Рисунок 4.3 - Взаимодействие пользователя через модалы - редактирование элемента.

На этой диаграмме компонент ToDoProject разделяет список дел с компонентом ToDoList. Когда пользователь вызывает событие edit, дочерний компонент уведомляет родительский, испуская такое событие. После этого родительский компонент создает копию элемента и открывает модальный диалог, передавая ему эту копию.

Когда диалог принят, родитель модифицирует исходный элемент с учетом изменений. Затем реактивность Vue отражает изменение состояния в дочерних компонентах.

Зачастую такое взаимодействие помогает нам выявить необходимость в дополнительных компонентах, которые не были очевидны в шаге 1, например, в реализации шаблонов проектирования... что является следующим шагом.

Шаг 4 - выявление шаблонов проектирования и компромиссов

Этот шаг отвечает на вопрос: Какие шаблоны проектирования мы можем применить, чтобы наилучшим образом удовлетворить требованиям конкретного случая использования, с учетом компромиссов?

Решение вопроса о том, какие шаблоны использовать, может быть очень творческим процессом. Не существует "серебряной пули", и несколько решений могут дать разные результаты. Обычно создается несколько прототипов для тестирования различных подходов.

В нашем новом приложении мы ввели концепцию модальных диалогов для получения пользовательского ввода. Модальные диалоги используются в тех случаях, когда для выполнения операции требуется действие или решение пользователя. Пользователь может принять или отклонить диалог и не может взаимодействовать с другими частями приложения до тех пор, пока не примет решение.

Учитывая эти условия, одним из возможных шаблонов для применения является шаблон Async Promise.

В нашем коде мы хотим открыть модальный диалог в виде промиса, который, по определению, предоставит нам функцию resolve() (принять) или reject() (отменить). Более того, мы хотим иметь возможность использовать это решение в нескольких проектах и глобально в нашем приложении. Для этого мы можем создать плагин и использовать шаблон инъекции зависимостей для доступа к модальной функциональности из любого компонента. Эти шаблоны обеспечат нам решение, необходимое для того, чтобы сделать наш модальный диалог многократно используемым.

На данном этапе мы практически готовы приступить к концептуальной реализации компонентов. Однако, чтобы создать наиболее подходящее и надежное приложение и реализовать вышеупомянутые шаблоны, нам следует уделить время более подробному изучению компонентов Vue.

Компоненты в деталях

Компоненты - это строительные блоки фреймворка. В главе 1, Фреймворк Vue 3, мы рассмотрели, как работать с компонентами, объявлять реактивные переменные и многое другое. В этом разделе мы рассмотрим более продвинутые возможности и определения.

Локальные и глобальные компоненты

При запуске нашего приложения Vue 3 мы монтируем главный компонент (App.vue) к элементу HTML в файле main.js. После этого в секции script каждого компонента мы можем импортировать другие компоненты для локального использования с помощью следующей команды:

js
import MyComponent from "./MyComponent.vue"

Таким образом, чтобы использовать MyComponent в другом компоненте, нам необходимо импортировать его в этот компонент еще раз. Если один компонент постоянно используется в нескольких компонентах, то это повторяющееся действие нарушает принцип DRY разработки (см. главу 2, Принципы и шаблоны проектирования программного обеспечения).

Альтернативный вариант - объявить компонент как глобальный, прикрепив его непосредственно к нашему приложению Vue вместо каждого компонента. В файле main.js мы можем использовать метод App.component() для этого случая:

Main.js

js
import { createApp } from "vue"
+import{_ as p,c as l,m as s,a as i,r as n,U as a,o as h}from"./chunks/framework.P5TqXf0g.js";const e="/assets/Figure_4.01_B18602.SPbcrJCD.jpg",k="/assets/Figure_4.02_B18602.S0uEx0XK.jpg",r="/assets/Figure_4.03_B18602.i1E5UmX8.jpg",o="/assets/Figure_4.04_B18602.kc3WbINr.jpg",E="/assets/Figure_4.05_B18602.FYQh43XK.jpg",g="/assets/Figure_4.06_B18602.2VaSMX-o.jpg",d="/assets/Figure_4.07_B18602.8hQGINdN.jpg",j=JSON.parse('{"title":"Композиция пользовательского интерфейса с помощью компонентов","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_4__User_Interface_Composition_with_Components.md","filePath":"ru/book/Chapter_4__User_Interface_Composition_with_Components.md","lastUpdated":1706553672000}'),y={name:"ru/book/Chapter_4__User_Interface_Composition_with_Components.md"},c=a('

Композиция пользовательского интерфейса с помощью компонентов

В этой главе мы подробно рассмотрим, как строить пользовательские интерфейсы с помощью компонентов. Хотя мы могли бы просто создать всю веб-страницу с помощью одного компонента, как мы это сделали с нашим начальным приложением Список дел в главе 3, Установка рабочего проекта, такой подход не является хорошей практикой, за исключением простых приложений, частичного переноса функциональности в существующих веб-приложениях или некоторых крайних случаев, когда другого варианта быть не может.

Компоненты занимают центральное место в подходе Vue к построению интерфейсов.

В этой главе мы сделаем следующее:

  • Узнаем, как строить пользовательские интерфейсы с помощью иерархии компонентов
  • Познакомимся с различными способами взаимодействия и связи компонентов друг с другом
  • Рассмотрим специальные и пользовательские компоненты
  • Создать пример плагина с применением шаблонов проектирования
  • Перепишите наше приложение для выполнения дел, используя наш плагин и композицию компонентов

В этой главе мы познакомимся с основными и расширенными концепциями и получим инструменты для создания надежных веб-приложений с многократно используемыми компонентами. В частности, мы применим наши знания о шаблонах проектирования из главы 2, Принципы и шаблоны проектирования программного обеспечения, при реализации кода.

Примечание о стилях

Чтобы избежать длинных текстов кода, мы опустим примеры иконок и стилей в примерах кода. Полный код, а также стили и иконки можно найти в репозитории GitHub этой книги по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices.

Технические требования

Требования к выполнению этой главы такие же, как и в главе 3, Установка рабочего проекта.

Посмотрите следующее видео, чтобы увидеть код в действии.

Файлы кода этой главы можно найти на GitHub здесь.

Составление страницы с помощью компонентов

Для создания пользовательского интерфейса необходимо иметь отправную точку, будь то грубый набросок или фантазийный полноценный дизайн. Графический дизайн веб-приложения выходит за рамки данной книги, поэтому мы будем считать, что он уже создан. Чтобы воплотить дизайн в компоненты, мы можем подойти к этому как к процессу, который отвечает на следующие вопросы:

  1. Как мы можем представить макет и множество элементов с помощью компонентов?
  2. Как эти компоненты будут взаимодействовать друг с другом и связаны между собой?
  3. Какие динамические элементы будут входить и выходить из сцены, и какие события или состояния приложения будут их вызывать?
  4. Какие шаблоны проектирования мы можем применить, чтобы наилучшим образом удовлетворить требованиям данного сценария использования, учитывая компромиссы?

Vue 3 специально подходит для создания динамичных, интерактивных интерфейсов. Эти вопросы приводят нас к повторяемому подходу к реализации. Итак, давайте определим общий процесс с четко определенными этапами, шаг за шагом.

Этап 1 - определение макетов и элементов пользовательского интерфейса

Этот этап отвечает на вопрос: Как мы можем представить макет и множество элементов с помощью компонентов?

Мы возьмем страницу в целом и подумаем, какой макет подходит лучше всего, учитывая дизайн. Следует ли использовать колонки? Разделы? Навигационные меню? Острова контента? Есть ли диалоговые или модальные окна? Простой подход заключается в том, чтобы взять изображение дизайна и обозначить прямоугольниками участки, которые могут представлять собой компоненты, начиная с самого большого и заканчивая наименьшей единицей интерактивности. Итерируйте эту нарезку страницы до тех пор, пока не получите комфортное количество компонентов. Если рассматривать новый дизайн приложения To-Do, то этот шаг может выглядеть следующим образом:

image

Рисунок 4.1 - Разбивка конструкции на компоненты с пунктирными рамками

После того как мы определили компоненты, необходимо выявить связи между ними, создав иерархию от самого верхнего корневого компонента (обычно это наш App.vue). Новые компоненты могут появиться в результате группировки компонентов по контексту или функциональности. Это подходящее время для присвоения имен компонентам. Эта начальная архитектура будет развиваться по мере реализации шаблонов проектирования. В соответствии с этим примером иерархия может выглядеть следующим образом:

image

Рисунок 4.2 - Начальный подход к иерархии компонентов

Заметьте, как из группировки других компонентов появился новый компонент ToDoProject.vue. Компонент App обычно имеет дело с основным макетом приложения и является отправной точкой в иерархии. Теперь, когда мы создали первоначальный дизайн, пора переходить к следующему шагу.

Шаг 2 - определение связей, потока данных, взаимодействий и событий

Этот шаг отвечает на вопрос: Как эти компоненты будут взаимодействовать и относиться друг к другу?

На этом этапе нам необходимо понять, как будет взаимодействовать пользователь (с помощью use-case нотаций, user story или чем-то еще). Для каждого компонента мы решаем, какую информацию он будет хранить (состояние), что будет передавать своим дочерним компонентам, что ему нужно от родителя и какие события он будет вызывать.

Во Vue компоненты могут соотноситься друг с другом только по вертикали. Братья и сестры по большей части игнорируют существование друг друга. Если компоненту-сиблингу необходимо поделиться данными с другим компонентом, то эти данные должны быть размещены у общей третьей стороны, которая может поделиться ими с обоими компонентами, обычно это родитель, который имеет общую видимость. Для этого существуют и другие решения, например, реактивное управление состоянием, которое мы подробно рассмотрим в главе 7, Управление потоками данных. В этой главе мы остановимся на базовой функциональности отношений.

Существует множество способов документирования собранной информации: заметки в дереве иерархии (см. Рисунок 4.2), описательная формальная документация, UML-диаграммы (UML означает Universal Modeling Language, иконографическое представление компонентов программного обеспечения) и многое другое. Для простоты запишем только один сегмент дерева в формате таблицы:

КомпонентФункцияСостояние, ввод/вывод, события
ToDoProject.vueСодержит список дел и координирует взаимодействие с пользователем. Этот компонент будет активно изменять элементы.Состояние: Список дел

События: Открытие новых, редактирование и удаление модалов.
ToDoSummary.vueОтображает суммарный подсчет элементов дел по состоянию.Ввод: Список дел

Состояние: Счетчики для каждого состояния элемента
ToDoFilter.vueСобирает строку для фильтрации списка дел.Выход: Строка фильтра

Состояние: Вспомогательная переменная
ToDoList.vueОтображает список дел и сигнальные операции для каждого из них.Входные данные: Список дел, строка фильтра

События: Переключение состояния элемента, редактирование и удаление элемента.

Для краткости я опустил компоненты и взаимодействия, которые будут составлять пользовательские диалоги. Мы увидим их позже в этой главе, но достаточно сказать, что за управление взаимодействием с помощью модальных диалогов отвечает ToDoProject.vue.

Шаг 3 - определение элементов пользовательской интерактивности (входов, диалогов, уведомлений и т.д.)

Этот шаг отвечает на вопрос: Какие динамические элементы будут выходить на сцену или покидать ее, и какие события или состояния приложения будут их вызывать?

В нашем приложении основные CRUD-операции (CRUD расшифровывается как Create, Read, Update, Delete данных) связаны с использованием модальных диалогов, представляемых пользователю. Как уже говорилось, именно компонент ToDoProject.vue управляет этим взаимодействием в ответ на определенные события. Этот процесс проиллюстрирован на данной диаграмме последовательности:

image

Рисунок 4.3 - Взаимодействие пользователя через модалы - редактирование элемента.

На этой диаграмме компонент ToDoProject разделяет список дел с компонентом ToDoList. Когда пользователь вызывает событие edit, дочерний компонент уведомляет родительский, испуская такое событие. После этого родительский компонент создает копию элемента и открывает модальный диалог, передавая ему эту копию.

Когда диалог принят, родитель модифицирует исходный элемент с учетом изменений. Затем реактивность Vue отражает изменение состояния в дочерних компонентах.

Зачастую такое взаимодействие помогает нам выявить необходимость в дополнительных компонентах, которые не были очевидны в шаге 1, например, в реализации шаблонов проектирования... что является следующим шагом.

Шаг 4 - выявление шаблонов проектирования и компромиссов

Этот шаг отвечает на вопрос: Какие шаблоны проектирования мы можем применить, чтобы наилучшим образом удовлетворить требованиям конкретного случая использования, с учетом компромиссов?

Решение вопроса о том, какие шаблоны использовать, может быть очень творческим процессом. Не существует "серебряной пули", и несколько решений могут дать разные результаты. Обычно создается несколько прототипов для тестирования различных подходов.

В нашем новом приложении мы ввели концепцию модальных диалогов для получения пользовательского ввода. Модальные диалоги используются в тех случаях, когда для выполнения операции требуется действие или решение пользователя. Пользователь может принять или отклонить диалог и не может взаимодействовать с другими частями приложения до тех пор, пока не примет решение.

Учитывая эти условия, одним из возможных шаблонов для применения является шаблон Async Promise.

В нашем коде мы хотим открыть модальный диалог в виде промиса, который, по определению, предоставит нам функцию resolve() (принять) или reject() (отменить). Более того, мы хотим иметь возможность использовать это решение в нескольких проектах и глобально в нашем приложении. Для этого мы можем создать плагин и использовать шаблон инъекции зависимостей для доступа к модальной функциональности из любого компонента. Эти шаблоны обеспечат нам решение, необходимое для того, чтобы сделать наш модальный диалог многократно используемым.

На данном этапе мы практически готовы приступить к концептуальной реализации компонентов. Однако, чтобы создать наиболее подходящее и надежное приложение и реализовать вышеупомянутые шаблоны, нам следует уделить время более подробному изучению компонентов Vue.

Компоненты в деталях

Компоненты - это строительные блоки фреймворка. В главе 1, Фреймворк Vue 3, мы рассмотрели, как работать с компонентами, объявлять реактивные переменные и многое другое. В этом разделе мы рассмотрим более продвинутые возможности и определения.

Локальные и глобальные компоненты

При запуске нашего приложения Vue 3 мы монтируем главный компонент (App.vue) к элементу HTML в файле main.js. После этого в секции script каждого компонента мы можем импортировать другие компоненты для локального использования с помощью следующей команды:

js
import MyComponent from "./MyComponent.vue"

Таким образом, чтобы использовать MyComponent в другом компоненте, нам необходимо импортировать его в этот компонент еще раз. Если один компонент постоянно используется в нескольких компонентах, то это повторяющееся действие нарушает принцип DRY разработки (см. главу 2, Принципы и шаблоны проектирования программного обеспечения).

Альтернативный вариант - объявить компонент как глобальный, прикрепив его непосредственно к нашему приложению Vue вместо каждого компонента. В файле main.js мы можем использовать метод App.component() для этого случая:

Main.js

js
import { createApp } from "vue"
 import App from './App.vue'
 import MyComponent from "./MyComponent.vue"
 createApp(App)
diff --git a/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.pb7O2bym.lean.js b/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.gcbH8GXH.lean.js
similarity index 97%
rename from assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.pb7O2bym.lean.js
rename to assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.gcbH8GXH.lean.js
index fd0f9415e..f2fc7d483 100644
--- a/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.pb7O2bym.lean.js
+++ b/assets/ru_book_Chapter_4__User_Interface_Composition_with_Components.md.gcbH8GXH.lean.js
@@ -1 +1 @@
-import{_ as p,c as l,m as s,a as i,r as n,U as a,o as h}from"./chunks/framework.P5TqXf0g.js";const e="/assets/Figure_4.01_B18602.SPbcrJCD.jpg",k="/assets/Figure_4.02_B18602.S0uEx0XK.jpg",r="/assets/Figure_4.03_B18602.i1E5UmX8.jpg",o="/assets/Figure_4.04_B18602.kc3WbINr.jpg",E="/assets/Figure_4.05_B18602.FYQh43XK.jpg",g="/assets/Figure_4.06_B18602.2VaSMX-o.jpg",d="/assets/Figure_4.07_B18602.8hQGINdN.jpg",j=JSON.parse('{"title":"Композиция пользовательского интерфейса с помощью компонентов","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_4__User_Interface_Composition_with_Components.md","filePath":"ru/book/Chapter_4__User_Interface_Composition_with_Components.md","lastUpdated":1706427418000}'),y={name:"ru/book/Chapter_4__User_Interface_Composition_with_Components.md"},c=a("",141),u=s("strong",null,"W3.css",-1),F=a("",8),m=s("li",null,"Если имя не совпадает ни с одним доступным слотом, содержимое не выводится.",-1),C=s("li",null,[i("Если имя не указано или используется имя "),s("strong",null,"default"),i(", то содержимое отображается в безымянном слоте по умолчанию.")],-1),v=a("",107);function A(t,D,b,B,q,_){return h(),l("div",null,[c,s("p",null,[i("Применяемая логика достаточно проста. Слот "),s("strong",null,[n(t.$slots,"default")]),i(" во время выполнения программы будет заменен на содержимое, предоставленное родительским компонентом внутри дочерних тегов. В предыдущем примере, если проанализировать конечный HTML, можно обнаружить примерно следующее (учитывая, что мы используем классы "),u,i("):")]),F,s("ul",null,[m,C,s("li",null,[i("Если для шаблона не указано содержимое, то будут показаны элементы по умолчанию внутри определения слота. Содержимое по умолчанию помещается между тегами слотов: "),s("strong",null,[n(t.$slots,"default",{},()=>[i("...содержимое по умолчанию здесь...")])]),i(".")])]),v])}const P=p(y,[["render",A]]);export{j as __pageData,P as default};
+import{_ as p,c as l,m as s,a as i,r as n,U as a,o as h}from"./chunks/framework.P5TqXf0g.js";const e="/assets/Figure_4.01_B18602.SPbcrJCD.jpg",k="/assets/Figure_4.02_B18602.S0uEx0XK.jpg",r="/assets/Figure_4.03_B18602.i1E5UmX8.jpg",o="/assets/Figure_4.04_B18602.kc3WbINr.jpg",E="/assets/Figure_4.05_B18602.FYQh43XK.jpg",g="/assets/Figure_4.06_B18602.2VaSMX-o.jpg",d="/assets/Figure_4.07_B18602.8hQGINdN.jpg",j=JSON.parse('{"title":"Композиция пользовательского интерфейса с помощью компонентов","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_4__User_Interface_Composition_with_Components.md","filePath":"ru/book/Chapter_4__User_Interface_Composition_with_Components.md","lastUpdated":1706553672000}'),y={name:"ru/book/Chapter_4__User_Interface_Composition_with_Components.md"},c=a("",141),u=s("strong",null,"W3.css",-1),F=a("",8),m=s("li",null,"Если имя не совпадает ни с одним доступным слотом, содержимое не выводится.",-1),C=s("li",null,[i("Если имя не указано или используется имя "),s("strong",null,"default"),i(", то содержимое отображается в безымянном слоте по умолчанию.")],-1),v=a("",107);function A(t,D,b,B,q,_){return h(),l("div",null,[c,s("p",null,[i("Применяемая логика достаточно проста. Слот "),s("strong",null,[n(t.$slots,"default")]),i(" во время выполнения программы будет заменен на содержимое, предоставленное родительским компонентом внутри дочерних тегов. В предыдущем примере, если проанализировать конечный HTML, можно обнаружить примерно следующее (учитывая, что мы используем классы "),u,i("):")]),F,s("ul",null,[m,C,s("li",null,[i("Если для шаблона не указано содержимое, то будут показаны элементы по умолчанию внутри определения слота. Содержимое по умолчанию помещается между тегами слотов: "),s("strong",null,[n(t.$slots,"default",{},()=>[i("...содержимое по умолчанию здесь...")])]),i(".")])]),v])}const P=p(y,[["render",A]]);export{j as __pageData,P as default};
diff --git a/assets/ru_book_Chapter_5__Single-Page_Applications.md.XL7e2wQ0.js b/assets/ru_book_Chapter_5__Single-Page_Applications.md.NNsvLbhA.js
similarity index 99%
rename from assets/ru_book_Chapter_5__Single-Page_Applications.md.XL7e2wQ0.js
rename to assets/ru_book_Chapter_5__Single-Page_Applications.md.NNsvLbhA.js
index c07d85a6f..96deb5603 100644
--- a/assets/ru_book_Chapter_5__Single-Page_Applications.md.XL7e2wQ0.js
+++ b/assets/ru_book_Chapter_5__Single-Page_Applications.md.NNsvLbhA.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_5.01_B18602.sRZJVUyi.jpg",p="/assets/Figure_5.02_B18602.wosWfXl5.jpg",h="/assets/Figure_5.03_B18602.cxFyes6F.jpg",l="/assets/Figure_5.04_B18602.qAUUEscj.jpg",e="/assets/Figure_5.05_B18602.6mMJ2Mnu.jpg",k="/assets/Figure_5.06_B18602.k2Z94cLY.jpg",r="/assets/Figure_5.07_B18602.raOlxZqf.jpg",o="/assets/Figure_5.08_B18602.1S4ihtrN.jpg",v=JSON.parse('{"title":"Одностраничные приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_5__Single-Page_Applications.md","filePath":"ru/book/Chapter_5__Single-Page_Applications.md","lastUpdated":1706427418000}'),E={name:"ru/book/Chapter_5__Single-Page_Applications.md"},g=t('

Одностраничные приложения

В этой главе мы продолжаем совершенствовать свои навыки работы с Vue 3, знакомясь с одностраничными приложениями (SPA). Мы узнаем, что отличает их от обычных сайтов, и рассмотрим их ключевые характеристики.

Чтобы применить полученные знания на практике, мы создадим новую версию приложения To-Do с использованием маршрутизатора Vue Router и иной схемы взаимодействия, чем в предыдущих главах. Мы также изучим методы аутентификации на примерах кода.

К концу этой главы вы будете знать следующее:

  • Как создавать SPA с помощью Vue 3
  • Как организовать приложение для использования Vue Router с различными стратегиями маршрутизации
  • Как переделать наше приложение To-Do с практическим применением различных паттернов
  • Как реализовать различные паттерны аутентификации в SPA

Если предыдущая глава была несколько перегружена фундаментальными знаниями, то теперь мы больше сосредоточимся на практических вопросах. В связи с этим вам потребуется доступ к приложениям-примерам, чтобы разобраться с ними.

Технические требования

Код этой главы можно найти на GitHub по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter05.

Посмотрите следующее видео, чтобы увидеть код в действии.

Что такое SPA?

Чтобы объяснить, что такое SPA, необходимо сначала объяснить, как мы взаимодействуем с World Wide Web (WWW или W3). Когда мы вводим адрес в веб-браузере, то получаем веб-страницу, отправленную веб-сервером. В самом общем виде веб-сайт представляет собой набор страниц, в основном так называемых "статических страниц".

Статические в данном контексте означают, что сервер отправляет одни и те же файлы без изменений. Это делает сайт очень быстрым и безопасным. Однако чисто статический сайт не обеспечивает большой интерактивности для конечного пользователя. Иногда это называют Web 1.0.

Серверные и браузерные скрипты позволили решить это ограничение и породили многостраничные приложения (MPA). Теперь страницы могли быть как статическими, так и динамически генерируемыми на сервере, который, в свою очередь, также мог получать вызовы новых страниц с дополнительными данными, обрабатывать их и возвращать в ответ новую страницу.

Эти новые страницы, "генерируемые на лету", получили название динамических и сделали возможным появление приложений. Благодаря этим технологиям стало возможным распространение блогов, сервисов и предприятий.

С появлением таких ключевых технологий, как асинхронные коммуникации (AJAX), более развитый JavaScript, методологии локального хранения данных, увеличение скорости сети и вычислительной мощности, мы пришли к тому, что называется Web 2.0. Теперь можно было загрузить в браузер один файл и с помощью JavaScript взять под контроль весь интерфейс и интерактивность, создавая насыщенные интерактивные приложения без генерации новых страниц на сервере.

SPA обращается к серверу только для загрузки данных, пользовательского интерфейса и т.д. по мере необходимости. Появилась возможность переносить на веб-технологии то, что было традиционными десктопными приложениями, такими как текстовые редакторы, электронные таблицы, почтовые клиенты, пакеты графического дизайна и т.д.

Хорошими примерами SPA являются Office 365, Google Docs, Photoshop online, Telegram, Discord, Netflix, YouTube и т.д. Важно отметить, что появление SPA не отменяет использование MPA и не делает их устаревшими - каждый из них полезен в определенных контекстах. Большинство блогов и новостных сайтов сегодня, по сути, являются MPA и по-прежнему составляют значительную часть Интернета.

Наиболее сложные веб-приложения сегодня включают в себя смесь MPA и SPA, работающих вместе. SPA могут даже устанавливаться как гибридные приложения на настольных и мобильных устройствах. Как это реализовать, мы увидим в главе 6, Прогрессивные Web-приложения.

Двигаясь вперёд, с развитием распределенных и децентрализованных вычислений, умных блокчейнов, технология, составляющая одностраничные веб-приложения (SPA), приобрела ещё большую актуальность. Хотя эта новая эра в развитии веб-технологий еще не полностью укоренилась, ее называют Web 3.0. В этой главе мы рассмотрим эту тему более подробно и на примерах.

Все приложения, которые мы делали до сих пор, относятся к категории SPA, даже если мы еще не использовали весь их потенциал. Vue 3 специально предназначен для создания приложений такого типа и является одной из наиболее актуальных технологий для такого подхода, наряду с React, Angular, Svelte и другими.

Но не все так радужно и сладко. Как и в любой другой технологии, в использовании SPA есть свои компромиссы. В следующей таблице мы перечислим некоторые из них:

ПреимуществаНедостатки
- Более быстрая и эффективная загрузка
- Локальное кэширование для повышения производительности
- Разнообразные пользовательские интерфейсы и интерактивность
- Проще в разработке и тестировании, чем MPA
- Более эффективное использование кода и шаблонов, с меньшим количеством сетевых взаимодействий (по сравнению с перезагрузкой всей страницы)
- Высокая производительность.
- Затруднение индексации и обнаружения поисковыми системами
- Увеличение сложности
- Увеличение времени загрузки и замедление времени появления первых интерактивных элементов

Таблица 5.1 - Преимущества и компромиссы для SPA.

Как видите, список преимуществ намного важнее, чем недостатков. Использование SPA следует рассматривать в тех случаях, когда приложение требует значительной интерактивности пользователя и обратной связи в реальном времени.

Теперь, когда мы лучше представляем себе, что такое SPA, давайте рассмотрим ключевую концепцию, лежащую в основе их функциональности: маршрутизатор приложения.

Vue 3 роутер

Vue - отличный фреймворк для создания SPA, но без маршрутизатора (роутера) эта задача вскоре стала бы довольно сложной. Vue router - это официальный плагин, который берет на себя навигацию по приложению и сопоставляет URL с компонентом. Это дает нам преимущества MPA. С помощью маршрутизатора мы можем сделать следующее:

  • Создавать динамические маршруты к компонентам и управлять ими, при необходимости автоматически отображая параметры к пропсам
  • Идентифицировать маршруты (адреса и компоненты) по имени и использовать навигацию в коде
  • Динамическая загрузка компонентов при необходимости, что позволяет уменьшить размер пакета
  • Создать естественный и логичный подход к навигации по сайту и разделению кода
  • Управлять навигацией с помощью известных событий, до и после того, как навигация произошла
  • Создание анимации перехода между страницами таким образом, который невозможен при использовании MPA

Реализация маршрутизатора Vue 3 проста и соответствует той же методологии, что и в случае с другими компонентами экосистемы. Давайте возьмем наш проект из главы 4, Композиция пользовательского интерфейса с компонентами, и модифицируем его для использования маршрутизатора Vue.

Установка

При запуске нового проекта вы могли заметить, что в меню программы установки есть возможность установить маршрутизатор Vue. Если вы не выбрали эту опцию, как мы сделали в нашем примере, то последующая установка достаточно проста. В терминале, в каталоге проекта, просто выполните следующую команду:

sh
$ npm install vue-router@4

Команда загрузит и установит зависимости, как и для любого другого пакета в каталог node_modules. Для того чтобы использовать его в нашем приложении, необходимо выполнить следующие действия:

  1. Создать наши маршруты.
  2. Связать маршруты с нашими компонентами.
  3. Включить роутер в наше приложение.
  4. Установите наши шаблоны, в которых маршрутизатор будет отображать наши компоненты.

Как и многие другие компоненты фреймворка, маршрутизатор не указывает, в каких директориях или организациях должны быть размещены ваши маршруты или компоненты. Однако существует соглашение, которое мы будем использовать и которое стало стандартом де-факто в отрасли. В папке /src создайте следующие каталоги:

  • /router (или /routes): Здесь будут находиться наши JavaScript-файлы с маршрутами для нашего приложения
  • /views: В этой папке будут находиться компоненты верхнего уровня, соответствующие навигации приложения (в качестве лучшей практики)

После создания этих каталогов мы готовы приступить к модификации нашего приложения для включения навигации по маршруту. Но прежде давайте рассмотрим, чего мы хотим добиться с помощью нашего маршрутизатора.

Новое приложение To-Do

В нашем новом приложении будут повторно использоваться компоненты для отображения списка дел, но также будет предусмотрена возможность создания нескольких списков или проектов. Мы будем отображать боковую панель со всеми нашими проектами, и при их выборе список будет обновляться.

Эти проекты также будут сохраняться в браузере, чтобы мы могли вернуться к ним позже, с помощью localStorage. В результате мы получим очень простую навигацию с двумя страницами верхнего уровня (компонентами):

  • Лэндинг страница, на которой мы можем создавать новые проекты
  • Страница проекта, на которой мы можем работать со списком дел

Следуя этим простым предпосылкам, наше приложение в готовом виде будет выглядеть следующим образом:

image

Рисунок 5.1 - Наша лэндинг страница

Как видно на Рисунке 5.1, целевая страница является также местом, где мы можем создавать новые проекты. Для сбора пользовательского ввода мы, как и раньше, используем модальные диалоги.

На боковой панели отображается ссылка на страницу Home (целевая страница) и список с названиями различных проектов, которые мы создали. При щелчке на каждом из них маршрут в браузере (URL) будет обновляться, как и страница, и мы увидим нечто подобное этому:

image

Рисунок 5.2 - Страница проекта To-Do

Последний скриншот вы можете узнать, поскольку именно его отображает наш компонент ToDoProject.vue. Собственно говоря, для достижения этого результата потребуется совсем немного модификаций. А пока давайте начнем с маршрутов.

Определение маршрутов и объект Router

Чтобы создать маршруты для нашего проекта, необходимо сначала определить их в собственном модуле. В каталоге /router создайте файл index.js со следующим содержимым:

/src/router/index.js

js
import {createRouter,createWebHashHistory} from 'vue-router'        //1
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_5.01_B18602.sRZJVUyi.jpg",p="/assets/Figure_5.02_B18602.wosWfXl5.jpg",h="/assets/Figure_5.03_B18602.cxFyes6F.jpg",l="/assets/Figure_5.04_B18602.qAUUEscj.jpg",e="/assets/Figure_5.05_B18602.6mMJ2Mnu.jpg",k="/assets/Figure_5.06_B18602.k2Z94cLY.jpg",r="/assets/Figure_5.07_B18602.raOlxZqf.jpg",o="/assets/Figure_5.08_B18602.1S4ihtrN.jpg",v=JSON.parse('{"title":"Одностраничные приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_5__Single-Page_Applications.md","filePath":"ru/book/Chapter_5__Single-Page_Applications.md","lastUpdated":1706553672000}'),E={name:"ru/book/Chapter_5__Single-Page_Applications.md"},g=t('

Одностраничные приложения

В этой главе мы продолжаем совершенствовать свои навыки работы с Vue 3, знакомясь с одностраничными приложениями (SPA). Мы узнаем, что отличает их от обычных сайтов, и рассмотрим их ключевые характеристики.

Чтобы применить полученные знания на практике, мы создадим новую версию приложения To-Do с использованием маршрутизатора Vue Router и иной схемы взаимодействия, чем в предыдущих главах. Мы также изучим методы аутентификации на примерах кода.

К концу этой главы вы будете знать следующее:

  • Как создавать SPA с помощью Vue 3
  • Как организовать приложение для использования Vue Router с различными стратегиями маршрутизации
  • Как переделать наше приложение To-Do с практическим применением различных паттернов
  • Как реализовать различные паттерны аутентификации в SPA

Если предыдущая глава была несколько перегружена фундаментальными знаниями, то теперь мы больше сосредоточимся на практических вопросах. В связи с этим вам потребуется доступ к приложениям-примерам, чтобы разобраться с ними.

Технические требования

Код этой главы можно найти на GitHub по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter05.

Посмотрите следующее видео, чтобы увидеть код в действии.

Что такое SPA?

Чтобы объяснить, что такое SPA, необходимо сначала объяснить, как мы взаимодействуем с World Wide Web (WWW или W3). Когда мы вводим адрес в веб-браузере, то получаем веб-страницу, отправленную веб-сервером. В самом общем виде веб-сайт представляет собой набор страниц, в основном так называемых "статических страниц".

Статические в данном контексте означают, что сервер отправляет одни и те же файлы без изменений. Это делает сайт очень быстрым и безопасным. Однако чисто статический сайт не обеспечивает большой интерактивности для конечного пользователя. Иногда это называют Web 1.0.

Серверные и браузерные скрипты позволили решить это ограничение и породили многостраничные приложения (MPA). Теперь страницы могли быть как статическими, так и динамически генерируемыми на сервере, который, в свою очередь, также мог получать вызовы новых страниц с дополнительными данными, обрабатывать их и возвращать в ответ новую страницу.

Эти новые страницы, "генерируемые на лету", получили название динамических и сделали возможным появление приложений. Благодаря этим технологиям стало возможным распространение блогов, сервисов и предприятий.

С появлением таких ключевых технологий, как асинхронные коммуникации (AJAX), более развитый JavaScript, методологии локального хранения данных, увеличение скорости сети и вычислительной мощности, мы пришли к тому, что называется Web 2.0. Теперь можно было загрузить в браузер один файл и с помощью JavaScript взять под контроль весь интерфейс и интерактивность, создавая насыщенные интерактивные приложения без генерации новых страниц на сервере.

SPA обращается к серверу только для загрузки данных, пользовательского интерфейса и т.д. по мере необходимости. Появилась возможность переносить на веб-технологии то, что было традиционными десктопными приложениями, такими как текстовые редакторы, электронные таблицы, почтовые клиенты, пакеты графического дизайна и т.д.

Хорошими примерами SPA являются Office 365, Google Docs, Photoshop online, Telegram, Discord, Netflix, YouTube и т.д. Важно отметить, что появление SPA не отменяет использование MPA и не делает их устаревшими - каждый из них полезен в определенных контекстах. Большинство блогов и новостных сайтов сегодня, по сути, являются MPA и по-прежнему составляют значительную часть Интернета.

Наиболее сложные веб-приложения сегодня включают в себя смесь MPA и SPA, работающих вместе. SPA могут даже устанавливаться как гибридные приложения на настольных и мобильных устройствах. Как это реализовать, мы увидим в главе 6, Прогрессивные Web-приложения.

Двигаясь вперёд, с развитием распределенных и децентрализованных вычислений, умных блокчейнов, технология, составляющая одностраничные веб-приложения (SPA), приобрела ещё большую актуальность. Хотя эта новая эра в развитии веб-технологий еще не полностью укоренилась, ее называют Web 3.0. В этой главе мы рассмотрим эту тему более подробно и на примерах.

Все приложения, которые мы делали до сих пор, относятся к категории SPA, даже если мы еще не использовали весь их потенциал. Vue 3 специально предназначен для создания приложений такого типа и является одной из наиболее актуальных технологий для такого подхода, наряду с React, Angular, Svelte и другими.

Но не все так радужно и сладко. Как и в любой другой технологии, в использовании SPA есть свои компромиссы. В следующей таблице мы перечислим некоторые из них:

ПреимуществаНедостатки
- Более быстрая и эффективная загрузка
- Локальное кэширование для повышения производительности
- Разнообразные пользовательские интерфейсы и интерактивность
- Проще в разработке и тестировании, чем MPA
- Более эффективное использование кода и шаблонов, с меньшим количеством сетевых взаимодействий (по сравнению с перезагрузкой всей страницы)
- Высокая производительность.
- Затруднение индексации и обнаружения поисковыми системами
- Увеличение сложности
- Увеличение времени загрузки и замедление времени появления первых интерактивных элементов

Таблица 5.1 - Преимущества и компромиссы для SPA.

Как видите, список преимуществ намного важнее, чем недостатков. Использование SPA следует рассматривать в тех случаях, когда приложение требует значительной интерактивности пользователя и обратной связи в реальном времени.

Теперь, когда мы лучше представляем себе, что такое SPA, давайте рассмотрим ключевую концепцию, лежащую в основе их функциональности: маршрутизатор приложения.

Vue 3 роутер

Vue - отличный фреймворк для создания SPA, но без маршрутизатора (роутера) эта задача вскоре стала бы довольно сложной. Vue router - это официальный плагин, который берет на себя навигацию по приложению и сопоставляет URL с компонентом. Это дает нам преимущества MPA. С помощью маршрутизатора мы можем сделать следующее:

  • Создавать динамические маршруты к компонентам и управлять ими, при необходимости автоматически отображая параметры к пропсам
  • Идентифицировать маршруты (адреса и компоненты) по имени и использовать навигацию в коде
  • Динамическая загрузка компонентов при необходимости, что позволяет уменьшить размер пакета
  • Создать естественный и логичный подход к навигации по сайту и разделению кода
  • Управлять навигацией с помощью известных событий, до и после того, как навигация произошла
  • Создание анимации перехода между страницами таким образом, который невозможен при использовании MPA

Реализация маршрутизатора Vue 3 проста и соответствует той же методологии, что и в случае с другими компонентами экосистемы. Давайте возьмем наш проект из главы 4, Композиция пользовательского интерфейса с компонентами, и модифицируем его для использования маршрутизатора Vue.

Установка

При запуске нового проекта вы могли заметить, что в меню программы установки есть возможность установить маршрутизатор Vue. Если вы не выбрали эту опцию, как мы сделали в нашем примере, то последующая установка достаточно проста. В терминале, в каталоге проекта, просто выполните следующую команду:

sh
$ npm install vue-router@4

Команда загрузит и установит зависимости, как и для любого другого пакета в каталог node_modules. Для того чтобы использовать его в нашем приложении, необходимо выполнить следующие действия:

  1. Создать наши маршруты.
  2. Связать маршруты с нашими компонентами.
  3. Включить роутер в наше приложение.
  4. Установите наши шаблоны, в которых маршрутизатор будет отображать наши компоненты.

Как и многие другие компоненты фреймворка, маршрутизатор не указывает, в каких директориях или организациях должны быть размещены ваши маршруты или компоненты. Однако существует соглашение, которое мы будем использовать и которое стало стандартом де-факто в отрасли. В папке /src создайте следующие каталоги:

  • /router (или /routes): Здесь будут находиться наши JavaScript-файлы с маршрутами для нашего приложения
  • /views: В этой папке будут находиться компоненты верхнего уровня, соответствующие навигации приложения (в качестве лучшей практики)

После создания этих каталогов мы готовы приступить к модификации нашего приложения для включения навигации по маршруту. Но прежде давайте рассмотрим, чего мы хотим добиться с помощью нашего маршрутизатора.

Новое приложение To-Do

В нашем новом приложении будут повторно использоваться компоненты для отображения списка дел, но также будет предусмотрена возможность создания нескольких списков или проектов. Мы будем отображать боковую панель со всеми нашими проектами, и при их выборе список будет обновляться.

Эти проекты также будут сохраняться в браузере, чтобы мы могли вернуться к ним позже, с помощью localStorage. В результате мы получим очень простую навигацию с двумя страницами верхнего уровня (компонентами):

  • Лэндинг страница, на которой мы можем создавать новые проекты
  • Страница проекта, на которой мы можем работать со списком дел

Следуя этим простым предпосылкам, наше приложение в готовом виде будет выглядеть следующим образом:

image

Рисунок 5.1 - Наша лэндинг страница

Как видно на Рисунке 5.1, целевая страница является также местом, где мы можем создавать новые проекты. Для сбора пользовательского ввода мы, как и раньше, используем модальные диалоги.

На боковой панели отображается ссылка на страницу Home (целевая страница) и список с названиями различных проектов, которые мы создали. При щелчке на каждом из них маршрут в браузере (URL) будет обновляться, как и страница, и мы увидим нечто подобное этому:

image

Рисунок 5.2 - Страница проекта To-Do

Последний скриншот вы можете узнать, поскольку именно его отображает наш компонент ToDoProject.vue. Собственно говоря, для достижения этого результата потребуется совсем немного модификаций. А пока давайте начнем с маршрутов.

Определение маршрутов и объект Router

Чтобы создать маршруты для нашего проекта, необходимо сначала определить их в собственном модуле. В каталоге /router создайте файл index.js со следующим содержимым:

/src/router/index.js

js
import {createRouter,createWebHashHistory} from 'vue-router'        //1
 import Landing from "../views/Landing.vue"                          //2
 const routes = [
     {path: "/",name: "landing", component: Landing},
diff --git a/assets/ru_book_Chapter_5__Single-Page_Applications.md.XL7e2wQ0.lean.js b/assets/ru_book_Chapter_5__Single-Page_Applications.md.NNsvLbhA.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_5__Single-Page_Applications.md.XL7e2wQ0.lean.js
rename to assets/ru_book_Chapter_5__Single-Page_Applications.md.NNsvLbhA.lean.js
index 1a688bb00..fc2739b67 100644
--- a/assets/ru_book_Chapter_5__Single-Page_Applications.md.XL7e2wQ0.lean.js
+++ b/assets/ru_book_Chapter_5__Single-Page_Applications.md.NNsvLbhA.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_5.01_B18602.sRZJVUyi.jpg",p="/assets/Figure_5.02_B18602.wosWfXl5.jpg",h="/assets/Figure_5.03_B18602.cxFyes6F.jpg",l="/assets/Figure_5.04_B18602.qAUUEscj.jpg",e="/assets/Figure_5.05_B18602.6mMJ2Mnu.jpg",k="/assets/Figure_5.06_B18602.k2Z94cLY.jpg",r="/assets/Figure_5.07_B18602.raOlxZqf.jpg",o="/assets/Figure_5.08_B18602.1S4ihtrN.jpg",v=JSON.parse('{"title":"Одностраничные приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_5__Single-Page_Applications.md","filePath":"ru/book/Chapter_5__Single-Page_Applications.md","lastUpdated":1706427418000}'),E={name:"ru/book/Chapter_5__Single-Page_Applications.md"},g=t("",275),d=[g];function y(c,u,F,m,A,C){return a(),i("div",null,d)}const q=s(E,[["render",y]]);export{v as __pageData,q as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_5.01_B18602.sRZJVUyi.jpg",p="/assets/Figure_5.02_B18602.wosWfXl5.jpg",h="/assets/Figure_5.03_B18602.cxFyes6F.jpg",l="/assets/Figure_5.04_B18602.qAUUEscj.jpg",e="/assets/Figure_5.05_B18602.6mMJ2Mnu.jpg",k="/assets/Figure_5.06_B18602.k2Z94cLY.jpg",r="/assets/Figure_5.07_B18602.raOlxZqf.jpg",o="/assets/Figure_5.08_B18602.1S4ihtrN.jpg",v=JSON.parse('{"title":"Одностраничные приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_5__Single-Page_Applications.md","filePath":"ru/book/Chapter_5__Single-Page_Applications.md","lastUpdated":1706553672000}'),E={name:"ru/book/Chapter_5__Single-Page_Applications.md"},g=t("",275),d=[g];function y(c,u,F,m,A,C){return a(),i("div",null,d)}const q=s(E,[["render",y]]);export{v as __pageData,q as default};
diff --git a/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.8fAww607.js b/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.-0Rj0Qvu.js
similarity index 99%
rename from assets/ru_book_Chapter_6__Progressive_Web_Applications.md.8fAww607.js
rename to assets/ru_book_Chapter_6__Progressive_Web_Applications.md.-0Rj0Qvu.js
index d5a4a3d2d..0ae858976 100644
--- a/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.8fAww607.js
+++ b/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.-0Rj0Qvu.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_6.01_B18602.kc1edmwz.jpg",l="/assets/Figure_6.02_B18602.O7QZzH51.jpg",p="/assets/Figure_6.03_B18602.81nl0Ow0.jpg",h="/assets/Figure_6.04_B18602.l2BI7iZ5.jpg",e="/assets/Figure_6.05_B18602.d9KuG185.jpg",k="/assets/Figure_6.06_B18602.xKGZnigP.jpg",r="/assets/Figure_6.07_B18602.E6RQGy_2.jpg",E="/assets/Figure_6.08_B18602.3qaTO_NG.jpg",_=JSON.parse('{"title":"Прогрессивные веб-приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_6__Progressive_Web_Applications.md","filePath":"ru/book/Chapter_6__Progressive_Web_Applications.md","lastUpdated":1706427418000}'),o={name:"ru/book/Chapter_6__Progressive_Web_Applications.md"},g=n(`

Прогрессивные веб-приложения

В этой главе мы познакомимся со следующим шагом эволюции веб-приложений: прогрессивные веб-приложения (PWA). Этот термин может показаться недостаточно описательным, но он относится к группе технологий, которые создают общую концепцию и могут быть реализованы постепенно или частично.

Основная идея заключается в том, чтобы вывести веб-приложение из контекста браузера и реализовать его на любом типе устройства, чтобы оно действовало и вело себя максимально похоже на нативное приложение. Это достигается за счет внедрения новых API в браузерные движки, а также интеграции с наиболее популярными операционными системами для настольных и мобильных устройств.

Отправной точкой для PWA, конечно же, является одностраничное приложение (SPA).

К концу этой главы мы узнаем следующее:

  • Что превращает SPA в PWA, и какие технологии при этом используются
  • Как вручную реализовать адаптивный SPA, файл манифеста, web workers, автономное хранилище и так далее
  • Что такое service workers и какие они бывают
  • Как использовать плагины Vite для автоматизации создания PWA
  • Как проверить готовность приложения с помощью Google Lighthouse

Из предыдущего списка мы сосредоточимся на изучении развертывания начальных шаблонов для нескольких технологий, закладывающих основу для их последующего использования, подробно реализованного в главе 7, Управление потоками данных, и главе 8, Многопоточность с Web Workers. К концу этих глав вы будете знать, как создавать PWA, которые эффективно используют современные вычислительные мощности, делая их отзывчивыми, надежными, и производительными.

Технические требования

Для работы с этой главой вам понадобятся примеры кода, расположенные в репозитории по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter06.

Текстовых примеров кода в этом разделе может быть недостаточно для создания работающего примера без дополнительного кода из репозитория.

Посмотрите следующее видео, чтобы увидеть код в действии:

PWA или устанавливаемые SPA

PWA - это не отдельная настройка или технология, а систематическое усовершенствование веб-приложения для соблюдения определенных условий, будь то многостраничное приложение (MPA) или SPA. Однако по-настоящему они проявляются и оживают, когда эти технологии применяются к SPA, давая нам мощные приложения, которые стирают грань между онлайном и оффлайном, настольными и веб-приложениями.

Термин прогрессивный, используемый здесь, имеет тот же оттенок, который мы обсуждали ранее применительно к фреймворку Vue - постепенное применение веб-технологий.

PWA несколько по-особому воспринимаются браузерами и операционными системами. Они могут устанавливаться рядом с "родными" или настольными приложениями и управлять сетевыми коммуникациями (отправлять, получать, кэшировать файлы и даже получать push-уведомления с сервера).

Здесь важно отметить, что речь идет уже не только о настольных компьютерах, но и о мобильных устройствах, таких как планшеты и телефоны, а также о различных операционных системах. Именно в связи с такой многоплатформенностью, если предполагается охватить базу пользователей на различных устройствах, необходимо уделить особое внимание использованию специальных правил CSS для адаптации пользовательского интерфейса к различным размерам (так называемые отзывчивые (responsive) приложения), различных иконок и цветов для согласования с локальными настройками пользователя на уровне операционной системы (например, светлый и темный режимы) и т.д.

Кроме того, PWA имеют возможность (как и SPA) хранить контент для автономного использования и, надеюсь, должны предоставлять определенную функциональность для автономного использования. Для выполнения всего этого, как минимум, PWA должен соответствовать следующим требованиям:

  • Веб-приложение должно обслуживаться через защищенное соединение (HTTPS).
  • Приложение должно предоставлять файл манифеста.
  • Приложение должно предоставить и установить service worker.

При выполнении всех этих условий браузер или операционная система могут предложить пользователю "установить" приложение. Если пользователь соглашается, то с помощью файла манифеста настраивается внешний вид приложения в соответствии с локальной операционной системой (значки, названия, цвета и т.д.), и оно появляется рядом с другими приложениями в системе.

При запуске оно будет открываться в собственном окне (если оно выбрано) вне рамок веб-браузера, как и обычное "родное" приложение. Внутри приложение по-прежнему будет работать на движке браузера с использованием веб-технологий, но предполагается, что это будет прозрачно для пользователя, обеспечивая лучшее из двух миров.

Есть вероятность того, что пользователь, сам того не зная, использует PWA вместо обычных приложений. Успешными примерами такого подхода являются Starbucks, Trivago и Tinder (https://medium.com/@addyosmani/a-tinder-progressive-web-app-performance-case-study-78919d98ece0).

Это создает целый ряд преимуществ, которые перекрывают сложности создания веб-приложения под различные сценарии установки:

  • Единая кодовая база для установки приложения на различные устройства (настольные, мобильные, ...) и операционные системы (Windows, Linux, macOS, Android, iOS и так далее)
  • Поддерживают push-уведомления с сервера, ручную обработку кэширования, автономное использование и так далее
  • Они интегрируются с локальной операционной системой
  • Обновления прозрачны для пользователя и происходят гораздо быстрее, чем в традиционном приложении (в большинстве случаев)
  • Разработка PWA требует гораздо меньших затрат, чем создание аналогичных целевых индивидуальных приложений для каждой платформы
  • Вы можете использовать все доступные веб-технологии, фреймворки и библиотеки
  • Могут индексироваться поисковыми системами, а их распространение и установка не зависят от проприетарных магазинов приложений
  • Отзывчивые, безопасные и быстрые, ими можно поделиться с помощью одной лишь ссылки
  • Вы можете обращаться к локальным устройствам с помощью стандартных веб-интерфейсов API, например к локальной файловой системе и USB-устройствам, использовать аппаратное ускорение графики и т.д.
  • Вы можете работать с локальными устройствами с помощью стандартных веб-интерфейсов API.
  • Некоторые магазины приложений позволяют переупаковывать PWA и распространять его как обычное приложение (Microsoft Store, Amazon Store, Android Store и др.)

Есть и другие преимущества, но этих, пожалуй, достаточно, чтобы привести их в качестве аргумента. Кроме того, в SPA проще добавить необходимые элементы, чтобы превратить его в PWA. В результате PWA могут показаться "серебряной пулей" среди приложений, однако следует учитывать и некоторые недостатки:

  • Производительность PWA хороша, но в некоторых конкретных сценариях она всегда будет отставать от нативного приложения. То же самое может произойти и на устаревшем оборудовании - они будут работать, но производительность может пострадать.
  • Устройства Apple немного отстают в освоении некоторых веб-технологий или специально ограничивают их применение для PWA (например, серверные push-уведомления).
  • Необходимо приложить немного больше усилий, чтобы охватить различные сценарии работы пользователей на разных устройствах (но немного больше, чем для обычного отзывчивого веб-приложения).
  • Некоторые магазины приложений не допускают PWA (в частности, на момент написания статьи это Apple App Store). Кроме того, приложение не получит выгоды от экспозиции и пешеходного трафика (foot traffic) из магазина приложений.

В целом, преимущества значительно перевешивают недостатки. По мере развития веб-технологий PWA будут получать все больше преимуществ и становиться все более распространенными. Теперь, имея более полное представление о том, что такое PWA и что он может делать, давайте модернизируем наши SPA в PWA.

Увеличение SPA до уровня PWA

Первое требование, о котором уже говорилось, - это обслуживание приложения по защищенному соединению. Как это сделать, установив на сервере бесплатный SSL-сертификат с помощью Let's Encrypt, мы рассмотрим в главе 10, Развертывание приложения. Учитывая это, давайте посмотрим, как выполнить другие требования.

Файл манифеста

Добавление файла манифеста - это отправная точка для превращения нашего приложения в PWA. Это не что иное, как JSON-файл с известными полями, которые указывают браузеру или операционной системе, как приложение должно быть установлено на настольном или мобильном устройстве.

Этот файл должен быть связан в секции head нашего файла index.html, и хотя он может иметь произвольное название, принято использовать имя manifest.json или app.webmanifest. Официальная спецификация предлагает расширение .webmanifest, но при этом уточняет, что имя не имеет особого значения, если файл принимается правильно с типом application/manifest+json - Multipurpose Internet Mail Extensions (MIME) (см. https://www.w3.org/TR/appmanifest/, раздел §1.1.2). В наших примерах кода мы будем использовать имя manifest.json для простоты:

html
<link rel="manifest" href="/manifest.json">

Заметим из предыдущего кода, что файл размещается в корне нашего приложения, а атрибут rel должен быть manifest. Атрибуты полей в нашем файле манифеста могут располагаться в любом порядке, и все они считаются опциональными согласно вышеупомянутой спецификации.

Однако некоторые платформы все же предполагают минимальный набор атрибутов, который мы будем считать необходимым. Обычная практика также требует наличия других атрибутов, которые мы будем относить к рекомендуемым, и, наконец, некоторые атрибуты в спецификации часто используются в магазинах приложений, социальных сетях и т.д. для представления или описания приложения, поэтому мы будем относить их к описательным полям.

Эта классификация не является частью спецификации, но может быть полезна при реализации. Вот список наиболее распространенных и полезных атрибутов:

Необходимо:

КлассификацияАтрибут
short_nameКороткое имя, используемое в тех случаях, когда не хватает места для отображения полного имени приложения. В мобильных устройствах часто используется для названия значка.
nameПолное имя приложения.
iconsМассив объектов, каждый из которых представляет собой отдельную иконку, используемую в различных контекстах. Каждый объект имеет как минимум два атрибута:

- src: Путь к изображению
- sizes: Строка с размерами изображения
start_urlURL-адрес, с которого должно стартовать приложение, заданный разработчиком.
displayСтрока, представляющая способ представления приложения:

- fullscreen: В полноэкранном режиме, но с отображением пользовательского интерфейса браузера.
- standalone: Аналогично fullscreen, но без элементов управления браузера. На рабочем столе элементы управления windows все равно будут отображаться.
- minimal-ui: Как standalone, но с базовой навигацией для перемещения вперед и назад, печати, обмена и т.д.
- browser: Приложение открыто в браузере по умолчанию.

Рекомендуется:

КлассификацияАтрибут
theme_colorСтрока, представляющая собой цвет CSS для приложения. ОС сама решает, как использовать это значение (обычно оно применяется в строке заголовка окна).
background_colorСтрока, представляющая цвет фона приложения при его запуске и до применения стилей приложения.
orientationВ основном используется в мобильных устройствах и определяет ориентацию, которую должно использовать приложение - например, ландшафтная, портретная, любая и т.д.
langСтрока, определяющая основной язык приложения.

Описательные:

КлассификацияАтрибут
shortcutsЭто массив объектов, определяющих пункты прямого меню для тесной интеграции с операционной системой. Обычно они появляются в контекстном меню, например, когда пользователь щелкает правой кнопкой мыши на значке приложения. Каждый объект ярлыка должен содержать как минимум имя и URL, а также - опционально - описание и массив иконок.
descriptionСтрока с кратким описанием приложения.
screenshotsМассив объектов, содержащий следующие поля:

- src: URL-адрес изображения
- type: MIME-тип изображения
- sizes: Строка с размерами изображения

Таблица 6.1 - Поля манифеста.

На практике я бы рекомендовал заполнять необходимые и рекомендуемые поля для каждого PWA, а описательные поля использовать по мере необходимости, исходя из контекста приложения. Кроме того, следует изучить целевые платформы на предмет наличия дополнительных поддерживаемых полей, которые не входят в стандартную спецификацию.

Следуя предыдущей таблице, приведем пример файла manifest.json:

json
{
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_6.01_B18602.kc1edmwz.jpg",l="/assets/Figure_6.02_B18602.O7QZzH51.jpg",p="/assets/Figure_6.03_B18602.81nl0Ow0.jpg",h="/assets/Figure_6.04_B18602.l2BI7iZ5.jpg",e="/assets/Figure_6.05_B18602.d9KuG185.jpg",k="/assets/Figure_6.06_B18602.xKGZnigP.jpg",r="/assets/Figure_6.07_B18602.E6RQGy_2.jpg",E="/assets/Figure_6.08_B18602.3qaTO_NG.jpg",_=JSON.parse('{"title":"Прогрессивные веб-приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_6__Progressive_Web_Applications.md","filePath":"ru/book/Chapter_6__Progressive_Web_Applications.md","lastUpdated":1706553672000}'),o={name:"ru/book/Chapter_6__Progressive_Web_Applications.md"},g=n(`

Прогрессивные веб-приложения

В этой главе мы познакомимся со следующим шагом эволюции веб-приложений: прогрессивные веб-приложения (PWA). Этот термин может показаться недостаточно описательным, но он относится к группе технологий, которые создают общую концепцию и могут быть реализованы постепенно или частично.

Основная идея заключается в том, чтобы вывести веб-приложение из контекста браузера и реализовать его на любом типе устройства, чтобы оно действовало и вело себя максимально похоже на нативное приложение. Это достигается за счет внедрения новых API в браузерные движки, а также интеграции с наиболее популярными операционными системами для настольных и мобильных устройств.

Отправной точкой для PWA, конечно же, является одностраничное приложение (SPA).

К концу этой главы мы узнаем следующее:

  • Что превращает SPA в PWA, и какие технологии при этом используются
  • Как вручную реализовать адаптивный SPA, файл манифеста, web workers, автономное хранилище и так далее
  • Что такое service workers и какие они бывают
  • Как использовать плагины Vite для автоматизации создания PWA
  • Как проверить готовность приложения с помощью Google Lighthouse

Из предыдущего списка мы сосредоточимся на изучении развертывания начальных шаблонов для нескольких технологий, закладывающих основу для их последующего использования, подробно реализованного в главе 7, Управление потоками данных, и главе 8, Многопоточность с Web Workers. К концу этих глав вы будете знать, как создавать PWA, которые эффективно используют современные вычислительные мощности, делая их отзывчивыми, надежными, и производительными.

Технические требования

Для работы с этой главой вам понадобятся примеры кода, расположенные в репозитории по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter06.

Текстовых примеров кода в этом разделе может быть недостаточно для создания работающего примера без дополнительного кода из репозитория.

Посмотрите следующее видео, чтобы увидеть код в действии:

PWA или устанавливаемые SPA

PWA - это не отдельная настройка или технология, а систематическое усовершенствование веб-приложения для соблюдения определенных условий, будь то многостраничное приложение (MPA) или SPA. Однако по-настоящему они проявляются и оживают, когда эти технологии применяются к SPA, давая нам мощные приложения, которые стирают грань между онлайном и оффлайном, настольными и веб-приложениями.

Термин прогрессивный, используемый здесь, имеет тот же оттенок, который мы обсуждали ранее применительно к фреймворку Vue - постепенное применение веб-технологий.

PWA несколько по-особому воспринимаются браузерами и операционными системами. Они могут устанавливаться рядом с "родными" или настольными приложениями и управлять сетевыми коммуникациями (отправлять, получать, кэшировать файлы и даже получать push-уведомления с сервера).

Здесь важно отметить, что речь идет уже не только о настольных компьютерах, но и о мобильных устройствах, таких как планшеты и телефоны, а также о различных операционных системах. Именно в связи с такой многоплатформенностью, если предполагается охватить базу пользователей на различных устройствах, необходимо уделить особое внимание использованию специальных правил CSS для адаптации пользовательского интерфейса к различным размерам (так называемые отзывчивые (responsive) приложения), различных иконок и цветов для согласования с локальными настройками пользователя на уровне операционной системы (например, светлый и темный режимы) и т.д.

Кроме того, PWA имеют возможность (как и SPA) хранить контент для автономного использования и, надеюсь, должны предоставлять определенную функциональность для автономного использования. Для выполнения всего этого, как минимум, PWA должен соответствовать следующим требованиям:

  • Веб-приложение должно обслуживаться через защищенное соединение (HTTPS).
  • Приложение должно предоставлять файл манифеста.
  • Приложение должно предоставить и установить service worker.

При выполнении всех этих условий браузер или операционная система могут предложить пользователю "установить" приложение. Если пользователь соглашается, то с помощью файла манифеста настраивается внешний вид приложения в соответствии с локальной операционной системой (значки, названия, цвета и т.д.), и оно появляется рядом с другими приложениями в системе.

При запуске оно будет открываться в собственном окне (если оно выбрано) вне рамок веб-браузера, как и обычное "родное" приложение. Внутри приложение по-прежнему будет работать на движке браузера с использованием веб-технологий, но предполагается, что это будет прозрачно для пользователя, обеспечивая лучшее из двух миров.

Есть вероятность того, что пользователь, сам того не зная, использует PWA вместо обычных приложений. Успешными примерами такого подхода являются Starbucks, Trivago и Tinder (https://medium.com/@addyosmani/a-tinder-progressive-web-app-performance-case-study-78919d98ece0).

Это создает целый ряд преимуществ, которые перекрывают сложности создания веб-приложения под различные сценарии установки:

  • Единая кодовая база для установки приложения на различные устройства (настольные, мобильные, ...) и операционные системы (Windows, Linux, macOS, Android, iOS и так далее)
  • Поддерживают push-уведомления с сервера, ручную обработку кэширования, автономное использование и так далее
  • Они интегрируются с локальной операционной системой
  • Обновления прозрачны для пользователя и происходят гораздо быстрее, чем в традиционном приложении (в большинстве случаев)
  • Разработка PWA требует гораздо меньших затрат, чем создание аналогичных целевых индивидуальных приложений для каждой платформы
  • Вы можете использовать все доступные веб-технологии, фреймворки и библиотеки
  • Могут индексироваться поисковыми системами, а их распространение и установка не зависят от проприетарных магазинов приложений
  • Отзывчивые, безопасные и быстрые, ими можно поделиться с помощью одной лишь ссылки
  • Вы можете обращаться к локальным устройствам с помощью стандартных веб-интерфейсов API, например к локальной файловой системе и USB-устройствам, использовать аппаратное ускорение графики и т.д.
  • Вы можете работать с локальными устройствами с помощью стандартных веб-интерфейсов API.
  • Некоторые магазины приложений позволяют переупаковывать PWA и распространять его как обычное приложение (Microsoft Store, Amazon Store, Android Store и др.)

Есть и другие преимущества, но этих, пожалуй, достаточно, чтобы привести их в качестве аргумента. Кроме того, в SPA проще добавить необходимые элементы, чтобы превратить его в PWA. В результате PWA могут показаться "серебряной пулей" среди приложений, однако следует учитывать и некоторые недостатки:

  • Производительность PWA хороша, но в некоторых конкретных сценариях она всегда будет отставать от нативного приложения. То же самое может произойти и на устаревшем оборудовании - они будут работать, но производительность может пострадать.
  • Устройства Apple немного отстают в освоении некоторых веб-технологий или специально ограничивают их применение для PWA (например, серверные push-уведомления).
  • Необходимо приложить немного больше усилий, чтобы охватить различные сценарии работы пользователей на разных устройствах (но немного больше, чем для обычного отзывчивого веб-приложения).
  • Некоторые магазины приложений не допускают PWA (в частности, на момент написания статьи это Apple App Store). Кроме того, приложение не получит выгоды от экспозиции и пешеходного трафика (foot traffic) из магазина приложений.

В целом, преимущества значительно перевешивают недостатки. По мере развития веб-технологий PWA будут получать все больше преимуществ и становиться все более распространенными. Теперь, имея более полное представление о том, что такое PWA и что он может делать, давайте модернизируем наши SPA в PWA.

Увеличение SPA до уровня PWA

Первое требование, о котором уже говорилось, - это обслуживание приложения по защищенному соединению. Как это сделать, установив на сервере бесплатный SSL-сертификат с помощью Let's Encrypt, мы рассмотрим в главе 10, Развертывание приложения. Учитывая это, давайте посмотрим, как выполнить другие требования.

Файл манифеста

Добавление файла манифеста - это отправная точка для превращения нашего приложения в PWA. Это не что иное, как JSON-файл с известными полями, которые указывают браузеру или операционной системе, как приложение должно быть установлено на настольном или мобильном устройстве.

Этот файл должен быть связан в секции head нашего файла index.html, и хотя он может иметь произвольное название, принято использовать имя manifest.json или app.webmanifest. Официальная спецификация предлагает расширение .webmanifest, но при этом уточняет, что имя не имеет особого значения, если файл принимается правильно с типом application/manifest+json - Multipurpose Internet Mail Extensions (MIME) (см. https://www.w3.org/TR/appmanifest/, раздел §1.1.2). В наших примерах кода мы будем использовать имя manifest.json для простоты:

html
<link rel="manifest" href="/manifest.json">

Заметим из предыдущего кода, что файл размещается в корне нашего приложения, а атрибут rel должен быть manifest. Атрибуты полей в нашем файле манифеста могут располагаться в любом порядке, и все они считаются опциональными согласно вышеупомянутой спецификации.

Однако некоторые платформы все же предполагают минимальный набор атрибутов, который мы будем считать необходимым. Обычная практика также требует наличия других атрибутов, которые мы будем относить к рекомендуемым, и, наконец, некоторые атрибуты в спецификации часто используются в магазинах приложений, социальных сетях и т.д. для представления или описания приложения, поэтому мы будем относить их к описательным полям.

Эта классификация не является частью спецификации, но может быть полезна при реализации. Вот список наиболее распространенных и полезных атрибутов:

Необходимо:

КлассификацияАтрибут
short_nameКороткое имя, используемое в тех случаях, когда не хватает места для отображения полного имени приложения. В мобильных устройствах часто используется для названия значка.
nameПолное имя приложения.
iconsМассив объектов, каждый из которых представляет собой отдельную иконку, используемую в различных контекстах. Каждый объект имеет как минимум два атрибута:

- src: Путь к изображению
- sizes: Строка с размерами изображения
start_urlURL-адрес, с которого должно стартовать приложение, заданный разработчиком.
displayСтрока, представляющая способ представления приложения:

- fullscreen: В полноэкранном режиме, но с отображением пользовательского интерфейса браузера.
- standalone: Аналогично fullscreen, но без элементов управления браузера. На рабочем столе элементы управления windows все равно будут отображаться.
- minimal-ui: Как standalone, но с базовой навигацией для перемещения вперед и назад, печати, обмена и т.д.
- browser: Приложение открыто в браузере по умолчанию.

Рекомендуется:

КлассификацияАтрибут
theme_colorСтрока, представляющая собой цвет CSS для приложения. ОС сама решает, как использовать это значение (обычно оно применяется в строке заголовка окна).
background_colorСтрока, представляющая цвет фона приложения при его запуске и до применения стилей приложения.
orientationВ основном используется в мобильных устройствах и определяет ориентацию, которую должно использовать приложение - например, ландшафтная, портретная, любая и т.д.
langСтрока, определяющая основной язык приложения.

Описательные:

КлассификацияАтрибут
shortcutsЭто массив объектов, определяющих пункты прямого меню для тесной интеграции с операционной системой. Обычно они появляются в контекстном меню, например, когда пользователь щелкает правой кнопкой мыши на значке приложения. Каждый объект ярлыка должен содержать как минимум имя и URL, а также - опционально - описание и массив иконок.
descriptionСтрока с кратким описанием приложения.
screenshotsМассив объектов, содержащий следующие поля:

- src: URL-адрес изображения
- type: MIME-тип изображения
- sizes: Строка с размерами изображения

Таблица 6.1 - Поля манифеста.

На практике я бы рекомендовал заполнять необходимые и рекомендуемые поля для каждого PWA, а описательные поля использовать по мере необходимости, исходя из контекста приложения. Кроме того, следует изучить целевые платформы на предмет наличия дополнительных поддерживаемых полей, которые не входят в стандартную спецификацию.

Следуя предыдущей таблице, приведем пример файла manifest.json:

json
{
       "short_name": "Пример PWA",
       "name": "Глава 6: Пример прогрессивного веб-приложения",
       "start_url":"/",
diff --git a/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.8fAww607.lean.js b/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.-0Rj0Qvu.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_6__Progressive_Web_Applications.md.8fAww607.lean.js
rename to assets/ru_book_Chapter_6__Progressive_Web_Applications.md.-0Rj0Qvu.lean.js
index dd3bbd999..b28330731 100644
--- a/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.8fAww607.lean.js
+++ b/assets/ru_book_Chapter_6__Progressive_Web_Applications.md.-0Rj0Qvu.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_6.01_B18602.kc1edmwz.jpg",l="/assets/Figure_6.02_B18602.O7QZzH51.jpg",p="/assets/Figure_6.03_B18602.81nl0Ow0.jpg",h="/assets/Figure_6.04_B18602.l2BI7iZ5.jpg",e="/assets/Figure_6.05_B18602.d9KuG185.jpg",k="/assets/Figure_6.06_B18602.xKGZnigP.jpg",r="/assets/Figure_6.07_B18602.E6RQGy_2.jpg",E="/assets/Figure_6.08_B18602.3qaTO_NG.jpg",_=JSON.parse('{"title":"Прогрессивные веб-приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_6__Progressive_Web_Applications.md","filePath":"ru/book/Chapter_6__Progressive_Web_Applications.md","lastUpdated":1706427418000}'),o={name:"ru/book/Chapter_6__Progressive_Web_Applications.md"},g=n("",123),d=[g];function y(c,F,u,m,A,C){return a(),i("div",null,d)}const b=s(o,[["render",y]]);export{_ as __pageData,b as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_6.01_B18602.kc1edmwz.jpg",l="/assets/Figure_6.02_B18602.O7QZzH51.jpg",p="/assets/Figure_6.03_B18602.81nl0Ow0.jpg",h="/assets/Figure_6.04_B18602.l2BI7iZ5.jpg",e="/assets/Figure_6.05_B18602.d9KuG185.jpg",k="/assets/Figure_6.06_B18602.xKGZnigP.jpg",r="/assets/Figure_6.07_B18602.E6RQGy_2.jpg",E="/assets/Figure_6.08_B18602.3qaTO_NG.jpg",_=JSON.parse('{"title":"Прогрессивные веб-приложения","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_6__Progressive_Web_Applications.md","filePath":"ru/book/Chapter_6__Progressive_Web_Applications.md","lastUpdated":1706553672000}'),o={name:"ru/book/Chapter_6__Progressive_Web_Applications.md"},g=n("",123),d=[g];function y(c,F,u,m,A,C){return a(),i("div",null,d)}const b=s(o,[["render",y]]);export{_ as __pageData,b as default};
diff --git a/assets/ru_book_Chapter_7__Data_Flow_Management.md.4kedV1g-.js b/assets/ru_book_Chapter_7__Data_Flow_Management.md.49uZ6IeN.js
similarity index 99%
rename from assets/ru_book_Chapter_7__Data_Flow_Management.md.4kedV1g-.js
rename to assets/ru_book_Chapter_7__Data_Flow_Management.md.49uZ6IeN.js
index 0ed8414f8..af9bf0af9 100644
--- a/assets/ru_book_Chapter_7__Data_Flow_Management.md.4kedV1g-.js
+++ b/assets/ru_book_Chapter_7__Data_Flow_Management.md.49uZ6IeN.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_7.01_B18602.o6bwMS2-.jpg",h="/assets/Figure_7.02_B18602.MCka6TCa.jpg",p="/assets/Figure_7.03_B18602.nuCECRuu.jpg",k="/assets/Figure_7.04_B18602.Fie1X6S5.jpg",l="/assets/Figure_7.05_B18602.TmQxDozH.jpg",e="/assets/Figure_7.06_B18602.cOAoOKNU.jpg",r="/assets/Figure_7.07_B18602.3xj_zNi2.jpg",m=JSON.parse('{"title":"Управление потоками данных","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_7__Data_Flow_Management.md","filePath":"ru/book/Chapter_7__Data_Flow_Management.md","lastUpdated":1706427418000}'),E={name:"ru/book/Chapter_7__Data_Flow_Management.md"},g=n('

Управление потоками данных

В предыдущих главах мы сосредоточились на понимании фреймворка Vue 3 и создании контекста для создания веб-приложений. В этой главе мы сосредоточимся на том, как наши компоненты взаимодействуют друг с другом и обмениваются информацией для реализации нашего приложения.

Ранее мы уже вкратце касались этой темы, но теперь мы глубоко погрузимся в некоторые шаблоны, реализуя их рядом друг с другом. Применение соответствующего информационного рабочего процесса - важный навык, который может сделать или разрушить приложение. В частности, мы рассмотрим следующие подходы и примеры кода:

  • Общение между родителями, детьми и братьями (siblings)
  • Реализация шины сообщений с использованием Singleton и Observer шаблонов
  • Реализация базового реактивного состояния с помощью композитных компонентов
  • Реализация централизованного хранилища данных с помощью мощного хранилища Pinia reactive store
  • Обзор предоставляемых браузерами альтернатив для обмена и хранения информации
  • Эксперименты с реактивностью, составными элементами и шаблонами прокси в действии

Как мы уже делали ранее, мы будем строить по одной концепции за раз, увеличивая сложность. К концу этой главы вы увидите наглядные примеры реализации, и сможете решить, когда применять каждую из них, исходя из потребностей вашего приложения.

Некоторые из них больше подходят для небольших приложений, а другие - для больших и сложных. Вы сможете лучше подготовиться к управлению потоком информации для вашего приложения.

Технические требования

В этой главе мы рассмотрим концепции и применим шаблоны для управления связью и потоком информации между компонентами. Вы должны быть в состоянии выполнить код, представленный в этом тексте, но для лучшего понимания и контекстного опыта вам будет полезно ознакомиться с полным кодом приложения для этой главы, доступным в репозитории к этой книге: https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter07.

Если вы начинаете новый проект, просто следуйте инструкциям, как показано в главе 3, Установка рабочего проекта.

Посмотрите следующее видео, чтобы увидеть код в действии.

Основное взаимодействие компонентов

Ранее мы видели, что родительский компонент и его дочерние компоненты имеют довольно простой и понятный способ взаимодействия. Родители передают данные в виде props своим дочерним компонентам, а те поднимают события (emits), чтобы привлечь внимание родителя.

Подобно сопоставимости параметров и аргументов в функциях, props получают простые данные по копии, а сложные типы (объекты, массивы и т.д.) - по ссылке.

Таким образом, мы можем передать от родителя к ребенку обычный объект с функциями-членами, а ребенок будет выполнять эти функции для доступа к данным родителя.

Несмотря на то, что это "работает", это своего рода антипаттерн, поскольку он скрывает отношения и затрудняет понимание потока данных. Правильным способом передачи данных вверх по дереву компонентов являются события (emits).

При этом следует отметить, что дочерние компоненты "не знают" друг друга, то есть не имеют прямого способа взаимодействия между собой. Мы можем передать реактивную переменную и заставить каждый компонент обращаться к ней, и это, конечно, рабочая альтернатива, однако не чистая. В некоторых случаях это дает простое решение, но опять же может привести к скрытым побочным эффектам.

Для того чтобы управлять рабочим процессом данных чистым способом, у нас есть несколько альтернатив, которые следуют хорошей практике и шаблонам проектирования.

Как общее правило и принцип, компонент, объявивший переменную, является ее владельцем, и именно он должен манипулировать ею. Исходя из этого, при самом базовом взаимодействии информация должна храниться и манипулироваться родительским компонентом и передаваться дочерним.

Для распространения информации мы можем использовать реактивную систему Vue. Ключевым моментом здесь является то, что манипулировать ею будет только родительский компонент. Посмотрим, как это работает на практике, на примере реализации небольшого тривиального приложения, как показано на Рисунке 7.1:

image

Рисунок 7.1 - Прямая базовая связь и реактивность

В данном приложении родительский компонент имеет три прямых дочерних компонента и разделяет с ними реактивный счетчик. Все компоненты отображают метку со значением счетчика и имеют кнопку для запуска инкремента, но только родительский компонент выполняет фактические манипуляции с данными. Vue обеспечивает реактивность, то есть когда родительский компонент изменяет значение, дочерние компоненты также получают его. Все достаточно просто - давайте посмотрим, как это реализовано:

/basic/ParentBasic.vue
vue
<script setup> 
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_7.01_B18602.o6bwMS2-.jpg",h="/assets/Figure_7.02_B18602.MCka6TCa.jpg",p="/assets/Figure_7.03_B18602.nuCECRuu.jpg",k="/assets/Figure_7.04_B18602.Fie1X6S5.jpg",l="/assets/Figure_7.05_B18602.TmQxDozH.jpg",e="/assets/Figure_7.06_B18602.cOAoOKNU.jpg",r="/assets/Figure_7.07_B18602.3xj_zNi2.jpg",m=JSON.parse('{"title":"Управление потоками данных","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_7__Data_Flow_Management.md","filePath":"ru/book/Chapter_7__Data_Flow_Management.md","lastUpdated":1706553672000}'),E={name:"ru/book/Chapter_7__Data_Flow_Management.md"},g=n('

Управление потоками данных

В предыдущих главах мы сосредоточились на понимании фреймворка Vue 3 и создании контекста для создания веб-приложений. В этой главе мы сосредоточимся на том, как наши компоненты взаимодействуют друг с другом и обмениваются информацией для реализации нашего приложения.

Ранее мы уже вкратце касались этой темы, но теперь мы глубоко погрузимся в некоторые шаблоны, реализуя их рядом друг с другом. Применение соответствующего информационного рабочего процесса - важный навык, который может сделать или разрушить приложение. В частности, мы рассмотрим следующие подходы и примеры кода:

  • Общение между родителями, детьми и братьями (siblings)
  • Реализация шины сообщений с использованием Singleton и Observer шаблонов
  • Реализация базового реактивного состояния с помощью композитных компонентов
  • Реализация централизованного хранилища данных с помощью мощного хранилища Pinia reactive store
  • Обзор предоставляемых браузерами альтернатив для обмена и хранения информации
  • Эксперименты с реактивностью, составными элементами и шаблонами прокси в действии

Как мы уже делали ранее, мы будем строить по одной концепции за раз, увеличивая сложность. К концу этой главы вы увидите наглядные примеры реализации, и сможете решить, когда применять каждую из них, исходя из потребностей вашего приложения.

Некоторые из них больше подходят для небольших приложений, а другие - для больших и сложных. Вы сможете лучше подготовиться к управлению потоком информации для вашего приложения.

Технические требования

В этой главе мы рассмотрим концепции и применим шаблоны для управления связью и потоком информации между компонентами. Вы должны быть в состоянии выполнить код, представленный в этом тексте, но для лучшего понимания и контекстного опыта вам будет полезно ознакомиться с полным кодом приложения для этой главы, доступным в репозитории к этой книге: https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter07.

Если вы начинаете новый проект, просто следуйте инструкциям, как показано в главе 3, Установка рабочего проекта.

Посмотрите следующее видео, чтобы увидеть код в действии.

Основное взаимодействие компонентов

Ранее мы видели, что родительский компонент и его дочерние компоненты имеют довольно простой и понятный способ взаимодействия. Родители передают данные в виде props своим дочерним компонентам, а те поднимают события (emits), чтобы привлечь внимание родителя.

Подобно сопоставимости параметров и аргументов в функциях, props получают простые данные по копии, а сложные типы (объекты, массивы и т.д.) - по ссылке.

Таким образом, мы можем передать от родителя к ребенку обычный объект с функциями-членами, а ребенок будет выполнять эти функции для доступа к данным родителя.

Несмотря на то, что это "работает", это своего рода антипаттерн, поскольку он скрывает отношения и затрудняет понимание потока данных. Правильным способом передачи данных вверх по дереву компонентов являются события (emits).

При этом следует отметить, что дочерние компоненты "не знают" друг друга, то есть не имеют прямого способа взаимодействия между собой. Мы можем передать реактивную переменную и заставить каждый компонент обращаться к ней, и это, конечно, рабочая альтернатива, однако не чистая. В некоторых случаях это дает простое решение, но опять же может привести к скрытым побочным эффектам.

Для того чтобы управлять рабочим процессом данных чистым способом, у нас есть несколько альтернатив, которые следуют хорошей практике и шаблонам проектирования.

Как общее правило и принцип, компонент, объявивший переменную, является ее владельцем, и именно он должен манипулировать ею. Исходя из этого, при самом базовом взаимодействии информация должна храниться и манипулироваться родительским компонентом и передаваться дочерним.

Для распространения информации мы можем использовать реактивную систему Vue. Ключевым моментом здесь является то, что манипулировать ею будет только родительский компонент. Посмотрим, как это работает на практике, на примере реализации небольшого тривиального приложения, как показано на Рисунке 7.1:

image

Рисунок 7.1 - Прямая базовая связь и реактивность

В данном приложении родительский компонент имеет три прямых дочерних компонента и разделяет с ними реактивный счетчик. Все компоненты отображают метку со значением счетчика и имеют кнопку для запуска инкремента, но только родительский компонент выполняет фактические манипуляции с данными. Vue обеспечивает реактивность, то есть когда родительский компонент изменяет значение, дочерние компоненты также получают его. Все достаточно просто - давайте посмотрим, как это реализовано:

/basic/ParentBasic.vue
vue
<script setup> 
 import {ref} from "vue" 
 import ChildComponent from "./Child.vue" 
 const _counter = ref(0);                                  //1 
diff --git a/assets/ru_book_Chapter_7__Data_Flow_Management.md.4kedV1g-.lean.js b/assets/ru_book_Chapter_7__Data_Flow_Management.md.49uZ6IeN.lean.js
similarity index 94%
rename from assets/ru_book_Chapter_7__Data_Flow_Management.md.4kedV1g-.lean.js
rename to assets/ru_book_Chapter_7__Data_Flow_Management.md.49uZ6IeN.lean.js
index e382881c1..2aa9e7d07 100644
--- a/assets/ru_book_Chapter_7__Data_Flow_Management.md.4kedV1g-.lean.js
+++ b/assets/ru_book_Chapter_7__Data_Flow_Management.md.49uZ6IeN.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_7.01_B18602.o6bwMS2-.jpg",h="/assets/Figure_7.02_B18602.MCka6TCa.jpg",p="/assets/Figure_7.03_B18602.nuCECRuu.jpg",k="/assets/Figure_7.04_B18602.Fie1X6S5.jpg",l="/assets/Figure_7.05_B18602.TmQxDozH.jpg",e="/assets/Figure_7.06_B18602.cOAoOKNU.jpg",r="/assets/Figure_7.07_B18602.3xj_zNi2.jpg",m=JSON.parse('{"title":"Управление потоками данных","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_7__Data_Flow_Management.md","filePath":"ru/book/Chapter_7__Data_Flow_Management.md","lastUpdated":1706427418000}'),E={name:"ru/book/Chapter_7__Data_Flow_Management.md"},g=n("",171),d=[g];function o(y,c,F,u,C,A){return a(),i("div",null,d)}const B=s(E,[["render",o]]);export{m as __pageData,B as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_7.01_B18602.o6bwMS2-.jpg",h="/assets/Figure_7.02_B18602.MCka6TCa.jpg",p="/assets/Figure_7.03_B18602.nuCECRuu.jpg",k="/assets/Figure_7.04_B18602.Fie1X6S5.jpg",l="/assets/Figure_7.05_B18602.TmQxDozH.jpg",e="/assets/Figure_7.06_B18602.cOAoOKNU.jpg",r="/assets/Figure_7.07_B18602.3xj_zNi2.jpg",m=JSON.parse('{"title":"Управление потоками данных","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_7__Data_Flow_Management.md","filePath":"ru/book/Chapter_7__Data_Flow_Management.md","lastUpdated":1706553672000}'),E={name:"ru/book/Chapter_7__Data_Flow_Management.md"},g=n("",171),d=[g];function o(y,c,F,u,C,A){return a(),i("div",null,d)}const B=s(E,[["render",o]]);export{m as __pageData,B as default};
diff --git a/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.buni53i0.js b/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.Jj18pQkg.js
similarity index 99%
rename from assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.buni53i0.js
rename to assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.Jj18pQkg.js
index 98b738ec0..1e89fe107 100644
--- a/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.buni53i0.js
+++ b/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.Jj18pQkg.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_8.01_B18602.ZVUdwX-m.jpg",h="/assets/Figure_8.02_B18602.Hf49VQ_z.jpg",k="/assets/Figure_8.03_B18602.wr7KF2XL.jpg",p="/assets/Figure_8.04_B18602.hzu-KI8z.jpg",l="/assets/Figure_8.05_B18602.O1D03Crl.jpg",e="/assets/Figure_8.06_B18602.g307JX5E.jpg",r="/assets/Figure_8.07_B18602.CCSAmAol.jpg",E="/assets/Figure_8.08_B18602.fEiE3pl3.jpg",m=JSON.parse('{"title":"Многопоточность с Web Workers","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_8__Multithreading_with_Web_Workers.md","filePath":"ru/book/Chapter_8__Multithreading_with_Web_Workers.md","lastUpdated":1706427418000}'),g={name:"ru/book/Chapter_8__Multithreading_with_Web_Workers.md"},d=n('

Многопоточность с Web Workers

В этой главе мы рассмотрим важные темы, которые позволят значительно повысить производительность веб-приложений, особенно одностраничных. Во-первых, мы узнаем, как работают веб-сайты и JavaScript, а также как использовать web workers для повышения эффективности вычислительной мощности приложения, доступа к данным и сетевых коммуникаций. Затем мы представим два новых концептуальных шаблона проектирования и реализуем их в примере приложения вместе с другими шаблонами, с которыми мы уже познакомились ранее.

Кроме того, мы представим две библиотеки, которые облегчат нам сетевые коммуникации, а также работу с постоянной базой данных (базами данных) в IndexedDB. Мы также реализуем простой сервер Node.js для обеспечения обратной связи и тестирования нашей работы в архитектуре с высокой степенью разобщенности, где наши фронтенд- и бэкенд-сервисы взаимодействуют с помощью стандартных API по протоколу HTTP.

В этой главе мы рассмотрим следующие темы:

  • Web workers
  • Шаблон проектирования Business delegate
  • Сетевое взаимодействие внутри Web Worker
  • Встроенная база данных браузера - IndexedDB
  • Как построить простой Node.js API-сервер для тестирования

Концепции, изложенные в этой главе, можно считать "продвинутыми", но мы сведем их к понятным фрагментам, которые можно будет сразу же реализовать. К концу этой главы вы будете иметь твердые знания о том, как реализовать многопоточность в своих веб-приложениях, а также эталонный фреймворк для масштабирования и облегчения использования сложных браузерных API.

Технические требования

Эта глава не добавляет дополнительных требований к нашему приложению. Однако мы увидим только соответствующие части кода, поэтому, чтобы увидеть работу всего приложения, следует обратиться к примерам кода для главы 8, Многопоточность с Web Workers, в GitHub-репозитории книги https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter08.

Посмотрите следующее видео, чтобы увидеть код в действии.

Введение в Web workers

JavaScript является однопоточным языком, то есть в нем нет возможности порождать процессы в отдельных потоках. Это заставляет браузеры запускать JavaScript на веб-странице в одном потоке с другими процессами, что напрямую влияет на производительность страницы, в первую очередь на процесс рендеринга, отвечающий за отображение страницы на экране.

Браузер прилагает значительные усилия для оптимизации работы всех этих движущихся частей, чтобы сделать страницу отзывчивой, производительной, быстрой и эффективной. Однако есть задачи, которые веб-приложение должно выполнять на JavaScript, которые являются тяжелыми и потенциально "блокирующими рендеринг".

Это означает, что браузеру придется обратить внимание на результаты работы кода и использовать все ресурсы для завершения выполняемой функции, прежде чем он сможет сосредоточиться на рендеринге (отображении страницы на экране). Если вы обнаружили на веб-странице процесс, из-за которого сайт кажется "неотзывчивым" или "тормозящим" после начала выполнения какого-либо действия (в некоторых случаях мышь может даже застыть), это может быть одной из причин.

Если открыть инструменты разработчика в современном браузере, то можно получить доступ к некоторым инструментам производительности для анализа поведения веб-страницы и времени, которое занимает каждый шаг процесса.

Например, вот быстрый вид первой загрузки YouTube по общей ссылке в Firefox для Linux:

image

Рисунок 8.1 - Производительность первой загрузки YouTube при использовании инструментов разработчика

На предыдущем скриншоте мы увеличили масштаб обработки страницы, показав, что происходит до первого рендеринга, то есть до того, как пользователь увидит что-то на экране. Это представлено в первой строке Скриншоты, где для данного случая первые видимые элементы появляются в конце временной шкалы (#1).

Вторая строка показывает, чем занят основной Parent Process, и если вы обратите внимание, то самая первая секция (#2) посвящена обработке JavaScript. Процесс Renderer , выделенный и отображаемый черной полосой (#3), не может начаться до тех пор, пока не будет запущен JavaScript.

Когда он запускается, он рисует страницу на экране, и вы получаете видимое содержимое из #1. Это дает примерное представление о том, какую работу выполняет браузер в каждом цикле между рисованиями на экране (так называемыми "кадрами"). Браузер старается делать как можно больше кадров в секунду (fps). Чтобы поддерживать 60 кадров в секунду, он должен выполнять всю эту обработку примерно за 16,67 миллисекунды или меньше.

В лучшем случае процесс JavaScript должен быть решен за половину этого времени, чтобы сохранить плавность восприятия для пользователя. Что же происходит, когда обработка JavaScript занимает больше времени? Все просто: процесс рендеринга откладывается, fps падает и может возникнуть застывший пользовательский интерфейс (UI). В зависимости от особенностей вашего веб-приложения это может стать серьезной проблемой.

Вы можете сказать: "Минуточку, а почему бы нам не сделать тяжелые задачи асинхронными? Разве это не решит проблему?". Ответ: и может, и нет. Когда вы объявляете асинхронную функцию, это означает лишь то, что ее выполнение будет отложено до того момента, когда обработка последовательного кода будет завершена.

Скорее всего, это сдвигает асинхронный код к концу или после выполнения последовательного кода, но затем он будет выполняться последовательно, как обычно. Если процесс рендеринга происходит раньше, то вы можете ощутить прирост производительности, но если нет, то вы столкнетесь с той же проблемой, если асинхронная функция будет выполняться дольше (так как это повлияет на следующий рендеринг).

image

Рисунок 8.2 - Представление выполнения асинхронного кода, перенесенного после выполнения последовательного кода (1)

Тогда, если асинхронные операции не решат проблему производительности полностью, как ее решить? Помимо всех возможных оптимизаций, есть одна технология, которую также следует рассматривать в начале списка альтернатив: Web workers API.

Web workers - это JavaScript-скрипты, выполняющиеся в собственном процессе (или потоке, в зависимости от реализации), что позволяет не нарушать родительский процесс, в котором происходит рендеринг.

API браузера предоставляет довольно простой, но эффективный способ связи с родительским процессом и обратно: систему сообщений. Эти сообщения могут передавать только сериализуемые данные. Родительский процесс и каждый web worker работают в своем окружении и в своих границах памяти, поэтому они не могут совместно использовать ссылки или функции, поэтому все данные, передаваемые между ними, должны быть сериализуемыми, поскольку они копируются в каждый процесс.

Хотя это может показаться недостатком, на самом деле при правильном использовании это преимущество, в чем мы вскоре убедимся. Еще одним недостатком этой архитектуры является то, что web workers не имеют доступа к документной объектной модели (DOM) или объектам Window и, соответственно, к любым их сервисам. Однако они имеют доступ к сети и IndexedDB.

image

Рисунок 8.3 - Послойное представление приложения Vue с фоновыми процессами, использующими web workers.

Как видно из предыдущей диаграммы, мы можем инстанцировать несколько web workers для представления различных типов слоев в нашем приложении (Бизнес, Данные, Коммуникация и т.д.). Хотя web worker может запускаться и завершаться из родительского процесса по своему усмотрению, оба эти действия требуют больших вычислительных затрат, поэтому рекомендуется, чтобы созданные web workers оставались активными в течение всего времени работы приложения и обращались к ним по мере необходимости.

Также не рекомендуется злоупотреблять этим ресурсом, создавая "слишком много" web workers, поскольку каждый из них является отдельным процессом со своими собственными ресурсами. Четкого определения того, что такое "слишком много", не существует, поэтому рекомендуется проявлять осторожность. По моему опыту, если количество web workers не превышает однозначных значений, то даже на маломощных устройствах ваше приложение будет работать с отличной производительностью. Как и во многих других вещах, хорошего может быть слишком много, и это относится и к web workers.

Теперь, когда мы знаем, что такое web workers и чем они могут быть полезны, давайте посмотрим, как реализовать их на чистом JavaScript, а затем как сделать это с помощью Vite.

Реализация web worker

Создание web worker на чистом JavaScript довольно простое и понятное. Объект window предоставляет конструктор, правильно названный Worker, который получает в качестве параметра путь к файлу сценария. Например, если учесть, что наш web worker содержится в файле my_worker.js, то создать его можно следующим образом:

js
if (window.Worker) {
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_8.01_B18602.ZVUdwX-m.jpg",h="/assets/Figure_8.02_B18602.Hf49VQ_z.jpg",k="/assets/Figure_8.03_B18602.wr7KF2XL.jpg",p="/assets/Figure_8.04_B18602.hzu-KI8z.jpg",l="/assets/Figure_8.05_B18602.O1D03Crl.jpg",e="/assets/Figure_8.06_B18602.g307JX5E.jpg",r="/assets/Figure_8.07_B18602.CCSAmAol.jpg",E="/assets/Figure_8.08_B18602.fEiE3pl3.jpg",m=JSON.parse('{"title":"Многопоточность с Web Workers","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_8__Multithreading_with_Web_Workers.md","filePath":"ru/book/Chapter_8__Multithreading_with_Web_Workers.md","lastUpdated":1706553672000}'),g={name:"ru/book/Chapter_8__Multithreading_with_Web_Workers.md"},d=n('

Многопоточность с Web Workers

В этой главе мы рассмотрим важные темы, которые позволят значительно повысить производительность веб-приложений, особенно одностраничных. Во-первых, мы узнаем, как работают веб-сайты и JavaScript, а также как использовать web workers для повышения эффективности вычислительной мощности приложения, доступа к данным и сетевых коммуникаций. Затем мы представим два новых концептуальных шаблона проектирования и реализуем их в примере приложения вместе с другими шаблонами, с которыми мы уже познакомились ранее.

Кроме того, мы представим две библиотеки, которые облегчат нам сетевые коммуникации, а также работу с постоянной базой данных (базами данных) в IndexedDB. Мы также реализуем простой сервер Node.js для обеспечения обратной связи и тестирования нашей работы в архитектуре с высокой степенью разобщенности, где наши фронтенд- и бэкенд-сервисы взаимодействуют с помощью стандартных API по протоколу HTTP.

В этой главе мы рассмотрим следующие темы:

  • Web workers
  • Шаблон проектирования Business delegate
  • Сетевое взаимодействие внутри Web Worker
  • Встроенная база данных браузера - IndexedDB
  • Как построить простой Node.js API-сервер для тестирования

Концепции, изложенные в этой главе, можно считать "продвинутыми", но мы сведем их к понятным фрагментам, которые можно будет сразу же реализовать. К концу этой главы вы будете иметь твердые знания о том, как реализовать многопоточность в своих веб-приложениях, а также эталонный фреймворк для масштабирования и облегчения использования сложных браузерных API.

Технические требования

Эта глава не добавляет дополнительных требований к нашему приложению. Однако мы увидим только соответствующие части кода, поэтому, чтобы увидеть работу всего приложения, следует обратиться к примерам кода для главы 8, Многопоточность с Web Workers, в GitHub-репозитории книги https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter08.

Посмотрите следующее видео, чтобы увидеть код в действии.

Введение в Web workers

JavaScript является однопоточным языком, то есть в нем нет возможности порождать процессы в отдельных потоках. Это заставляет браузеры запускать JavaScript на веб-странице в одном потоке с другими процессами, что напрямую влияет на производительность страницы, в первую очередь на процесс рендеринга, отвечающий за отображение страницы на экране.

Браузер прилагает значительные усилия для оптимизации работы всех этих движущихся частей, чтобы сделать страницу отзывчивой, производительной, быстрой и эффективной. Однако есть задачи, которые веб-приложение должно выполнять на JavaScript, которые являются тяжелыми и потенциально "блокирующими рендеринг".

Это означает, что браузеру придется обратить внимание на результаты работы кода и использовать все ресурсы для завершения выполняемой функции, прежде чем он сможет сосредоточиться на рендеринге (отображении страницы на экране). Если вы обнаружили на веб-странице процесс, из-за которого сайт кажется "неотзывчивым" или "тормозящим" после начала выполнения какого-либо действия (в некоторых случаях мышь может даже застыть), это может быть одной из причин.

Если открыть инструменты разработчика в современном браузере, то можно получить доступ к некоторым инструментам производительности для анализа поведения веб-страницы и времени, которое занимает каждый шаг процесса.

Например, вот быстрый вид первой загрузки YouTube по общей ссылке в Firefox для Linux:

image

Рисунок 8.1 - Производительность первой загрузки YouTube при использовании инструментов разработчика

На предыдущем скриншоте мы увеличили масштаб обработки страницы, показав, что происходит до первого рендеринга, то есть до того, как пользователь увидит что-то на экране. Это представлено в первой строке Скриншоты, где для данного случая первые видимые элементы появляются в конце временной шкалы (#1).

Вторая строка показывает, чем занят основной Parent Process, и если вы обратите внимание, то самая первая секция (#2) посвящена обработке JavaScript. Процесс Renderer , выделенный и отображаемый черной полосой (#3), не может начаться до тех пор, пока не будет запущен JavaScript.

Когда он запускается, он рисует страницу на экране, и вы получаете видимое содержимое из #1. Это дает примерное представление о том, какую работу выполняет браузер в каждом цикле между рисованиями на экране (так называемыми "кадрами"). Браузер старается делать как можно больше кадров в секунду (fps). Чтобы поддерживать 60 кадров в секунду, он должен выполнять всю эту обработку примерно за 16,67 миллисекунды или меньше.

В лучшем случае процесс JavaScript должен быть решен за половину этого времени, чтобы сохранить плавность восприятия для пользователя. Что же происходит, когда обработка JavaScript занимает больше времени? Все просто: процесс рендеринга откладывается, fps падает и может возникнуть застывший пользовательский интерфейс (UI). В зависимости от особенностей вашего веб-приложения это может стать серьезной проблемой.

Вы можете сказать: "Минуточку, а почему бы нам не сделать тяжелые задачи асинхронными? Разве это не решит проблему?". Ответ: и может, и нет. Когда вы объявляете асинхронную функцию, это означает лишь то, что ее выполнение будет отложено до того момента, когда обработка последовательного кода будет завершена.

Скорее всего, это сдвигает асинхронный код к концу или после выполнения последовательного кода, но затем он будет выполняться последовательно, как обычно. Если процесс рендеринга происходит раньше, то вы можете ощутить прирост производительности, но если нет, то вы столкнетесь с той же проблемой, если асинхронная функция будет выполняться дольше (так как это повлияет на следующий рендеринг).

image

Рисунок 8.2 - Представление выполнения асинхронного кода, перенесенного после выполнения последовательного кода (1)

Тогда, если асинхронные операции не решат проблему производительности полностью, как ее решить? Помимо всех возможных оптимизаций, есть одна технология, которую также следует рассматривать в начале списка альтернатив: Web workers API.

Web workers - это JavaScript-скрипты, выполняющиеся в собственном процессе (или потоке, в зависимости от реализации), что позволяет не нарушать родительский процесс, в котором происходит рендеринг.

API браузера предоставляет довольно простой, но эффективный способ связи с родительским процессом и обратно: систему сообщений. Эти сообщения могут передавать только сериализуемые данные. Родительский процесс и каждый web worker работают в своем окружении и в своих границах памяти, поэтому они не могут совместно использовать ссылки или функции, поэтому все данные, передаваемые между ними, должны быть сериализуемыми, поскольку они копируются в каждый процесс.

Хотя это может показаться недостатком, на самом деле при правильном использовании это преимущество, в чем мы вскоре убедимся. Еще одним недостатком этой архитектуры является то, что web workers не имеют доступа к документной объектной модели (DOM) или объектам Window и, соответственно, к любым их сервисам. Однако они имеют доступ к сети и IndexedDB.

image

Рисунок 8.3 - Послойное представление приложения Vue с фоновыми процессами, использующими web workers.

Как видно из предыдущей диаграммы, мы можем инстанцировать несколько web workers для представления различных типов слоев в нашем приложении (Бизнес, Данные, Коммуникация и т.д.). Хотя web worker может запускаться и завершаться из родительского процесса по своему усмотрению, оба эти действия требуют больших вычислительных затрат, поэтому рекомендуется, чтобы созданные web workers оставались активными в течение всего времени работы приложения и обращались к ним по мере необходимости.

Также не рекомендуется злоупотреблять этим ресурсом, создавая "слишком много" web workers, поскольку каждый из них является отдельным процессом со своими собственными ресурсами. Четкого определения того, что такое "слишком много", не существует, поэтому рекомендуется проявлять осторожность. По моему опыту, если количество web workers не превышает однозначных значений, то даже на маломощных устройствах ваше приложение будет работать с отличной производительностью. Как и во многих других вещах, хорошего может быть слишком много, и это относится и к web workers.

Теперь, когда мы знаем, что такое web workers и чем они могут быть полезны, давайте посмотрим, как реализовать их на чистом JavaScript, а затем как сделать это с помощью Vite.

Реализация web worker

Создание web worker на чистом JavaScript довольно простое и понятное. Объект window предоставляет конструктор, правильно названный Worker, который получает в качестве параметра путь к файлу сценария. Например, если учесть, что наш web worker содержится в файле my_worker.js, то создать его можно следующим образом:

js
if (window.Worker) {
     let my_worker = new Worker("my_worker.js")
      ...
 }

Достаточно просто, если конструктор существует в объекте window, то мы просто создаем нового web worker, обращающегося к конструктору напрямую. Вновь созданный web worker предоставляет простой API:

  • .postMessage(message): Отправить сообщение на web worker. Это может быть любой тип данных, который может быть сериализован (основные типы данных, массивы, объекты и т.д.).
  • .onmessage(callback(event)): Это событие срабатывает, когда web worker получает сообщение от родительского процесса. Полученное событие имеет поле .data, которое содержит сообщение/данные, переданные web worker.
  • .onerror(callback(event)): При возникновении ошибки в web worker, срабатывает это событие, которое будет содержать следующие поля:
    • .filename: Имя файла скрипта, сгенерировавшего ошибку.
    • .lineno: Номер строки, на которой произошла ошибка.
    • .message: Строка, содержащая описание ошибки.

Эта система обмена сообщениями позволяет нам осуществлять то, что в противном случае могло бы быть очень сложной формой межпроцессного взаимодействия (IPC). После ее внедрения наш предыдущий код должен выглядеть следующим образом:

js
let my_worker = new Worker("my_worker.js")
diff --git a/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.buni53i0.lean.js b/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.Jj18pQkg.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.buni53i0.lean.js
rename to assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.Jj18pQkg.lean.js
index 457df6cf3..41e8406a9 100644
--- a/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.buni53i0.lean.js
+++ b/assets/ru_book_Chapter_8__Multithreading_with_Web_Workers.md.Jj18pQkg.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_8.01_B18602.ZVUdwX-m.jpg",h="/assets/Figure_8.02_B18602.Hf49VQ_z.jpg",k="/assets/Figure_8.03_B18602.wr7KF2XL.jpg",p="/assets/Figure_8.04_B18602.hzu-KI8z.jpg",l="/assets/Figure_8.05_B18602.O1D03Crl.jpg",e="/assets/Figure_8.06_B18602.g307JX5E.jpg",r="/assets/Figure_8.07_B18602.CCSAmAol.jpg",E="/assets/Figure_8.08_B18602.fEiE3pl3.jpg",m=JSON.parse('{"title":"Многопоточность с Web Workers","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_8__Multithreading_with_Web_Workers.md","filePath":"ru/book/Chapter_8__Multithreading_with_Web_Workers.md","lastUpdated":1706427418000}'),g={name:"ru/book/Chapter_8__Multithreading_with_Web_Workers.md"},d=n("",181),o=[d];function y(F,c,u,A,D,C){return a(),i("div",null,o)}const b=s(g,[["render",y]]);export{m as __pageData,b as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const t="/assets/Figure_8.01_B18602.ZVUdwX-m.jpg",h="/assets/Figure_8.02_B18602.Hf49VQ_z.jpg",k="/assets/Figure_8.03_B18602.wr7KF2XL.jpg",p="/assets/Figure_8.04_B18602.hzu-KI8z.jpg",l="/assets/Figure_8.05_B18602.O1D03Crl.jpg",e="/assets/Figure_8.06_B18602.g307JX5E.jpg",r="/assets/Figure_8.07_B18602.CCSAmAol.jpg",E="/assets/Figure_8.08_B18602.fEiE3pl3.jpg",m=JSON.parse('{"title":"Многопоточность с Web Workers","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_8__Multithreading_with_Web_Workers.md","filePath":"ru/book/Chapter_8__Multithreading_with_Web_Workers.md","lastUpdated":1706553672000}'),g={name:"ru/book/Chapter_8__Multithreading_with_Web_Workers.md"},d=n("",181),o=[d];function y(F,c,u,A,D,C){return a(),i("div",null,o)}const b=s(g,[["render",y]]);export{m as __pageData,b as default};
diff --git a/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.udrgfCq6.js b/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.zTRfTVpt.js
similarity index 99%
rename from assets/ru_book_Chapter_9__Testing_and_Source_Control.md.udrgfCq6.js
rename to assets/ru_book_Chapter_9__Testing_and_Source_Control.md.zTRfTVpt.js
index 45703a5ca..a4326c020 100644
--- a/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.udrgfCq6.js
+++ b/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.zTRfTVpt.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_9.01_B18602.8_iN0RPn.jpg",p="/assets/Figure_9.02_B18602.keq-p3KX.jpg",e="/assets/Figure_9.03_B18602.O38aED9j.jpg",h="/assets/Figure_9.04_B18602.vpqHuseb.jpg",l="/assets/Figure_9.05_B18602.K68Kr4_U.jpg",k="/assets/Figure_9.06_B18602.4QACJQMs.jpg",r="/assets/Figure_9.07_B18602.RxYWaDdB.jpg",o="/assets/Figure_9.08_B18602.MdeLw2Rg.jpg",g="/assets/Figure_9.09_B18602.-8qT82d1.jpg",d="/assets/Figure_9.10_B18602.fvmkIgGO.jpg",c="/assets/Figure_9.11_B18602.XyibXsgt.jpg",D=JSON.parse('{"title":"Тестирование и системы контроля версий","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_9__Testing_and_Source_Control.md","filePath":"ru/book/Chapter_9__Testing_and_Source_Control.md","lastUpdated":1706427418000}'),E={name:"ru/book/Chapter_9__Testing_and_Source_Control.md"},F=t('

Тестирование и системы контроля версий

Успех нашего приложения зависит от многих факторов, помимо качества организации кода или паттернов. Более того, сама природа программного обеспечения подразумевает, что во время и после разработки будут происходить изменения, меняться требования, область применения и т.д.

С каждой разработанной функцией в программное обеспечение вносится элемент сложности, создающий взаимосвязи и зависимости. Новые включения могут нарушить эти связи и внести разрывные изменения, привести к ошибкам или даже полностью вывести систему из строя.

Решением этой проблемы является отслеживание изменений кода и проведение тестов приложения для выявления проблем и максимального обеспечения соответствия системы желаемым атрибутам ПО и удовлетворения требований.

В этой главе мы рассмотрим, как можно более точно определить, что происходит в системе.

  • Различные подходы к тестированию и концепция тестовой разработки (TDD)
  • Установка тестового пакета (Vitest) и инструментов тестирования (Vue Test Utils) для нашего проекта
  • Создание и запуск тестов на существующем проекте для синхронного и асинхронного кода
  • Тестирование наших компонентов с помощью симуляции взаимодействия с пользователем
  • Установка и управление нашим исходным кодом с помощью Git и онлайн-репозиториев, таких как GitHub или GitLab

Представленные в этой главе концепции являются введением в важные профессиональные навыки разработчика, обеспечивающие создание качественного программного обеспечения.

Часто эти задачи остаются в стороне или отходят на второй план. Однако их отсутствие может привести к дорогостоящим ошибкам и длительному переутомлению по мере роста сложности программного обеспечения.

Для нетривиальных приложений, в которых задействовано более одного разработчика, в настоящее время вряд ли можно представить себе проект, в котором не использовались бы некоторые из этих инструментов.

В этой главе мы сосредоточимся на Unit testing и инструментах, предоставляемых командой Vue для его выполнения.

Технические требования

Эта глава не имеет дополнительных требований по сравнению с предыдущими реализациями примеров кода. Окончательный исходный код можно найти в официальном репозитории этой книги по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter09.

Посмотрите следующее видео, чтобы увидеть код в действии.

Что такое тестирование и TDD

Тестирование - это процесс проверки того, что программное обеспечение делает то, что должно делать, в соответствии с требованиями проекта.

Оно включает в себя ручное или автоматизированное выполнение инструментов для оценки и измерения различных свойств и атрибутов программного обеспечения, выявления ошибок и багов и предоставления обратной связи разработчикам для принятия мер по их устранению.

Существует множество различных подходов и типов выполняемых тестов, например, следующие:

  • Unit testing: при этом соответствующие единицы исходного кода проверяются на соответствие ряду входных и выходных данных. Часто оно автоматизировано.
  • Интеграционное тестирование: Все компоненты системы проверяются вместе как единое целое, при этом ищутся ошибки и недочеты в интеграции, взаимодействии и т.д.
  • End-to-end (e2e) testing: предполагает полную проверку приложения, имитирующую его использование в реальных условиях, взаимодействие с базами данных, сетевые сценарии и т.д. Оно может проводиться как с помощью автоматизированных средств, имитирующих взаимодействие с человеком, так и вручную с использованием реальных пользователей.

Перечисленные виды тестирования - лишь малая часть этой дисциплины, поскольку существуют сотни возможных тестов, которые можно применить к программному обеспечению. В крупных компаниях могут существовать целые группы тестирования, занимающиеся обеспечением качества программного обеспечения.

Как правило, чем сложнее программное обеспечение, тем сложнее может быть и тестирование. На практике план тестирования может быть не менее сложным, чем сам план разработки. Как уже говорилось во введении, мы остановимся на официальных инструментах, предоставляемых командой Vue для решения этой задачи.

Тестирование может проводиться до, во время, после или параллельно с разработкой. TDD - это дисциплина, которая возлагает бремя тестирования как можно раньше в проекте, даже до начала фактического кодирования, с целью соответствия требованиям. Она включает в себя следующие этапы:

  1. Написание тестового случая, основанного на требованиях и дизайне приложения, с указанием ключевых входов и ожидаемых выходов.
  2. Запуск теста, который должен завершиться неудачей (поскольку код еще не написан).
  3. Напишите реальный код для тестирования (функцию, компонент Vue и т.д.).
  4. Запустите тест на созданном коде. В случае неудачи рефакторингуйте код или дизайн.
  5. Начните с нового тестового случая для следующего блока.

Этот процесс повторяется, и ожидается, что он обеспечит разработчикам значительное сокращение "багов" и ошибок и поможет им сосредоточиться на требованиях. Правда, это требует дополнительных усилий на ранних этапах проекта, в отличие от рефакторинга, когда тесты выполняются в конце.

TDD стал популярным в некоторых командах и с некоторыми фреймворками, и предполагается, что он поможет разработчикам улучшить свой собственный код, поскольку они теперь приобретают "тестирующее" мышление. Однако специальных исследований, подтверждающих это, не проводилось, но практикующие эту дисциплину отмечают, что она улучшила их код и дизайн. В связи с этим, конечно же, возникает вопрос: что нужно тестировать и как можно оптимизировать эту задачу в нашем рабочем процессе? Именно эту тему мы и рассмотрим далее.

Что тестировать

Одним из ключевых факторов успеха хорошего плана тестирования и его реализации является решение вопроса о том, что тестировать. Невозможно протестировать всю совокупность возможностей или 100% компонентов и взаимодействий в проекте с учетом внутренних и внешних факторов.

Даже попытка полностью охватить все возможности будет невероятно дорогой и практически невозможной. Вместо этого необходимо сосредоточиться на реальных возможностях того, что можно протестировать в рамках наших временных и бюджетных ограничений, тщательно отобрав нетривиальные элементы, которые "делают или ломают" наши требования к проекту. Зачастую это нелегкая задача.

Когда речь идет о Vue-приложениях, нам необходимо сосредоточиться на важнейших сервисах и компонентах, выполняющих ключевые операции. Нам необходимо протестировать следующее:

  • Сервисы: Самостоятельные функции, как синхронные, так и асинхронные. Функции, которые не возвращают значения, но выполняют логические процедуры, будут служить для другого вида тестирования, чем то, которое мы рассмотрим здесь. Они будут связаны с имитацией сетевых взаимодействий или вызовов баз данных, политик приложения и т.д. Однако принципы их тестирования схожи.
  • Компоненты: Нам необходимо тестировать входы (props) и выходы (events и HTML). Компоненты более высокого уровня, объединяющие другие компоненты для выполнения рабочего процесса или бизнес-логики, также могут быть протестированы аналогичным образом (props, events и HTML-вывод). Однако для них также потребуются другие виды тестирования, например, end-to-end тестирование.

Мы можем написать собственные функции и инструменты для выполнения тестов, но, за исключением некоторых крайних случаев, очевидной рекомендацией является использование стабильных тестовых наборов и инструментов.

В нашем случае для Vue существуют официальные ресурсы, предоставляемые той же командой, под названием Vitest и Vue Test Utils.

Использование тестового пакета/библиотеки имеет множество преимуществ, схожих с использованием фреймворка или библиотеки при "обычной" разработке приложения. Пожалуй, одно из главных преимуществ связано с DX, или Developer eXperience, поскольку они оптимизируют и облегчают процесс разработки, а в лучшем случае - делают его более легким.

Давайте научимся применять эти инструменты в нашем рабочем процессе на примере приложения, которое мы рассмотрим в следующем разделе.

Наш базовый пример приложения

Понимать дисциплину тестирования и знакомиться с инструментами лучше всего, применяя их на практике в реальном проекте. В качестве учебного упражнения мы сначала возьмем работающее приложение, основанное на одном из примеров, представленных в главе 2, Принципы и паттерны проектирования программного обеспечения.

Мы создадим калькулятор Фибоначчи и установим в проект тестовый пакет Vitest и утилиты Vue Testing Utils. Позже мы объясним, что изменится в этом подходе при применении дисциплины TDD.

Код этого приложения можно найти в репозитории к этой главе. После загрузки необходимо выполнить следующую команду для установки зависимостей:

sh
$ npm install

Для запуска приложения необходимо выполнить следующие действия:

sh
$ npm run start

После того как сервер будет готов, при загрузке сайта в браузере должно появиться приложение следующего вида:

image

Рисунок 9.1 - Пример приложения с калькулятором Фибоначчи

Данное приложение создано с целью изучения основ тестирования функций и компонентов, поэтому оно является очень базовым, но достаточным. Нам представлен один служебный файл (/src/services/Fibonacci.js) и три компонента: App.vue, FibonacciInput.vue и FibonacciOutput.vue.

image

Рисунок 9.2 - Компоненты и сервис для приложения

Наш компонент уровня приложения, App.vue, получает от FibonacciInput.vue целое положительное число через событие, которое передает в качестве входного props в FibonacciOutput.vue.

Этот компонент использует сервис Fibonacci.js для вычисления соответствующего числа Фибоначчи, входящего в серию, и представления его пользователю. Как бы просто ни звучало это приложение, оно дает нам базовые примеры для создания тестов для наиболее распространенных случаев, что позволит нам взять уверенный старт. Теперь настало время установить наш тестовый пакет.

Установка и использование Vitest

Vitest - это тестовый пакет, то есть он предоставляет из коробки набор инструментов и фреймворк для выполнения тестов в нашем коде. Разработанный командами Vue и Vite, он легко интегрируется с Vite, даже имеет одну и ту же конфигурацию и уважает организацию друг друга.

Vitest можно выбрать при создании проекта Vue, выбрав соответствующую опцию в мастере создания - эта задача добавит папку /src/tests, несколько примеров и несколько дополнительных записей в наш файл package.json.

Но вся эта шаблонная информация может несколько сбить с толку, если у нас нет опыта работы в этой области. Вместо этого мы начнем с уже созданного проекта и установим Vitest в качестве зависимости разработки - задача, которая позволит нам понять, как он работает и организован.

Установите Vitest из командной строки в корневой каталог проекта с помощью следующей команды:

sh
$ npm install -D vitest

Менеджер пакетов потратит некоторое время на включение Vitest и всех необходимых зависимостей, но не изменит наш исходный код и его организации.

Для удобства мы будем использовать npm и для запуска наших тестов, поэтому нам нужно открыть наш файл package.json и в секции scripts ввести следующие строки, чтобы секция выглядела следующим образом:

json
"scripts": {
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_9.01_B18602.8_iN0RPn.jpg",p="/assets/Figure_9.02_B18602.keq-p3KX.jpg",e="/assets/Figure_9.03_B18602.O38aED9j.jpg",h="/assets/Figure_9.04_B18602.vpqHuseb.jpg",l="/assets/Figure_9.05_B18602.K68Kr4_U.jpg",k="/assets/Figure_9.06_B18602.4QACJQMs.jpg",r="/assets/Figure_9.07_B18602.RxYWaDdB.jpg",o="/assets/Figure_9.08_B18602.MdeLw2Rg.jpg",g="/assets/Figure_9.09_B18602.-8qT82d1.jpg",d="/assets/Figure_9.10_B18602.fvmkIgGO.jpg",c="/assets/Figure_9.11_B18602.XyibXsgt.jpg",D=JSON.parse('{"title":"Тестирование и системы контроля версий","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_9__Testing_and_Source_Control.md","filePath":"ru/book/Chapter_9__Testing_and_Source_Control.md","lastUpdated":1706553672000}'),E={name:"ru/book/Chapter_9__Testing_and_Source_Control.md"},F=t('

Тестирование и системы контроля версий

Успех нашего приложения зависит от многих факторов, помимо качества организации кода или паттернов. Более того, сама природа программного обеспечения подразумевает, что во время и после разработки будут происходить изменения, меняться требования, область применения и т.д.

С каждой разработанной функцией в программное обеспечение вносится элемент сложности, создающий взаимосвязи и зависимости. Новые включения могут нарушить эти связи и внести разрывные изменения, привести к ошибкам или даже полностью вывести систему из строя.

Решением этой проблемы является отслеживание изменений кода и проведение тестов приложения для выявления проблем и максимального обеспечения соответствия системы желаемым атрибутам ПО и удовлетворения требований.

В этой главе мы рассмотрим, как можно более точно определить, что происходит в системе.

  • Различные подходы к тестированию и концепция тестовой разработки (TDD)
  • Установка тестового пакета (Vitest) и инструментов тестирования (Vue Test Utils) для нашего проекта
  • Создание и запуск тестов на существующем проекте для синхронного и асинхронного кода
  • Тестирование наших компонентов с помощью симуляции взаимодействия с пользователем
  • Установка и управление нашим исходным кодом с помощью Git и онлайн-репозиториев, таких как GitHub или GitLab

Представленные в этой главе концепции являются введением в важные профессиональные навыки разработчика, обеспечивающие создание качественного программного обеспечения.

Часто эти задачи остаются в стороне или отходят на второй план. Однако их отсутствие может привести к дорогостоящим ошибкам и длительному переутомлению по мере роста сложности программного обеспечения.

Для нетривиальных приложений, в которых задействовано более одного разработчика, в настоящее время вряд ли можно представить себе проект, в котором не использовались бы некоторые из этих инструментов.

В этой главе мы сосредоточимся на Unit testing и инструментах, предоставляемых командой Vue для его выполнения.

Технические требования

Эта глава не имеет дополнительных требований по сравнению с предыдущими реализациями примеров кода. Окончательный исходный код можно найти в официальном репозитории этой книги по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices/tree/main/Chapter09.

Посмотрите следующее видео, чтобы увидеть код в действии.

Что такое тестирование и TDD

Тестирование - это процесс проверки того, что программное обеспечение делает то, что должно делать, в соответствии с требованиями проекта.

Оно включает в себя ручное или автоматизированное выполнение инструментов для оценки и измерения различных свойств и атрибутов программного обеспечения, выявления ошибок и багов и предоставления обратной связи разработчикам для принятия мер по их устранению.

Существует множество различных подходов и типов выполняемых тестов, например, следующие:

  • Unit testing: при этом соответствующие единицы исходного кода проверяются на соответствие ряду входных и выходных данных. Часто оно автоматизировано.
  • Интеграционное тестирование: Все компоненты системы проверяются вместе как единое целое, при этом ищутся ошибки и недочеты в интеграции, взаимодействии и т.д.
  • End-to-end (e2e) testing: предполагает полную проверку приложения, имитирующую его использование в реальных условиях, взаимодействие с базами данных, сетевые сценарии и т.д. Оно может проводиться как с помощью автоматизированных средств, имитирующих взаимодействие с человеком, так и вручную с использованием реальных пользователей.

Перечисленные виды тестирования - лишь малая часть этой дисциплины, поскольку существуют сотни возможных тестов, которые можно применить к программному обеспечению. В крупных компаниях могут существовать целые группы тестирования, занимающиеся обеспечением качества программного обеспечения.

Как правило, чем сложнее программное обеспечение, тем сложнее может быть и тестирование. На практике план тестирования может быть не менее сложным, чем сам план разработки. Как уже говорилось во введении, мы остановимся на официальных инструментах, предоставляемых командой Vue для решения этой задачи.

Тестирование может проводиться до, во время, после или параллельно с разработкой. TDD - это дисциплина, которая возлагает бремя тестирования как можно раньше в проекте, даже до начала фактического кодирования, с целью соответствия требованиям. Она включает в себя следующие этапы:

  1. Написание тестового случая, основанного на требованиях и дизайне приложения, с указанием ключевых входов и ожидаемых выходов.
  2. Запуск теста, который должен завершиться неудачей (поскольку код еще не написан).
  3. Напишите реальный код для тестирования (функцию, компонент Vue и т.д.).
  4. Запустите тест на созданном коде. В случае неудачи рефакторингуйте код или дизайн.
  5. Начните с нового тестового случая для следующего блока.

Этот процесс повторяется, и ожидается, что он обеспечит разработчикам значительное сокращение "багов" и ошибок и поможет им сосредоточиться на требованиях. Правда, это требует дополнительных усилий на ранних этапах проекта, в отличие от рефакторинга, когда тесты выполняются в конце.

TDD стал популярным в некоторых командах и с некоторыми фреймворками, и предполагается, что он поможет разработчикам улучшить свой собственный код, поскольку они теперь приобретают "тестирующее" мышление. Однако специальных исследований, подтверждающих это, не проводилось, но практикующие эту дисциплину отмечают, что она улучшила их код и дизайн. В связи с этим, конечно же, возникает вопрос: что нужно тестировать и как можно оптимизировать эту задачу в нашем рабочем процессе? Именно эту тему мы и рассмотрим далее.

Что тестировать

Одним из ключевых факторов успеха хорошего плана тестирования и его реализации является решение вопроса о том, что тестировать. Невозможно протестировать всю совокупность возможностей или 100% компонентов и взаимодействий в проекте с учетом внутренних и внешних факторов.

Даже попытка полностью охватить все возможности будет невероятно дорогой и практически невозможной. Вместо этого необходимо сосредоточиться на реальных возможностях того, что можно протестировать в рамках наших временных и бюджетных ограничений, тщательно отобрав нетривиальные элементы, которые "делают или ломают" наши требования к проекту. Зачастую это нелегкая задача.

Когда речь идет о Vue-приложениях, нам необходимо сосредоточиться на важнейших сервисах и компонентах, выполняющих ключевые операции. Нам необходимо протестировать следующее:

  • Сервисы: Самостоятельные функции, как синхронные, так и асинхронные. Функции, которые не возвращают значения, но выполняют логические процедуры, будут служить для другого вида тестирования, чем то, которое мы рассмотрим здесь. Они будут связаны с имитацией сетевых взаимодействий или вызовов баз данных, политик приложения и т.д. Однако принципы их тестирования схожи.
  • Компоненты: Нам необходимо тестировать входы (props) и выходы (events и HTML). Компоненты более высокого уровня, объединяющие другие компоненты для выполнения рабочего процесса или бизнес-логики, также могут быть протестированы аналогичным образом (props, events и HTML-вывод). Однако для них также потребуются другие виды тестирования, например, end-to-end тестирование.

Мы можем написать собственные функции и инструменты для выполнения тестов, но, за исключением некоторых крайних случаев, очевидной рекомендацией является использование стабильных тестовых наборов и инструментов.

В нашем случае для Vue существуют официальные ресурсы, предоставляемые той же командой, под названием Vitest и Vue Test Utils.

Использование тестового пакета/библиотеки имеет множество преимуществ, схожих с использованием фреймворка или библиотеки при "обычной" разработке приложения. Пожалуй, одно из главных преимуществ связано с DX, или Developer eXperience, поскольку они оптимизируют и облегчают процесс разработки, а в лучшем случае - делают его более легким.

Давайте научимся применять эти инструменты в нашем рабочем процессе на примере приложения, которое мы рассмотрим в следующем разделе.

Наш базовый пример приложения

Понимать дисциплину тестирования и знакомиться с инструментами лучше всего, применяя их на практике в реальном проекте. В качестве учебного упражнения мы сначала возьмем работающее приложение, основанное на одном из примеров, представленных в главе 2, Принципы и паттерны проектирования программного обеспечения.

Мы создадим калькулятор Фибоначчи и установим в проект тестовый пакет Vitest и утилиты Vue Testing Utils. Позже мы объясним, что изменится в этом подходе при применении дисциплины TDD.

Код этого приложения можно найти в репозитории к этой главе. После загрузки необходимо выполнить следующую команду для установки зависимостей:

sh
$ npm install

Для запуска приложения необходимо выполнить следующие действия:

sh
$ npm run start

После того как сервер будет готов, при загрузке сайта в браузере должно появиться приложение следующего вида:

image

Рисунок 9.1 - Пример приложения с калькулятором Фибоначчи

Данное приложение создано с целью изучения основ тестирования функций и компонентов, поэтому оно является очень базовым, но достаточным. Нам представлен один служебный файл (/src/services/Fibonacci.js) и три компонента: App.vue, FibonacciInput.vue и FibonacciOutput.vue.

image

Рисунок 9.2 - Компоненты и сервис для приложения

Наш компонент уровня приложения, App.vue, получает от FibonacciInput.vue целое положительное число через событие, которое передает в качестве входного props в FibonacciOutput.vue.

Этот компонент использует сервис Fibonacci.js для вычисления соответствующего числа Фибоначчи, входящего в серию, и представления его пользователю. Как бы просто ни звучало это приложение, оно дает нам базовые примеры для создания тестов для наиболее распространенных случаев, что позволит нам взять уверенный старт. Теперь настало время установить наш тестовый пакет.

Установка и использование Vitest

Vitest - это тестовый пакет, то есть он предоставляет из коробки набор инструментов и фреймворк для выполнения тестов в нашем коде. Разработанный командами Vue и Vite, он легко интегрируется с Vite, даже имеет одну и ту же конфигурацию и уважает организацию друг друга.

Vitest можно выбрать при создании проекта Vue, выбрав соответствующую опцию в мастере создания - эта задача добавит папку /src/tests, несколько примеров и несколько дополнительных записей в наш файл package.json.

Но вся эта шаблонная информация может несколько сбить с толку, если у нас нет опыта работы в этой области. Вместо этого мы начнем с уже созданного проекта и установим Vitest в качестве зависимости разработки - задача, которая позволит нам понять, как он работает и организован.

Установите Vitest из командной строки в корневой каталог проекта с помощью следующей команды:

sh
$ npm install -D vitest

Менеджер пакетов потратит некоторое время на включение Vitest и всех необходимых зависимостей, но не изменит наш исходный код и его организации.

Для удобства мы будем использовать npm и для запуска наших тестов, поэтому нам нужно открыть наш файл package.json и в секции scripts ввести следующие строки, чтобы секция выглядела следующим образом:

json
"scripts": {
       "start": "vite",
       "build": "vite build",
       "preview": "vite preview",
diff --git a/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.udrgfCq6.lean.js b/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.zTRfTVpt.lean.js
similarity index 95%
rename from assets/ru_book_Chapter_9__Testing_and_Source_Control.md.udrgfCq6.lean.js
rename to assets/ru_book_Chapter_9__Testing_and_Source_Control.md.zTRfTVpt.lean.js
index c2026573f..566f84033 100644
--- a/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.udrgfCq6.lean.js
+++ b/assets/ru_book_Chapter_9__Testing_and_Source_Control.md.zTRfTVpt.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_9.01_B18602.8_iN0RPn.jpg",p="/assets/Figure_9.02_B18602.keq-p3KX.jpg",e="/assets/Figure_9.03_B18602.O38aED9j.jpg",h="/assets/Figure_9.04_B18602.vpqHuseb.jpg",l="/assets/Figure_9.05_B18602.K68Kr4_U.jpg",k="/assets/Figure_9.06_B18602.4QACJQMs.jpg",r="/assets/Figure_9.07_B18602.RxYWaDdB.jpg",o="/assets/Figure_9.08_B18602.MdeLw2Rg.jpg",g="/assets/Figure_9.09_B18602.-8qT82d1.jpg",d="/assets/Figure_9.10_B18602.fvmkIgGO.jpg",c="/assets/Figure_9.11_B18602.XyibXsgt.jpg",D=JSON.parse('{"title":"Тестирование и системы контроля версий","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_9__Testing_and_Source_Control.md","filePath":"ru/book/Chapter_9__Testing_and_Source_Control.md","lastUpdated":1706427418000}'),E={name:"ru/book/Chapter_9__Testing_and_Source_Control.md"},F=t("",262),u=[F];function y(C,b,m,v,B,q){return a(),i("div",null,u)}const f=s(E,[["render",y]]);export{D as __pageData,f as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const n="/assets/Figure_9.01_B18602.8_iN0RPn.jpg",p="/assets/Figure_9.02_B18602.keq-p3KX.jpg",e="/assets/Figure_9.03_B18602.O38aED9j.jpg",h="/assets/Figure_9.04_B18602.vpqHuseb.jpg",l="/assets/Figure_9.05_B18602.K68Kr4_U.jpg",k="/assets/Figure_9.06_B18602.4QACJQMs.jpg",r="/assets/Figure_9.07_B18602.RxYWaDdB.jpg",o="/assets/Figure_9.08_B18602.MdeLw2Rg.jpg",g="/assets/Figure_9.09_B18602.-8qT82d1.jpg",d="/assets/Figure_9.10_B18602.fvmkIgGO.jpg",c="/assets/Figure_9.11_B18602.XyibXsgt.jpg",D=JSON.parse('{"title":"Тестирование и системы контроля версий","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/Chapter_9__Testing_and_Source_Control.md","filePath":"ru/book/Chapter_9__Testing_and_Source_Control.md","lastUpdated":1706553672000}'),E={name:"ru/book/Chapter_9__Testing_and_Source_Control.md"},F=t("",262),u=[F];function y(C,b,m,v,B,q){return a(),i("div",null,u)}const f=s(E,[["render",y]]);export{D as __pageData,f as default};
diff --git a/assets/ru_book_index.md.n3JGVia-.js b/assets/ru_book_index.md.RmDnakgK.js
similarity index 99%
rename from assets/ru_book_index.md.n3JGVia-.js
rename to assets/ru_book_index.md.RmDnakgK.js
index 89a441771..5d1ab5efc 100644
--- a/assets/ru_book_index.md.n3JGVia-.js
+++ b/assets/ru_book_index.md.RmDnakgK.js
@@ -1 +1 @@
-import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const o="/assets/book-face.PIGrYfyT.jpg",g=JSON.parse('{"title":"Vue.js 3 - Шаблоны проектирования и лучшие практики","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/index.md","filePath":"ru/book/index.md","lastUpdated":1706427418000}'),s={name:"ru/book/index.md"},i=r('

Vue.js 3 - Шаблоны проектирования и лучшие практики

Автор: Pablo Garaguso

image




Здесь представлен перевод книги "Vue.js 3 - Design Patterns and Best Practices" на русский язык

Предисловие

Vue 3 - это последняя и наиболее производительная версия "прогрессивного фреймворка" Vue.js для создания реактивных и отзывчивых пользовательских интерфейсов. Сам фреймворк представляет новые концепции и подходы к проектированию; шаблоны, которые могут быть необычными для других библиотек и фреймворков. Изучение основ фреймворка и понимание принципов проектирования програмных систем, а также шаблонов проектирования (design patterns), поможет вам определить компромиссы каждого подхода и построить надежные приложения.

Книга начинается с базовых концепций, а затем с помощью примеров и сценариев кодирования ведет постепенно к построению более сложных архитектур. Вы начнете с простой страницы и закончите многопоточным приложением, автономным и инсталируемым Progressive Web Application (PWA). Также рассматривается использование новых инструментов тестирования, доступных для Vue 3.

Помимо демонстрации того, как все делается, эта книга поможет вам научиться думать и искать подход к решению общих проблем, которые уже нашли свое решение в шаблонах проектирования. Это позволит вам сэкономить время и сделать ваше программное обеспечение более приспособленным к будущим изменениям.

Для кого эта книга

Эта книга предназначена для разработчиков Vue, которые заботятся о принципах проектирования фреймворка Vue и использовании часто встречающихся паттернов проектирования при разработке веб-приложений. Вы узнаете, как использовать и настраивать новый сборщик Vite, библиотеку для управления состоянием Pinia, Router 4, web workers и другие технологии для создания производительных и надежных приложений. Предварительное знание JavaScirpt и базовые знания Vue будут полезны.

Чтобы получить максимальную пользу от этой книги

Эта книга предполагает, что вы знакомы с веб-технологиями, такими как JavaScript, HTML и CSS. Разработчики, заинтересованные в расширении своего понимания паттернов проектирования и архитектуры получат максимальную пользу от этой книги. Студенты и новички в мире веб-приложений, могут также следовать этой книге, уделяя пристальное внимание примерам кода и используя предоставленные проекты.

Программное/аппаратное обеспечение, рассматриваемое в книгеТребования к операционной системе
Official Vue 3 ecosystem:

• Vue 3 framework
• Pinia
• Vue Router
• Vite
• Vitest
• Vue Testing Tools
Windows, macOS, or Linux
Node.js (any version + v16 LTS)Windows, macOS, or Linux
Web servers: NGINX, ApacheWindows or Linux
Visual Studio CodeWindows, macOS, or Linux
Chrome browserWindows, macOS, or Linux

Особых требований к аппаратному обеспечению современных компьютеров нет, но рекомендуется иметь, по крайней мере, следующее:

  • Intel или AMD CPU на как минимум 1 GHz
  • 4 GB RAM (больше - лучше)
  • Как минимум 10 GB места на диске (для программ и кода)

Как правило, если на вашем компьютере может работать современный веб-браузер (Chrome/Chromium, Mozilla Firefox или Microsoft Edge), то он должен отвечать всем требованиям для установки и запуска всех инструментов разработчика, упомянутых в этой книге.

Купить книгу

Книга в бумажном варианте на английском языке доступна для покупки на сайте O'Reilly

Скачать файлы кода примеров

Файлы кода примеров этой книги можно загрузить с GitHub по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices.

Код в действии

Видеоролики Программирование в действии для этой книги можно посмотреть на сайте https://packt.link/FtCMS.




Я выражаю Вам признательность за преданность этой дисциплине и благодарю за прочтение этой книги. Желаю Вам благополучия и блестящих успехов в дальнейших начинаниях и профессиональной карьере.

Искренне,

Пабло Давид Гарагусо

www.pdgaraguso.com

',31),n=[i];function d(l,c,u,h,p,m){return a(),t("div",null,n)}const _=e(s,[["render",d]]);export{g as __pageData,_ as default}; +import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const o="/assets/book-face.PIGrYfyT.jpg",g=JSON.parse('{"title":"Vue.js 3 - Шаблоны проектирования и лучшие практики","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/index.md","filePath":"ru/book/index.md","lastUpdated":1706553672000}'),s={name:"ru/book/index.md"},i=r('

Vue.js 3 - Шаблоны проектирования и лучшие практики

Автор: Pablo Garaguso

image




Здесь представлен перевод книги "Vue.js 3 - Design Patterns and Best Practices" на русский язык

Предисловие

Vue 3 - это последняя и наиболее производительная версия "прогрессивного фреймворка" Vue.js для создания реактивных и отзывчивых пользовательских интерфейсов. Сам фреймворк представляет новые концепции и подходы к проектированию; шаблоны, которые могут быть необычными для других библиотек и фреймворков. Изучение основ фреймворка и понимание принципов проектирования програмных систем, а также шаблонов проектирования (design patterns), поможет вам определить компромиссы каждого подхода и построить надежные приложения.

Книга начинается с базовых концепций, а затем с помощью примеров и сценариев кодирования ведет постепенно к построению более сложных архитектур. Вы начнете с простой страницы и закончите многопоточным приложением, автономным и инсталируемым Progressive Web Application (PWA). Также рассматривается использование новых инструментов тестирования, доступных для Vue 3.

Помимо демонстрации того, как все делается, эта книга поможет вам научиться думать и искать подход к решению общих проблем, которые уже нашли свое решение в шаблонах проектирования. Это позволит вам сэкономить время и сделать ваше программное обеспечение более приспособленным к будущим изменениям.

Для кого эта книга

Эта книга предназначена для разработчиков Vue, которые заботятся о принципах проектирования фреймворка Vue и использовании часто встречающихся паттернов проектирования при разработке веб-приложений. Вы узнаете, как использовать и настраивать новый сборщик Vite, библиотеку для управления состоянием Pinia, Router 4, web workers и другие технологии для создания производительных и надежных приложений. Предварительное знание JavaScirpt и базовые знания Vue будут полезны.

Чтобы получить максимальную пользу от этой книги

Эта книга предполагает, что вы знакомы с веб-технологиями, такими как JavaScript, HTML и CSS. Разработчики, заинтересованные в расширении своего понимания паттернов проектирования и архитектуры получат максимальную пользу от этой книги. Студенты и новички в мире веб-приложений, могут также следовать этой книге, уделяя пристальное внимание примерам кода и используя предоставленные проекты.

Программное/аппаратное обеспечение, рассматриваемое в книгеТребования к операционной системе
Official Vue 3 ecosystem:

• Vue 3 framework
• Pinia
• Vue Router
• Vite
• Vitest
• Vue Testing Tools
Windows, macOS, or Linux
Node.js (any version + v16 LTS)Windows, macOS, or Linux
Web servers: NGINX, ApacheWindows or Linux
Visual Studio CodeWindows, macOS, or Linux
Chrome browserWindows, macOS, or Linux

Особых требований к аппаратному обеспечению современных компьютеров нет, но рекомендуется иметь, по крайней мере, следующее:

  • Intel или AMD CPU на как минимум 1 GHz
  • 4 GB RAM (больше - лучше)
  • Как минимум 10 GB места на диске (для программ и кода)

Как правило, если на вашем компьютере может работать современный веб-браузер (Chrome/Chromium, Mozilla Firefox или Microsoft Edge), то он должен отвечать всем требованиям для установки и запуска всех инструментов разработчика, упомянутых в этой книге.

Купить книгу

Книга в бумажном варианте на английском языке доступна для покупки на сайте O'Reilly

Скачать файлы кода примеров

Файлы кода примеров этой книги можно загрузить с GitHub по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices.

Код в действии

Видеоролики Программирование в действии для этой книги можно посмотреть на сайте https://packt.link/FtCMS.




Я выражаю Вам признательность за преданность этой дисциплине и благодарю за прочтение этой книги. Желаю Вам благополучия и блестящих успехов в дальнейших начинаниях и профессиональной карьере.

Искренне,

Пабло Давид Гарагусо

www.pdgaraguso.com

',31),n=[i];function d(l,c,u,h,p,m){return a(),t("div",null,n)}const _=e(s,[["render",d]]);export{g as __pageData,_ as default}; diff --git a/assets/ru_book_index.md.n3JGVia-.lean.js b/assets/ru_book_index.md.RmDnakgK.lean.js similarity index 93% rename from assets/ru_book_index.md.n3JGVia-.lean.js rename to assets/ru_book_index.md.RmDnakgK.lean.js index a3eedecd4..035a3ac97 100644 --- a/assets/ru_book_index.md.n3JGVia-.lean.js +++ b/assets/ru_book_index.md.RmDnakgK.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const o="/assets/book-face.PIGrYfyT.jpg",g=JSON.parse('{"title":"Vue.js 3 - Шаблоны проектирования и лучшие практики","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/index.md","filePath":"ru/book/index.md","lastUpdated":1706427418000}'),s={name:"ru/book/index.md"},i=r("",31),n=[i];function d(l,c,u,h,p,m){return a(),t("div",null,n)}const _=e(s,[["render",d]]);export{g as __pageData,_ as default}; +import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const o="/assets/book-face.PIGrYfyT.jpg",g=JSON.parse('{"title":"Vue.js 3 - Шаблоны проектирования и лучшие практики","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/index.md","filePath":"ru/book/index.md","lastUpdated":1706553672000}'),s={name:"ru/book/index.md"},i=r("",31),n=[i];function d(l,c,u,h,p,m){return a(),t("div",null,n)}const _=e(s,[["render",d]]);export{g as __pageData,_ as default}; diff --git a/assets/ru_book_summary.md.PjGGLL_W.js b/assets/ru_book_summary.md.kKn25AHO.js similarity index 99% rename from assets/ru_book_summary.md.PjGGLL_W.js rename to assets/ru_book_summary.md.kKn25AHO.js index 310ba534e..854f2d618 100644 --- a/assets/ru_book_summary.md.PjGGLL_W.js +++ b/assets/ru_book_summary.md.kKn25AHO.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Что включает в себя эта книга","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/summary.md","filePath":"ru/book/summary.md","lastUpdated":1706427418000}'),o={name:"ru/book/summary.md"},n=r('

Что включает в себя эта книга

Глава 1, Фреймворк Vue 3

Что представляет собой прогрессивный фреймворк Vue 3? В этой главе представлены наиболее важные аспекты фреймворка и другие ключевые понятия.

Глава 2, Принципы и шаблоны проектирования программного обеспечения

Принципы и шаблоны проектирования программного обеспечения являются визитной карточкой хорошей архитектуры программного обеспечения. В этой главе рассказывается о них, приводятся примеры для реализации на JavaScript и Vue 3.

Глава 3, Создание рабочего проекта

В этой главе мы создаем рабочий проект, который будет использоваться в качестве базовой основы для будущих проектов. В ней вы шаг за шагом узнаете, как начать работу над проектом, используя нужные инструменты.

Глава 4, Композиция пользовательского интерфейса с помощью компонентов

Эта глава знакомит с концепцией пользовательских интерфейсов и подводит к реализации веб-приложения, начиная с концептуального визуального дизайна до разработки соответствующих компонентов.

Глава 5, Одностраничные приложения

Это ключевая глава, в которой представлен маршрутизатор Vue Router для создания одностраничных веб-приложений.

Глава 6, Прогрессивные веб-приложения

В этой главе на основе SPA создаются PWA, а также представлены инструменты для оценки их полноты и производительности.

Глава 7, Управление потоками данных

Эта глава знакомит с ключевыми концепциями проектирования и управления потоками данных и информации в приложении. В ней представлена Pinia как официальный фреймворк управления состояниями для Vue 3.

Глава 8, Многопоточность с помощью web-workers

Эта глава посвящена повышению производительности крупномасштабного приложения с помощью многопоточности с web-workers. В ней также представлены дополнительные паттерны для создания простой в реализации и удобной в обслуживании архитектуры.

Глава 9, Тестирование и контроль исходных текстов

В этой главе мы знакомимся с официальными инструментами тестирования предоставляемыми командой Vue, а также с наиболее распространенной системой контроля версий: Git. В главе показано, как создавать тестовые примеры для кода на JavaScript, а также компонентов Vue 3.

Глава 10, Развертывание приложения

В этой главе представлены концепции, необходимые для понимания того, как опубликовать приложение Vue 3 на живом рабочем сервере и как защитить его с помощью Let's Encrypt.

Глава 11, UX Patterns

Эта бонусная глава расширяет понятия пользовательского интерфейса и паттернов пользовательского опыта, чтобы обеспечить общий язык между разработчиком и дизайнером. В ней представлены общие шаблоны, предусмотренные стандартом HTML 5, и другие общие элементы.

Приложение: Миграция с Vue 2 на Vue 3

В этом приложении представлено руководство по изменениям и вариантам миграции для опытных разработчиков Vue 2.

',25),i=[n];function s(h,u,l,d,c,p){return t(),e("div",null,i)}const _=a(o,[["render",s]]);export{b as __pageData,_ as default}; +import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Что включает в себя эта книга","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/summary.md","filePath":"ru/book/summary.md","lastUpdated":1706553672000}'),o={name:"ru/book/summary.md"},n=r('

Что включает в себя эта книга

Глава 1, Фреймворк Vue 3

Что представляет собой прогрессивный фреймворк Vue 3? В этой главе представлены наиболее важные аспекты фреймворка и другие ключевые понятия.

Глава 2, Принципы и шаблоны проектирования программного обеспечения

Принципы и шаблоны проектирования программного обеспечения являются визитной карточкой хорошей архитектуры программного обеспечения. В этой главе рассказывается о них, приводятся примеры для реализации на JavaScript и Vue 3.

Глава 3, Создание рабочего проекта

В этой главе мы создаем рабочий проект, который будет использоваться в качестве базовой основы для будущих проектов. В ней вы шаг за шагом узнаете, как начать работу над проектом, используя нужные инструменты.

Глава 4, Композиция пользовательского интерфейса с помощью компонентов

Эта глава знакомит с концепцией пользовательских интерфейсов и подводит к реализации веб-приложения, начиная с концептуального визуального дизайна до разработки соответствующих компонентов.

Глава 5, Одностраничные приложения

Это ключевая глава, в которой представлен маршрутизатор Vue Router для создания одностраничных веб-приложений.

Глава 6, Прогрессивные веб-приложения

В этой главе на основе SPA создаются PWA, а также представлены инструменты для оценки их полноты и производительности.

Глава 7, Управление потоками данных

Эта глава знакомит с ключевыми концепциями проектирования и управления потоками данных и информации в приложении. В ней представлена Pinia как официальный фреймворк управления состояниями для Vue 3.

Глава 8, Многопоточность с помощью web-workers

Эта глава посвящена повышению производительности крупномасштабного приложения с помощью многопоточности с web-workers. В ней также представлены дополнительные паттерны для создания простой в реализации и удобной в обслуживании архитектуры.

Глава 9, Тестирование и контроль исходных текстов

В этой главе мы знакомимся с официальными инструментами тестирования предоставляемыми командой Vue, а также с наиболее распространенной системой контроля версий: Git. В главе показано, как создавать тестовые примеры для кода на JavaScript, а также компонентов Vue 3.

Глава 10, Развертывание приложения

В этой главе представлены концепции, необходимые для понимания того, как опубликовать приложение Vue 3 на живом рабочем сервере и как защитить его с помощью Let's Encrypt.

Глава 11, UX Patterns

Эта бонусная глава расширяет понятия пользовательского интерфейса и паттернов пользовательского опыта, чтобы обеспечить общий язык между разработчиком и дизайнером. В ней представлены общие шаблоны, предусмотренные стандартом HTML 5, и другие общие элементы.

Приложение: Миграция с Vue 2 на Vue 3

В этом приложении представлено руководство по изменениям и вариантам миграции для опытных разработчиков Vue 2.

',25),i=[n];function s(h,u,l,d,c,p){return t(),e("div",null,i)}const _=a(o,[["render",s]]);export{b as __pageData,_ as default}; diff --git a/assets/ru_book_summary.md.PjGGLL_W.lean.js b/assets/ru_book_summary.md.kKn25AHO.lean.js similarity index 92% rename from assets/ru_book_summary.md.PjGGLL_W.lean.js rename to assets/ru_book_summary.md.kKn25AHO.lean.js index f0a68e37b..da12c6f08 100644 --- a/assets/ru_book_summary.md.PjGGLL_W.lean.js +++ b/assets/ru_book_summary.md.kKn25AHO.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Что включает в себя эта книга","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/summary.md","filePath":"ru/book/summary.md","lastUpdated":1706427418000}'),o={name:"ru/book/summary.md"},n=r("",25),i=[n];function s(h,u,l,d,c,p){return t(),e("div",null,i)}const _=a(o,[["render",s]]);export{b as __pageData,_ as default}; +import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Что включает в себя эта книга","description":"Учебник по Vue.js 3","frontmatter":{"pageClass":"textbook","head":[["meta",{"name":"og:site_name","content":"Vue.js 3 - Шаблоны проектирования и лучшие практики"}],["meta",{"name":"description","content":"Учебник по Vue.js 3"}],["meta",{"name":"og:image","content":"/images/book-face.jpg"}],["meta",{"name":"twitter:image","content":"/images/book-face.jpg"}]]},"headers":[],"relativePath":"ru/book/summary.md","filePath":"ru/book/summary.md","lastUpdated":1706553672000}'),o={name:"ru/book/summary.md"},n=r("",25),i=[n];function s(h,u,l,d,c,p){return t(),e("div",null,i)}const _=a(o,[["render",s]]);export{b as __pageData,_ as default}; diff --git a/assets/ru_deployment_ci-cd.md.6l-WW8pm.js b/assets/ru_deployment_ci-cd.md.Ki1so5jw.js similarity index 96% rename from assets/ru_deployment_ci-cd.md.6l-WW8pm.js rename to assets/ru_deployment_ci-cd.md.Ki1so5jw.js index 050a15df7..ee92ad81a 100644 --- a/assets/ru_deployment_ci-cd.md.6l-WW8pm.js +++ b/assets/ru_deployment_ci-cd.md.Ki1so5jw.js @@ -1 +1 @@ -import{_ as a,c as s,o as n,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const D=JSON.parse('{"title":"CI/CD","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/ci-cd.md","filePath":"ru/deployment/ci-cd.md","lastUpdated":1706427418000}'),o={name:"ru/deployment/ci-cd.md"},c=e("h1",{id:"ci-cd",tabindex:"-1"},[t("CI/CD "),e("a",{class:"header-anchor",href:"#ci-cd","aria-label":'Permalink to "CI/CD"'},"​")],-1),i=e("details",{class:"details custom-block"},[e("summary",null,"Что такое CI/CD?"),e("p",null,"CI/CD (Continuous Integration, Continuous Delivery — непрерывная интеграция и доставка) — это технология автоматизации билда, тестирования и развертывания разрабатываемого проекта."),e("p",null,"Другими словами, процесс перехода лежащего в репозитории кода в рабочий продукт на облачном сервере, например."),e("p",null,[t("Элементы CI/CD полезны не только девопс инженеру, но и простому фронтендеру, позволяя ему после "),e("code",null,"git commit/push"),t(" изменений кода получить рабочий сайт, например, на GitHub Pages без дополнительных действий.")]),e("p",null,"Основные инструменты для CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis")],-1),l=[c,i];function d(r,u,p,m,C,_){return n(),s("div",null,l)}const f=a(o,[["render",d]]);export{D as __pageData,f as default}; +import{_ as a,c as s,o as n,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const D=JSON.parse('{"title":"CI/CD","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/ci-cd.md","filePath":"ru/deployment/ci-cd.md","lastUpdated":1706553672000}'),o={name:"ru/deployment/ci-cd.md"},c=e("h1",{id:"ci-cd",tabindex:"-1"},[t("CI/CD "),e("a",{class:"header-anchor",href:"#ci-cd","aria-label":'Permalink to "CI/CD"'},"​")],-1),i=e("details",{class:"details custom-block"},[e("summary",null,"Что такое CI/CD?"),e("p",null,"CI/CD (Continuous Integration, Continuous Delivery — непрерывная интеграция и доставка) — это технология автоматизации билда, тестирования и развертывания разрабатываемого проекта."),e("p",null,"Другими словами, процесс перехода лежащего в репозитории кода в рабочий продукт на облачном сервере, например."),e("p",null,[t("Элементы CI/CD полезны не только девопс инженеру, но и простому фронтендеру, позволяя ему после "),e("code",null,"git commit/push"),t(" изменений кода получить рабочий сайт, например, на GitHub Pages без дополнительных действий.")]),e("p",null,"Основные инструменты для CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis")],-1),l=[c,i];function d(r,u,p,m,C,_){return n(),s("div",null,l)}const f=a(o,[["render",d]]);export{D as __pageData,f as default}; diff --git a/assets/ru_deployment_ci-cd.md.6l-WW8pm.lean.js b/assets/ru_deployment_ci-cd.md.Ki1so5jw.lean.js similarity index 96% rename from assets/ru_deployment_ci-cd.md.6l-WW8pm.lean.js rename to assets/ru_deployment_ci-cd.md.Ki1so5jw.lean.js index 050a15df7..ee92ad81a 100644 --- a/assets/ru_deployment_ci-cd.md.6l-WW8pm.lean.js +++ b/assets/ru_deployment_ci-cd.md.Ki1so5jw.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as n,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const D=JSON.parse('{"title":"CI/CD","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/ci-cd.md","filePath":"ru/deployment/ci-cd.md","lastUpdated":1706427418000}'),o={name:"ru/deployment/ci-cd.md"},c=e("h1",{id:"ci-cd",tabindex:"-1"},[t("CI/CD "),e("a",{class:"header-anchor",href:"#ci-cd","aria-label":'Permalink to "CI/CD"'},"​")],-1),i=e("details",{class:"details custom-block"},[e("summary",null,"Что такое CI/CD?"),e("p",null,"CI/CD (Continuous Integration, Continuous Delivery — непрерывная интеграция и доставка) — это технология автоматизации билда, тестирования и развертывания разрабатываемого проекта."),e("p",null,"Другими словами, процесс перехода лежащего в репозитории кода в рабочий продукт на облачном сервере, например."),e("p",null,[t("Элементы CI/CD полезны не только девопс инженеру, но и простому фронтендеру, позволяя ему после "),e("code",null,"git commit/push"),t(" изменений кода получить рабочий сайт, например, на GitHub Pages без дополнительных действий.")]),e("p",null,"Основные инструменты для CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis")],-1),l=[c,i];function d(r,u,p,m,C,_){return n(),s("div",null,l)}const f=a(o,[["render",d]]);export{D as __pageData,f as default}; +import{_ as a,c as s,o as n,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const D=JSON.parse('{"title":"CI/CD","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/ci-cd.md","filePath":"ru/deployment/ci-cd.md","lastUpdated":1706553672000}'),o={name:"ru/deployment/ci-cd.md"},c=e("h1",{id:"ci-cd",tabindex:"-1"},[t("CI/CD "),e("a",{class:"header-anchor",href:"#ci-cd","aria-label":'Permalink to "CI/CD"'},"​")],-1),i=e("details",{class:"details custom-block"},[e("summary",null,"Что такое CI/CD?"),e("p",null,"CI/CD (Continuous Integration, Continuous Delivery — непрерывная интеграция и доставка) — это технология автоматизации билда, тестирования и развертывания разрабатываемого проекта."),e("p",null,"Другими словами, процесс перехода лежащего в репозитории кода в рабочий продукт на облачном сервере, например."),e("p",null,[t("Элементы CI/CD полезны не только девопс инженеру, но и простому фронтендеру, позволяя ему после "),e("code",null,"git commit/push"),t(" изменений кода получить рабочий сайт, например, на GitHub Pages без дополнительных действий.")]),e("p",null,"Основные инструменты для CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis")],-1),l=[c,i];function d(r,u,p,m,C,_){return n(),s("div",null,l)}const f=a(o,[["render",d]]);export{D as __pageData,f as default}; diff --git a/assets/ru_deployment_docker.md.zQL-SFzA.js b/assets/ru_deployment_docker.md.af4jKnuv.js similarity index 77% rename from assets/ru_deployment_docker.md.zQL-SFzA.js rename to assets/ru_deployment_docker.md.af4jKnuv.js index a749358be..24ef9e3a0 100644 --- a/assets/ru_deployment_docker.md.zQL-SFzA.js +++ b/assets/ru_deployment_docker.md.af4jKnuv.js @@ -1 +1 @@ -import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Docker","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/docker.md","filePath":"ru/deployment/docker.md","lastUpdated":1706427418000}'),c={name:"ru/deployment/docker.md"},d=e("h1",{id:"docker",tabindex:"-1"},[r("Docker "),e("a",{class:"header-anchor",href:"#docker","aria-label":'Permalink to "Docker"'},"​")],-1),s=[d];function n(l,i,p,_,m,k){return o(),a("div",null,s)}const u=t(c,[["render",n]]);export{f as __pageData,u as default}; +import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Docker","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/docker.md","filePath":"ru/deployment/docker.md","lastUpdated":1706553672000}'),c={name:"ru/deployment/docker.md"},d=e("h1",{id:"docker",tabindex:"-1"},[r("Docker "),e("a",{class:"header-anchor",href:"#docker","aria-label":'Permalink to "Docker"'},"​")],-1),s=[d];function n(l,i,p,_,m,k){return o(),a("div",null,s)}const u=t(c,[["render",n]]);export{f as __pageData,u as default}; diff --git a/assets/ru_deployment_docker.md.zQL-SFzA.lean.js b/assets/ru_deployment_docker.md.af4jKnuv.lean.js similarity index 77% rename from assets/ru_deployment_docker.md.zQL-SFzA.lean.js rename to assets/ru_deployment_docker.md.af4jKnuv.lean.js index a749358be..24ef9e3a0 100644 --- a/assets/ru_deployment_docker.md.zQL-SFzA.lean.js +++ b/assets/ru_deployment_docker.md.af4jKnuv.lean.js @@ -1 +1 @@ -import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Docker","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/docker.md","filePath":"ru/deployment/docker.md","lastUpdated":1706427418000}'),c={name:"ru/deployment/docker.md"},d=e("h1",{id:"docker",tabindex:"-1"},[r("Docker "),e("a",{class:"header-anchor",href:"#docker","aria-label":'Permalink to "Docker"'},"​")],-1),s=[d];function n(l,i,p,_,m,k){return o(),a("div",null,s)}const u=t(c,[["render",n]]);export{f as __pageData,u as default}; +import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Docker","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/docker.md","filePath":"ru/deployment/docker.md","lastUpdated":1706553672000}'),c={name:"ru/deployment/docker.md"},d=e("h1",{id:"docker",tabindex:"-1"},[r("Docker "),e("a",{class:"header-anchor",href:"#docker","aria-label":'Permalink to "Docker"'},"​")],-1),s=[d];function n(l,i,p,_,m,k){return o(),a("div",null,s)}const u=t(c,[["render",n]]);export{f as __pageData,u as default}; diff --git a/assets/ru_deployment_github-actions.md.T6cBmLdZ.js b/assets/ru_deployment_github-actions.md.W03pVg1-.js similarity index 99% rename from assets/ru_deployment_github-actions.md.T6cBmLdZ.js rename to assets/ru_deployment_github-actions.md.W03pVg1-.js index d0d495246..6de7601b5 100644 --- a/assets/ru_deployment_github-actions.md.T6cBmLdZ.js +++ b/assets/ru_deployment_github-actions.md.W03pVg1-.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Github Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/github-actions.md","filePath":"ru/deployment/github-actions.md","lastUpdated":1706427418000}'),p={name:"ru/deployment/github-actions.md"},h=n(`

Github Actions

Что такое GitHub Actions?

GitHub Actions самый популярный и удобный способ автоматизации билда, тестирования и развертывания, так что советуется их изучить для применения как в пет, так и в больших коммерческих проектах.

Ваш код должен быть на GitHub, естественно.

Добавьте в корень репозитория файл .github/workflows/deploy.yaml (имя самого файла может быть любым)

В нем будут GitHub Actions инструкции.

GitHub Actions - пример деплоя на GitHub Pages

Образец конфигурационного файла данного проекта (Vue-Faq) с развертыванием на Github Pages

yaml
# .github/workflows/deploy.yaml
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Github Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/github-actions.md","filePath":"ru/deployment/github-actions.md","lastUpdated":1706553672000}'),p={name:"ru/deployment/github-actions.md"},h=n(`

Github Actions

Что такое GitHub Actions?

GitHub Actions самый популярный и удобный способ автоматизации билда, тестирования и развертывания, так что советуется их изучить для применения как в пет, так и в больших коммерческих проектах.

Ваш код должен быть на GitHub, естественно.

Добавьте в корень репозитория файл .github/workflows/deploy.yaml (имя самого файла может быть любым)

В нем будут GitHub Actions инструкции.

GitHub Actions - пример деплоя на GitHub Pages

Образец конфигурационного файла данного проекта (Vue-Faq) с развертыванием на Github Pages

yaml
# .github/workflows/deploy.yaml
 
 name: Build and Deploy
 on:
diff --git a/assets/ru_deployment_github-actions.md.T6cBmLdZ.lean.js b/assets/ru_deployment_github-actions.md.W03pVg1-.lean.js
similarity index 86%
rename from assets/ru_deployment_github-actions.md.T6cBmLdZ.lean.js
rename to assets/ru_deployment_github-actions.md.W03pVg1-.lean.js
index 3cc31e112..4a9045ac7 100644
--- a/assets/ru_deployment_github-actions.md.T6cBmLdZ.lean.js
+++ b/assets/ru_deployment_github-actions.md.W03pVg1-.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Github Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/github-actions.md","filePath":"ru/deployment/github-actions.md","lastUpdated":1706427418000}'),p={name:"ru/deployment/github-actions.md"},h=n("",4),l=[h];function k(t,e,E,d,r,g){return a(),i("div",null,l)}const o=s(p,[["render",k]]);export{c as __pageData,o as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Github Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/github-actions.md","filePath":"ru/deployment/github-actions.md","lastUpdated":1706553672000}'),p={name:"ru/deployment/github-actions.md"},h=n("",4),l=[h];function k(t,e,E,d,r,g){return a(),i("div",null,l)}const o=s(p,[["render",k]]);export{c as __pageData,o as default};
diff --git a/assets/ru_deployment_hosting.md.o2goqYFw.js b/assets/ru_deployment_hosting.md.sdjk58bF.js
similarity index 98%
rename from assets/ru_deployment_hosting.md.o2goqYFw.js
rename to assets/ru_deployment_hosting.md.sdjk58bF.js
index 0f9cd2a28..d82aabd84 100644
--- a/assets/ru_deployment_hosting.md.o2goqYFw.js
+++ b/assets/ru_deployment_hosting.md.sdjk58bF.js
@@ -1 +1 @@
-import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Хостинг","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/hosting.md","filePath":"ru/deployment/hosting.md","lastUpdated":1706427418000}'),l={name:"ru/deployment/hosting.md"},s=r('

Хостинг

Где разместить сайт?

После билда фронтенд проекта вы получаете набор html/css/js/jpeg и других статичных файлов, которые надо разместить на вебсервере, чтобы к вашему сайту был доступ.

Варианты размещения с бесплатными планами:

Также многие облачные провайдеры (Amazon, Google, Oracle, Microsoft) предоставляют бесплатные тарифы с возможностью получить виртуальный сервер, на котором можно установить вебсервер (Nginx, Apache) и захостить свой сайт самостоятельно. В этом случае на нем же можно разместить и бэкенд.

Домен

Купить домен сейчас очень просто и недорого (от 200 рублей в год), в связи с чем рекомендуется это сделать. GitHub Pages и другие хостеры позволяют подключить кастомный домен к вашему сайту. Поддомены удобны для организации окружения разработки (environments):

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL сертификаты

Современные браузеры требуют, чтобы сайт был доступен по HTTPS протоколу. Для этого для вашего домена необходим SSL сертификат. Хостинг провайдеры типа Firebase или Github Pages обеспечат вам сертификат сами. Если вы хостите свой сайт самостоятельно на облачном сервере, то можно сгенерировать сертификат с помощью программы CertBot.

',4),o=[s];function i(n,c,m,d,p,_){return a(),t("div",null,o)}const f=e(l,[["render",i]]);export{u as __pageData,f as default}; +import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Хостинг","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/hosting.md","filePath":"ru/deployment/hosting.md","lastUpdated":1706553672000}'),l={name:"ru/deployment/hosting.md"},s=r('

Хостинг

Где разместить сайт?

После билда фронтенд проекта вы получаете набор html/css/js/jpeg и других статичных файлов, которые надо разместить на вебсервере, чтобы к вашему сайту был доступ.

Варианты размещения с бесплатными планами:

Также многие облачные провайдеры (Amazon, Google, Oracle, Microsoft) предоставляют бесплатные тарифы с возможностью получить виртуальный сервер, на котором можно установить вебсервер (Nginx, Apache) и захостить свой сайт самостоятельно. В этом случае на нем же можно разместить и бэкенд.

Домен

Купить домен сейчас очень просто и недорого (от 200 рублей в год), в связи с чем рекомендуется это сделать. GitHub Pages и другие хостеры позволяют подключить кастомный домен к вашему сайту. Поддомены удобны для организации окружения разработки (environments):

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL сертификаты

Современные браузеры требуют, чтобы сайт был доступен по HTTPS протоколу. Для этого для вашего домена необходим SSL сертификат. Хостинг провайдеры типа Firebase или Github Pages обеспечат вам сертификат сами. Если вы хостите свой сайт самостоятельно на облачном сервере, то можно сгенерировать сертификат с помощью программы CertBot.

',4),o=[s];function i(n,c,m,d,p,_){return a(),t("div",null,o)}const f=e(l,[["render",i]]);export{u as __pageData,f as default}; diff --git a/assets/ru_deployment_hosting.md.o2goqYFw.lean.js b/assets/ru_deployment_hosting.md.sdjk58bF.lean.js similarity index 85% rename from assets/ru_deployment_hosting.md.o2goqYFw.lean.js rename to assets/ru_deployment_hosting.md.sdjk58bF.lean.js index 0b2b4e580..451398a46 100644 --- a/assets/ru_deployment_hosting.md.o2goqYFw.lean.js +++ b/assets/ru_deployment_hosting.md.sdjk58bF.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Хостинг","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/hosting.md","filePath":"ru/deployment/hosting.md","lastUpdated":1706427418000}'),l={name:"ru/deployment/hosting.md"},s=r("",4),o=[s];function i(n,c,m,d,p,_){return a(),t("div",null,o)}const f=e(l,[["render",i]]);export{u as __pageData,f as default}; +import{_ as e,c as t,o as a,U as r}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Хостинг","description":"","frontmatter":{},"headers":[],"relativePath":"ru/deployment/hosting.md","filePath":"ru/deployment/hosting.md","lastUpdated":1706553672000}'),l={name:"ru/deployment/hosting.md"},s=r("",4),o=[s];function i(n,c,m,d,p,_){return a(),t("div",null,o)}const f=e(l,[["render",i]]);export{u as __pageData,f as default}; diff --git a/assets/ru_development_architectural-patterns.md.BL1U-uei.js b/assets/ru_development_architectural-patterns.md.mJwiNHV_.js similarity index 96% rename from assets/ru_development_architectural-patterns.md.BL1U-uei.js rename to assets/ru_development_architectural-patterns.md.mJwiNHV_.js index 028982e64..d548c767f 100644 --- a/assets/ru_development_architectural-patterns.md.BL1U-uei.js +++ b/assets/ru_development_architectural-patterns.md.mJwiNHV_.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Архитектурные решения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/architectural-patterns.md","filePath":"ru/development/architectural-patterns.md","lastUpdated":1706427418000}'),t={name:"ru/development/architectural-patterns.md"},l=n(`

Архитектурные решения

Подходящая архитектура для Vue 3 веб-приложения

Самая удобная архитектура для Vue 3 приложения - модульная.

Изначально, приложение разбивается на логические модули, слабо связанные друг с другом. Например, для онлайн магазина это могут быть модуль каталога товаров, модуль отдельного товара, модуль личного кабинета / аккаунта пользователя.

Кроме того, есть модуль оболочки - то, что иногда называет app shell. Шаблон с хедером, футером, боковым меню и главным окном. В этот модуль целесообразно поместить утилиты и ресурсы, используемые по всему приложению - например, api, useI18n, BaseButton и stringHelpers.

В каждом модуле свои components, composables, assets, utils; возможно, api, routes, views, layouts.

Слабая связанность позволяет разрабатывать каждый модуль достаточно независимо, что значительно повышает вероятность успешности проекта.

Как переиспользовать одни те же разрабатываемые ресурсы на нескольких проектах?

Иногда есть два или более проекта (админ панель и сайт, например) которые должны использовать одни и те же компоненты, утилиты, сервисы, композабл функции и прочие ресурсы, которые сами в свою очередь находятся в процессе разработки.

Самое удобное в данном случае, выделить все ресурсы в отдельный проект/репозиторий, и использовать Git submodules для подключения его как поддиректории в каждом проекте. VS Code позволяет прозрачно и комфортно работать одновременно и с проектом, и с подключенными сабмодулями.

Если нужна версионность и независимость библиотеки ресурсов, можно оформить её как private NPM пакет.

Когда использовать Provide/Inject?

Use cases

  • Настройки темы или конфигурации: Вы можете предоставить глобальные настройки, темы или параметры конфигурации на корневом уровне вашего приложения Vue.js и внедрить их в любой компонент, которому они нужны.

  • Данные аутентификации: Предоставляйте информацию об аутентификации пользователя, например данные пользователя или токены аутентификации, компонентам, которым они необходимы, не передавая их через пропсы.

  • Интернационализация (i18n): Храните данные перевода на корневом уровне и внедряйте их в компоненты, которым требуется отображать текст на разных языках.

  • Тесно связанные компоненты: Например, компонент AccordianPanel, который всегда появляется только внутри слота компонента Accordian. Вы можете инжектировать общие данные, к которым вы всегда хотите иметь доступ, без необходимости передавать их в качестве пропсов.

Лучшие практики и соображения

При использовании provide и inject необходимо помнить о нескольких лучших практиках:

  • Избегайте чрезмерного использования: Хотя provide и inject могут быть очень мощными, не стоит ими злоупотреблять. Оставьте их для случаев, когда вам действительно нужно поделиться данными между компонентами, не создавая тесной связи между ними.

  • Четкая документация: Документируйте данные, которые вы провайдите и инжектируете, чтобы разработчикам было легко понять, как взаимодействуют компоненты. Их также можно типизировать, - подробности в официальной документации.

  • Рассмотрите возможность Prop Drilling: Prop drilling обычно является антипаттерном, но в некоторых случаях передача данных через пропсы может быть более простым и прозрачным подходом. Оцените, являются ли provide и inject лучшим решением для вашего конкретного сценария.

Как лучше организовать работу с лэйаутами (макетами)?

У приложения может быть несколько лэйаутов - один с боковым меню, например, и другой - без. Какие-то страницы показываются с боковым меню, другие - без.

Удобно это регулировать роутами. Делается два вложенных router-view - внешний отвечает за лэйаут, а внутренний (их может быть несколько) - за компоненты в этом лэйауте.

Пример:

vue
// MainLayout
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Архитектурные решения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/architectural-patterns.md","filePath":"ru/development/architectural-patterns.md","lastUpdated":1706553672000}'),t={name:"ru/development/architectural-patterns.md"},l=n(`

Архитектурные решения

Подходящая архитектура для Vue 3 веб-приложения

Самая удобная архитектура для Vue 3 приложения - модульная.

Изначально, приложение разбивается на логические модули, слабо связанные друг с другом. Например, для онлайн магазина это могут быть модуль каталога товаров, модуль отдельного товара, модуль личного кабинета / аккаунта пользователя.

Кроме того, есть модуль оболочки - то, что иногда называет app shell. Шаблон с хедером, футером, боковым меню и главным окном. В этот модуль целесообразно поместить утилиты и ресурсы, используемые по всему приложению - например, api, useI18n, BaseButton и stringHelpers.

В каждом модуле свои components, composables, assets, utils; возможно, api, routes, views, layouts.

Слабая связанность позволяет разрабатывать каждый модуль достаточно независимо, что значительно повышает вероятность успешности проекта.

Как переиспользовать одни те же разрабатываемые ресурсы на нескольких проектах?

Иногда есть два или более проекта (админ панель и сайт, например) которые должны использовать одни и те же компоненты, утилиты, сервисы, композабл функции и прочие ресурсы, которые сами в свою очередь находятся в процессе разработки.

Самое удобное в данном случае, выделить все ресурсы в отдельный проект/репозиторий, и использовать Git submodules для подключения его как поддиректории в каждом проекте. VS Code позволяет прозрачно и комфортно работать одновременно и с проектом, и с подключенными сабмодулями.

Если нужна версионность и независимость библиотеки ресурсов, можно оформить её как private NPM пакет.

Когда использовать Provide/Inject?

Use cases

  • Настройки темы или конфигурации: Вы можете предоставить глобальные настройки, темы или параметры конфигурации на корневом уровне вашего приложения Vue.js и внедрить их в любой компонент, которому они нужны.

  • Данные аутентификации: Предоставляйте информацию об аутентификации пользователя, например данные пользователя или токены аутентификации, компонентам, которым они необходимы, не передавая их через пропсы.

  • Интернационализация (i18n): Храните данные перевода на корневом уровне и внедряйте их в компоненты, которым требуется отображать текст на разных языках.

  • Тесно связанные компоненты: Например, компонент AccordianPanel, который всегда появляется только внутри слота компонента Accordian. Вы можете инжектировать общие данные, к которым вы всегда хотите иметь доступ, без необходимости передавать их в качестве пропсов.

Лучшие практики и соображения

При использовании provide и inject необходимо помнить о нескольких лучших практиках:

  • Избегайте чрезмерного использования: Хотя provide и inject могут быть очень мощными, не стоит ими злоупотреблять. Оставьте их для случаев, когда вам действительно нужно поделиться данными между компонентами, не создавая тесной связи между ними.

  • Четкая документация: Документируйте данные, которые вы провайдите и инжектируете, чтобы разработчикам было легко понять, как взаимодействуют компоненты. Их также можно типизировать, - подробности в официальной документации.

  • Рассмотрите возможность Prop Drilling: Prop drilling обычно является антипаттерном, но в некоторых случаях передача данных через пропсы может быть более простым и прозрачным подходом. Оцените, являются ли provide и inject лучшим решением для вашего конкретного сценария.

Как лучше организовать работу с лэйаутами (макетами)?

У приложения может быть несколько лэйаутов - один с боковым меню, например, и другой - без. Какие-то страницы показываются с боковым меню, другие - без.

Удобно это регулировать роутами. Делается два вложенных router-view - внешний отвечает за лэйаут, а внутренний (их может быть несколько) - за компоненты в этом лэйауте.

Пример:

vue
// MainLayout
 <template>
   <div>
     <AppHeader />
@@ -46,7 +46,7 @@ import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=
       meta: { requiresAuth: true, backRoute: "/" },
     }
   ]
-};
Как сделать один глобальные прелоадер (аналог Suspense)?

Если в приложении одновременно может выполняться несколько асинхронных функций (загрузка с бэкенда, например), а анимационный прелоадер надо показывать один, то можно несложно реализовать его через composable функцию:

AppLoader.vue
vue
<script setup>
+};
Как сделать один глобальный прелоадер (аналог Suspense)?

Если в приложении одновременно может выполняться несколько асинхронных функций (загрузка с бэкенда, например), а анимационный прелоадер надо показывать один, то можно несложно реализовать его через composable функцию:

AppLoader.vue
vue
<script setup>
 import { useAppLoader } from "@/app/composables/useAppLoader";
 const { loading } = useAppLoader();
 </script>
@@ -72,7 +72,7 @@ import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=
   }
 
   return { loading, startLoading, stopLoading };
-}
Some component
js
import { useAppLoader } from "@/app/composables/useAppLoader";
+}
SomeComponent
js
import { useAppLoader } from "@/app/composables/useAppLoader";
 const { startLoading, stopLoading } = useAppLoader();
 
 startLoading();
diff --git a/assets/ru_development_architectural-patterns.md.BL1U-uei.lean.js b/assets/ru_development_architectural-patterns.md.mJwiNHV_.lean.js
similarity index 87%
rename from assets/ru_development_architectural-patterns.md.BL1U-uei.lean.js
rename to assets/ru_development_architectural-patterns.md.mJwiNHV_.lean.js
index 2abc7ca4f..968c3c0df 100644
--- a/assets/ru_development_architectural-patterns.md.BL1U-uei.lean.js
+++ b/assets/ru_development_architectural-patterns.md.mJwiNHV_.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Архитектурные решения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/architectural-patterns.md","filePath":"ru/development/architectural-patterns.md","lastUpdated":1706427418000}'),t={name:"ru/development/architectural-patterns.md"},l=n("",6),p=[l];function h(k,e,E,d,r,g){return a(),i("div",null,p)}const y=s(t,[["render",h]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Архитектурные решения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/architectural-patterns.md","filePath":"ru/development/architectural-patterns.md","lastUpdated":1706553672000}'),t={name:"ru/development/architectural-patterns.md"},l=n("",6),p=[l];function h(k,e,E,d,r,g){return a(),i("div",null,p)}const y=s(t,[["render",h]]);export{c as __pageData,y as default};
diff --git a/assets/ru_development_assets.md.Z6Ws8qcS.js b/assets/ru_development_assets.md.W5Ne8Rvk.js
similarity index 99%
rename from assets/ru_development_assets.md.Z6Ws8qcS.js
rename to assets/ru_development_assets.md.W5Ne8Rvk.js
index 9ba7adf20..bd4f1125e 100644
--- a/assets/ru_development_assets.md.Z6Ws8qcS.js
+++ b/assets/ru_development_assets.md.W5Ne8Rvk.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Ресурсы приложения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/assets.md","filePath":"ru/development/assets.md","lastUpdated":1706427418000}'),h={name:"ru/development/assets.md"},l=n(`

Ресурсы приложения

Ресурсы приложения

Под ресурсами понимаются изображения, иконки, аудио, видео, json, pdf и прочие файлы, которые может использовать ваше приложение либо внутри себя, либо для показа на странице.

Картинки класть в папку public или assets?

Из папки public ресурсы (например, изображения) подключаются в вашем приложении по протоколу HTTP(S), загружаясь по необходимости с сервера - как они это делали всегда.

Ресурсы в папке assets (и вообще из любой поддиректории в src/) при билде приложения переименовываются (добавляется хэш - типа social-banner-e88a22df.png) и помещаются в папку dist/assets, либо, если это картинки маленького размера, они могут кодироваться в Base64 и помещаться в ваш js бандл. В приложении в браузере они доступны, получается, сразу, но размер js бандла увеличивается на размер ресурсов, что увеличивает скорость загрузки.

Доступ к ресурсам осущестляется через import:

js
// gets url to the resource
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Ресурсы приложения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/assets.md","filePath":"ru/development/assets.md","lastUpdated":1706553672000}'),h={name:"ru/development/assets.md"},l=n(`

Ресурсы приложения

Ресурсы приложения

Под ресурсами понимаются изображения, иконки, аудио, видео, json, pdf и прочие файлы, которые может использовать ваше приложение либо внутри себя, либо для показа на странице.

Картинки класть в папку public или assets?

Из папки public ресурсы (например, изображения) подключаются в вашем приложении по протоколу HTTP(S), загружаясь по необходимости с сервера - как они это делали всегда.

Ресурсы в папке assets (и вообще из любой поддиректории в src/) при билде приложения переименовываются (добавляется хэш - типа social-banner-e88a22df.png) и помещаются в папку dist/assets, либо, если это картинки маленького размера, они могут кодироваться в Base64 и помещаться в ваш js бандл. В приложении в браузере они доступны, получается, сразу, но размер js бандла увеличивается на размер ресурсов, что увеличивает скорость загрузки.

Доступ к ресурсам осущестляется через import:

js
// gets url to the resource
 import imageUrl from "./image.img";
 
 // gets raw (string) representation of the resource
diff --git a/assets/ru_development_assets.md.Z6Ws8qcS.lean.js b/assets/ru_development_assets.md.W5Ne8Rvk.lean.js
similarity index 86%
rename from assets/ru_development_assets.md.Z6Ws8qcS.lean.js
rename to assets/ru_development_assets.md.W5Ne8Rvk.lean.js
index 32ba2876c..f49e43e2a 100644
--- a/assets/ru_development_assets.md.Z6Ws8qcS.lean.js
+++ b/assets/ru_development_assets.md.W5Ne8Rvk.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Ресурсы приложения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/assets.md","filePath":"ru/development/assets.md","lastUpdated":1706427418000}'),h={name:"ru/development/assets.md"},l=n("",8),p=[l];function k(t,e,E,r,d,g){return a(),i("div",null,p)}const F=s(h,[["render",k]]);export{c as __pageData,F as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Ресурсы приложения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/assets.md","filePath":"ru/development/assets.md","lastUpdated":1706553672000}'),h={name:"ru/development/assets.md"},l=n("",8),p=[l];function k(t,e,E,r,d,g){return a(),i("div",null,p)}const F=s(h,[["render",k]]);export{c as __pageData,F as default};
diff --git a/assets/ru_development_building.md.riCj-tlN.js b/assets/ru_development_building.md.h_DTCEFb.js
similarity index 99%
rename from assets/ru_development_building.md.riCj-tlN.js
rename to assets/ru_development_building.md.h_DTCEFb.js
index 7c8210c0d..b62b4fade 100644
--- a/assets/ru_development_building.md.riCj-tlN.js
+++ b/assets/ru_development_building.md.h_DTCEFb.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Создание и сборка приложения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/building.md","filePath":"ru/development/building.md","lastUpdated":1706427418000}'),t={name:"ru/development/building.md"},p=n(`

Создание и сборка приложения

Сборка приложения

Чтобы собрать Vue проект в файлы, понятные браузеру, нужен сборщик. Самые популярные - Vite и Webpack

Vite более новый и использует современные технологии, включая esbuild для dev сборок для транспиляции TypeScript в JavaScript, который в 20~30 раз быстрее чем обычный tsc, что делает HMR в десятки раз быстрей, чем на Webpack. Для билда JavaScript для production используется сборщик Rollup.

Нужно учитывать, что каждый сборщик собирает ресурсы приложения (иконки, SVG и пр.) по-своему, используя свои плагины, и требует в этом настройки.

Оба сборщика позволяют расширять свои возможности кастомными плагинами.

Vite или Webpack?

Vite.

Если вам понадобится Webpack, вы будете знать это сами.

npm, yarn или pnpm?

Рекомендуется pnpm как наиболее современный

Кроме того, он, используя жесткие ссылки вместо копирования файлов, очень сильно сохраняет дисковое пространство на компьютере в случае нескольких проектов с node_modules и одинаковыми пакетами в них.

Создание Vue приложения

Vue-cli - устаревший способ

Создание напрямую через Vite:

sh
pnpm create vite

Либо в онлайн песочнице.

Подробнее - на сайте Vite

Как настроить алиас @?

Алиасы - настройка сборщика, и для каждого сборщика устанавливается по-своему.

Для того, чтобы использовать алиас @ в путях в проекте с Vite

js
import BaseIcon from "@/components/ui/BaseIcon.vue";

нужно настроить его в vite.config.j(t)s:

js
// vite.config.js
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Создание и сборка приложения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/building.md","filePath":"ru/development/building.md","lastUpdated":1706553672000}'),t={name:"ru/development/building.md"},p=n(`

Создание и сборка приложения

Сборка приложения

Чтобы собрать Vue проект в файлы, понятные браузеру, нужен сборщик. Самые популярные - Vite и Webpack

Vite более новый и использует современные технологии, включая esbuild для dev сборок для транспиляции TypeScript в JavaScript, который в 20~30 раз быстрее чем обычный tsc, что делает HMR в десятки раз быстрей, чем на Webpack. Для билда JavaScript для production используется сборщик Rollup.

Нужно учитывать, что каждый сборщик собирает ресурсы приложения (иконки, SVG и пр.) по-своему, используя свои плагины, и требует в этом настройки.

Оба сборщика позволяют расширять свои возможности кастомными плагинами.

Vite или Webpack?

Vite.

Если вам понадобится Webpack, вы будете знать это сами.

npm, yarn или pnpm?

Рекомендуется pnpm как наиболее современный

Кроме того, он, используя жесткие ссылки вместо копирования файлов, очень сильно сохраняет дисковое пространство на компьютере в случае нескольких проектов с node_modules и одинаковыми пакетами в них.

Создание Vue приложения

Vue-cli - устаревший способ

Создание напрямую через Vite:

sh
pnpm create vite

Либо в онлайн песочнице.

Подробнее - на сайте Vite

Как настроить алиас @?

Алиасы - настройка сборщика, и для каждого сборщика устанавливается по-своему.

Для того, чтобы использовать алиас @ в путях в проекте с Vite

js
import BaseIcon from "@/components/ui/BaseIcon.vue";

нужно настроить его в vite.config.j(t)s:

js
// vite.config.js
 import path from "node:path";
 
 export default defineConfig({
diff --git a/assets/ru_development_building.md.riCj-tlN.lean.js b/assets/ru_development_building.md.h_DTCEFb.lean.js
similarity index 86%
rename from assets/ru_development_building.md.riCj-tlN.lean.js
rename to assets/ru_development_building.md.h_DTCEFb.lean.js
index bf2f27d7f..351381d5e 100644
--- a/assets/ru_development_building.md.riCj-tlN.lean.js
+++ b/assets/ru_development_building.md.h_DTCEFb.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Создание и сборка приложения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/building.md","filePath":"ru/development/building.md","lastUpdated":1706427418000}'),t={name:"ru/development/building.md"},p=n("",7),e=[p];function l(h,k,d,o,r,c){return a(),i("div",null,e)}const u=s(t,[["render",l]]);export{g as __pageData,u as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Создание и сборка приложения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/building.md","filePath":"ru/development/building.md","lastUpdated":1706553672000}'),t={name:"ru/development/building.md"},p=n("",7),e=[p];function l(h,k,d,o,r,c){return a(),i("div",null,e)}const u=s(t,[["render",l]]);export{g as __pageData,u as default};
diff --git a/assets/ru_development_ide.md.URuu0WX8.js b/assets/ru_development_ide.md.OcUhVyLP.js
similarity index 99%
rename from assets/ru_development_ide.md.URuu0WX8.js
rename to assets/ru_development_ide.md.OcUhVyLP.js
index 0369b83b2..1264bcea5 100644
--- a/assets/ru_development_ide.md.URuu0WX8.js
+++ b/assets/ru_development_ide.md.OcUhVyLP.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"Настройка IDE","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/ide.md","filePath":"ru/development/ide.md","lastUpdated":1706427418000}'),t={name:"ru/development/ide.md"},l=n(`

Настройка IDE

Какой IDE выбрать?

Vue рекомендует Microsoft VS Code. Второй по популярности - WebStorm

В VS Code намного раньше появляются новые официальные расширения для Vue, и вообще эта среда очень удобна для разработки в целом, есть множество полезных расширений, - например, можно запустить GitHub Action и посмотреть его вывод прямо в редакторе.

WebStorm даёт больше возможностей по работе в js, html, но глючит с TypeScript и не только в SFC script setup, и вообще не очень успевает за изменениями во Vue.

Для начинающих однозначно VS Code

Необходимые расширения VS Code

При работе с Vite и Vue 3:

  • ESlint
  • Volar

Могут пригодиться:

  • Typescript Vue Plugin
  • Codeium
  • SFTP
  • GitHub Actions
Настройка VS Code

VS Code позволяет делать очень тонкую настройку. Например, попробуйте создать вот этот файл локальных настроек .vscode/setting.json и посмотрите как изменится редактор.

settings.json
json
{
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"Настройка IDE","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/ide.md","filePath":"ru/development/ide.md","lastUpdated":1706553672000}'),t={name:"ru/development/ide.md"},l=n(`

Настройка IDE

Какой IDE выбрать?

Vue рекомендует Microsoft VS Code. Второй по популярности - WebStorm

В VS Code намного раньше появляются новые официальные расширения для Vue, и вообще эта среда очень удобна для разработки в целом, есть множество полезных расширений, - например, можно запустить GitHub Action и посмотреть его вывод прямо в редакторе.

WebStorm даёт больше возможностей по работе в js, html, но глючит с TypeScript и не только в SFC script setup, и вообще не очень успевает за изменениями во Vue.

Для начинающих однозначно VS Code

Необходимые расширения VS Code

При работе с Vite и Vue 3:

  • ESlint
  • Volar

Могут пригодиться:

  • Typescript Vue Plugin
  • Codeium
  • SFTP
  • GitHub Actions
Настройка VS Code

VS Code позволяет делать очень тонкую настройку. Например, попробуйте создать вот этот файл локальных настроек .vscode/setting.json и посмотрите как изменится редактор.

settings.json
json
{
   "editor.formatOnSave": false,
   "editor.defaultFormatter": "esbenp.prettier-vscode",
   "[vue]": {
diff --git a/assets/ru_development_ide.md.URuu0WX8.lean.js b/assets/ru_development_ide.md.OcUhVyLP.lean.js
similarity index 85%
rename from assets/ru_development_ide.md.URuu0WX8.lean.js
rename to assets/ru_development_ide.md.OcUhVyLP.lean.js
index 2880386f7..9fe21aa0a 100644
--- a/assets/ru_development_ide.md.URuu0WX8.lean.js
+++ b/assets/ru_development_ide.md.OcUhVyLP.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"Настройка IDE","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/ide.md","filePath":"ru/development/ide.md","lastUpdated":1706427418000}'),t={name:"ru/development/ide.md"},l=n("",8),h=[l];function p(k,e,r,E,o,g){return a(),i("div",null,h)}const u=s(t,[["render",p]]);export{d as __pageData,u as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const d=JSON.parse('{"title":"Настройка IDE","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/ide.md","filePath":"ru/development/ide.md","lastUpdated":1706553672000}'),t={name:"ru/development/ide.md"},l=n("",8),h=[l];function p(k,e,r,E,o,g){return a(),i("div",null,h)}const u=s(t,[["render",p]]);export{d as __pageData,u as default};
diff --git a/assets/ru_development_libraries.md.JMPie-jI.js b/assets/ru_development_libraries.md.8LYDjbMs.js
similarity index 96%
rename from assets/ru_development_libraries.md.JMPie-jI.js
rename to assets/ru_development_libraries.md.8LYDjbMs.js
index bdc2d94f1..b35045bdc 100644
--- a/assets/ru_development_libraries.md.JMPie-jI.js
+++ b/assets/ru_development_libraries.md.8LYDjbMs.js
@@ -1 +1 @@
-import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Подскажите удобную библиотеку","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/libraries.md","filePath":"ru/development/libraries.md","lastUpdated":1706427418000}'),s={name:"ru/development/libraries.md"},o=r('

Подскажите удобную библиотеку

Для работы с датами

moment безвозвратно устарел. Есть day.js и day-fnc.js

Однако в 95% случаев хватает возможностей стандартного JavaScript Intl пакета

Для UI компонентов

Существует достаточно много CSS и UI библиотек

Вот в этой статье есть небольшой обзор их тяжеловесности

Quasar и PrimeVue выглядят солидно.

',3),l=[o];function i(c,d,n,_,m,p){return t(),a("div",null,l)}const f=e(s,[["render",i]]);export{h as __pageData,f as default}; +import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Подскажите удобную библиотеку","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/libraries.md","filePath":"ru/development/libraries.md","lastUpdated":1706553672000}'),s={name:"ru/development/libraries.md"},o=r('

Подскажите удобную библиотеку

Для работы с датами

moment безвозвратно устарел. Есть day.js и day-fnc.js

Однако в 95% случаев хватает возможностей стандартного JavaScript Intl пакета

Для UI компонентов

Существует достаточно много CSS и UI библиотек

Вот в этой статье есть небольшой обзор их тяжеловесности

Quasar и PrimeVue выглядят солидно.

',3),l=[o];function i(c,d,n,_,m,p){return t(),a("div",null,l)}const f=e(s,[["render",i]]);export{h as __pageData,f as default}; diff --git a/assets/ru_development_libraries.md.JMPie-jI.lean.js b/assets/ru_development_libraries.md.8LYDjbMs.lean.js similarity index 87% rename from assets/ru_development_libraries.md.JMPie-jI.lean.js rename to assets/ru_development_libraries.md.8LYDjbMs.lean.js index 9b81a34d0..c8074ef6c 100644 --- a/assets/ru_development_libraries.md.JMPie-jI.lean.js +++ b/assets/ru_development_libraries.md.8LYDjbMs.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Подскажите удобную библиотеку","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/libraries.md","filePath":"ru/development/libraries.md","lastUpdated":1706427418000}'),s={name:"ru/development/libraries.md"},o=r("",3),l=[o];function i(c,d,n,_,m,p){return t(),a("div",null,l)}const f=e(s,[["render",i]]);export{h as __pageData,f as default}; +import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Подскажите удобную библиотеку","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/libraries.md","filePath":"ru/development/libraries.md","lastUpdated":1706553672000}'),s={name:"ru/development/libraries.md"},o=r("",3),l=[o];function i(c,d,n,_,m,p){return t(),a("div",null,l)}const f=e(s,[["render",i]]);export{h as __pageData,f as default}; diff --git a/assets/ru_development_misc.md.hSw6bLx2.js b/assets/ru_development_misc.md.xXSfg52U.js similarity index 99% rename from assets/ru_development_misc.md.hSw6bLx2.js rename to assets/ru_development_misc.md.xXSfg52U.js index 36b05e9cb..4a0477850 100644 --- a/assets/ru_development_misc.md.hSw6bLx2.js +++ b/assets/ru_development_misc.md.xXSfg52U.js @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as i,U as e,a9 as t,aa as l}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Полезные советы","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/misc.md","filePath":"ru/development/misc.md","lastUpdated":1706427418000}'),p={name:"ru/development/misc.md"},n=e(`

Полезные советы

Какие есть хорошие библиотеки для работы с ...?

Карусель или слайдер

Keen-Slider, Embla Carousel, Splide

Хорошо известный Swiper не очень подходит для Vue.js

Дата и время

day.js, day-fnc.js

Известный moment.js безвозвратно устарел.

TIP

Современный JavaScript - это гораздо больше, чем было 10 лет назад. В 95% случаев для операций с датой достаточно возможностей стандартного пакета JavaScript Intl

Как поймать момент когда пользователь доскролил до определенного места или сделать virtual scroll?

Intersection Observer

i18n - интернационализация приложения

NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже "интернационализационным фреймворком".

В то же время часто для локализации сайта в большинстве случаев требуются очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n.

По сути обычно нужна реактивная функция, по ключу и текущей локали возвращающая строку.

Вариант реализации через композабл - в этой статье

Ваш бандл "похудеет" на 50Кб.

Options API или Composition API?

Советуется Composition API (script setup) как более логичный и удобный, в котором программист контролирует поток выполнения программы средствами JavaScript, а не просто задает какие-то магические опции.

Ref или Reactive?

Отличие в плане использования - Reactive работает только с объектами и не отслеживает замену объекта. Ref работает со всем и отслеживает замену переменной:

js
const a = Ref(1);
+import{_ as s,c as a,o as i,U as e,a9 as t,aa as l}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Полезные советы","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/misc.md","filePath":"ru/development/misc.md","lastUpdated":1706553672000}'),p={name:"ru/development/misc.md"},n=e(`

Полезные советы

Какие есть хорошие библиотеки для работы с ...?

Карусель или слайдер

Keen-Slider, Embla Carousel, Splide

Хорошо известный Swiper не очень подходит для Vue.js

Дата и время

day.js, day-fnc.js

Известный moment.js безвозвратно устарел.

TIP

Современный JavaScript - это гораздо больше, чем было 10 лет назад. В 95% случаев для операций с датой достаточно возможностей стандартного пакета JavaScript Intl

Как поймать момент когда пользователь доскролил до определенного места или сделать virtual scroll?

Intersection Observer

i18n - интернационализация приложения

NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже "интернационализационным фреймворком".

В то же время часто для локализации сайта в большинстве случаев требуются очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n.

По сути обычно нужна реактивная функция, по ключу и текущей локали возвращающая строку.

Вариант реализации через композабл - в этой статье

Ваш бандл "похудеет" на 50Кб.

Options API или Composition API?

Советуется Composition API (script setup) как более логичный и удобный, в котором программист контролирует поток выполнения программы средствами JavaScript, а не просто задает какие-то магические опции.

Ref или Reactive?

Отличие в плане использования - Reactive работает только с объектами и не отслеживает замену объекта. Ref работает со всем и отслеживает замену переменной:

js
const a = Ref(1);
 const b = Reactive({ x: 1 });
 
 // is OK
diff --git a/assets/ru_development_misc.md.hSw6bLx2.lean.js b/assets/ru_development_misc.md.xXSfg52U.lean.js
similarity index 86%
rename from assets/ru_development_misc.md.hSw6bLx2.lean.js
rename to assets/ru_development_misc.md.xXSfg52U.lean.js
index 4fd3fa900..13fbc2ffd 100644
--- a/assets/ru_development_misc.md.hSw6bLx2.lean.js
+++ b/assets/ru_development_misc.md.xXSfg52U.lean.js
@@ -1 +1 @@
-import{_ as s,c as a,o as i,U as e,a9 as t,aa as l}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Полезные советы","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/misc.md","filePath":"ru/development/misc.md","lastUpdated":1706427418000}'),p={name:"ru/development/misc.md"},n=e("",10),r=[n];function h(o,k,d,c,m,u){return i(),a("div",null,r)}const E=s(p,[["render",h]]);export{y as __pageData,E as default};
+import{_ as s,c as a,o as i,U as e,a9 as t,aa as l}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Полезные советы","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/misc.md","filePath":"ru/development/misc.md","lastUpdated":1706553672000}'),p={name:"ru/development/misc.md"},n=e("",10),r=[n];function h(o,k,d,c,m,u){return i(),a("div",null,r)}const E=s(p,[["render",h]]);export{y as __pageData,E as default};
diff --git a/assets/ru_development_stores.md.IPyYTrHp.js b/assets/ru_development_stores.md.fGoABZW6.js
similarity index 99%
rename from assets/ru_development_stores.md.IPyYTrHp.js
rename to assets/ru_development_stores.md.fGoABZW6.js
index 9535d5848..89ce65e9e 100644
--- a/assets/ru_development_stores.md.IPyYTrHp.js
+++ b/assets/ru_development_stores.md.fGoABZW6.js
@@ -1 +1 @@
-import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"State management во Vue 3","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/stores.md","filePath":"ru/development/stores.md","lastUpdated":1706427418000}'),s={name:"ru/development/stores.md"},i=a('

State management во Vue 3

Зачем нужен State management?

Иногда в приложении нужно передать реактивные данные или функцию из одного компонента в другой, и эти компоненты не принадлежат одной иерархии. Механизмы пропсов/ивентов или provide/inject не подходят для этого. Поэтому во Vue 2 появился Vuex - state management библиотека, которая позволяет хранить реактивный стейт и предоставлять доступ к нему отовсюду.

Библиотека управления стейтом на фронтенде обычно называется "стором".

Как можно передать реактивные данные из одного компонента в другой во Vue 3?
  • Если один компонент является прямым потомком другого - пропсы и ивенты
  • Если один компонент непрямой потомок другого - provide/inject или проп/ивент дриллинг (плохая практика)
  • Если они в разных ветках иерархии - стор или Vue 3 ref/reactive

Vue 3 ref/reactive - это когда в отдельном js модуле вы определяете и экспортируете реактивную переменную:

export const userLoggedIn = ref(false);

После чего она доступна во всём приложении через импорт данного модуля.

Однако, расшаривать просто переменную - архитектурно плохая идея. Обычно вокруг этой переменной есть бизнес логика, которую и надо сделать доступной.

Например, для аутентификации нужен не только сам факт, что пользователь залогинился, но и сопутствующие методы - login(), logout(), register(), isAuthenticated(). Синтез некоего стейта и сопутствующей бизнес логики дал так называемые composable функции во Vue 3.

В некотором смысле - аналог объекта в ООП.

Что такое стор (store) на фронтенде?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Стор (например, Pinia) — это сущность, содержащая состояние и бизнес-логику, которая не привязана к вашему дереву компонентов. Другими словами, здесь находится глобальное состояние. Это что-то вроде компонента, который всегда присутствует, и который каждый может считывать и писать в него.

Официальная документация Pinia

Выглядит как очень неудачное, двусмысленное и запутывающее определение.

С точки зрения разработчика не фронтенда (по сути любой другой язык, кроме JavaScript, плюс частично JavaScript), аналогом конструкции с названиемстор будет база данных - SQL, NoSQL или кэширующий Redis. Там есть аналоги стейта и геттеров (View в SQL БД). Но в 99.99% случаях в базе данных не будет никакой бизнес логики, за исключением ограничений для консистентности данных (например, unique или foreign keys).

С точки зрения разработчика не фронтенда, сторы фронтенда - это просто объекты / stateful сервисы, построенные по шаблону синглтон. Называть их "глобальными сторами" как минимум нелогично.

Скорей всего, это произошло исторически. Сперва был один Vuex, он был один стор и глобален. Потом у него появились модули. Потом у Pinia эти модули стали независимы и расползлись по всему приложению. В итоге, в приложении куча мелких локальных (по области использования) сторов, каждый из которых считает себя глобальным, даже если его использует 2-3 компонента из 1000 на проекте, и даже если в этом сторе 1% - стейта, и 99% - бизнес и сопутствующей логики.

В этом плане использование композабл функций для той же цели (an entity holding state and business logic that isn't bound to your Component tree) - намного более логично. И называть их следует не useAuthStore, а useAuth или useAuthService.

Vuex или Pinia?

Во Vue 3 основной внешней библиотекой управления стейтом стала Pinia. В отличие от Vuex у нее есть поддержка TypeScript, она удобней и, естественно, пользуется преимуществами Vue 3.

Vuex официально устарел (deprecated)

Pinia или Composable functions?

Во Vue 3 появилось нечто, делающее отдельную библиотеку для управления стейтом ненужной. А именно, реактивные типыRef и Reactive, которыми можно пользоваться за пределами компонент. Стало возможным делать свои сторы на основе composable функций и подключать их в любом компоненте.

Основное декларируемое отличие Pinia - интеграция с Vue DevTools, плагины и SSR поддержка. Однако, нужно ли ему то или другое, каждый разработчик решает сам. Работать с composables в DevTools вполне комфортно.

Composable функция, в свою очередь, может иметь как глобальный, так и локальный (переменные объявлены внутри функции) стейты. Это бывает удобно в определенных случаях - можно создать несколько экземпляров composable функций, каждая со своим стейтом. Например, когда у вас на сайте несколько новостных виджетов, различающихся только категорией новостей.

Кроме того, с функциональной точки зрения composable функции имеют полный доступ ко всему Vue Reactivity API, что делает их гибче, чем Pinia.

Composable функции с глобальным стейтом не работают в SSR режиме.

Что касается производительности, то по тестам на изменениях Reactive Pinia примерно в полтора раза медленней Vue 3 Reactive, а на Ref - в 20 раз. Это потому, что Ref (примитивные типы) в Pinia становится частью Reactive. Setup store не решают эту проблему.

Также надо помнить, что любая зависимость (в данном случае библиотека Pinia) может принести проблемы, аналогичные с ситуацией "RIP Vuex", когда библиотека умирает, устаревает, перестает поддерживаться или в ней находят уязвимости. Composable функции, в свою очередь, выглядят основательным нововведением во Vue фреймворк.

Вот интересное обсуждение по теме на /r/vuejs. Пример кода от Reddit пользователя @ferferga показывает, как использовать классы TypeScript с private методами, геттерами, сеттерами (без .value) и поддержкой типов первого класса в качестве store на Composition API (что было бы невозможно с Pinia). Использование классов TS здесь, возможно, не является хорошей практикой, но демонстрирует гибкость и мощь Composition API.

Также вот лайфхак для Devtools от пользователя @coolcosmos: Я просто использую рефы. Минус в том, что вы теряете Devtools, но в режиме разработки я временно импортирую все свои рефы и передаю их в Pinia, так что у меня есть все плюсы и никаких минусов.

Как разделять логику между компонентом и composable функциями?

Удобно представлять это как MVC шаблон, где роль View (и частично Controller) выполняют компоненты, отвечающие преимущественно за визуализацию, а логика и модель (Model и частично Controller) приходятся на композабл функции и их реактивный стейт.

Чтобы понять, что класть в композабл, а что в компонент (который может состоять из нескольких компонент), представьте, что вы меняете компонент на другой - отображающий ваши данные как-то иначе. В идеале, модель (композабл) должен остаться тем же самым, вы переписываете только компонент, в котором логика, ответственная только за отображение.

В то же время, логика (Controller) может делиться между компонентом и композаблом. Например, валидация данных формы может происходить в компоненте (проверка, что поле заполнено), в компоненте с помощью сторонней утилиты (проверка, что пароль - "сложный") и в композабле (проверка, что username - уникален)

',7),r=[i];function n(l,p,c,d,m,u){return o(),t("div",null,r)}const g=e(s,[["render",n]]);export{b as __pageData,g as default}; +import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"State management во Vue 3","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/stores.md","filePath":"ru/development/stores.md","lastUpdated":1706553672000}'),s={name:"ru/development/stores.md"},i=a('

State management во Vue 3

Зачем нужен State management?

Иногда в приложении нужно передать реактивные данные или функцию из одного компонента в другой, и эти компоненты не принадлежат одной иерархии. Механизмы пропсов/ивентов или provide/inject не подходят для этого. Поэтому во Vue 2 появился Vuex - state management библиотека, которая позволяет хранить реактивный стейт и предоставлять доступ к нему отовсюду.

Библиотека управления стейтом на фронтенде обычно называется "стором".

Как можно передать реактивные данные из одного компонента в другой во Vue 3?
  • Если один компонент является прямым потомком другого - пропсы и ивенты
  • Если один компонент непрямой потомок другого - provide/inject или проп/ивент дриллинг (плохая практика)
  • Если они в разных ветках иерархии - стор или Vue 3 ref/reactive

Vue 3 ref/reactive - это когда в отдельном js модуле вы определяете и экспортируете реактивную переменную:

export const userLoggedIn = ref(false);

После чего она доступна во всём приложении через импорт данного модуля.

Однако, расшаривать просто переменную - архитектурно плохая идея. Обычно вокруг этой переменной есть бизнес логика, которую и надо сделать доступной.

Например, для аутентификации нужен не только сам факт, что пользователь залогинился, но и сопутствующие методы - login(), logout(), register(), isAuthenticated(). Синтез некоего стейта и сопутствующей бизнес логики дал так называемые composable функции во Vue 3.

В некотором смысле - аналог объекта в ООП.

Что такое стор (store) на фронтенде?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Стор (например, Pinia) — это сущность, содержащая состояние и бизнес-логику, которая не привязана к вашему дереву компонентов. Другими словами, здесь находится глобальное состояние. Это что-то вроде компонента, который всегда присутствует, и который каждый может считывать и писать в него.

Официальная документация Pinia

Выглядит как очень неудачное, двусмысленное и запутывающее определение.

С точки зрения разработчика не фронтенда (по сути любой другой язык, кроме JavaScript, плюс частично JavaScript), аналогом конструкции с названиемстор будет база данных - SQL, NoSQL или кэширующий Redis. Там есть аналоги стейта и геттеров (View в SQL БД). Но в 99.99% случаях в базе данных не будет никакой бизнес логики, за исключением ограничений для консистентности данных (например, unique или foreign keys).

С точки зрения разработчика не фронтенда, сторы фронтенда - это просто объекты / stateful сервисы, построенные по шаблону синглтон. Называть их "глобальными сторами" как минимум нелогично.

Скорей всего, это произошло исторически. Сперва был один Vuex, он был один стор и глобален. Потом у него появились модули. Потом у Pinia эти модули стали независимы и расползлись по всему приложению. В итоге, в приложении куча мелких локальных (по области использования) сторов, каждый из которых считает себя глобальным, даже если его использует 2-3 компонента из 1000 на проекте, и даже если в этом сторе 1% - стейта, и 99% - бизнес и сопутствующей логики.

В этом плане использование композабл функций для той же цели (an entity holding state and business logic that isn't bound to your Component tree) - намного более логично. И называть их следует не useAuthStore, а useAuth или useAuthService.

Vuex или Pinia?

Во Vue 3 основной внешней библиотекой управления стейтом стала Pinia. В отличие от Vuex у нее есть поддержка TypeScript, она удобней и, естественно, пользуется преимуществами Vue 3.

Vuex официально устарел (deprecated)

Pinia или Composable functions?

Во Vue 3 появилось нечто, делающее отдельную библиотеку для управления стейтом ненужной. А именно, реактивные типыRef и Reactive, которыми можно пользоваться за пределами компонент. Стало возможным делать свои сторы на основе composable функций и подключать их в любом компоненте.

Основное декларируемое отличие Pinia - интеграция с Vue DevTools, плагины и SSR поддержка. Однако, нужно ли ему то или другое, каждый разработчик решает сам. Работать с composables в DevTools вполне комфортно.

Composable функция, в свою очередь, может иметь как глобальный, так и локальный (переменные объявлены внутри функции) стейты. Это бывает удобно в определенных случаях - можно создать несколько экземпляров composable функций, каждая со своим стейтом. Например, когда у вас на сайте несколько новостных виджетов, различающихся только категорией новостей.

Кроме того, с функциональной точки зрения composable функции имеют полный доступ ко всему Vue Reactivity API, что делает их гибче, чем Pinia.

Composable функции с глобальным стейтом не работают в SSR режиме.

Что касается производительности, то по тестам на изменениях Reactive Pinia примерно в полтора раза медленней Vue 3 Reactive, а на Ref - в 20 раз. Это потому, что Ref (примитивные типы) в Pinia становится частью Reactive. Setup store не решают эту проблему.

Также надо помнить, что любая зависимость (в данном случае библиотека Pinia) может принести проблемы, аналогичные с ситуацией "RIP Vuex", когда библиотека умирает, устаревает, перестает поддерживаться или в ней находят уязвимости. Composable функции, в свою очередь, выглядят основательным нововведением во Vue фреймворк.

Вот интересное обсуждение по теме на /r/vuejs. Пример кода от Reddit пользователя @ferferga показывает, как использовать классы TypeScript с private методами, геттерами, сеттерами (без .value) и поддержкой типов первого класса в качестве store на Composition API (что было бы невозможно с Pinia). Использование классов TS здесь, возможно, не является хорошей практикой, но демонстрирует гибкость и мощь Composition API.

Также вот лайфхак для Devtools от пользователя @coolcosmos: Я просто использую рефы. Минус в том, что вы теряете Devtools, но в режиме разработки я временно импортирую все свои рефы и передаю их в Pinia, так что у меня есть все плюсы и никаких минусов.

Как разделять логику между компонентом и composable функциями?

Удобно представлять это как MVC шаблон, где роль View (и частично Controller) выполняют компоненты, отвечающие преимущественно за визуализацию, а логика и модель (Model и частично Controller) приходятся на композабл функции и их реактивный стейт.

Чтобы понять, что класть в композабл, а что в компонент (который может состоять из нескольких компонент), представьте, что вы меняете компонент на другой - отображающий ваши данные как-то иначе. В идеале, модель (композабл) должен остаться тем же самым, вы переписываете только компонент, в котором логика, ответственная только за отображение.

В то же время, логика (Controller) может делиться между компонентом и композаблом. Например, валидация данных формы может происходить в компоненте (проверка, что поле заполнено), в компоненте с помощью сторонней утилиты (проверка, что пароль - "сложный") и в композабле (проверка, что username - уникален)

',7),r=[i];function n(l,p,c,d,m,u){return o(),t("div",null,r)}const g=e(s,[["render",n]]);export{b as __pageData,g as default}; diff --git a/assets/ru_development_stores.md.IPyYTrHp.lean.js b/assets/ru_development_stores.md.fGoABZW6.lean.js similarity index 85% rename from assets/ru_development_stores.md.IPyYTrHp.lean.js rename to assets/ru_development_stores.md.fGoABZW6.lean.js index ed0c9cbf8..f6747affc 100644 --- a/assets/ru_development_stores.md.IPyYTrHp.lean.js +++ b/assets/ru_development_stores.md.fGoABZW6.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"State management во Vue 3","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/stores.md","filePath":"ru/development/stores.md","lastUpdated":1706427418000}'),s={name:"ru/development/stores.md"},i=a("",7),r=[i];function n(l,p,c,d,m,u){return o(),t("div",null,r)}const g=e(s,[["render",n]]);export{b as __pageData,g as default}; +import{_ as e,c as t,o,U as a}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"State management во Vue 3","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/stores.md","filePath":"ru/development/stores.md","lastUpdated":1706553672000}'),s={name:"ru/development/stores.md"},i=a("",7),r=[i];function n(l,p,c,d,m,u){return o(),t("div",null,r)}const g=e(s,[["render",n]]);export{b as __pageData,g as default}; diff --git a/assets/ru_development_testing.md.eG1m_hL_.js b/assets/ru_development_testing.md.FHj2DJPG.js similarity index 98% rename from assets/ru_development_testing.md.eG1m_hL_.js rename to assets/ru_development_testing.md.FHj2DJPG.js index af6402489..a2a177cce 100644 --- a/assets/ru_development_testing.md.eG1m_hL_.js +++ b/assets/ru_development_testing.md.FHj2DJPG.js @@ -1 +1 @@ -import{_ as e,c as t,o as r,U as a}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Тестирование","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/testing.md","filePath":"ru/development/testing.md","lastUpdated":1706427418000}'),s={name:"ru/development/testing.md"},n=a('

Тестирование

Нужно ли тестирование на фронтенде?

Тесты бывают нескольких типов, среди них - unit тесты и интеграционные (e2e) теcты

Unit тестированием во Vue занимаются Vitest, Jest

С тестированием на фронте нужно быть аккуратней, так как написание и переписывание тестов зачастую может занять время, сопоставимое с самой разработкой. В то же время, полезность этих тестов будет под большим вопросом. Их целесообразность проявляется на больших проектах с большим количеством разработчиков. Там unit тесты также отнимают время, но снижают вероятность, что кто-то что-то испортит. В то же время на стартапе unit тесты далеко не самый нужный ингридиент для быстрого создания MVP.

Фронтенд разработка в этом аспекте очень сильно отличается от бэкенд разработки, где unit тесты действительно полезны.

Хорошая статья на эту тему - Unit Test Fetish

Что такое e2e тесты?

На фронте, особенно для веб приложения, которое уже в продакшне и должно время от времени обновляться, важны e2e тесты.

e2e (end-to-end) тестирование — это процесс тестирования программного обеспечения, который имитирует реальные действия пользователей на уровне интерфейса.

При этом будет запущен браузер (обычно, в headless режиме - без UI), и он по написанным скриптам будет проверять работу сайта - наличие элементов на странице, возможность логина и т.п.

Основные средства для e2e тестирования - Cypress, WebdriverIO

При CI/CD проекта прогон тестов - один из основных моментов наряду с линтингом и билдом.

',3),o=[n];function p(i,l,d,_,c,m){return r(),t("div",null,o)}const f=e(s,[["render",p]]);export{u as __pageData,f as default}; +import{_ as e,c as t,o as r,U as a}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Тестирование","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/testing.md","filePath":"ru/development/testing.md","lastUpdated":1706553672000}'),s={name:"ru/development/testing.md"},n=a('

Тестирование

Нужно ли тестирование на фронтенде?

Тесты бывают нескольких типов, среди них - unit тесты и интеграционные (e2e) теcты

Unit тестированием во Vue занимаются Vitest, Jest

С тестированием на фронте нужно быть аккуратней, так как написание и переписывание тестов зачастую может занять время, сопоставимое с самой разработкой. В то же время, полезность этих тестов будет под большим вопросом. Их целесообразность проявляется на больших проектах с большим количеством разработчиков. Там unit тесты также отнимают время, но снижают вероятность, что кто-то что-то испортит. В то же время на стартапе unit тесты далеко не самый нужный ингридиент для быстрого создания MVP.

Фронтенд разработка в этом аспекте очень сильно отличается от бэкенд разработки, где unit тесты действительно полезны.

Хорошая статья на эту тему - Unit Test Fetish

Что такое e2e тесты?

На фронте, особенно для веб приложения, которое уже в продакшне и должно время от времени обновляться, важны e2e тесты.

e2e (end-to-end) тестирование — это процесс тестирования программного обеспечения, который имитирует реальные действия пользователей на уровне интерфейса.

При этом будет запущен браузер (обычно, в headless режиме - без UI), и он по написанным скриптам будет проверять работу сайта - наличие элементов на странице, возможность логина и т.п.

Основные средства для e2e тестирования - Cypress, WebdriverIO

При CI/CD проекта прогон тестов - один из основных моментов наряду с линтингом и билдом.

',3),o=[n];function p(i,l,d,_,c,m){return r(),t("div",null,o)}const f=e(s,[["render",p]]);export{u as __pageData,f as default}; diff --git a/assets/ru_development_testing.md.eG1m_hL_.lean.js b/assets/ru_development_testing.md.FHj2DJPG.lean.js similarity index 86% rename from assets/ru_development_testing.md.eG1m_hL_.lean.js rename to assets/ru_development_testing.md.FHj2DJPG.lean.js index 150b82edb..51bddbf53 100644 --- a/assets/ru_development_testing.md.eG1m_hL_.lean.js +++ b/assets/ru_development_testing.md.FHj2DJPG.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as r,U as a}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Тестирование","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/testing.md","filePath":"ru/development/testing.md","lastUpdated":1706427418000}'),s={name:"ru/development/testing.md"},n=a("",3),o=[n];function p(i,l,d,_,c,m){return r(),t("div",null,o)}const f=e(s,[["render",p]]);export{u as __pageData,f as default}; +import{_ as e,c as t,o as r,U as a}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Тестирование","description":"","frontmatter":{},"headers":[],"relativePath":"ru/development/testing.md","filePath":"ru/development/testing.md","lastUpdated":1706553672000}'),s={name:"ru/development/testing.md"},n=a("",3),o=[n];function p(i,l,d,_,c,m){return r(),t("div",null,o)}const f=e(s,[["render",p]]);export{u as __pageData,f as default}; diff --git a/assets/ru_frontend_about-frameworks.md.PeuasWWO.js b/assets/ru_frontend_about-frameworks.md.QDjLbL5A.js similarity index 99% rename from assets/ru_frontend_about-frameworks.md.PeuasWWO.js rename to assets/ru_frontend_about-frameworks.md.QDjLbL5A.js index 0bd9837c7..e531a9c40 100644 --- a/assets/ru_frontend_about-frameworks.md.PeuasWWO.js +++ b/assets/ru_frontend_about-frameworks.md.QDjLbL5A.js @@ -1,4 +1,4 @@ -import{_ as s,c as e,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"О фронтенд фреймворках","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/about-frameworks.md","filePath":"ru/frontend/about-frameworks.md","lastUpdated":1706427418000}'),i={name:"ru/frontend/about-frameworks.md"},p=t(`

О фронтенд фреймворках

Что такое "реактивность"?

Наверное, самое фундаментальное отличие программы для фронта от программы для бэка, микросервиса и даже отдельного приложения с GUI, это понятие "реактивности".

При работе на бэке программист имеет хорошие возможности управлять потоком данных. Он контролирует откуда их брать, куда передавать, кто их может изменить, всё это хоть в одном потоке, хоть в многопоточной системе.

На фронте большую роль играет фактор интерактивности UI - данные надо динамично показывать пользователю, пользователь может изменять данные, данные могут изменяться различными контрагентами (пользователь, бэкенд, внутренние вычисления). В принципе, возможно использовать обычные программистские подходы как и на бэке, - то есть, самому следить за изменениями данных в каждом месте, и проводить обновление всех зависимостей. Это даст очень много бойлерплейта - рутинного повторяющегося кода. Реактивные фреймворки сильно облегчили жизнь программистам, взяв на себя заботу об этом обновлении зависимостей переменной при её изменении.

В реактивном фреймворке достаточно задать реактивную переменную и указать, что она является, например, значением input поля. При вводе пользователем в это поле значения переменная автоматически обновится, и все другие переменные, зависящие от нее, тоже. Кода писать для этого не надо.

Упрощенно говоря, под капотом реактивная переменная это прокси-обертка над обычной, которая следит за её изменениями и регистрирует всех слушателей, которых надо оповестить об изменении переменной, чтобы они себя пересчитали.

Какие реактивные фронтенд фреймворки существуют

React, Vue, Angular - самые распространенные. Есть множество других, не взлетевших.

Angular используется обычно для больших проектов (больших команд разного уровня программистов) и жестко зажимает разработку в свои правила.

React и Vue более гибки и схожи, но есть существенные отличия.

Vue быстрей, меньше, эффективней, не смешивает HTML и JS, имеет меньший порог входа. Активно развивается.

За React-ом Цукерберг и бо́льшая распространенность. Больше предложений о работе, но и больше кандидатов на одно место.

Почему Vue?

Чтобы можно было разрабатывать и управлять большими сложными программными системами, было изобретено ООП - объектно-ориентированное программирование, где для иерархичного разбиения сложности вводились новые сущности - объекты. Они инкапсулировали в себе данные и поведение (логику).

На фронтенде немного иная ситуация из-за наличия кода на нескольких языках программирования - HTML, CSS, JavaScript. И в данном случае SFC компоненты во Vue отлично служат для разбиения сложности системы. Каждый компонент инкапсулирует HTML шаблон, его стилизацию и логику.

Vue делает это намного лучше, чем тот же React, который сваливает всё в одну кучу. В этом аспекте Vue однозначно является флагманом компонентно-ориентированного программирования (КОП) на фронтэнде.

Кроме того, во Vue 3 появилась реактивность за пределами компонент - ref и reactive переменные можно задать в простом js модуле. Это используется в composable функциях. Стало возможно отделить от представления не только реактивный сервис (useI18n, useScreenSize например), но и бизнес-логику (useShoppingCart, useNewsWidget). Это позволяет использовать на фронтенде MVC шаблон, где роли View и частично Controller выполняют компоненты, отвечающие преимущественно за визуализацию, а логика и модель (Model и частично Controller) приходятся на composable функции и их реактивный стейт.

Это даёт возможность сделать, например, смену дизайна сайта или замену UI библиотеки намного более легкой задачей.

Данная особенность также сильно выделяет Vue на фоне других реактивных фреймворков-аналогов.

Reactivity API во Vue 3, возможно, еще не идеально (именно поэтому Эван Ю экспериментировал с reactivity Transform), но уже вполне подходит для разработки больших, надежных, масштабируемых систем, чего нельзя было сказать о Vue 2.

TIP

Реактивностью Vue можно пользоваться совсем без UI. Например, в этом расширении VS Code элементы Vue 3 reactive, ref и watch используются для организации реактивности в коде без визуальных компонент.

Что может Vue, но не могут React или Svelte?

Vue эффективней работает с реактивностью.

Добавление нового элемента в массив:

js
// React
+import{_ as s,c as e,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"О фронтенд фреймворках","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/about-frameworks.md","filePath":"ru/frontend/about-frameworks.md","lastUpdated":1706553672000}'),i={name:"ru/frontend/about-frameworks.md"},p=t(`

О фронтенд фреймворках

Что такое "реактивность"?

Наверное, самое фундаментальное отличие программы для фронта от программы для бэка, микросервиса и даже отдельного приложения с GUI, это понятие "реактивности".

При работе на бэке программист имеет хорошие возможности управлять потоком данных. Он контролирует откуда их брать, куда передавать, кто их может изменить, всё это хоть в одном потоке, хоть в многопоточной системе.

На фронте большую роль играет фактор интерактивности UI - данные надо динамично показывать пользователю, пользователь может изменять данные, данные могут изменяться различными контрагентами (пользователь, бэкенд, внутренние вычисления). В принципе, возможно использовать обычные программистские подходы как и на бэке, - то есть, самому следить за изменениями данных в каждом месте, и проводить обновление всех зависимостей. Это даст очень много бойлерплейта - рутинного повторяющегося кода. Реактивные фреймворки сильно облегчили жизнь программистам, взяв на себя заботу об этом обновлении зависимостей переменной при её изменении.

В реактивном фреймворке достаточно задать реактивную переменную и указать, что она является, например, значением input поля. При вводе пользователем в это поле значения переменная автоматически обновится, и все другие переменные, зависящие от нее, тоже. Кода писать для этого не надо.

Упрощенно говоря, под капотом реактивная переменная это прокси-обертка над обычной, которая следит за её изменениями и регистрирует всех слушателей, которых надо оповестить об изменении переменной, чтобы они себя пересчитали.

Какие реактивные фронтенд фреймворки существуют

React, Vue, Angular - самые распространенные. Есть множество других, не взлетевших.

Angular используется обычно для больших проектов (больших команд разного уровня программистов) и жестко зажимает разработку в свои правила.

React и Vue более гибки и схожи, но есть существенные отличия.

Vue быстрей, меньше, эффективней, не смешивает HTML и JS, имеет меньший порог входа. Активно развивается.

За React-ом Цукерберг и бо́льшая распространенность. Больше предложений о работе, но и больше кандидатов на одно место.

Почему Vue?

Чтобы можно было разрабатывать и управлять большими сложными программными системами, было изобретено ООП - объектно-ориентированное программирование, где для иерархичного разбиения сложности вводились новые сущности - объекты. Они инкапсулировали в себе данные и поведение (логику).

На фронтенде немного иная ситуация из-за наличия кода на нескольких языках программирования - HTML, CSS, JavaScript. И в данном случае SFC компоненты во Vue отлично служат для разбиения сложности системы. Каждый компонент инкапсулирует HTML шаблон, его стилизацию и логику.

Vue делает это намного лучше, чем тот же React, который сваливает всё в одну кучу. В этом аспекте Vue однозначно является флагманом компонентно-ориентированного программирования (КОП) на фронтэнде.

Кроме того, во Vue 3 появилась реактивность за пределами компонент - ref и reactive переменные можно задать в простом js модуле. Это используется в composable функциях. Стало возможно отделить от представления не только реактивный сервис (useI18n, useScreenSize например), но и бизнес-логику (useShoppingCart, useNewsWidget). Это позволяет использовать на фронтенде MVC шаблон, где роли View и частично Controller выполняют компоненты, отвечающие преимущественно за визуализацию, а логика и модель (Model и частично Controller) приходятся на composable функции и их реактивный стейт.

Это даёт возможность сделать, например, смену дизайна сайта или замену UI библиотеки намного более легкой задачей.

Данная особенность также сильно выделяет Vue на фоне других реактивных фреймворков-аналогов.

Reactivity API во Vue 3, возможно, еще не идеально (именно поэтому Эван Ю экспериментировал с reactivity Transform), но уже вполне подходит для разработки больших, надежных, масштабируемых систем, чего нельзя было сказать о Vue 2.

TIP

Реактивностью Vue можно пользоваться совсем без UI. Например, в этом расширении VS Code элементы Vue 3 reactive, ref и watch используются для организации реактивности в коде без визуальных компонент.

Что может Vue, но не могут React или Svelte?

Vue эффективней работает с реактивностью.

Добавление нового элемента в массив:

js
// React
 setSomeArr([...someArr, newItem]);
 
 // Svelte
diff --git a/assets/ru_frontend_about-frameworks.md.PeuasWWO.lean.js b/assets/ru_frontend_about-frameworks.md.QDjLbL5A.lean.js
similarity index 87%
rename from assets/ru_frontend_about-frameworks.md.PeuasWWO.lean.js
rename to assets/ru_frontend_about-frameworks.md.QDjLbL5A.lean.js
index 9e1b016ea..eeee37506 100644
--- a/assets/ru_frontend_about-frameworks.md.PeuasWWO.lean.js
+++ b/assets/ru_frontend_about-frameworks.md.QDjLbL5A.lean.js
@@ -1 +1 @@
-import{_ as s,c as e,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"О фронтенд фреймворках","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/about-frameworks.md","filePath":"ru/frontend/about-frameworks.md","lastUpdated":1706427418000}'),i={name:"ru/frontend/about-frameworks.md"},p=t("",5),o=[p];function l(n,r,c,d,h,u){return a(),e("div",null,o)}const g=s(i,[["render",l]]);export{m as __pageData,g as default};
+import{_ as s,c as e,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"О фронтенд фреймворках","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/about-frameworks.md","filePath":"ru/frontend/about-frameworks.md","lastUpdated":1706553672000}'),i={name:"ru/frontend/about-frameworks.md"},p=t("",5),o=[p];function l(n,r,c,d,h,u){return a(),e("div",null,o)}const g=s(i,[["render",l]]);export{m as __pageData,g as default};
diff --git a/assets/ru_frontend_architecture.md.Q6KROnXC.js b/assets/ru_frontend_architecture.md.et3W1cWI.js
similarity index 98%
rename from assets/ru_frontend_architecture.md.Q6KROnXC.js
rename to assets/ru_frontend_architecture.md.et3W1cWI.js
index 76dec17ee..693b29fb2 100644
--- a/assets/ru_frontend_architecture.md.Q6KROnXC.js
+++ b/assets/ru_frontend_architecture.md.et3W1cWI.js
@@ -1 +1 @@
-import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Архитектура фронтэнд приложений","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/architecture.md","filePath":"ru/frontend/architecture.md","lastUpdated":1706427418000}'),o={name:"ru/frontend/architecture.md"},s=r('

Архитектура фронтэнд приложений

Что такое хорошая архитектура веб-приложения

Есть разные теоретические определения и обоснования данного понятия, но грубо говоря это следующее.

Допустим ты разрабатываешь проект, уже на финальном этапе. К тебе подходит заказчик и говорит что-то типа: я хочу добавить тень ко всем кнопкам, я хочу изменить UI библиотеку, мы решили поддерживать несколько языков, мы решили заменить вот этот модуль на другой, нужно сделать более детальную адаптивность для разных разрешений, мы решили добавить темы, мы меняем провайдера услуг по обработке платежей, у нас повышается число пользователей / сайт тормозит / надо его ускорить, надо повысить уровень безопасности сайта, мы взяли мидл программиста, введи его в курс дела быстро, и пусть он добавляет функционал или фиксит баги и т.п.

Хорошая архитектура фронтенд приложения позволяет выполнить всё это наиболее эффективно с наименьшими затратами.

ООП на фронтенде

Многие приходя из разработки на объектно-ориентированных языках пытаются использовать концепции ООП и на фронте и программировать с классами, наследованием, полиморфизмом и прочим.

Это ошибка. Основные вычисления на фронте связаны с UI - показ данных, обработка взаимодействия с пользователем. Системы классов и микросервисов на них просто не нужны. Конечно, можно создать базовую кнопку, обернуть ее в два кастомных компонента и считать это наследованием, но в коде этого не получается. Поэтому надо учиться мыслить другими категориями - компоненты, композаблы, js модули. И использовать свою мощь JavaScript-a, а не пытаться натянуть его на ООП.

В то же время неплохой аналогией объекта с глобальным ("статичным") и локальным ("объектным") состоянием является композабл функция. Это можно использовать в определённых ситуациях.

Полезные советы
Избегайте зависимостей

Если есть возможность не вводить новую зависимость (не подключать новый npm пакет) - не делайте это. Это может немного сэкономит ваше время, но сторонняя библиотека рано или поздно устареет, перестанет поддерживаться, в ней могут обнаружить уязвимость. Кроме того она увеличивает размер вашего бандла, что напрямую влияет на производительность вашего приложения. Tree shaking хорош в рекламных зазываниях, но работает реально далеко не всегда.

Если вам нужна, например, функция debounce, не торопитесь подключать её вместе с какой-либо библиотекой. Загуглите её реализацию и скопируйте 15 строк кода, сделав свою функцию.


Используйте обертки над компонентами UI библиотек и сторонних утилит

Если вы используете компоненты какой-то UI библиотеки, не используйте их напрямую - сделайте обертки для них. Например, BaseButton или BaseInput. Это намного облегчит стилизацию компонент, а также сильно упростит переход на другую библиотеку, или замену на свои компоненты.

То же самое с утилитами.


Регулярный рефакторинг

Время от времени делайте рефакторинг кода, перемещая компоненты и модули туда, где они должны быть логически, переименовывая их, и структурируя и улучшая сам код. Это полезно и для кода, и для вашего профессионального роста.


Используйте CSS3

Старайтесь использовать для адаптивноcти чистый CSS3. Не привязывайтесь к колоночным моделям CSS и UI библиотек, если только это не проект из разряда: "сделал и забыл, пусть заказчик дальше с ним мучается".

Потратьте пару дней на изучение Флексбокса и вы сможете верстать на нём быстрей и лучше, чем на любом Тайлвинде.


Используйте современные стандарты и возможности языков

Например, семантические элементы HTML5 - aside, header, section, article, details и.т.д.

CSS3 - Flexbox и Grid, Container query


Документируйте проект

Рисуйте use-case и другие диаграммы, описывайте основной функционал проекта и важные детали его реализации - это как минимум повысит ваш уровень как разработчика ПО.

VitePress - очень удобный инструмент для технического документирования.

',4),i=[s];function c(d,l,n,h,p,u){return t(),e("div",null,i)}const q=a(o,[["render",c]]);export{_ as __pageData,q as default}; +import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Архитектура фронтэнд приложений","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/architecture.md","filePath":"ru/frontend/architecture.md","lastUpdated":1706553672000}'),o={name:"ru/frontend/architecture.md"},s=r('

Архитектура фронтэнд приложений

Что такое хорошая архитектура веб-приложения

Есть разные теоретические определения и обоснования данного понятия, но грубо говоря это следующее.

Допустим ты разрабатываешь проект, уже на финальном этапе. К тебе подходит заказчик и говорит что-то типа: я хочу добавить тень ко всем кнопкам, я хочу изменить UI библиотеку, мы решили поддерживать несколько языков, мы решили заменить вот этот модуль на другой, нужно сделать более детальную адаптивность для разных разрешений, мы решили добавить темы, мы меняем провайдера услуг по обработке платежей, у нас повышается число пользователей / сайт тормозит / надо его ускорить, надо повысить уровень безопасности сайта, мы взяли мидл программиста, введи его в курс дела быстро, и пусть он добавляет функционал или фиксит баги и т.п.

Хорошая архитектура фронтенд приложения позволяет выполнить всё это наиболее эффективно с наименьшими затратами.

ООП на фронтенде

Многие приходя из разработки на объектно-ориентированных языках пытаются использовать концепции ООП и на фронте и программировать с классами, наследованием, полиморфизмом и прочим.

Это ошибка. Основные вычисления на фронте связаны с UI - показ данных, обработка взаимодействия с пользователем. Системы классов и микросервисов на них просто не нужны. Конечно, можно создать базовую кнопку, обернуть ее в два кастомных компонента и считать это наследованием, но в коде этого не получается. Поэтому надо учиться мыслить другими категориями - компоненты, композаблы, js модули. И использовать свою мощь JavaScript-a, а не пытаться натянуть его на ООП.

В то же время неплохой аналогией объекта с глобальным ("статичным") и локальным ("объектным") состоянием является композабл функция. Это можно использовать в определённых ситуациях.

Полезные советы
Избегайте зависимостей

Если есть возможность не вводить новую зависимость (не подключать новый npm пакет) - не делайте это. Это может немного сэкономит ваше время, но сторонняя библиотека рано или поздно устареет, перестанет поддерживаться, в ней могут обнаружить уязвимость. Кроме того она увеличивает размер вашего бандла, что напрямую влияет на производительность вашего приложения. Tree shaking хорош в рекламных зазываниях, но работает реально далеко не всегда.

Если вам нужна, например, функция debounce, не торопитесь подключать её вместе с какой-либо библиотекой. Загуглите её реализацию и скопируйте 15 строк кода, сделав свою функцию.


Используйте обертки над компонентами UI библиотек и сторонних утилит

Если вы используете компоненты какой-то UI библиотеки, не используйте их напрямую - сделайте обертки для них. Например, BaseButton или BaseInput. Это намного облегчит стилизацию компонент, а также сильно упростит переход на другую библиотеку, или замену на свои компоненты.

То же самое с утилитами.


Регулярный рефакторинг

Время от времени делайте рефакторинг кода, перемещая компоненты и модули туда, где они должны быть логически, переименовывая их, и структурируя и улучшая сам код. Это полезно и для кода, и для вашего профессионального роста.


Используйте CSS3

Старайтесь использовать для адаптивноcти чистый CSS3. Не привязывайтесь к колоночным моделям CSS и UI библиотек, если только это не проект из разряда: "сделал и забыл, пусть заказчик дальше с ним мучается".

Потратьте пару дней на изучение Флексбокса и вы сможете верстать на нём быстрей и лучше, чем на любом Тайлвинде.


Используйте современные стандарты и возможности языков

Например, семантические элементы HTML5 - aside, header, section, article, details и.т.д.

CSS3 - Flexbox и Grid, Container query


Документируйте проект

Рисуйте use-case и другие диаграммы, описывайте основной функционал проекта и важные детали его реализации - это как минимум повысит ваш уровень как разработчика ПО.

VitePress - очень удобный инструмент для технического документирования.

',4),i=[s];function c(d,l,n,h,p,u){return t(),e("div",null,i)}const q=a(o,[["render",c]]);export{_ as __pageData,q as default}; diff --git a/assets/ru_frontend_architecture.md.Q6KROnXC.lean.js b/assets/ru_frontend_architecture.md.et3W1cWI.lean.js similarity index 74% rename from assets/ru_frontend_architecture.md.Q6KROnXC.lean.js rename to assets/ru_frontend_architecture.md.et3W1cWI.lean.js index c40cc8d1c..08022f8e9 100644 --- a/assets/ru_frontend_architecture.md.Q6KROnXC.lean.js +++ b/assets/ru_frontend_architecture.md.et3W1cWI.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Архитектура фронтэнд приложений","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/architecture.md","filePath":"ru/frontend/architecture.md","lastUpdated":1706427418000}'),o={name:"ru/frontend/architecture.md"},s=r("",4),i=[s];function c(d,l,n,h,p,u){return t(),e("div",null,i)}const q=a(o,[["render",c]]);export{_ as __pageData,q as default}; +import{_ as a,c as e,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Архитектура фронтэнд приложений","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/architecture.md","filePath":"ru/frontend/architecture.md","lastUpdated":1706553672000}'),o={name:"ru/frontend/architecture.md"},s=r("",4),i=[s];function c(d,l,n,h,p,u){return t(),e("div",null,i)}const q=a(o,[["render",c]]);export{_ as __pageData,q as default}; diff --git a/assets/ru_frontend_css-ui-libs.md.RVCMtFt_.js b/assets/ru_frontend_css-ui-libs.md.LyeDWX4O.js similarity index 98% rename from assets/ru_frontend_css-ui-libs.md.RVCMtFt_.js rename to assets/ru_frontend_css-ui-libs.md.LyeDWX4O.js index 21526625b..3b04494df 100644 --- a/assets/ru_frontend_css-ui-libs.md.RVCMtFt_.js +++ b/assets/ru_frontend_css-ui-libs.md.LyeDWX4O.js @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"CSS и UI библиотеки","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/css-ui-libs.md","filePath":"ru/frontend/css-ui-libs.md","lastUpdated":1706427418000}'),e={name:"ru/frontend/css-ui-libs.md"},l=i(`

CSS и UI библиотеки

Что такое CSS и UI библиотеки?

CSS и UI библиотеки либо предоставляют свои, либо помогают создавать кастомные UI компоненты типа Button или Select? что может значительно ускорить разработку.

CSS библиотеки не содержат JavaScript кода и, соответственно, имеют ограничения для сложных компонент типа Select или Dropdown.

Есть отдельный тип Headless-UI библиотек, которые предлагают компоненты без стилизованной визуализации - только логику компонента и Accessibility требования. Разработчику нужно самому добавить CSS стили.

Плюсы и минусы UI библиотек?

Плюсы: укоряет разработку, если пользоваться ей на проекте максимально, вносит в приложение единый стиль

Минусы: как и любая зависимость может устареть (трагедия Vuetify 2), добавляет веса в итоговый бандл.

В этой статье хорошо сравниваются 10 Vue 3 UI библиотек.

Как снизить зависимость от чужих библиотек?

Оборачивайте компоненты UI библиотеки в свои.

vue
<!-- BaseButton.vue -->
+import{_ as s,c as a,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"CSS и UI библиотеки","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/css-ui-libs.md","filePath":"ru/frontend/css-ui-libs.md","lastUpdated":1706553672000}'),e={name:"ru/frontend/css-ui-libs.md"},l=i(`

CSS и UI библиотеки

Что такое CSS и UI библиотеки?

CSS и UI библиотеки либо предоставляют свои, либо помогают создавать кастомные UI компоненты типа Button или Select? что может значительно ускорить разработку.

CSS библиотеки не содержат JavaScript кода и, соответственно, имеют ограничения для сложных компонент типа Select или Dropdown.

Есть отдельный тип Headless-UI библиотек, которые предлагают компоненты без стилизованной визуализации - только логику компонента и Accessibility требования. Разработчику нужно самому добавить CSS стили.

Плюсы и минусы UI библиотек?

Плюсы: укоряет разработку, если пользоваться ей на проекте максимально, вносит в приложение единый стиль

Минусы: как и любая зависимость может устареть (трагедия Vuetify 2), добавляет веса в итоговый бандл.

В этой статье хорошо сравниваются 10 Vue 3 UI библиотек.

Как снизить зависимость от чужих библиотек?

Оборачивайте компоненты UI библиотеки в свои.

vue
<!-- BaseButton.vue -->
 <template>
   <QButton ... />
 </template>

и используйте в своем коде BaseButton. Таким образом в дальнейшем вам будет намного проще проапгрейдиться, заменить библиотеку или заменить данный компонент на самописный. И даже просто изменить у компонента стили.

Лэйаут и адаптивность страниц средствами CSS и UI библиотек

Использование колоночной системы и иного функционала CSS и UI библиотек типа распространенного Tailwind удобно для небольших проектов и иногда ускоряет верстку, однако очень сильно ухудшает качество кода в целом, включая его поддерживаемость и расширяемость. Как будто мир вновь вернулся во времена IE6, когда все стили и JavaScript также располагались в аттрибутах тэгов, и вся эволюция CSS в понятную, удобную, красивую иерарxичную модель классов была зря, как и разделение веба на документ (шаблон), презентационный слой (CSS стили) и логику (JavaScript).

В интернете полно статей, почему подход подобный Tailwind это плохо. Можно отметить только, что при должном умении верстать на чистом CSS3 также быстро и намного удобней и приятней в плане DX, чем через средства CSS и UI библиотек.

Цитата

Хорошие разработчики знают причины, по которым стандарты, паттерны и хорошие практики стали таковыми.

Плохие разработчики придерживаются любой новой тенденции, которая может сэкономить им немного времени на обучение.

`,5),p=[l];function n(c,r,o,d,h,k){return t(),a("div",null,p)}const S=s(e,[["render",n]]);export{m as __pageData,S as default}; diff --git a/assets/ru_frontend_css-ui-libs.md.RVCMtFt_.lean.js b/assets/ru_frontend_css-ui-libs.md.LyeDWX4O.lean.js similarity index 86% rename from assets/ru_frontend_css-ui-libs.md.RVCMtFt_.lean.js rename to assets/ru_frontend_css-ui-libs.md.LyeDWX4O.lean.js index 0b7e8262b..1a0746ea1 100644 --- a/assets/ru_frontend_css-ui-libs.md.RVCMtFt_.lean.js +++ b/assets/ru_frontend_css-ui-libs.md.LyeDWX4O.lean.js @@ -1 +1 @@ -import{_ as s,c as a,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"CSS и UI библиотеки","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/css-ui-libs.md","filePath":"ru/frontend/css-ui-libs.md","lastUpdated":1706427418000}'),e={name:"ru/frontend/css-ui-libs.md"},l=i("",5),p=[l];function n(c,r,o,d,h,k){return t(),a("div",null,p)}const S=s(e,[["render",n]]);export{m as __pageData,S as default}; +import{_ as s,c as a,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"CSS и UI библиотеки","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/css-ui-libs.md","filePath":"ru/frontend/css-ui-libs.md","lastUpdated":1706553672000}'),e={name:"ru/frontend/css-ui-libs.md"},l=i("",5),p=[l];function n(c,r,o,d,h,k){return t(),a("div",null,p)}const S=s(e,[["render",n]]);export{m as __pageData,S as default}; diff --git a/assets/ru_frontend_learning.md.6ZobhGeK.js b/assets/ru_frontend_learning.md.ZQxEVbQX.js similarity index 99% rename from assets/ru_frontend_learning.md.6ZobhGeK.js rename to assets/ru_frontend_learning.md.ZQxEVbQX.js index 518b83f7a..b106fa171 100644 --- a/assets/ru_frontend_learning.md.6ZobhGeK.js +++ b/assets/ru_frontend_learning.md.ZQxEVbQX.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Изучение Vue","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/learning.md","filePath":"ru/frontend/learning.md","lastUpdated":1706427418000}'),s={name:"ru/frontend/learning.md"},l=r('

Изучение Vue

Источники информации по Vue

Почему-то считается, что на фронтенде есть всего два варианта получать знания - документация Vue и обучающие видео с Ютюба и всевозможных курсов.

Но документация это не учебник, а справочник, и отделить зерна от плевел на Ютюбе очень сложно. Я встречал полезные видео, но все они предназначались для уже неплохо знающих Vue разработчиков, и показывали какие-то новые или нестандартные моменты.


Главным учителем должна быть книга, которая именно учит, а не даёт справочную информацию.

Прекрасный учебник по Vue на английском языке - вышедшая в мае 2023 года Vue.js 3 Design Patterns and Best Practices. Можно зарегистрироваться на oReilly и читать 10 дней бесплатно. Даже скачать. Несмотря на название, книга учит именно программированию, причем, довольно с таки начального уровня.

Перевод данной книги на русский язык находится на этом сайте: (учебник).

Примеры из книги находятся в открытом доступе и вполне достойны изучения.

Больше на русском, к сожалению, почти ничего нет, но, во-первых, есть Google translate, а во-вторых, стать уверенным разработчиком без хотя бы среднего знания технического английского вряд ли получится.

Так же надо отметить, что документация Vue на русском порой сильно отстает от документации на английском.


Заметка

Можно провести аналогию между хорошим разработчиком и водителем:

  1. Изучение основ вождения, ПДД и устройства двигателя внутреннего сгорания - документация Vue и спецификация JavaScript
  2. Практическое обучение вождению в автошколе - хорошие учебники типа "Vue.js 3 Design Patterns and Best Practices"
  3. Реальный опыт вождения - коммерческий опыт разработки
  4. Курсы экстремального вождения, поставить стакан воды на капот и проехать на двадцатилетней машине с механической коробкой передач по разбитым улицам - качественные опен сорс проекты и сертификации

Невозможно стать хорошим разработчиком/водителем как без 1., так и только с 1. Обучающие видео из интернета (как платные так и бесплатные) могут как быть частью 4., так и быть абсолютно бесполезными и даже вредными (очень часто), в зависимости от их качества и мотивации ученика.

Vue 2 или Vue 3?

Vue 3.
Composition API.

Если вам нужен будет Vue 2 для поддержки существующего проекта, то вы сами будете знать ответ на этот вопрос.

Разница между Vue 2 и Vue 3 большая. Это не тот случай, когда надо выучить предварительно предыдущую версию, чтобы лучше и легче понять следующую.

Нужно ли знать JavaScript предварительно?

Обязательно, минимум на среднем уровне. Если этого нет, я бы предложил сперва пройти короткий курс javascript-a, чтобы человек знал об объекте document, умел обращаться с методами массива и не очень боялся промисов. Также, HTML и CSS как минимум на базовом уровне.

Вот легко читаемая книжка - "Морган Н. - JavaScript для детей. Самоучитель по программированию - 2016. Перед началом изучения Vue желательно понимать 70% первой части, а также параграфы 10 и 12.

Также классический ресурс по JavaScript - learn.javascript.ru

70 вопросов по JavaScript для подготовки к собеседованию - отличный тест, проверить себя по знанию языка.


Совет

Также абсолютно необходимый предварительный скилл - умение гуглить.

Есть ли сертификация по Vue?

Vue.js Certification

Vue Style Guide

Обязательно ознакомьтесь с Vue Style Guide и старайтесь придерживаться его лучших практик при написании кода.

Время от времени возвращайтесь к этому источнику и улучшайте свой код.

ESlint также помогает держать свой код в соответствии с лучшими практиками.

Нужен ли ментор?

Ментор полезен и начинающему, и опытному разработчику. Можно бесполезно убить два дня на решение проблемы, которую за 20 минут может объяснить более опытный человек. Причем, этот двухдневный "опыт" больше никогда не пригодится.

В компаниях эту роль обычно выполняют более компетентные доброжелательные коллеги.

В интернете есть сервисы типа Solvery, которые могут помочь в этом вопросе.

Всё равно хочу видео

Есть качественные у Vue Mastery, однако большинство устарели.

Довольно грамотно и качественно объясняет технологии фронтенда и Vue 3 Илья Климов.

Что еще посмотреть кроме Vue? React?

Можно и React, если есть реальный вариант использования этих знаний, однако намного лучше расширить свой кругозор разработчика. Попробуйте написать простой API на бэкенде. Самый легкий и удобный язык для этого - PHP, но можно и на Node.js или Python. Попробуйте транспортные протоколы JSON-RPC и WebSockets. Захостите свое приложение на GitHub Pages или другой аналогичный сервис, поэкспериментируйте с GitHub Actions - они очень помогают с автоматизацией деплоя и CI/CD в целом. Поработайте с Cloud провайдерами (многие предлагают бесплатные ресурсы), настройте виртуальный сервер. Зарегистрируйте домен, сделайте продуктовый законченный сайт - даже если это будет просто ваш сайт-резюме или что-то элементарное на VitePress (используется данным сайтом). Поработайте с FireStore и открытыми API для различных данных. Посмотрите Swagger. Поизучайте SQL, установите MySQL и поиграйте с ним, либо сделайте это на SupaBase. Понимание, как данные хранятся и обрабатываются на бэкенде, сильно поможет в выборе правильных стратегий на фронте.

Изучайте, как работает современный Интернет, и какие технологии и лучшие практики распространены в нем сейчас.

',9),i=[l];function o(p,u,c,n,m,d){return t(),a("div",null,i)}const _=e(s,[["render",o]]);export{f as __pageData,_ as default}; +import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Изучение Vue","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/learning.md","filePath":"ru/frontend/learning.md","lastUpdated":1706553672000}'),s={name:"ru/frontend/learning.md"},l=r('

Изучение Vue

Источники информации по Vue

Почему-то считается, что на фронтенде есть всего два варианта получать знания - документация Vue и обучающие видео с Ютюба и всевозможных курсов.

Но документация это не учебник, а справочник, и отделить зерна от плевел на Ютюбе очень сложно. Я встречал полезные видео, но все они предназначались для уже неплохо знающих Vue разработчиков, и показывали какие-то новые или нестандартные моменты.


Главным учителем должна быть книга, которая именно учит, а не даёт справочную информацию.

Прекрасный учебник по Vue на английском языке - вышедшая в мае 2023 года Vue.js 3 Design Patterns and Best Practices. Можно зарегистрироваться на oReilly и читать 10 дней бесплатно. Даже скачать. Несмотря на название, книга учит именно программированию, причем, довольно с таки начального уровня.

Перевод данной книги на русский язык находится на этом сайте: (учебник).

Примеры из книги находятся в открытом доступе и вполне достойны изучения.

Больше на русском, к сожалению, почти ничего нет, но, во-первых, есть Google translate, а во-вторых, стать уверенным разработчиком без хотя бы среднего знания технического английского вряд ли получится.

Так же надо отметить, что документация Vue на русском порой сильно отстает от документации на английском.


Заметка

Можно провести аналогию между хорошим разработчиком и водителем:

  1. Изучение основ вождения, ПДД и устройства двигателя внутреннего сгорания - документация Vue и спецификация JavaScript
  2. Практическое обучение вождению в автошколе - хорошие учебники типа "Vue.js 3 Design Patterns and Best Practices"
  3. Реальный опыт вождения - коммерческий опыт разработки
  4. Курсы экстремального вождения, поставить стакан воды на капот и проехать на двадцатилетней машине с механической коробкой передач по разбитым улицам - качественные опен сорс проекты и сертификации

Невозможно стать хорошим разработчиком/водителем как без 1., так и только с 1. Обучающие видео из интернета (как платные так и бесплатные) могут как быть частью 4., так и быть абсолютно бесполезными и даже вредными (очень часто), в зависимости от их качества и мотивации ученика.

Vue 2 или Vue 3?

Vue 3.
Composition API.

Если вам нужен будет Vue 2 для поддержки существующего проекта, то вы сами будете знать ответ на этот вопрос.

Разница между Vue 2 и Vue 3 большая. Это не тот случай, когда надо выучить предварительно предыдущую версию, чтобы лучше и легче понять следующую.

Нужно ли знать JavaScript предварительно?

Обязательно, минимум на среднем уровне. Если этого нет, я бы предложил сперва пройти короткий курс javascript-a, чтобы человек знал об объекте document, умел обращаться с методами массива и не очень боялся промисов. Также, HTML и CSS как минимум на базовом уровне.

Вот легко читаемая книжка - "Морган Н. - JavaScript для детей. Самоучитель по программированию - 2016. Перед началом изучения Vue желательно понимать 70% первой части, а также параграфы 10 и 12.

Также классический ресурс по JavaScript - learn.javascript.ru

70 вопросов по JavaScript для подготовки к собеседованию - отличный тест, проверить себя по знанию языка.


Совет

Также абсолютно необходимый предварительный скилл - умение гуглить.

Есть ли сертификация по Vue?

Vue.js Certification

Vue Style Guide

Обязательно ознакомьтесь с Vue Style Guide и старайтесь придерживаться его лучших практик при написании кода.

Время от времени возвращайтесь к этому источнику и улучшайте свой код.

ESlint также помогает держать свой код в соответствии с лучшими практиками.

Нужен ли ментор?

Ментор полезен и начинающему, и опытному разработчику. Можно бесполезно убить два дня на решение проблемы, которую за 20 минут может объяснить более опытный человек. Причем, этот двухдневный "опыт" больше никогда не пригодится.

В компаниях эту роль обычно выполняют более компетентные доброжелательные коллеги.

В интернете есть сервисы типа Solvery, которые могут помочь в этом вопросе.

Всё равно хочу видео

Есть качественные у Vue Mastery, однако большинство устарели.

Довольно грамотно и качественно объясняет технологии фронтенда и Vue 3 Илья Климов.

Что еще посмотреть кроме Vue? React?

Можно и React, если есть реальный вариант использования этих знаний, однако намного лучше расширить свой кругозор разработчика. Попробуйте написать простой API на бэкенде. Самый легкий и удобный язык для этого - PHP, но можно и на Node.js или Python. Попробуйте транспортные протоколы JSON-RPC и WebSockets. Захостите свое приложение на GitHub Pages или другой аналогичный сервис, поэкспериментируйте с GitHub Actions - они очень помогают с автоматизацией деплоя и CI/CD в целом. Поработайте с Cloud провайдерами (многие предлагают бесплатные ресурсы), настройте виртуальный сервер. Зарегистрируйте домен, сделайте продуктовый законченный сайт - даже если это будет просто ваш сайт-резюме или что-то элементарное на VitePress (используется данным сайтом). Поработайте с FireStore и открытыми API для различных данных. Посмотрите Swagger. Поизучайте SQL, установите MySQL и поиграйте с ним, либо сделайте это на SupaBase. Понимание, как данные хранятся и обрабатываются на бэкенде, сильно поможет в выборе правильных стратегий на фронте.

Изучайте, как работает современный Интернет, и какие технологии и лучшие практики распространены в нем сейчас.

',9),i=[l];function o(p,u,c,n,m,d){return t(),a("div",null,i)}const _=e(s,[["render",o]]);export{f as __pageData,_ as default}; diff --git a/assets/ru_frontend_learning.md.6ZobhGeK.lean.js b/assets/ru_frontend_learning.md.ZQxEVbQX.lean.js similarity index 85% rename from assets/ru_frontend_learning.md.6ZobhGeK.lean.js rename to assets/ru_frontend_learning.md.ZQxEVbQX.lean.js index e5f980d20..8e333556b 100644 --- a/assets/ru_frontend_learning.md.6ZobhGeK.lean.js +++ b/assets/ru_frontend_learning.md.ZQxEVbQX.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Изучение Vue","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/learning.md","filePath":"ru/frontend/learning.md","lastUpdated":1706427418000}'),s={name:"ru/frontend/learning.md"},l=r("",9),i=[l];function o(p,u,c,n,m,d){return t(),a("div",null,i)}const _=e(s,[["render",o]]);export{f as __pageData,_ as default}; +import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Изучение Vue","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/learning.md","filePath":"ru/frontend/learning.md","lastUpdated":1706553672000}'),s={name:"ru/frontend/learning.md"},l=r("",9),i=[l];function o(p,u,c,n,m,d){return t(),a("div",null,i)}const _=e(s,[["render",o]]);export{f as __pageData,_ as default}; diff --git a/assets/ru_frontend_spa-pwa-ssr-ssg.md.b7Meyx6a.js b/assets/ru_frontend_spa-pwa-ssr-ssg.md.DePUW-dF.js similarity index 99% rename from assets/ru_frontend_spa-pwa-ssr-ssg.md.b7Meyx6a.js rename to assets/ru_frontend_spa-pwa-ssr-ssg.md.DePUW-dF.js index f65c853e7..18e046379 100644 --- a/assets/ru_frontend_spa-pwa-ssr-ssg.md.b7Meyx6a.js +++ b/assets/ru_frontend_spa-pwa-ssr-ssg.md.DePUW-dF.js @@ -1 +1 @@ -import{_ as e,a}from"./chunks/dynamic-rendering.xvS1OZJu.js";import{_ as s,c as r,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"SPA, PWA, SSG, SSR и SEO","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/spa-pwa-ssr-ssg.md","filePath":"ru/frontend/spa-pwa-ssr-ssg.md","lastUpdated":1706427418000}'),p={name:"ru/frontend/spa-pwa-ssr-ssg.md"},l=o('

SPA, PWA, SSG, SSR и SEO

Web 1.0 -> Web 2.0

Сперва был статичный HTML и браузеры показывали его. Чуть позже придумали немножко JavaScript-а, чтобы обрабатывать формочки и делать небольшую анимацию. Потом появился CSS, и все увидели, что это красиво. После кто-то предложил идею JSON для формата данных, а затем Микрософт подарила миру XMLHttpRequest, и JavaScript-у разрешили отправлять и получать данные с сервера.

Так родился SPA.

SPA

SPA (Single Page Application) работает примерно как обычное десктоп/мобильное приложение - при первом обращении на сервер получает програмную оболочку, необходимую для отображения сайта, а затем уже пересылает на/с сервера данные, обычно в JSON формате. Так получается намного эффективней способа, когда с каждым запросом с сервера приходила новая HTML страница с всеми ресурсами.

Для пользователя UX повышается значительно.

spa-vs-mpa

PWA

PWA (Progressive Web Application) - еще один шаг, чтобы улучшить пользовательский опыт и максимально приблизить веб приложения по ощущениям пользователя к нативным.

При PWA к SPA добавляются два элемента:

  1. Манифест. Текстовый файл со свойствами приложения. Благодаря ему иконка веб-приложения может быть установлена также как и у нативных приложений на домашний экран смартфона. Кроме того, при запуске PWA может не показывать элементы браузера и казаться обычным приложением.

  2. Service worker. Это прослойка в браузере между сервером и самим браузером, которая позволяет сделать управляемое кэширование. Другими словами, сохранить приложение со всеми ресурсами на смартфоне/компьютере, чтобы при запуске оно сразу запускалось. Если не нужны данные с сервера, то приложение может работать оффлайн (например, Заметки).

Больше о PWA можно прочесть на сайте, созданном командой Chrome - https://web.dev/

Апгрейд SPA до PWA очень небольшой по трудозатратам, но очень значительный по выгоде. Разрабатывать SPA и не делать его PWA - это как снять люксовый номер в гостинице, но лечь спать на его входе в коридоре на коврике, потому что до спальни лень дойти.

PWA -> Workbox и vite-plugin-pwa

Манифест и Service worker настолько просты, что создание обертки над SW - Workbox, и плагина для Vite vite-plugin-pwa логическому объяснению не поддается. Кода получается в несколько раз больше, нужно грузить дополнительные зависимости и разбираться в конфигурациях оберток. Простое сделали сложным.

Лучше задействовать Манифест и Service worker как они созданы изначально, и написать два этих простых файла по шаблонам из спецификаций.

SSG

SSG (Static Site Generation) — подход, когда содержимое сайта предварительно генерируется в html-файлы, которые потом раздаются с сервера.

Сразу подходит для индексации поисковиками.

SSR

SSR (Server Side Rendering), способ генерации html на стороне сервера, когда генерация происходит в момент обращения. После запроса клиентом странички, сервер на своей стороне выполняет API-запросы, а затем формирует html-страницу. Соответственно, на сервере нужен Node.js сервер, который довольно сильно нагружает "железо".

Кроме того, есть множество ограничений при написании кода и использования тех или иных JavaScript и Vue возможностей. Как пишет Google относительно SSR - "A rehydration problem: one app for the price of two".

SEO оптимизация

Для того, чтобы поисковик мог проиндексировать страницу вашего сайта, при обращении к ней он должен получить HTML с контентом (текст, картинки, видео). Со SPA сайтами, в которых контент подгружается динамически JavaScript-ом, такое иногда не получается, но иногда и получается. Как следует из этих экспериментов Google уже умеет индексировать SPA приложения, Yandex - еще нет.

Самым популярным и неэффективным методом для надежного индексации всеми поисковиками является использование SSR (SSG подходит для несложных по структуре сайтов без бэкенда, вроде документаций).

Google позволяет посмотреть, как ваш сайт выглядит/индексируется его кроулером, который как-то всё-таки работает со скриптами, поэтому для начала проверьте, нужно ли вам усложняться вообще.

Если проблемы обнаружились, то можно воспользоваться динамической отрисовкой

dynamic-rendering

Смысл в том, чтобы обрабатывать запросы обычных пользователей и поисковых ботов по-разному и отдавать им разные страницы. Для пользователей - SPA, для поисковиков - сгенеренные налету либо заранее страницы. Распределение может вести вебсервер или точка входа на ваш сайт (index.php вместо index.html).

На картинке выше подразумевается некий Prerenderer (которые тоже есть в качестве стороннего сервиса или своего решения), однако в большинстве случаев намного проще генерить HTML страницу для бота напрямую.

То есть, например, для страницы товара в онлайн магазине это может быть его текстовое описание с картинками и отзывами покупателей в любом HTML форматировании. Для этого достаточно скрипта на PHP/Express/Python и т.д. в 100-200 строк, что намного менее трудозатратней SSR решений, а так же снижает требования в серверному "железу" на порядки (вывод можно закэшировать в статичный HTML файл).

При совпадении фактического контента (текст, картинки) такой страницы с контентом SPA в браузере, Google не рассматривает упрощенную для его бота версию как обман. Данная метода была еще до появления всяких SSR. Проверено многолетним использованием.

PageSpeed и другие тесты производительности

PageSpeed и подобные инструменты очень полезны в выявлении неоптимизированных мест в вашем веб-приложении, однако для SPA и PWA он не совсем верен.

Точней, некоторые его метрики не учитывают UX в целом. Нормально сделанный PWA при самой первой загрузке и установке, конечно, проиграет по FCP метрике аналогу на SSR, но после размещения всех своих ресурсов локально на браузере клиента, никакой SSR и близко не сравнится с ним по скорости работы и комфорту для пользователя, не говоря уже о прочих возможностях типа оффлайн работы и установке как нативного приложения.

SSR может быть, наверное, полезен для каких-то исключительных случаев, но в целом он выглядит тупиковой ветвью во фронтенд разработке.

',9),i=[l];function c(d,S,m,n,u,P){return t(),r("div",null,i)}const A=s(p,[["render",c]]);export{h as __pageData,A as default}; +import{_ as e,a}from"./chunks/dynamic-rendering.xvS1OZJu.js";import{_ as s,c as r,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"SPA, PWA, SSG, SSR и SEO","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/spa-pwa-ssr-ssg.md","filePath":"ru/frontend/spa-pwa-ssr-ssg.md","lastUpdated":1706553672000}'),p={name:"ru/frontend/spa-pwa-ssr-ssg.md"},l=o('

SPA, PWA, SSG, SSR и SEO

Web 1.0 -> Web 2.0

Сперва был статичный HTML и браузеры показывали его. Чуть позже придумали немножко JavaScript-а, чтобы обрабатывать формочки и делать небольшую анимацию. Потом появился CSS, и все увидели, что это красиво. После кто-то предложил идею JSON для формата данных, а затем Микрософт подарила миру XMLHttpRequest, и JavaScript-у разрешили отправлять и получать данные с сервера.

Так родился SPA.

SPA

SPA (Single Page Application) работает примерно как обычное десктоп/мобильное приложение - при первом обращении на сервер получает програмную оболочку, необходимую для отображения сайта, а затем уже пересылает на/с сервера данные, обычно в JSON формате. Так получается намного эффективней способа, когда с каждым запросом с сервера приходила новая HTML страница с всеми ресурсами.

Для пользователя UX повышается значительно.

spa-vs-mpa

PWA

PWA (Progressive Web Application) - еще один шаг, чтобы улучшить пользовательский опыт и максимально приблизить веб приложения по ощущениям пользователя к нативным.

При PWA к SPA добавляются два элемента:

  1. Манифест. Текстовый файл со свойствами приложения. Благодаря ему иконка веб-приложения может быть установлена также как и у нативных приложений на домашний экран смартфона. Кроме того, при запуске PWA может не показывать элементы браузера и казаться обычным приложением.

  2. Service worker. Это прослойка в браузере между сервером и самим браузером, которая позволяет сделать управляемое кэширование. Другими словами, сохранить приложение со всеми ресурсами на смартфоне/компьютере, чтобы при запуске оно сразу запускалось. Если не нужны данные с сервера, то приложение может работать оффлайн (например, Заметки).

Больше о PWA можно прочесть на сайте, созданном командой Chrome - https://web.dev/

Апгрейд SPA до PWA очень небольшой по трудозатратам, но очень значительный по выгоде. Разрабатывать SPA и не делать его PWA - это как снять люксовый номер в гостинице, но лечь спать на его входе в коридоре на коврике, потому что до спальни лень дойти.

PWA -> Workbox и vite-plugin-pwa

Манифест и Service worker настолько просты, что создание обертки над SW - Workbox, и плагина для Vite vite-plugin-pwa логическому объяснению не поддается. Кода получается в несколько раз больше, нужно грузить дополнительные зависимости и разбираться в конфигурациях оберток. Простое сделали сложным.

Лучше задействовать Манифест и Service worker как они созданы изначально, и написать два этих простых файла по шаблонам из спецификаций.

SSG

SSG (Static Site Generation) — подход, когда содержимое сайта предварительно генерируется в html-файлы, которые потом раздаются с сервера.

Сразу подходит для индексации поисковиками.

SSR

SSR (Server Side Rendering), способ генерации html на стороне сервера, когда генерация происходит в момент обращения. После запроса клиентом странички, сервер на своей стороне выполняет API-запросы, а затем формирует html-страницу. Соответственно, на сервере нужен Node.js сервер, который довольно сильно нагружает "железо".

Кроме того, есть множество ограничений при написании кода и использования тех или иных JavaScript и Vue возможностей. Как пишет Google относительно SSR - "A rehydration problem: one app for the price of two".

SEO оптимизация

Для того, чтобы поисковик мог проиндексировать страницу вашего сайта, при обращении к ней он должен получить HTML с контентом (текст, картинки, видео). Со SPA сайтами, в которых контент подгружается динамически JavaScript-ом, такое иногда не получается, но иногда и получается. Как следует из этих экспериментов Google уже умеет индексировать SPA приложения, Yandex - еще нет.

Самым популярным и неэффективным методом для надежного индексации всеми поисковиками является использование SSR (SSG подходит для несложных по структуре сайтов без бэкенда, вроде документаций).

Google позволяет посмотреть, как ваш сайт выглядит/индексируется его кроулером, который как-то всё-таки работает со скриптами, поэтому для начала проверьте, нужно ли вам усложняться вообще.

Если проблемы обнаружились, то можно воспользоваться динамической отрисовкой

dynamic-rendering

Смысл в том, чтобы обрабатывать запросы обычных пользователей и поисковых ботов по-разному и отдавать им разные страницы. Для пользователей - SPA, для поисковиков - сгенеренные налету либо заранее страницы. Распределение может вести вебсервер или точка входа на ваш сайт (index.php вместо index.html).

На картинке выше подразумевается некий Prerenderer (которые тоже есть в качестве стороннего сервиса или своего решения), однако в большинстве случаев намного проще генерить HTML страницу для бота напрямую.

То есть, например, для страницы товара в онлайн магазине это может быть его текстовое описание с картинками и отзывами покупателей в любом HTML форматировании. Для этого достаточно скрипта на PHP/Express/Python и т.д. в 100-200 строк, что намного менее трудозатратней SSR решений, а так же снижает требования в серверному "железу" на порядки (вывод можно закэшировать в статичный HTML файл).

При совпадении фактического контента (текст, картинки) такой страницы с контентом SPA в браузере, Google не рассматривает упрощенную для его бота версию как обман. Данная метода была еще до появления всяких SSR. Проверено многолетним использованием.

PageSpeed и другие тесты производительности

PageSpeed и подобные инструменты очень полезны в выявлении неоптимизированных мест в вашем веб-приложении, однако для SPA и PWA он не совсем верен.

Точней, некоторые его метрики не учитывают UX в целом. Нормально сделанный PWA при самой первой загрузке и установке, конечно, проиграет по FCP метрике аналогу на SSR, но после размещения всех своих ресурсов локально на браузере клиента, никакой SSR и близко не сравнится с ним по скорости работы и комфорту для пользователя, не говоря уже о прочих возможностях типа оффлайн работы и установке как нативного приложения.

SSR может быть, наверное, полезен для каких-то исключительных случаев, но в целом он выглядит тупиковой ветвью во фронтенд разработке.

',9),i=[l];function c(d,S,m,n,u,P){return t(),r("div",null,i)}const A=s(p,[["render",c]]);export{h as __pageData,A as default}; diff --git a/assets/ru_frontend_spa-pwa-ssr-ssg.md.b7Meyx6a.lean.js b/assets/ru_frontend_spa-pwa-ssr-ssg.md.DePUW-dF.lean.js similarity index 88% rename from assets/ru_frontend_spa-pwa-ssr-ssg.md.b7Meyx6a.lean.js rename to assets/ru_frontend_spa-pwa-ssr-ssg.md.DePUW-dF.lean.js index cc60b05e6..8545a9bdb 100644 --- a/assets/ru_frontend_spa-pwa-ssr-ssg.md.b7Meyx6a.lean.js +++ b/assets/ru_frontend_spa-pwa-ssr-ssg.md.DePUW-dF.lean.js @@ -1 +1 @@ -import{_ as e,a}from"./chunks/dynamic-rendering.xvS1OZJu.js";import{_ as s,c as r,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"SPA, PWA, SSG, SSR и SEO","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/spa-pwa-ssr-ssg.md","filePath":"ru/frontend/spa-pwa-ssr-ssg.md","lastUpdated":1706427418000}'),p={name:"ru/frontend/spa-pwa-ssr-ssg.md"},l=o("",9),i=[l];function c(d,S,m,n,u,P){return t(),r("div",null,i)}const A=s(p,[["render",c]]);export{h as __pageData,A as default}; +import{_ as e,a}from"./chunks/dynamic-rendering.xvS1OZJu.js";import{_ as s,c as r,o as t,U as o}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"SPA, PWA, SSG, SSR и SEO","description":"","frontmatter":{},"headers":[],"relativePath":"ru/frontend/spa-pwa-ssr-ssg.md","filePath":"ru/frontend/spa-pwa-ssr-ssg.md","lastUpdated":1706553672000}'),p={name:"ru/frontend/spa-pwa-ssr-ssg.md"},l=o("",9),i=[l];function c(d,S,m,n,u,P){return t(),r("div",null,i)}const A=s(p,[["render",c]]);export{h as __pageData,A as default}; diff --git a/assets/ru_index.md.hFF131S2.js b/assets/ru_index.md.dxXdamCT.js similarity index 96% rename from assets/ru_index.md.hFF131S2.js rename to assets/ru_index.md.dxXdamCT.js index 82fe6940b..44c609aba 100644 --- a/assets/ru_index.md.hFF131S2.js +++ b/assets/ru_index.md.dxXdamCT.js @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Наиболее часто задаваемые вопросы по Vue.js","actions":[{"theme":"brand","text":"Начать","link":"/ru/misc/introduction"},{"theme":"alt","text":"Учебник","link":"/ru/book/"},{"theme":"alt alt-border","text":"vue-webapp билдер","link":"/ru/vue-webapp/"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"Рассматриваются общие вопросы фронтенд разработки - архитектура, шаблоны, лучшие практики"},{"title":"Vue 3","details":"Основное внимание уделено Vue 3, Composition API и экосистеме Vue последних лет"},{"title":"vue-webapp","details":"Стартер кит Vue 3 проекта с различными предустановленными опциями"},{"title":"Vue.js 3 Design Patterns and Best Practices","details":"Перевод на русский язык прекрасного учебника по Vue 3 автора Pablo Garaguso"},{"title":"Nuxt-free","details":"Nuxt - отдельный самостоятельный фреймворк, заслуживающий свой собственный FAQ"}]},"headers":[],"relativePath":"ru/index.md","filePath":"ru/index.md","lastUpdated":1706427418000}'),i={name:"ru/index.md"};function r(o,s,n,u,l,d){return a(),t("div")}const m=e(i,[["render",r]]);export{p as __pageData,m as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Наиболее часто задаваемые вопросы по Vue.js","actions":[{"theme":"brand","text":"Начать","link":"/ru/misc/introduction"},{"theme":"alt","text":"Учебник","link":"/ru/book/"},{"theme":"alt alt-border","text":"vue-webapp билдер","link":"/ru/vue-webapp/"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"Рассматриваются общие вопросы фронтенд разработки - архитектура, шаблоны, лучшие практики"},{"title":"Vue 3","details":"Основное внимание уделено Vue 3, Composition API и экосистеме Vue последних лет"},{"title":"vue-webapp","details":"Стартер кит Vue 3 проекта с различными предустановленными опциями"},{"title":"Vue.js 3 Design Patterns and Best Practices","details":"Перевод на русский язык прекрасного учебника по Vue 3 автора Pablo Garaguso"},{"title":"Nuxt-free","details":"Nuxt - отдельный самостоятельный фреймворк, заслуживающий свой собственный FAQ"}]},"headers":[],"relativePath":"ru/index.md","filePath":"ru/index.md","lastUpdated":1706553672000}'),i={name:"ru/index.md"};function r(o,s,n,u,l,d){return a(),t("div")}const m=e(i,[["render",r]]);export{p as __pageData,m as default}; diff --git a/assets/ru_index.md.hFF131S2.lean.js b/assets/ru_index.md.dxXdamCT.lean.js similarity index 96% rename from assets/ru_index.md.hFF131S2.lean.js rename to assets/ru_index.md.dxXdamCT.lean.js index 82fe6940b..44c609aba 100644 --- a/assets/ru_index.md.hFF131S2.lean.js +++ b/assets/ru_index.md.dxXdamCT.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Наиболее часто задаваемые вопросы по Vue.js","actions":[{"theme":"brand","text":"Начать","link":"/ru/misc/introduction"},{"theme":"alt","text":"Учебник","link":"/ru/book/"},{"theme":"alt alt-border","text":"vue-webapp билдер","link":"/ru/vue-webapp/"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"Рассматриваются общие вопросы фронтенд разработки - архитектура, шаблоны, лучшие практики"},{"title":"Vue 3","details":"Основное внимание уделено Vue 3, Composition API и экосистеме Vue последних лет"},{"title":"vue-webapp","details":"Стартер кит Vue 3 проекта с различными предустановленными опциями"},{"title":"Vue.js 3 Design Patterns and Best Practices","details":"Перевод на русский язык прекрасного учебника по Vue 3 автора Pablo Garaguso"},{"title":"Nuxt-free","details":"Nuxt - отдельный самостоятельный фреймворк, заслуживающий свой собственный FAQ"}]},"headers":[],"relativePath":"ru/index.md","filePath":"ru/index.md","lastUpdated":1706427418000}'),i={name:"ru/index.md"};function r(o,s,n,u,l,d){return a(),t("div")}const m=e(i,[["render",r]]);export{p as __pageData,m as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.P5TqXf0g.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Vue FAQ","text":"Vue JavaScript framework FAQ","tagline":"Наиболее часто задаваемые вопросы по Vue.js","actions":[{"theme":"brand","text":"Начать","link":"/ru/misc/introduction"},{"theme":"alt","text":"Учебник","link":"/ru/book/"},{"theme":"alt alt-border","text":"vue-webapp билдер","link":"/ru/vue-webapp/"}],"image":{"src":"/images/vue-faq-logo.webp","alt":"Vue FAQ"}},"features":[{"title":"Frontend","details":"Рассматриваются общие вопросы фронтенд разработки - архитектура, шаблоны, лучшие практики"},{"title":"Vue 3","details":"Основное внимание уделено Vue 3, Composition API и экосистеме Vue последних лет"},{"title":"vue-webapp","details":"Стартер кит Vue 3 проекта с различными предустановленными опциями"},{"title":"Vue.js 3 Design Patterns and Best Practices","details":"Перевод на русский язык прекрасного учебника по Vue 3 автора Pablo Garaguso"},{"title":"Nuxt-free","details":"Nuxt - отдельный самостоятельный фреймворк, заслуживающий свой собственный FAQ"}]},"headers":[],"relativePath":"ru/index.md","filePath":"ru/index.md","lastUpdated":1706553672000}'),i={name:"ru/index.md"};function r(o,s,n,u,l,d){return a(),t("div")}const m=e(i,[["render",r]]);export{p as __pageData,m as default}; diff --git a/assets/ru_misc_CHANGELOG.md.cOUMC_PG.js b/assets/ru_misc_CHANGELOG.md.FmBCcMOt.js similarity index 98% rename from assets/ru_misc_CHANGELOG.md.cOUMC_PG.js rename to assets/ru_misc_CHANGELOG.md.FmBCcMOt.js index d0d8feb73..933c71b05 100644 --- a/assets/ru_misc_CHANGELOG.md.cOUMC_PG.js +++ b/assets/ru_misc_CHANGELOG.md.FmBCcMOt.js @@ -1 +1 @@ -import{_ as a,c as e,o as l,U as i}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"История изменений","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/CHANGELOG.md","filePath":"ru/misc/CHANGELOG.md","lastUpdated":1706427418000}'),o={name:"ru/misc/CHANGELOG.md"},r=i('

История изменений


v1.4 (24-11-2023)

Новое

  • Перевод книги 'Vue.js 3 Design Patterns and Best Practices'
  • vue-webapp

Изменено

  • Фронтенд / Как изучать Vue?


v1.3 (10-10-2023)

Изменено

  • Общение с бэкендом / CORS
  • Фронтенд / Как изучать Vue?
  • Разработка / Полезные советы


v1.2 (27-09-2023)

Новое

  • Деплой на сервере / Github Actions

Изменено

  • Деплой на сервере / CI/CD
  • Разработка / Сторы - Vuex, Pinia и Composition API
  • Фронтенд / О фронтенд фреймворках
  • Несущественные изменения и исправление ошибок в разных разделах


v1.1 (15-09-2023)

Новое

  • Разработка / Сторы

Изменено

  • Разработка / Полезные советы


v1.0 (11-09-2023)

Новое

  • Начальный запуск
',31),t=[r];function d(c,h,n,s,u,b){return l(),e("div",null,t)}const _=a(o,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as a,c as e,o as l,U as i}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"История изменений","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/CHANGELOG.md","filePath":"ru/misc/CHANGELOG.md","lastUpdated":1706553672000}'),o={name:"ru/misc/CHANGELOG.md"},r=i('

История изменений


v1.4 (24-11-2023)

Новое

  • Перевод книги 'Vue.js 3 Design Patterns and Best Practices'
  • vue-webapp

Изменено

  • Фронтенд / Как изучать Vue?


v1.3 (10-10-2023)

Изменено

  • Общение с бэкендом / CORS
  • Фронтенд / Как изучать Vue?
  • Разработка / Полезные советы


v1.2 (27-09-2023)

Новое

  • Деплой на сервере / Github Actions

Изменено

  • Деплой на сервере / CI/CD
  • Разработка / Сторы - Vuex, Pinia и Composition API
  • Фронтенд / О фронтенд фреймворках
  • Несущественные изменения и исправление ошибок в разных разделах


v1.1 (15-09-2023)

Новое

  • Разработка / Сторы

Изменено

  • Разработка / Полезные советы


v1.0 (11-09-2023)

Новое

  • Начальный запуск
',31),t=[r];function d(c,h,n,s,u,b){return l(),e("div",null,t)}const _=a(o,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/ru_misc_CHANGELOG.md.cOUMC_PG.lean.js b/assets/ru_misc_CHANGELOG.md.FmBCcMOt.lean.js similarity index 85% rename from assets/ru_misc_CHANGELOG.md.cOUMC_PG.lean.js rename to assets/ru_misc_CHANGELOG.md.FmBCcMOt.lean.js index 51f39ebdd..842e6634b 100644 --- a/assets/ru_misc_CHANGELOG.md.cOUMC_PG.lean.js +++ b/assets/ru_misc_CHANGELOG.md.FmBCcMOt.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as l,U as i}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"История изменений","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/CHANGELOG.md","filePath":"ru/misc/CHANGELOG.md","lastUpdated":1706427418000}'),o={name:"ru/misc/CHANGELOG.md"},r=i("",31),t=[r];function d(c,h,n,s,u,b){return l(),e("div",null,t)}const _=a(o,[["render",d]]);export{m as __pageData,_ as default}; +import{_ as a,c as e,o as l,U as i}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"История изменений","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/CHANGELOG.md","filePath":"ru/misc/CHANGELOG.md","lastUpdated":1706553672000}'),o={name:"ru/misc/CHANGELOG.md"},r=i("",31),t=[r];function d(c,h,n,s,u,b){return l(),e("div",null,t)}const _=a(o,[["render",d]]);export{m as __pageData,_ as default}; diff --git a/assets/ru_misc_cheat-sheets.md.-Aqav2yK.js b/assets/ru_misc_cheat-sheets.md.7-z4zJxQ.js similarity index 97% rename from assets/ru_misc_cheat-sheets.md.-Aqav2yK.js rename to assets/ru_misc_cheat-sheets.md.7-z4zJxQ.js index d766587b3..d2ab0bc2e 100644 --- a/assets/ru_misc_cheat-sheets.md.-Aqav2yK.js +++ b/assets/ru_misc_cheat-sheets.md.7-z4zJxQ.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Шпаргалки (Cheat Sheet)","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/cheat-sheets.md","filePath":"ru/misc/cheat-sheets.md","lastUpdated":1706427418000}'),l={name:"ru/misc/cheat-sheets.md"},i=r('

Шпаргалки (Cheat Sheet)

Vue

JavaScript

HTML

CSS

Typescript

Markdown

',13),h=[i];function s(o,c,n,d,p,f){return t(),a("div",null,h)}const _=e(l,[["render",s]]);export{S as __pageData,_ as default}; +import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Шпаргалки (Cheat Sheet)","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/cheat-sheets.md","filePath":"ru/misc/cheat-sheets.md","lastUpdated":1706553672000}'),l={name:"ru/misc/cheat-sheets.md"},i=r('

Шпаргалки (Cheat Sheet)

Vue

JavaScript

HTML

CSS

Typescript

Markdown

',13),h=[i];function s(o,c,n,d,p,f){return t(),a("div",null,h)}const _=e(l,[["render",s]]);export{S as __pageData,_ as default}; diff --git a/assets/ru_misc_cheat-sheets.md.-Aqav2yK.lean.js b/assets/ru_misc_cheat-sheets.md.7-z4zJxQ.lean.js similarity index 86% rename from assets/ru_misc_cheat-sheets.md.-Aqav2yK.lean.js rename to assets/ru_misc_cheat-sheets.md.7-z4zJxQ.lean.js index 5fa84ee2c..7aa773742 100644 --- a/assets/ru_misc_cheat-sheets.md.-Aqav2yK.lean.js +++ b/assets/ru_misc_cheat-sheets.md.7-z4zJxQ.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Шпаргалки (Cheat Sheet)","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/cheat-sheets.md","filePath":"ru/misc/cheat-sheets.md","lastUpdated":1706427418000}'),l={name:"ru/misc/cheat-sheets.md"},i=r("",13),h=[i];function s(o,c,n,d,p,f){return t(),a("div",null,h)}const _=e(l,[["render",s]]);export{S as __pageData,_ as default}; +import{_ as e,c as a,o as t,U as r}from"./chunks/framework.P5TqXf0g.js";const S=JSON.parse('{"title":"Шпаргалки (Cheat Sheet)","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/cheat-sheets.md","filePath":"ru/misc/cheat-sheets.md","lastUpdated":1706553672000}'),l={name:"ru/misc/cheat-sheets.md"},i=r("",13),h=[i];function s(o,c,n,d,p,f){return t(),a("div",null,h)}const _=e(l,[["render",s]]);export{S as __pageData,_ as default}; diff --git a/assets/ru_misc_contribute.md.LbBCHFLN.lean.js b/assets/ru_misc_contribute.md.vor1kH7M.js similarity index 97% rename from assets/ru_misc_contribute.md.LbBCHFLN.lean.js rename to assets/ru_misc_contribute.md.vor1kH7M.js index 837cfe277..5662769ac 100644 --- a/assets/ru_misc_contribute.md.LbBCHFLN.lean.js +++ b/assets/ru_misc_contribute.md.vor1kH7M.js @@ -1,4 +1,4 @@ -import{h as r,c as d,m as e,ab as l,ac as o,a as i,o as m}from"./chunks/framework.P5TqXf0g.js";const p=e("h1",{id:"внесите-лепту-в-развитие-данного-ресурса",tabindex:"-1"},[i("Внесите лепту в развитие данного ресурса "),e("a",{class:"header-anchor",href:"#внесите-лепту-в-развитие-данного-ресурса","aria-label":'Permalink to "Внесите лепту в развитие данного ресурса"'},"​")],-1),h=e("p",null,"Вы можете предложить корректировку любого или добавление нового материала используя форму ниже.",-1),f=e("p",null,[i("GitHub way внесения изменений ("),e("i",null,"fork -> edit -> create PR"),i(") также всячески приветствуется.")],-1),b={class:"form-container",action:"action_page.php"},_=e("label",{for:"fname"},"Ваше имя и/или контакты (опционально)",-1),v=e("label",{for:"subject"},"Вопрос/ответ или сообщение",-1),k=e("label",{for:"check"},'Введите слово "vue"',-1),j=JSON.parse('{"title":"Внесите лепту в развитие данного ресурса","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/contribute.md","filePath":"ru/misc/contribute.md","lastUpdated":1706427418000}'),g={name:"ru/misc/contribute.md"},P=Object.assign(g,{setup(y){const n=r(),t=r({name:"",email:"",message:"",check:""});async function u(){if(n.value.setAttribute("disabled",!0),t.value.check==="vue"){const c=`Сообщение с сайта Vue FAQ: +import{h as r,c as d,m as e,ab as l,ac as o,a as i,o as m}from"./chunks/framework.P5TqXf0g.js";const p=e("h1",{id:"внесите-лепту-в-развитие-данного-ресурса",tabindex:"-1"},[i("Внесите лепту в развитие данного ресурса "),e("a",{class:"header-anchor",href:"#внесите-лепту-в-развитие-данного-ресурса","aria-label":'Permalink to "Внесите лепту в развитие данного ресурса"'},"​")],-1),h=e("p",null,"Вы можете предложить корректировку любого или добавление нового материала используя форму ниже.",-1),f=e("p",null,[i("GitHub way внесения изменений ("),e("i",null,"fork -> edit -> create PR"),i(") также всячески приветствуется.")],-1),b={class:"form-container",action:"action_page.php"},_=e("label",{for:"fname"},"Ваше имя и/или контакты (опционально)",-1),v=e("label",{for:"subject"},"Вопрос/ответ или сообщение",-1),k=e("label",{for:"check"},'Введите слово "vue"',-1),j=JSON.parse('{"title":"Внесите лепту в развитие данного ресурса","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/contribute.md","filePath":"ru/misc/contribute.md","lastUpdated":1706553672000}'),g={name:"ru/misc/contribute.md"},P=Object.assign(g,{setup(y){const n=r(),t=r({name:"",email:"",message:"",check:""});async function u(){if(n.value.setAttribute("disabled",!0),t.value.check==="vue"){const c=`Сообщение с сайта Vue FAQ: Имя:${t.value.name} diff --git a/assets/ru_misc_contribute.md.LbBCHFLN.js b/assets/ru_misc_contribute.md.vor1kH7M.lean.js similarity index 97% rename from assets/ru_misc_contribute.md.LbBCHFLN.js rename to assets/ru_misc_contribute.md.vor1kH7M.lean.js index 837cfe277..5662769ac 100644 --- a/assets/ru_misc_contribute.md.LbBCHFLN.js +++ b/assets/ru_misc_contribute.md.vor1kH7M.lean.js @@ -1,4 +1,4 @@ -import{h as r,c as d,m as e,ab as l,ac as o,a as i,o as m}from"./chunks/framework.P5TqXf0g.js";const p=e("h1",{id:"внесите-лепту-в-развитие-данного-ресурса",tabindex:"-1"},[i("Внесите лепту в развитие данного ресурса "),e("a",{class:"header-anchor",href:"#внесите-лепту-в-развитие-данного-ресурса","aria-label":'Permalink to "Внесите лепту в развитие данного ресурса"'},"​")],-1),h=e("p",null,"Вы можете предложить корректировку любого или добавление нового материала используя форму ниже.",-1),f=e("p",null,[i("GitHub way внесения изменений ("),e("i",null,"fork -> edit -> create PR"),i(") также всячески приветствуется.")],-1),b={class:"form-container",action:"action_page.php"},_=e("label",{for:"fname"},"Ваше имя и/или контакты (опционально)",-1),v=e("label",{for:"subject"},"Вопрос/ответ или сообщение",-1),k=e("label",{for:"check"},'Введите слово "vue"',-1),j=JSON.parse('{"title":"Внесите лепту в развитие данного ресурса","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/contribute.md","filePath":"ru/misc/contribute.md","lastUpdated":1706427418000}'),g={name:"ru/misc/contribute.md"},P=Object.assign(g,{setup(y){const n=r(),t=r({name:"",email:"",message:"",check:""});async function u(){if(n.value.setAttribute("disabled",!0),t.value.check==="vue"){const c=`Сообщение с сайта Vue FAQ: +import{h as r,c as d,m as e,ab as l,ac as o,a as i,o as m}from"./chunks/framework.P5TqXf0g.js";const p=e("h1",{id:"внесите-лепту-в-развитие-данного-ресурса",tabindex:"-1"},[i("Внесите лепту в развитие данного ресурса "),e("a",{class:"header-anchor",href:"#внесите-лепту-в-развитие-данного-ресурса","aria-label":'Permalink to "Внесите лепту в развитие данного ресурса"'},"​")],-1),h=e("p",null,"Вы можете предложить корректировку любого или добавление нового материала используя форму ниже.",-1),f=e("p",null,[i("GitHub way внесения изменений ("),e("i",null,"fork -> edit -> create PR"),i(") также всячески приветствуется.")],-1),b={class:"form-container",action:"action_page.php"},_=e("label",{for:"fname"},"Ваше имя и/или контакты (опционально)",-1),v=e("label",{for:"subject"},"Вопрос/ответ или сообщение",-1),k=e("label",{for:"check"},'Введите слово "vue"',-1),j=JSON.parse('{"title":"Внесите лепту в развитие данного ресурса","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/contribute.md","filePath":"ru/misc/contribute.md","lastUpdated":1706553672000}'),g={name:"ru/misc/contribute.md"},P=Object.assign(g,{setup(y){const n=r(),t=r({name:"",email:"",message:"",check:""});async function u(){if(n.value.setAttribute("disabled",!0),t.value.check==="vue"){const c=`Сообщение с сайта Vue FAQ: Имя:${t.value.name} diff --git a/assets/ru_misc_glossary.md.TvcpXh2r.js b/assets/ru_misc_glossary.md.Wg97CvCV.js similarity index 96% rename from assets/ru_misc_glossary.md.TvcpXh2r.js rename to assets/ru_misc_glossary.md.Wg97CvCV.js index 3a9d21dc8..f7019968e 100644 --- a/assets/ru_misc_glossary.md.TvcpXh2r.js +++ b/assets/ru_misc_glossary.md.Wg97CvCV.js @@ -1 +1 @@ -import{_ as s,c as a,o as r,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const x=JSON.parse('{"title":"Глоссарий и сокращения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/glossary.md","filePath":"ru/misc/glossary.md","lastUpdated":1706427418000}'),l={name:"ru/misc/glossary.md"},o=e("h1",{id:"глоссарии-и-сокращения",tabindex:"-1"},[t("Глоссарий и сокращения "),e("a",{class:"header-anchor",href:"#глоссарии-и-сокращения","aria-label":'Permalink to "Глоссарий и сокращения"'},"​")],-1),n=e("ul",null,[e("li",null,"DX (developer experience) - опыт разработчика, удобство его работы над приложением. Сюда входит всё - качество кода, удобство работы с IDE, грамотная архитектура проекта, комментирование, качество документации, использование на проекте проверенных и лучших практик и т.п."),e("li",null,"UX (user experience) - опыт пользователя. Общее его впечатление от удобства работы с сайтом/приложением."),e("li",null,"UI (user interface) - дизайн вебсайта/приложения с точки зрения визуальной эстетики и стиля"),e("li",null,"SW (service worker) - сервис воркер (элемент PWA)"),e("li",null,"AT (access token) - токен при JWT аутентификации"),e("li",null,"RT (refresh token) - токен при JWT аутентификации")],-1),c=[o,n];function i(d,u,_,p,m,h){return r(),a("div",null,c)}const k=s(l,[["render",i]]);export{x as __pageData,k as default}; +import{_ as s,c as a,o as r,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const x=JSON.parse('{"title":"Глоссарий и сокращения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/glossary.md","filePath":"ru/misc/glossary.md","lastUpdated":1706553672000}'),l={name:"ru/misc/glossary.md"},o=e("h1",{id:"глоссарии-и-сокращения",tabindex:"-1"},[t("Глоссарий и сокращения "),e("a",{class:"header-anchor",href:"#глоссарии-и-сокращения","aria-label":'Permalink to "Глоссарий и сокращения"'},"​")],-1),n=e("ul",null,[e("li",null,"DX (developer experience) - опыт разработчика, удобство его работы над приложением. Сюда входит всё - качество кода, удобство работы с IDE, грамотная архитектура проекта, комментирование, качество документации, использование на проекте проверенных и лучших практик и т.п."),e("li",null,"UX (user experience) - опыт пользователя. Общее его впечатление от удобства работы с сайтом/приложением."),e("li",null,"UI (user interface) - дизайн вебсайта/приложения с точки зрения визуальной эстетики и стиля"),e("li",null,"SW (service worker) - сервис воркер (элемент PWA)"),e("li",null,"AT (access token) - токен при JWT аутентификации"),e("li",null,"RT (refresh token) - токен при JWT аутентификации")],-1),c=[o,n];function i(d,u,_,p,m,h){return r(),a("div",null,c)}const k=s(l,[["render",i]]);export{x as __pageData,k as default}; diff --git a/assets/ru_misc_glossary.md.TvcpXh2r.lean.js b/assets/ru_misc_glossary.md.Wg97CvCV.lean.js similarity index 96% rename from assets/ru_misc_glossary.md.TvcpXh2r.lean.js rename to assets/ru_misc_glossary.md.Wg97CvCV.lean.js index 3a9d21dc8..f7019968e 100644 --- a/assets/ru_misc_glossary.md.TvcpXh2r.lean.js +++ b/assets/ru_misc_glossary.md.Wg97CvCV.lean.js @@ -1 +1 @@ -import{_ as s,c as a,o as r,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const x=JSON.parse('{"title":"Глоссарий и сокращения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/glossary.md","filePath":"ru/misc/glossary.md","lastUpdated":1706427418000}'),l={name:"ru/misc/glossary.md"},o=e("h1",{id:"глоссарии-и-сокращения",tabindex:"-1"},[t("Глоссарий и сокращения "),e("a",{class:"header-anchor",href:"#глоссарии-и-сокращения","aria-label":'Permalink to "Глоссарий и сокращения"'},"​")],-1),n=e("ul",null,[e("li",null,"DX (developer experience) - опыт разработчика, удобство его работы над приложением. Сюда входит всё - качество кода, удобство работы с IDE, грамотная архитектура проекта, комментирование, качество документации, использование на проекте проверенных и лучших практик и т.п."),e("li",null,"UX (user experience) - опыт пользователя. Общее его впечатление от удобства работы с сайтом/приложением."),e("li",null,"UI (user interface) - дизайн вебсайта/приложения с точки зрения визуальной эстетики и стиля"),e("li",null,"SW (service worker) - сервис воркер (элемент PWA)"),e("li",null,"AT (access token) - токен при JWT аутентификации"),e("li",null,"RT (refresh token) - токен при JWT аутентификации")],-1),c=[o,n];function i(d,u,_,p,m,h){return r(),a("div",null,c)}const k=s(l,[["render",i]]);export{x as __pageData,k as default}; +import{_ as s,c as a,o as r,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const x=JSON.parse('{"title":"Глоссарий и сокращения","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/glossary.md","filePath":"ru/misc/glossary.md","lastUpdated":1706553672000}'),l={name:"ru/misc/glossary.md"},o=e("h1",{id:"глоссарии-и-сокращения",tabindex:"-1"},[t("Глоссарий и сокращения "),e("a",{class:"header-anchor",href:"#глоссарии-и-сокращения","aria-label":'Permalink to "Глоссарий и сокращения"'},"​")],-1),n=e("ul",null,[e("li",null,"DX (developer experience) - опыт разработчика, удобство его работы над приложением. Сюда входит всё - качество кода, удобство работы с IDE, грамотная архитектура проекта, комментирование, качество документации, использование на проекте проверенных и лучших практик и т.п."),e("li",null,"UX (user experience) - опыт пользователя. Общее его впечатление от удобства работы с сайтом/приложением."),e("li",null,"UI (user interface) - дизайн вебсайта/приложения с точки зрения визуальной эстетики и стиля"),e("li",null,"SW (service worker) - сервис воркер (элемент PWA)"),e("li",null,"AT (access token) - токен при JWT аутентификации"),e("li",null,"RT (refresh token) - токен при JWT аутентификации")],-1),c=[o,n];function i(d,u,_,p,m,h){return r(),a("div",null,c)}const k=s(l,[["render",i]]);export{x as __pageData,k as default}; diff --git a/assets/ru_misc_introduction.md.jvAtBfIU.js b/assets/ru_misc_introduction.md.fitoRiBp.js similarity index 97% rename from assets/ru_misc_introduction.md.jvAtBfIU.js rename to assets/ru_misc_introduction.md.fitoRiBp.js index af10087e7..34c741ba0 100644 --- a/assets/ru_misc_introduction.md.jvAtBfIU.js +++ b/assets/ru_misc_introduction.md.fitoRiBp.js @@ -1 +1 @@ -import{_ as e,c as r,o as t,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Предисловие","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/introduction.md","filePath":"ru/misc/introduction.md","lastUpdated":1706427418000}'),s={name:"ru/misc/introduction.md"},n=a('

Предисловие

Данный FAQ (Frequently Asked Questions - Часто задаваемые вопросы) создан по наиболее часто затрагиваемым темам в Reddit r/vuejs/ и Телеграм чате @vuejs_ru

Уровень вопросов и ответов охватывает как начинающих так и опытных фронтэнд разработчиков.

В качестве ответов используется как общепризнанная, проверенная и объективная информация, так и субъективное мнение составителя.

Повышение сложности не идет сверху вниз. И в первых вопросах-ответах описываются неочевидные моменты, могущие быть интересными для опытных программистов.

Основные источники информации - официальная документация Vue 3 и Vite, книга Vue.js 3 Design Patterns and Best Practices, r/vuejs/, @vuejs_ru

Актуальность информации - 2022-2023 года.

У нас есть Телеграм канал

В нем публикуются анонсы о новых материалах на данном ресурсе и другая интересная относящаяся к Vue.js информация: https://t.me/vuefaq

',9),o=[n];function i(_,u,c,l,d,p){return t(),r("div",null,o)}const m=e(s,[["render",i]]);export{f as __pageData,m as default}; +import{_ as e,c as r,o as t,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Предисловие","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/introduction.md","filePath":"ru/misc/introduction.md","lastUpdated":1706553672000}'),s={name:"ru/misc/introduction.md"},n=a('

Предисловие

Данный FAQ (Frequently Asked Questions - Часто задаваемые вопросы) создан по наиболее часто затрагиваемым темам в Reddit r/vuejs/ и Телеграм чате @vuejs_ru

Уровень вопросов и ответов охватывает как начинающих так и опытных фронтэнд разработчиков.

В качестве ответов используется как общепризнанная, проверенная и объективная информация, так и субъективное мнение составителя.

Повышение сложности не идет сверху вниз. И в первых вопросах-ответах описываются неочевидные моменты, могущие быть интересными для опытных программистов.

Основные источники информации - официальная документация Vue 3 и Vite, книга Vue.js 3 Design Patterns and Best Practices, r/vuejs/, @vuejs_ru

Актуальность информации - 2022-2023 года.

У нас есть Телеграм канал

В нем публикуются анонсы о новых материалах на данном ресурсе и другая интересная относящаяся к Vue.js информация: https://t.me/vuefaq

',9),o=[n];function i(_,u,c,l,d,p){return t(),r("div",null,o)}const m=e(s,[["render",i]]);export{f as __pageData,m as default}; diff --git a/assets/ru_misc_introduction.md.jvAtBfIU.lean.js b/assets/ru_misc_introduction.md.fitoRiBp.lean.js similarity index 85% rename from assets/ru_misc_introduction.md.jvAtBfIU.lean.js rename to assets/ru_misc_introduction.md.fitoRiBp.lean.js index 44f0e8dc6..b602329fd 100644 --- a/assets/ru_misc_introduction.md.jvAtBfIU.lean.js +++ b/assets/ru_misc_introduction.md.fitoRiBp.lean.js @@ -1 +1 @@ -import{_ as e,c as r,o as t,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Предисловие","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/introduction.md","filePath":"ru/misc/introduction.md","lastUpdated":1706427418000}'),s={name:"ru/misc/introduction.md"},n=a("",9),o=[n];function i(_,u,c,l,d,p){return t(),r("div",null,o)}const m=e(s,[["render",i]]);export{f as __pageData,m as default}; +import{_ as e,c as r,o as t,U as a}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Предисловие","description":"","frontmatter":{},"headers":[],"relativePath":"ru/misc/introduction.md","filePath":"ru/misc/introduction.md","lastUpdated":1706553672000}'),s={name:"ru/misc/introduction.md"},n=a("",9),o=[n];function i(_,u,c,l,d,p){return t(),r("div",null,o)}const m=e(s,[["render",i]]);export{f as __pageData,m as default}; diff --git a/assets/ru_vue-webapp_contribution.md.g6Z6NUb5.lean.js b/assets/ru_vue-webapp_contribution.md.JQrZGxDM.js similarity index 90% rename from assets/ru_vue-webapp_contribution.md.g6Z6NUb5.lean.js rename to assets/ru_vue-webapp_contribution.md.JQrZGxDM.js index 928223893..de9385da7 100644 --- a/assets/ru_vue-webapp_contribution.md.g6Z6NUb5.lean.js +++ b/assets/ru_vue-webapp_contribution.md.JQrZGxDM.js @@ -1 +1 @@ -import{_ as a,c as n,o,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Участие в проекте","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/contribution.md","filePath":"ru/vue-webapp/contribution.md","lastUpdated":1706427418000}'),r={name:"ru/vue-webapp/contribution.md"},p=e("h1",{id:"участие-в-проекте",tabindex:"-1"},[t("Участие в проекте "),e("a",{class:"header-anchor",href:"#участие-в-проекте","aria-label":'Permalink to "Участие в проекте"'},"​")],-1),s=e("p",null,[e("a",{href:"https://github.com/vuesence/create-vue-webapp",target:"_blank",rel:"noreferrer"},"create-vue-webapp"),t(" и "),e("a",{href:"https://github.com/vuesence/vue-webapp",target:"_blank",rel:"noreferrer"},"vue-webapp"),t(" являются open source проектами под лицензией MIT.")],-1),c=e("p",null,"Приглашаем к участию всех желающих.",-1),i=[p,s,c];function u(l,m,d,_,b,h){return o(),n("div",null,i)}const v=a(r,[["render",u]]);export{f as __pageData,v as default}; +import{_ as a,c as n,o,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Участие в проекте","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/contribution.md","filePath":"ru/vue-webapp/contribution.md","lastUpdated":1706553672000}'),r={name:"ru/vue-webapp/contribution.md"},p=e("h1",{id:"участие-в-проекте",tabindex:"-1"},[t("Участие в проекте "),e("a",{class:"header-anchor",href:"#участие-в-проекте","aria-label":'Permalink to "Участие в проекте"'},"​")],-1),s=e("p",null,[e("a",{href:"https://github.com/vuesence/create-vue-webapp",target:"_blank",rel:"noreferrer"},"create-vue-webapp"),t(" и "),e("a",{href:"https://github.com/vuesence/vue-webapp",target:"_blank",rel:"noreferrer"},"vue-webapp"),t(" являются open source проектами под лицензией MIT.")],-1),c=e("p",null,"Приглашаем к участию всех желающих.",-1),i=[p,s,c];function u(l,m,d,_,b,h){return o(),n("div",null,i)}const v=a(r,[["render",u]]);export{f as __pageData,v as default}; diff --git a/assets/ru_vue-webapp_contribution.md.g6Z6NUb5.js b/assets/ru_vue-webapp_contribution.md.JQrZGxDM.lean.js similarity index 90% rename from assets/ru_vue-webapp_contribution.md.g6Z6NUb5.js rename to assets/ru_vue-webapp_contribution.md.JQrZGxDM.lean.js index 928223893..de9385da7 100644 --- a/assets/ru_vue-webapp_contribution.md.g6Z6NUb5.js +++ b/assets/ru_vue-webapp_contribution.md.JQrZGxDM.lean.js @@ -1 +1 @@ -import{_ as a,c as n,o,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Участие в проекте","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/contribution.md","filePath":"ru/vue-webapp/contribution.md","lastUpdated":1706427418000}'),r={name:"ru/vue-webapp/contribution.md"},p=e("h1",{id:"участие-в-проекте",tabindex:"-1"},[t("Участие в проекте "),e("a",{class:"header-anchor",href:"#участие-в-проекте","aria-label":'Permalink to "Участие в проекте"'},"​")],-1),s=e("p",null,[e("a",{href:"https://github.com/vuesence/create-vue-webapp",target:"_blank",rel:"noreferrer"},"create-vue-webapp"),t(" и "),e("a",{href:"https://github.com/vuesence/vue-webapp",target:"_blank",rel:"noreferrer"},"vue-webapp"),t(" являются open source проектами под лицензией MIT.")],-1),c=e("p",null,"Приглашаем к участию всех желающих.",-1),i=[p,s,c];function u(l,m,d,_,b,h){return o(),n("div",null,i)}const v=a(r,[["render",u]]);export{f as __pageData,v as default}; +import{_ as a,c as n,o,m as e,a as t}from"./chunks/framework.P5TqXf0g.js";const f=JSON.parse('{"title":"Участие в проекте","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/contribution.md","filePath":"ru/vue-webapp/contribution.md","lastUpdated":1706553672000}'),r={name:"ru/vue-webapp/contribution.md"},p=e("h1",{id:"участие-в-проекте",tabindex:"-1"},[t("Участие в проекте "),e("a",{class:"header-anchor",href:"#участие-в-проекте","aria-label":'Permalink to "Участие в проекте"'},"​")],-1),s=e("p",null,[e("a",{href:"https://github.com/vuesence/create-vue-webapp",target:"_blank",rel:"noreferrer"},"create-vue-webapp"),t(" и "),e("a",{href:"https://github.com/vuesence/vue-webapp",target:"_blank",rel:"noreferrer"},"vue-webapp"),t(" являются open source проектами под лицензией MIT.")],-1),c=e("p",null,"Приглашаем к участию всех желающих.",-1),i=[p,s,c];function u(l,m,d,_,b,h){return o(),n("div",null,i)}const v=a(r,[["render",u]]);export{f as __pageData,v as default}; diff --git a/assets/ru_vue-webapp_getting-started.md.0RG3MV12.js b/assets/ru_vue-webapp_getting-started.md.0RG3MV12.js new file mode 100644 index 000000000..58e59b554 --- /dev/null +++ b/assets/ru_vue-webapp_getting-started.md.0RG3MV12.js @@ -0,0 +1,39 @@ +import{_ as a,c as s,o as d,U as i,ad as t}from"./chunks/framework.P5TqXf0g.js";const E=JSON.parse('{"title":"Установка","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/getting-started.md","filePath":"ru/vue-webapp/getting-started.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/getting-started.md"},h=i(`

Установка

Установка через create vue-webapp

При данном способе можно выбрать, какие опции будут установлены:

sh
$ pnpm create vue-webapp
+
+ Project name: ... my-vue-project
+ Add a Splash screen? ... no / yes
+ Make it PWA (adds service worker and manifest)? ... no / yes
+ Add Open Graph meta tags? ... no / yes
+ Add Google Analytics code? ... no / yes
+ Add Github Action Workflow for publishing it on GitHub Pages? ... no / yes
+ Select application layout » MainLayout
+ Select navigation drawer » SimpleDrawer
+ Select webapp navbar » MantineSimpleNavbar
+ Select webapp header » MantineSimpleHeader
+ Select webapp footer » MantineRichFooter
+ Add API layer (REST)? ... no / yes
+ Add JSON-RPC adapter? ... no / yes
+
+Scaffolding project in /home/ubuntu/my-vue-project...
"Молчаливая" установка

Возможно установка без ручного ввода параметров с указанием конфигурационного файла с опциями:

bash
pnpm create vue-webapp -c config.json
+// or
+pnpm create vue-webapp --config config.json

Формат файла config.json:

json
{
+  "projectName": "my-vue-project",
+  "splashScreen": false,
+  "pwa": true,
+  "openGraph": false,
+  "googleAnalytics": false,
+  "githubActionsGithubPagesWorkflow": true,
+  "layout": "MainLayout",
+  "navigationDrawer": "SimpleDrawer",
+  "navbar": "MantineSimpleNavbar",
+  "header": "MantineSimpleHeader",
+  "footer": "MantineRichFooter",
+  "api": true,
+  "jsonRpc": false,
+  "overwrite": true
+}

Параметр overwrite означает перезаписывание содержимого уже существующей директории. Может принимать значения "yes", "no" и "ignore".

Также, команда

bash
$ pnpm create vue-webapp .

создаст проект в текущей директории.

Данный метод создаст проект только с выбранными компонентами и функционалом.

Инициализация и запуск веб приложения

sh
$ cd my-vue-project
+$ pnpm i
+$ pnpm dev

Результат в браузере:

image

Установка из репозитория

При данном способе будет установлено всё, однако непосредственно в проекте будет подключена не вся функциональность. Удобно для ознакомления и тестирования всех доступных компонент и функционала.

sh
$ git clone https://github.com/vuesence/vue-webapp.git
+$ cd vue-webapp
+$ pnpm i
+$ pnpm dev
`,13),p=[h];function k(l,e,F,v,f,r){return d(),s("div",null,p)}const y=a(n,[["render",k],["__scopeId","data-v-1f7d28d6"]]);export{E as __pageData,y as default}; diff --git a/assets/ru_vue-webapp_getting-started.md.Bb8mL-Ia.lean.js b/assets/ru_vue-webapp_getting-started.md.0RG3MV12.lean.js similarity index 56% rename from assets/ru_vue-webapp_getting-started.md.Bb8mL-Ia.lean.js rename to assets/ru_vue-webapp_getting-started.md.0RG3MV12.lean.js index 36adb35ea..6b0d4ddf3 100644 --- a/assets/ru_vue-webapp_getting-started.md.Bb8mL-Ia.lean.js +++ b/assets/ru_vue-webapp_getting-started.md.0RG3MV12.lean.js @@ -1 +1 @@ -import{_ as a,c as s,o as i,U as t,ad as n}from"./chunks/framework.P5TqXf0g.js";const E=JSON.parse('{"title":"Установка","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/getting-started.md","filePath":"ru/vue-webapp/getting-started.md","lastUpdated":1706427418000}'),h={name:"ru/vue-webapp/getting-started.md"},p=t("",13),k=[p];function f(d,l,e,F,v,r){return i(),s("div",null,k)}const y=a(h,[["render",f],["__scopeId","data-v-06ff214a"]]);export{E as __pageData,y as default}; +import{_ as a,c as s,o as d,U as i,ad as t}from"./chunks/framework.P5TqXf0g.js";const E=JSON.parse('{"title":"Установка","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/getting-started.md","filePath":"ru/vue-webapp/getting-started.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/getting-started.md"},h=i("",13),p=[h];function k(l,e,F,v,f,r){return d(),s("div",null,p)}const y=a(n,[["render",k],["__scopeId","data-v-1f7d28d6"]]);export{E as __pageData,y as default}; diff --git a/assets/ru_vue-webapp_getting-started.md.Bb8mL-Ia.js b/assets/ru_vue-webapp_getting-started.md.Bb8mL-Ia.js deleted file mode 100644 index 612b55d02..000000000 --- a/assets/ru_vue-webapp_getting-started.md.Bb8mL-Ia.js +++ /dev/null @@ -1,39 +0,0 @@ -import{_ as a,c as s,o as i,U as t,ad as n}from"./chunks/framework.P5TqXf0g.js";const E=JSON.parse('{"title":"Установка","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/getting-started.md","filePath":"ru/vue-webapp/getting-started.md","lastUpdated":1706427418000}'),h={name:"ru/vue-webapp/getting-started.md"},p=t(`

Установка

Установка через create vue-webapp

При данном способе можно выбрать, какие опции будут установлены:

sh
$ pnpm create vue-webapp
-
- Project name: ... my-vue-project
- Add a Splash screen? ... no / yes
- Make it PWA (adds service worker and manifest)? ... no / yes
- Add Open Graph meta tags? ... no / yes
- Add Google Analytics code? ... no / yes
- Add Github Action Workflow for publishing it on GitHub Pages? ... no / yes
- Select application layout » MainLayout
- Select navigation drawer » SimpleDrawer
- Select webapp navbar » MantineSimpleNavbar
- Select webapp header » MantineSimpleHeader
- Select webapp footer » MantineRichFooter
- Add API layer (REST)? ... no / yes
- Add JSON-RPC adapter? ... no / yes
-
-Scaffolding project in /home/ubuntu/my-vue-project...
"Молчаливая" установка

Возможно установка без ручного ввода параметров с указанием конфигурационного файла с опциями:

bash
pnpm create vue-webapp -c config.json
-// or
-pnpm create vue-webapp --config config.json

Формат файла config.json:

json
{
-  "projectName": "my-vue-project",
-  "splashScreen": false,
-  "pwa": true,
-  "openGraph": false,
-  "googleAnalytics": false,
-  "githubActionsGithubPagesWorkflow": true,
-  "layout": "MainLayout",
-  "navigationDrawer": "SimpleDrawer",
-  "navbar": "MantineSimpleNavbar",
-  "header": "MantineSimpleHeader",
-  "footer": "MantineRichFooter",
-  "api": true,
-  "jsonRpc": false,
-  "overwrite": true
-}

Параметр overwrite означает перезаписывание содержимого уже существующей директории. Может принимать значения "yes", "no" и "ignore".

Также, команда

bash
$ pnpm create vue-webapp .

создаст проект в текущей директории.

Данный метод создаст проект только с выбранными компонентами и функционалом.

Инициализация и запуск веб приложения

sh
$ cd my-vue-project
-$ pnpm i
-$ pnpm dev

Результат в браузере:

image

Установка из репозитория

При данном способе будет установлено всё, однако непосредственно в проекте будет подключена не вся функциональность. Удобно для ознакомления и тестирования всех доступных компонент и функционала.

sh
$ git clone https://github.com/vuesence/vue-webapp.git
-$ cd vue-webapp
-$ pnpm i
-$ pnpm dev
`,13),k=[p];function f(d,l,e,F,v,r){return i(),s("div",null,k)}const y=a(h,[["render",f],["__scopeId","data-v-06ff214a"]]);export{E as __pageData,y as default}; diff --git a/assets/ru_vue-webapp_guidelines.md.73ssn_Fa.js b/assets/ru_vue-webapp_guidelines.md.ihh4Ek53.js similarity index 98% rename from assets/ru_vue-webapp_guidelines.md.73ssn_Fa.js rename to assets/ru_vue-webapp_guidelines.md.ihh4Ek53.js index c3392762a..71f3753ff 100644 --- a/assets/ru_vue-webapp_guidelines.md.73ssn_Fa.js +++ b/assets/ru_vue-webapp_guidelines.md.ihh4Ek53.js @@ -1 +1 @@ -import{_ as e,c as t,o as i,U as a}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Принципы","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/guidelines.md","filePath":"ru/vue-webapp/guidelines.md","lastUpdated":1706427418000}'),l={name:"ru/vue-webapp/guidelines.md"},o=a('

Принципы

  • Лёгкое эффективное вебприложение с высоким современным UI/UX
  • Vue 3, Composition API, script setup синтаксис
  • Не использовать сторонние библиотеки без необходимости. Единственная обязательная зависимость - vue-router
  • Использование чистого и эффективного HTML5 и CSS3 для верстки
  • Подключение требуемого функционала только по необходимости
  • Высокая кастомизация

  • Подключение определенной функциональности, например i18n, означает не просто добавление этой библиотеки в package.json, а полноценную минимальную работающую интеграцию - создание соответствующей composable функции, нескольких локалей, и применение t() в шаблоне для иллюстрации с необходимыми комментариями в коде для облегчения последующего использования и кастомизации.

  • Подключение определенной функциональности, использующей стороннюю библиотеку (например, тостер или модальное окно), делается через обёртку, чтобы потом разработчику при желании было легко поменять конкретный пакет, реализующий данный функционал.

  • Для веб приложения используется TypeScript, однако продолжать писать приложение можно на чистом JavaScript.

  • В качестве сборщика используется Vite.

  • В качестве CSS препроцессора используется SCSS.

  • Для линтинга и форматирования в ESlint используется eslint-config Antony Fu.

  • На "выходе" получается готовое Vue 3 приложение без зависимостей от каких-либо фреймворков/библиотек/пакетов, если только пользователь явно не включил их в каркас.

',4),n=[o];function p(r,s,c,u,_,d){return i(),t("div",null,n)}const h=e(l,[["render",p]]);export{g as __pageData,h as default}; +import{_ as e,c as t,o as i,U as a}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Принципы","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/guidelines.md","filePath":"ru/vue-webapp/guidelines.md","lastUpdated":1706553672000}'),l={name:"ru/vue-webapp/guidelines.md"},o=a('

Принципы

  • Лёгкое эффективное вебприложение с высоким современным UI/UX
  • Vue 3, Composition API, script setup синтаксис
  • Не использовать сторонние библиотеки без необходимости. Единственная обязательная зависимость - vue-router
  • Использование чистого и эффективного HTML5 и CSS3 для верстки
  • Подключение требуемого функционала только по необходимости
  • Высокая кастомизация

  • Подключение определенной функциональности, например i18n, означает не просто добавление этой библиотеки в package.json, а полноценную минимальную работающую интеграцию - создание соответствующей composable функции, нескольких локалей, и применение t() в шаблоне для иллюстрации с необходимыми комментариями в коде для облегчения последующего использования и кастомизации.

  • Подключение определенной функциональности, использующей стороннюю библиотеку (например, тостер или модальное окно), делается через обёртку, чтобы потом разработчику при желании было легко поменять конкретный пакет, реализующий данный функционал.

  • Для веб приложения используется TypeScript, однако продолжать писать приложение можно на чистом JavaScript.

  • В качестве сборщика используется Vite.

  • В качестве CSS препроцессора используется SCSS.

  • Для линтинга и форматирования в ESlint используется eslint-config Antony Fu.

  • На "выходе" получается готовое Vue 3 приложение без зависимостей от каких-либо фреймворков/библиотек/пакетов, если только пользователь явно не включил их в каркас.

',4),n=[o];function p(r,s,c,u,_,d){return i(),t("div",null,n)}const h=e(l,[["render",p]]);export{g as __pageData,h as default}; diff --git a/assets/ru_vue-webapp_guidelines.md.73ssn_Fa.lean.js b/assets/ru_vue-webapp_guidelines.md.ihh4Ek53.lean.js similarity index 90% rename from assets/ru_vue-webapp_guidelines.md.73ssn_Fa.lean.js rename to assets/ru_vue-webapp_guidelines.md.ihh4Ek53.lean.js index 727ef6a00..dad81b105 100644 --- a/assets/ru_vue-webapp_guidelines.md.73ssn_Fa.lean.js +++ b/assets/ru_vue-webapp_guidelines.md.ihh4Ek53.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as i,U as a}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Принципы","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/guidelines.md","filePath":"ru/vue-webapp/guidelines.md","lastUpdated":1706427418000}'),l={name:"ru/vue-webapp/guidelines.md"},o=a("",4),n=[o];function p(r,s,c,u,_,d){return i(),t("div",null,n)}const h=e(l,[["render",p]]);export{g as __pageData,h as default}; +import{_ as e,c as t,o as i,U as a}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Принципы","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/guidelines.md","filePath":"ru/vue-webapp/guidelines.md","lastUpdated":1706553672000}'),l={name:"ru/vue-webapp/guidelines.md"},o=a("",4),n=[o];function p(r,s,c,u,_,d){return i(),t("div",null,n)}const h=e(l,[["render",p]]);export{g as __pageData,h as default}; diff --git a/assets/ru_vue-webapp_index.md.1abyIYnK.js b/assets/ru_vue-webapp_index.md.1abyIYnK.js deleted file mode 100644 index b56fb7ae9..000000000 --- a/assets/ru_vue-webapp_index.md.1abyIYnK.js +++ /dev/null @@ -1,8 +0,0 @@ -import{_ as a,c as s,o as i,U as t,ae as d}from"./chunks/framework.P5TqXf0g.js";const o=JSON.parse('{"title":"Vue 3 webapp билдер","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/index.md","filePath":"ru/vue-webapp/index.md","lastUpdated":1706427418000}'),e={name:"ru/vue-webapp/index.md"},n=t(`

Vue 3 webapp билдер

Краткое описание

Vue 3 вебсайт билдер (GitHub) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.

sh
$ pnpm create vue-webapp
-
- Project name: ... my-vue-project
- Add a Splash screen? ... no / yes
- Make it PWA (adds service worker and manifest)? ... no / yes
- Add Open Graph meta tags? ... no / yes
- Add Google Analytics code? ... no / yes
-...

Обоснование

Существует довольно много (в основном специфичных и быстро устаревающих) бойлерплейтов для создания Vue приложения. Обычно под этим подразумевается создание пустого проекта с определенными библиотеками. Другими словами, это просто настройка окружения для начала разработки без, непосредственно, кода.

В то же время, у многих других фронтенд и бэкенд фреймворков есть стартер-киты, позволяющие быстро создать готовый блог, онлайн магазин, сайт-визитку, портфолио, документацию и т.п., что значительно помогает как и в изучении самого фреймворка, соответствующих технологий и лучших практик, так и для решения стоящих перед бизнесом задач.

В результате может возникнуть впечатление, что Vue - довольно низкоуровневый фреймворк, и чтобы создавать вебприложения быстро, эффективно и удобно, необходимо взять какую-либо надстройку или иное решение - Nuxt, Vue Storefront, Astro, VitePress - которые прямо позиционируют себя как средство для решения определенных (или широкого круга) бизнес задач.

Появилась идея для создания инструмента, аналогичного create-vue, создающего каркас готового к работе веб приложения. С одной стороны, вполне работоспособного, адаптивного вебсайта с необходимым функционалом, чтобы начинающий разработчик мог ознакомиться с проверенным подходом в решении встающих при этом задач. С другой, достаточно минималистичным, не навязывающим опытному разработчику нежелаемые им зависимости, и создающим скелет из устоявшихся лучших практик для дальнейшего развития приложения.

Понятно, что определение той или иной "лучшей практики" (fetch или axios?) может быть довольно спорным моментом и зависит от контекста, но тем не менее.

image

',11),h=[n];function p(k,l,F,r,b,v){return i(),s("div",null,h)}const c=a(e,[["render",p],["__scopeId","data-v-32b5d500"]]);export{o as __pageData,c as default}; diff --git a/assets/ru_vue-webapp_index.md.1abyIYnK.lean.js b/assets/ru_vue-webapp_index.md.1abyIYnK.lean.js deleted file mode 100644 index b083d6511..000000000 --- a/assets/ru_vue-webapp_index.md.1abyIYnK.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as s,o as i,U as t,ae as d}from"./chunks/framework.P5TqXf0g.js";const o=JSON.parse('{"title":"Vue 3 webapp билдер","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/index.md","filePath":"ru/vue-webapp/index.md","lastUpdated":1706427418000}'),e={name:"ru/vue-webapp/index.md"},n=t("",11),h=[n];function p(k,l,F,r,b,v){return i(),s("div",null,h)}const c=a(e,[["render",p],["__scopeId","data-v-32b5d500"]]);export{o as __pageData,c as default}; diff --git a/assets/ru_vue-webapp_index.md.zGi9vV4Z.js b/assets/ru_vue-webapp_index.md.zGi9vV4Z.js new file mode 100644 index 000000000..dc39b0309 --- /dev/null +++ b/assets/ru_vue-webapp_index.md.zGi9vV4Z.js @@ -0,0 +1,8 @@ +import{_ as a,c as s,o as i,U as t,ae as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Vue 3 webapp билдер","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/index.md","filePath":"ru/vue-webapp/index.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/index.md"},h=t(`

Vue 3 webapp билдер

Краткое описание

Vue 3 вебсайт билдер (GitHub) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.

sh
$ pnpm create vue-webapp
+
+ Project name: ... my-vue-project
+ Add a Splash screen? ... no / yes
+ Make it PWA (adds service worker and manifest)? ... no / yes
+ Add Open Graph meta tags? ... no / yes
+ Add Google Analytics code? ... no / yes
+...

Обоснование

Существует довольно много (в основном специфичных и быстро устаревающих) бойлерплейтов для создания Vue приложения. Обычно под этим подразумевается создание пустого проекта с определенными библиотеками. Другими словами, это просто настройка окружения для начала разработки без, непосредственно, кода.

В то же время, у многих других фронтенд и бэкенд фреймворков есть стартер-киты, позволяющие быстро создать готовый блог, онлайн магазин, сайт-визитку, портфолио, документацию и т.п., что значительно помогает как и в изучении самого фреймворка, соответствующих технологий и лучших практик, так и для решения стоящих перед бизнесом задач.

В результате может возникнуть впечатление, что Vue - довольно низкоуровневый фреймворк, и чтобы создавать вебприложения быстро, эффективно и удобно, необходимо взять какую-либо надстройку или иное решение - Nuxt, Vue Storefront, Astro, VitePress - которые прямо позиционируют себя как средство для решения определенных (или широкого круга) бизнес задач.

Появилась идея для создания инструмента, аналогичного create-vue, создающего каркас готового к работе веб приложения. С одной стороны, вполне работоспособного, адаптивного вебсайта с необходимым функционалом, чтобы начинающий разработчик мог ознакомиться с проверенным подходом в решении встающих при этом задач. С другой, достаточно минималистичным, не навязывающим опытному разработчику нежелаемые им зависимости, и создающим скелет из устоявшихся лучших практик для дальнейшего развития приложения.

Понятно, что определение той или иной "лучшей практики" (fetch или axios?) может быть довольно спорным моментом и зависит от контекста, но тем не менее.

image

',11),p=[h];function d(k,l,c,F,r,v){return i(),s("div",null,p)}const o=a(n,[["render",d],["__scopeId","data-v-403afc04"]]);export{g as __pageData,o as default}; diff --git a/assets/ru_vue-webapp_index.md.zGi9vV4Z.lean.js b/assets/ru_vue-webapp_index.md.zGi9vV4Z.lean.js new file mode 100644 index 000000000..01b1cede8 --- /dev/null +++ b/assets/ru_vue-webapp_index.md.zGi9vV4Z.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,o as i,U as t,ae as e}from"./chunks/framework.P5TqXf0g.js";const g=JSON.parse('{"title":"Vue 3 webapp билдер","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/index.md","filePath":"ru/vue-webapp/index.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/index.md"},h=t("",11),p=[h];function d(k,l,c,F,r,v){return i(),s("div",null,p)}const o=a(n,[["render",d],["__scopeId","data-v-403afc04"]]);export{g as __pageData,o as default}; diff --git a/assets/ru_vue-webapp_objectives.md.hYhwbtkG.js b/assets/ru_vue-webapp_objectives.md.DTLaKSHQ.js similarity index 98% rename from assets/ru_vue-webapp_objectives.md.hYhwbtkG.js rename to assets/ru_vue-webapp_objectives.md.DTLaKSHQ.js index 88c88d31b..ad5f9fb11 100644 --- a/assets/ru_vue-webapp_objectives.md.hYhwbtkG.js +++ b/assets/ru_vue-webapp_objectives.md.DTLaKSHQ.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as i}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Цели","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/objectives.md","filePath":"ru/vue-webapp/objectives.md","lastUpdated":1706427418000}'),l={name:"ru/vue-webapp/objectives.md"},o=i('

Цели

  1. Создание конструктора каркаса простого сразу работающего SPA приложения под конкретную задачу за пару минут, с возможностью его дальнейшей стилизации и наполнения контентом.
  2. Тонкая кастомизация его с помощью небольших функциональных блоков кода.
  3. Сбор и обобщение лучших техник и практик при создании современного реактивного фронтенда.
  4. Дать возможность начинающим разработчикам на готовых примерах ознакомиться с экосистемой Vue.js, изучить лучшие практики фронтенда и Vue 3 от построения архитектуры приложения до наименования CSS классов.
  5. Дать возможность опытным разработчикам быстро и эффективно создавать каркас готового веб приложения и использовать переиспользуемые блоки кода (boilerplate), особенно такие, которые не могут быть распространяемы как NPM пакеты.

Данное приложение должно выполнять роль конструктора каркаса вебсайта, с возможностью выбора при создании:

  • Глобального бизнес-шаблона сайта (портфолио, блог, онлайн-магазин и.т.д)
  • Варианта общего лэйаута вебприложения
  • Вариантов конкретных компонент (header, footer, navigation drawer и т.д.)
  • Варианта общего стиля/дизайна
  • Отдельного функционала, инжектируемого как функциональные фрагменты (API модуль, i18n, PWA, splash screen, Auth модуль, themes и т.д. )
  • Вариантов GitHub Actions с возможностью билда и деплоя на популярные хостинги
  • Возможности подключения/интеграции при желании распространенных библиотек (в том числе UI)
  • Возможности интеграции c определенными headless CRM и API сервисами

Отдельно планируется создание веб-витрины, на которой пользователь, динамично меняя параметры, сможет посмотреть и протестировать доступные макеты сайта, темы/стилизации, компоненты (header, footer и т.д.) и функционал развертываемого приложения, а также их комбинацию друг с другом.

',5),s=[o];function n(r,p,c,_,d,u){return a(),t("div",null,s)}const b=e(l,[["render",n]]);export{h as __pageData,b as default}; +import{_ as e,c as t,o as a,U as i}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Цели","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/objectives.md","filePath":"ru/vue-webapp/objectives.md","lastUpdated":1706553672000}'),l={name:"ru/vue-webapp/objectives.md"},o=i('

Цели

  1. Создание конструктора каркаса простого сразу работающего SPA приложения под конкретную задачу за пару минут, с возможностью его дальнейшей стилизации и наполнения контентом.
  2. Тонкая кастомизация его с помощью небольших функциональных блоков кода.
  3. Сбор и обобщение лучших техник и практик при создании современного реактивного фронтенда.
  4. Дать возможность начинающим разработчикам на готовых примерах ознакомиться с экосистемой Vue.js, изучить лучшие практики фронтенда и Vue 3 от построения архитектуры приложения до наименования CSS классов.
  5. Дать возможность опытным разработчикам быстро и эффективно создавать каркас готового веб приложения и использовать переиспользуемые блоки кода (boilerplate), особенно такие, которые не могут быть распространяемы как NPM пакеты.

Данное приложение должно выполнять роль конструктора каркаса вебсайта, с возможностью выбора при создании:

  • Глобального бизнес-шаблона сайта (портфолио, блог, онлайн-магазин и.т.д)
  • Варианта общего лэйаута вебприложения
  • Вариантов конкретных компонент (header, footer, navigation drawer и т.д.)
  • Варианта общего стиля/дизайна
  • Отдельного функционала, инжектируемого как функциональные фрагменты (API модуль, i18n, PWA, splash screen, Auth модуль, themes и т.д. )
  • Вариантов GitHub Actions с возможностью билда и деплоя на популярные хостинги
  • Возможности подключения/интеграции при желании распространенных библиотек (в том числе UI)
  • Возможности интеграции c определенными headless CRM и API сервисами

Отдельно планируется создание веб-витрины, на которой пользователь, динамично меняя параметры, сможет посмотреть и протестировать доступные макеты сайта, темы/стилизации, компоненты (header, footer и т.д.) и функционал развертываемого приложения, а также их комбинацию друг с другом.

',5),s=[o];function n(r,p,c,_,d,u){return a(),t("div",null,s)}const b=e(l,[["render",n]]);export{h as __pageData,b as default}; diff --git a/assets/ru_vue-webapp_objectives.md.hYhwbtkG.lean.js b/assets/ru_vue-webapp_objectives.md.DTLaKSHQ.lean.js similarity index 90% rename from assets/ru_vue-webapp_objectives.md.hYhwbtkG.lean.js rename to assets/ru_vue-webapp_objectives.md.DTLaKSHQ.lean.js index c0b27154f..52f7a9f4a 100644 --- a/assets/ru_vue-webapp_objectives.md.hYhwbtkG.lean.js +++ b/assets/ru_vue-webapp_objectives.md.DTLaKSHQ.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a,U as i}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Цели","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/objectives.md","filePath":"ru/vue-webapp/objectives.md","lastUpdated":1706427418000}'),l={name:"ru/vue-webapp/objectives.md"},o=i("",5),s=[o];function n(r,p,c,_,d,u){return a(),t("div",null,s)}const b=e(l,[["render",n]]);export{h as __pageData,b as default}; +import{_ as e,c as t,o as a,U as i}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"Цели","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/objectives.md","filePath":"ru/vue-webapp/objectives.md","lastUpdated":1706553672000}'),l={name:"ru/vue-webapp/objectives.md"},o=i("",5),s=[o];function n(r,p,c,_,d,u){return a(),t("div",null,s)}const b=e(l,[["render",n]]);export{h as __pageData,b as default}; diff --git a/assets/ru_vue-webapp_options_adaptability.md.Gfxd7XZF.js b/assets/ru_vue-webapp_options_adaptability.md.ytbCRp7v.js similarity index 99% rename from assets/ru_vue-webapp_options_adaptability.md.Gfxd7XZF.js rename to assets/ru_vue-webapp_options_adaptability.md.ytbCRp7v.js index ae6aa6d55..a1276679e 100644 --- a/assets/ru_vue-webapp_options_adaptability.md.Gfxd7XZF.js +++ b/assets/ru_vue-webapp_options_adaptability.md.ytbCRp7v.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Адаптивность","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/adaptability.md","filePath":"ru/vue-webapp/options/adaptability.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/adaptability.md"},h=n(`

Адаптивность

Адаптивность реализована с помощью useScreenWidth composable функции через четыре класса (mobile, tablet, notebook и desktop), динамично устанавливающихся на тэг body.

Конфигурационные параметры (верхний брейкпойнт для каждого режима) для useScreenWidth устанавливаются в App.vue:

vue
<script setup lang="ts">
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Адаптивность","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/adaptability.md","filePath":"ru/vue-webapp/options/adaptability.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/adaptability.md"},h=n(`

Адаптивность

Адаптивность реализована с помощью useScreenWidth composable функции через четыре класса (mobile, tablet, notebook и desktop), динамично устанавливающихся на тэг body.

Конфигурационные параметры (верхний брейкпойнт для каждого режима) для useScreenWidth устанавливаются в App.vue:

vue
<script setup lang="ts">
 import { useScreenWidth } from "@/composables/useScreenWidth";
 
 useScreenWidth({
diff --git a/assets/ru_vue-webapp_options_adaptability.md.Gfxd7XZF.lean.js b/assets/ru_vue-webapp_options_adaptability.md.ytbCRp7v.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_adaptability.md.Gfxd7XZF.lean.js
rename to assets/ru_vue-webapp_options_adaptability.md.ytbCRp7v.lean.js
index 125874b9a..207140e33 100644
--- a/assets/ru_vue-webapp_options_adaptability.md.Gfxd7XZF.lean.js
+++ b/assets/ru_vue-webapp_options_adaptability.md.ytbCRp7v.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Адаптивность","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/adaptability.md","filePath":"ru/vue-webapp/options/adaptability.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/adaptability.md"},h=n("",9),p=[h];function l(k,e,E,d,r,g){return a(),i("div",null,p)}const y=s(t,[["render",l]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Адаптивность","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/adaptability.md","filePath":"ru/vue-webapp/options/adaptability.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/adaptability.md"},h=n("",9),p=[h];function l(k,e,E,d,r,g){return a(),i("div",null,p)}const y=s(t,[["render",l]]);export{c as __pageData,y as default};
diff --git a/assets/ru_vue-webapp_options_api.md.Wkjz6ywD.js b/assets/ru_vue-webapp_options_api.md.YjTpTbF-.js
similarity index 99%
rename from assets/ru_vue-webapp_options_api.md.Wkjz6ywD.js
rename to assets/ru_vue-webapp_options_api.md.YjTpTbF-.js
index 3446fd3a6..bc3ba8038 100644
--- a/assets/ru_vue-webapp_options_api.md.Wkjz6ywD.js
+++ b/assets/ru_vue-webapp_options_api.md.YjTpTbF-.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"API модуль","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/api.md","filePath":"ru/vue-webapp/options/api.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/api.md"},p=n(`

API модуль

API (REST)

Создает сервисный transport client agnostic слой-обертку для REST обращений к бэкенду по HTTP(S).

В качестве HTTP транспортного клиента может использоваться fetch, axios или промисная версия XHR, на выбор разработчика. С помощью неё вызовы API в коде выглядят следующим образом:

js
import { api } from "@/services/api";
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"API модуль","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/api.md","filePath":"ru/vue-webapp/options/api.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/api.md"},p=n(`

API модуль

API (REST)

Создает сервисный transport client agnostic слой-обертку для REST обращений к бэкенду по HTTP(S).

В качестве HTTP транспортного клиента может использоваться fetch, axios или промисная версия XHR, на выбор разработчика. С помощью неё вызовы API в коде выглядят следующим образом:

js
import { api } from "@/services/api";
 
 const apiData = ref();
 apiData.value = await api.utils.testRest();

Каждый вызов представляет из себя асинхронную функцию, возвращающую Promise.

js
// utils.ts
diff --git a/assets/ru_vue-webapp_options_api.md.Wkjz6ywD.lean.js b/assets/ru_vue-webapp_options_api.md.YjTpTbF-.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_api.md.Wkjz6ywD.lean.js
rename to assets/ru_vue-webapp_options_api.md.YjTpTbF-.lean.js
index cef0f6545..69e5c7ca0 100644
--- a/assets/ru_vue-webapp_options_api.md.Wkjz6ywD.lean.js
+++ b/assets/ru_vue-webapp_options_api.md.YjTpTbF-.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"API модуль","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/api.md","filePath":"ru/vue-webapp/options/api.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/api.md"},p=n("",17),h=[p];function l(k,e,E,r,d,o){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"API модуль","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/api.md","filePath":"ru/vue-webapp/options/api.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/api.md"},p=n("",17),h=[p];function l(k,e,E,r,d,o){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{c as __pageData,y as default};
diff --git a/assets/ru_vue-webapp_options_baseIcon.md.CcMHd_oI.js b/assets/ru_vue-webapp_options_baseIcon.md.jxSYdiEK.js
similarity index 99%
rename from assets/ru_vue-webapp_options_baseIcon.md.CcMHd_oI.js
rename to assets/ru_vue-webapp_options_baseIcon.md.jxSYdiEK.js
index c9c2b4579..807260089 100644
--- a/assets/ru_vue-webapp_options_baseIcon.md.CcMHd_oI.js
+++ b/assets/ru_vue-webapp_options_baseIcon.md.jxSYdiEK.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"BaseIcon","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/baseIcon.md","filePath":"ru/vue-webapp/options/baseIcon.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/baseIcon.md"},e=t(`

BaseIcon

Состоит из компонента BaseIcon и утилиты utils.ts.

Позволяет использовать в приложении иконки с динамичным обращением к ним по имени:

vue
<script setup lang="ts">
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"BaseIcon","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/baseIcon.md","filePath":"ru/vue-webapp/options/baseIcon.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/options/baseIcon.md"},e=t(`

BaseIcon

Состоит из компонента BaseIcon и утилиты utils.ts.

Позволяет использовать в приложении иконки с динамичным обращением к ним по имени:

vue
<script setup lang="ts">
 import BaseIcon from "@/components/ui/BaseIcon.vue";
 import { useAppConfig } from "@/composables/useAppConfig";
 
diff --git a/assets/ru_vue-webapp_options_baseIcon.md.CcMHd_oI.lean.js b/assets/ru_vue-webapp_options_baseIcon.md.jxSYdiEK.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_baseIcon.md.CcMHd_oI.lean.js
rename to assets/ru_vue-webapp_options_baseIcon.md.jxSYdiEK.lean.js
index b7869fec3..f4c2be427 100644
--- a/assets/ru_vue-webapp_options_baseIcon.md.CcMHd_oI.lean.js
+++ b/assets/ru_vue-webapp_options_baseIcon.md.jxSYdiEK.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"BaseIcon","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/baseIcon.md","filePath":"ru/vue-webapp/options/baseIcon.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/baseIcon.md"},e=t("",5),p=[e];function h(l,k,E,r,o,d){return a(),i("div",null,p)}const y=s(n,[["render",h]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"BaseIcon","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/baseIcon.md","filePath":"ru/vue-webapp/options/baseIcon.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/options/baseIcon.md"},e=t("",5),p=[e];function h(l,k,E,r,o,d){return a(),i("div",null,p)}const y=s(n,[["render",h]]);export{c as __pageData,y as default};
diff --git a/assets/ru_vue-webapp_options_description.md.ioGQSz4b.js b/assets/ru_vue-webapp_options_description.md.Ohf5aovV.js
similarity index 98%
rename from assets/ru_vue-webapp_options_description.md.ioGQSz4b.js
rename to assets/ru_vue-webapp_options_description.md.Ohf5aovV.js
index 41f641ce0..bab7a4e4e 100644
--- a/assets/ru_vue-webapp_options_description.md.ioGQSz4b.js
+++ b/assets/ru_vue-webapp_options_description.md.Ohf5aovV.js
@@ -1,4 +1,4 @@
-import{_ as i,c as s,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Детали реализации","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/description.md","filePath":"ru/vue-webapp/options/description.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/description.md"},n=e(`

Детали реализации

Инъекции кода в index.html

Чтобы не раздувать index.html инъекции фрагментов кода в него (Open graph, Google analytics, Splash screen, Service worker) делаются через vite-plugin-html-injection Vite плагин.

Сами фрагменты кода расположены в ./src/utils/injections/ директории. Там же находится конфигурационный файл плагина injection-config.ts.

CSS tricks

В приложении на больших разрешениях применен хак для недопущения прыгания экрана при появлении/исчезновении главного скролбара

css
html {
+import{_ as i,c as s,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Детали реализации","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/description.md","filePath":"ru/vue-webapp/options/description.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/description.md"},n=e(`

Детали реализации

Инъекции кода в index.html

Чтобы не раздувать index.html инъекции фрагментов кода в него (Open graph, Google analytics, Splash screen, Service worker) делаются через vite-plugin-html-injection Vite плагин.

Сами фрагменты кода расположены в ./src/utils/injections/ директории. Там же находится конфигурационный файл плагина injection-config.ts.

CSS tricks

В приложении на больших разрешениях применен хак для недопущения прыгания экрана при появлении/исчезновении главного скролбара

css
html {
   overflow-x: hidden;
   margin-right: calc(-1 * (100vw - 100%));
 }
`,7),h=[n];function p(l,r,o,k,d,c){return a(),s("div",null,h)}const E=i(t,[["render",p]]);export{m as __pageData,E as default}; diff --git a/assets/ru_vue-webapp_options_description.md.ioGQSz4b.lean.js b/assets/ru_vue-webapp_options_description.md.Ohf5aovV.lean.js similarity index 91% rename from assets/ru_vue-webapp_options_description.md.ioGQSz4b.lean.js rename to assets/ru_vue-webapp_options_description.md.Ohf5aovV.lean.js index 57ee56578..41e688eec 100644 --- a/assets/ru_vue-webapp_options_description.md.ioGQSz4b.lean.js +++ b/assets/ru_vue-webapp_options_description.md.Ohf5aovV.lean.js @@ -1 +1 @@ -import{_ as i,c as s,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Детали реализации","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/description.md","filePath":"ru/vue-webapp/options/description.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/description.md"},n=e("",7),h=[n];function p(l,r,o,k,d,c){return a(),s("div",null,h)}const E=i(t,[["render",p]]);export{m as __pageData,E as default}; +import{_ as i,c as s,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Детали реализации","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/description.md","filePath":"ru/vue-webapp/options/description.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/description.md"},n=e("",7),h=[n];function p(l,r,o,k,d,c){return a(),s("div",null,h)}const E=i(t,[["render",p]]);export{m as __pageData,E as default}; diff --git a/assets/ru_vue-webapp_options_drawer.md.FSdeA8Wt.js b/assets/ru_vue-webapp_options_drawer.md.dcvPqHG3.js similarity index 59% rename from assets/ru_vue-webapp_options_drawer.md.FSdeA8Wt.js rename to assets/ru_vue-webapp_options_drawer.md.dcvPqHG3.js index 43f39ce36..31c7dba46 100644 --- a/assets/ru_vue-webapp_options_drawer.md.FSdeA8Wt.js +++ b/assets/ru_vue-webapp_options_drawer.md.dcvPqHG3.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r,af as o,ag as c}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Navigation drawers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/drawer.md","filePath":"ru/vue-webapp/options/drawer.md","lastUpdated":1706427418000}'),d={name:"ru/vue-webapp/options/drawer.md"},i=r('

Navigation drawers

На данный момент можно выбрать из двух видов навигационных шторок.

SimpleDrawer

image

Всегда открыт для разрешений экрана notebook и desktop, а для мобильных устройств и планшетов открывается по клику/нажатию на иконку "гамбургера".

TouchSlideoutDrawer

image

Аналогичен SimpleDrawer, но управляется с помощью прикосновений на сенсорных экранах. Добавляет приятный UX.

Функциональность реализована с помощью useTouchSwipe composable функции и TouchSlideoutDrawer компонента.

',9),s=[i];function p(n,l,u,b,m,h){return t(),e("div",null,s)}const w=a(d,[["render",p],["__scopeId","data-v-86b9234c"]]);export{_ as __pageData,w as default}; +import{_ as e,c as a,o as t,U as r,af as o,ag as c}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Navigation drawers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/drawer.md","filePath":"ru/vue-webapp/options/drawer.md","lastUpdated":1706553672000}'),d={name:"ru/vue-webapp/options/drawer.md"},i=r('

Navigation drawers

На данный момент можно выбрать из двух видов навигационных шторок.

SimpleDrawer

image

Всегда открыт для разрешений экрана notebook и desktop, а для мобильных устройств и планшетов открывается по клику/нажатию на иконку "гамбургера".

TouchSlideoutDrawer

image

Аналогичен SimpleDrawer, но управляется с помощью прикосновений на сенсорных экранах. Добавляет приятный UX.

Функциональность реализована с помощью useTouchSwipe composable функции и TouchSlideoutDrawer компонента.

',9),s=[i];function p(n,l,u,b,m,h){return t(),a("div",null,s)}const w=e(d,[["render",p],["__scopeId","data-v-603c5e0b"]]);export{_ as __pageData,w as default}; diff --git a/assets/ru_vue-webapp_options_drawer.md.FSdeA8Wt.lean.js b/assets/ru_vue-webapp_options_drawer.md.dcvPqHG3.lean.js similarity index 65% rename from assets/ru_vue-webapp_options_drawer.md.FSdeA8Wt.lean.js rename to assets/ru_vue-webapp_options_drawer.md.dcvPqHG3.lean.js index b4b2b1f59..4e54e7b44 100644 --- a/assets/ru_vue-webapp_options_drawer.md.FSdeA8Wt.lean.js +++ b/assets/ru_vue-webapp_options_drawer.md.dcvPqHG3.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as r,af as o,ag as c}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Navigation drawers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/drawer.md","filePath":"ru/vue-webapp/options/drawer.md","lastUpdated":1706427418000}'),d={name:"ru/vue-webapp/options/drawer.md"},i=r("",9),s=[i];function p(n,l,u,b,m,h){return t(),e("div",null,s)}const w=a(d,[["render",p],["__scopeId","data-v-86b9234c"]]);export{_ as __pageData,w as default}; +import{_ as e,c as a,o as t,U as r,af as o,ag as c}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Navigation drawers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/drawer.md","filePath":"ru/vue-webapp/options/drawer.md","lastUpdated":1706553672000}'),d={name:"ru/vue-webapp/options/drawer.md"},i=r("",9),s=[i];function p(n,l,u,b,m,h){return t(),a("div",null,s)}const w=e(d,[["render",p],["__scopeId","data-v-603c5e0b"]]);export{_ as __pageData,w as default}; diff --git a/assets/ru_vue-webapp_options_footer.md.9ESCQk_c.js b/assets/ru_vue-webapp_options_footer.md.9ESCQk_c.js deleted file mode 100644 index aa3e6ecb1..000000000 --- a/assets/ru_vue-webapp_options_footer.md.9ESCQk_c.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as f,ak as s,al as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Footers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/footer.md","filePath":"ru/vue-webapp/options/footer.md","lastUpdated":1706427418000}'),d={name:"ru/vue-webapp/options/footer.md"},p=o('

Footers

На данный момент можно доступны следующие типы футеров:

SimpleFooter

image

RichFooter

image

MantineSimpleFooter

image

MantineRichFooter

image

DistributedFooter

image

',12),m=[p];function l(c,b,h,_,u,v){return t(),e("div",null,m)}const q=a(d,[["render",l],["__scopeId","data-v-22b4ffe9"]]);export{F as __pageData,q as default}; diff --git a/assets/ru_vue-webapp_options_footer.md.HDpMf0ZY.js b/assets/ru_vue-webapp_options_footer.md.HDpMf0ZY.js new file mode 100644 index 000000000..aad6aaef9 --- /dev/null +++ b/assets/ru_vue-webapp_options_footer.md.HDpMf0ZY.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as d,ak as s,al as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Footers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/footer.md","filePath":"ru/vue-webapp/options/footer.md","lastUpdated":1706553672000}'),p={name:"ru/vue-webapp/options/footer.md"},f=o('

Footers

На данный момент можно доступны следующие типы футеров:

SimpleFooter

image

RichFooter

image

MantineSimpleFooter

image

MantineRichFooter

image

DistributedFooter

image

',12),m=[f];function l(c,h,_,u,v,b){return t(),e("div",null,m)}const q=a(p,[["render",l],["__scopeId","data-v-f20ed386"]]);export{F as __pageData,q as default}; diff --git a/assets/ru_vue-webapp_options_footer.md.9ESCQk_c.lean.js b/assets/ru_vue-webapp_options_footer.md.HDpMf0ZY.lean.js similarity index 65% rename from assets/ru_vue-webapp_options_footer.md.9ESCQk_c.lean.js rename to assets/ru_vue-webapp_options_footer.md.HDpMf0ZY.lean.js index 11901a706..bb9b2d741 100644 --- a/assets/ru_vue-webapp_options_footer.md.9ESCQk_c.lean.js +++ b/assets/ru_vue-webapp_options_footer.md.HDpMf0ZY.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as f,ak as s,al as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Footers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/footer.md","filePath":"ru/vue-webapp/options/footer.md","lastUpdated":1706427418000}'),d={name:"ru/vue-webapp/options/footer.md"},p=o("",12),m=[p];function l(c,b,h,_,u,v){return t(),e("div",null,m)}const q=a(d,[["render",l],["__scopeId","data-v-22b4ffe9"]]);export{F as __pageData,q as default}; +import{_ as a,c as e,o as t,U as o,ah as r,ai as i,aj as d,ak as s,al as n}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Footers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/footer.md","filePath":"ru/vue-webapp/options/footer.md","lastUpdated":1706553672000}'),p={name:"ru/vue-webapp/options/footer.md"},f=o("",12),m=[f];function l(c,h,_,u,v,b){return t(),e("div",null,m)}const q=a(p,[["render",l],["__scopeId","data-v-f20ed386"]]);export{F as __pageData,q as default}; diff --git a/assets/ru_vue-webapp_options_ga-gp.md.tcaA_Wxz.js b/assets/ru_vue-webapp_options_ga-gp.md.fKJ7YOmv.js similarity index 98% rename from assets/ru_vue-webapp_options_ga-gp.md.tcaA_Wxz.js rename to assets/ru_vue-webapp_options_ga-gp.md.fKJ7YOmv.js index bd6dc2f51..52e26c345 100644 --- a/assets/ru_vue-webapp_options_ga-gp.md.tcaA_Wxz.js +++ b/assets/ru_vue-webapp_options_ga-gp.md.fKJ7YOmv.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Github Actions сценарий для развертывания на Github Pages","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/ga-gp.md","filePath":"ru/vue-webapp/options/ga-gp.md","lastUpdated":1706427418000}'),s={name:"ru/vue-webapp/options/ga-gp.md"},o=i('

Github Actions сценарий для развертывания на Github Pages

Deployment

Использует JamesIves/github-pages-deploy-action Github Action для размещения сайта на ветке gh-pages того же репозитория, что автоматически делает сайт доступный по адресу https://youGitHubUsername.github.io/my-vue-webapp (если ваш проект и репозиторий называется my-vue-webapp).

  • Создайте в репозитории ветку с названием gh-pages
  • Перейдите в раздел "Settings" вашего репозитория
  • В разделе "Code and automation" на боковой панели нажмите Pages.
  • В разделе "Build and deployment" в пункте "Source" выберите "Deploy from a branch".
  • В разделе "Build and deployment" под заголовком "Branch" воспользуйтесь раскрывающимся меню ветки и выберите нужную ветку - gh-pages.

Более подробно:

Настройка base в Vite конфиге

Если у вас не кастомный домен, то в vite.config.ts необходимо прописать название вашего репозитория в качестве base, чтобы сайт был доступен по вышеуказанной ссылке:

js
export default defineConfig({\n  base: "/my-vue-webapp/",\n});

Если у вас кастомный домен (типа yourname.com), то этот параметр не нужен.

',10),n=[o];function p(l,h,r,u,c,d){return t(),a("div",null,n)}const m=e(s,[["render",p]]);export{b as __pageData,m as default}; +import{_ as e,c as a,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Github Actions сценарий для развертывания на Github Pages","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/ga-gp.md","filePath":"ru/vue-webapp/options/ga-gp.md","lastUpdated":1706553672000}'),s={name:"ru/vue-webapp/options/ga-gp.md"},o=i('

Github Actions сценарий для развертывания на Github Pages

Deployment

Использует JamesIves/github-pages-deploy-action Github Action для размещения сайта на ветке gh-pages того же репозитория, что автоматически делает сайт доступный по адресу https://youGitHubUsername.github.io/my-vue-webapp (если ваш проект и репозиторий называется my-vue-webapp).

  • Создайте в репозитории ветку с названием gh-pages
  • Перейдите в раздел "Settings" вашего репозитория
  • В разделе "Code and automation" на боковой панели нажмите Pages.
  • В разделе "Build and deployment" в пункте "Source" выберите "Deploy from a branch".
  • В разделе "Build and deployment" под заголовком "Branch" воспользуйтесь раскрывающимся меню ветки и выберите нужную ветку - gh-pages.

Более подробно:

Настройка base в Vite конфиге

Если у вас не кастомный домен, то в vite.config.ts необходимо прописать название вашего репозитория в качестве base, чтобы сайт был доступен по вышеуказанной ссылке:

js
export default defineConfig({\n  base: "/my-vue-webapp/",\n});

Если у вас кастомный домен (типа yourname.com), то этот параметр не нужен.

',10),n=[o];function p(l,h,r,u,c,d){return t(),a("div",null,n)}const m=e(s,[["render",p]]);export{b as __pageData,m as default}; diff --git a/assets/ru_vue-webapp_options_ga-gp.md.tcaA_Wxz.lean.js b/assets/ru_vue-webapp_options_ga-gp.md.fKJ7YOmv.lean.js similarity index 91% rename from assets/ru_vue-webapp_options_ga-gp.md.tcaA_Wxz.lean.js rename to assets/ru_vue-webapp_options_ga-gp.md.fKJ7YOmv.lean.js index d555b49bc..871904ad0 100644 --- a/assets/ru_vue-webapp_options_ga-gp.md.tcaA_Wxz.lean.js +++ b/assets/ru_vue-webapp_options_ga-gp.md.fKJ7YOmv.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Github Actions сценарий для развертывания на Github Pages","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/ga-gp.md","filePath":"ru/vue-webapp/options/ga-gp.md","lastUpdated":1706427418000}'),s={name:"ru/vue-webapp/options/ga-gp.md"},o=i("",10),n=[o];function p(l,h,r,u,c,d){return t(),a("div",null,n)}const m=e(s,[["render",p]]);export{b as __pageData,m as default}; +import{_ as e,c as a,o as t,U as i}from"./chunks/framework.P5TqXf0g.js";const b=JSON.parse('{"title":"Github Actions сценарий для развертывания на Github Pages","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/ga-gp.md","filePath":"ru/vue-webapp/options/ga-gp.md","lastUpdated":1706553672000}'),s={name:"ru/vue-webapp/options/ga-gp.md"},o=i("",10),n=[o];function p(l,h,r,u,c,d){return t(),a("div",null,n)}const m=e(s,[["render",p]]);export{b as __pageData,m as default}; diff --git a/assets/ru_vue-webapp_options_google-analytics.md.EGW541ll.js b/assets/ru_vue-webapp_options_google-analytics.md.EOiIrWbw.js similarity index 98% rename from assets/ru_vue-webapp_options_google-analytics.md.EGW541ll.js rename to assets/ru_vue-webapp_options_google-analytics.md.EOiIrWbw.js index 78cc79f6b..86d4fc689 100644 --- a/assets/ru_vue-webapp_options_google-analytics.md.EGW541ll.js +++ b/assets/ru_vue-webapp_options_google-analytics.md.EOiIrWbw.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/google-analytics.md","filePath":"ru/vue-webapp/options/google-analytics.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/google-analytics.md"},e=t(`

Google analytics

Добавляет код инициализации Google Tag для index.html.

html
<!-- Google tag (gtag.js) -->
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/google-analytics.md","filePath":"ru/vue-webapp/options/google-analytics.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/options/google-analytics.md"},e=t(`

Google analytics

Добавляет код инициализации Google Tag для index.html.

html
<!-- Google tag (gtag.js) -->
 <script async src="https://www.googletagmanager.com/gtag/js?id=G-JL65GWRNQQ"></script>
 <script>
   window.dataLayer = window.dataLayer || [];
diff --git a/assets/ru_vue-webapp_options_google-analytics.md.EGW541ll.lean.js b/assets/ru_vue-webapp_options_google-analytics.md.EOiIrWbw.lean.js
similarity index 91%
rename from assets/ru_vue-webapp_options_google-analytics.md.EGW541ll.lean.js
rename to assets/ru_vue-webapp_options_google-analytics.md.EOiIrWbw.lean.js
index ee97cbf90..e8763b60f 100644
--- a/assets/ru_vue-webapp_options_google-analytics.md.EGW541ll.lean.js
+++ b/assets/ru_vue-webapp_options_google-analytics.md.EOiIrWbw.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/google-analytics.md","filePath":"ru/vue-webapp/options/google-analytics.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/google-analytics.md"},e=t("",4),l=[e];function h(p,k,g,E,o,r){return a(),i("div",null,l)}const y=s(n,[["render",h]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/google-analytics.md","filePath":"ru/vue-webapp/options/google-analytics.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/options/google-analytics.md"},e=t("",4),l=[e];function h(p,k,g,E,o,r){return a(),i("div",null,l)}const y=s(n,[["render",h]]);export{c as __pageData,y as default};
diff --git a/assets/ru_vue-webapp_options_header.md.O9WP_P7o.js b/assets/ru_vue-webapp_options_header.md.O9WP_P7o.js
deleted file mode 100644
index b37563ec4..000000000
--- a/assets/ru_vue-webapp_options_header.md.O9WP_P7o.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import{_ as a,c as e,o as s,U as i,am as t,an as d,ao as n,ap as h}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Headers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/header.md","filePath":"ru/vue-webapp/options/header.md","lastUpdated":1706427418000}'),p={name:"ru/vue-webapp/options/header.md"},l=i('

Headers

Все хедеры адаптивны.

SimpleHeader

image

Простой sticky header

MantineSimpleHeader

image

Простой sticky header в стиле Mantine UI

MantineLayeredHeader

image

sticky header с уровнями в стиле Mantine UI

SlidingHeader

image

Может содержать два разных header-а, второй появляется после того, как пользователь проскроллит страницу вниз

template
<AppHeader :threshold-hide="200" :threshold-open="400">
-    <template #first-header>
-        <AppHeaderFirst />
-    </template>
-
-    <template #second-header>
-        <AppHeaderSecond />
-    </template>
-</AppHeader>
`,15),r=[l];function k(E,f,v,o,g,c){return s(),e("div",null,r)}const _=a(p,[["render",k],["__scopeId","data-v-057840ef"]]);export{y as __pageData,_ as default}; diff --git a/assets/ru_vue-webapp_options_header.md.aBFan2Ig.js b/assets/ru_vue-webapp_options_header.md.aBFan2Ig.js new file mode 100644 index 000000000..b581c971a --- /dev/null +++ b/assets/ru_vue-webapp_options_header.md.aBFan2Ig.js @@ -0,0 +1,9 @@ +import{_ as a,c as s,o as i,U as t,am as e,an as d,ao as n,ap as h}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Headers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/header.md","filePath":"ru/vue-webapp/options/header.md","lastUpdated":1706553672000}'),p={name:"ru/vue-webapp/options/header.md"},l=t('

Headers

Все хедеры адаптивны.

SimpleHeader

image

Простой sticky header

MantineSimpleHeader

image

Простой sticky header в стиле Mantine UI

MantineLayeredHeader

image

sticky header с уровнями в стиле Mantine UI

SlidingHeader

image

Может содержать два разных header-а, второй появляется после того, как пользователь проскроллит страницу вниз

template
<AppHeader :threshold-hide="200" :threshold-open="400">
+    <template #first-header>
+        <AppHeaderFirst />
+    </template>
+
+    <template #second-header>
+        <AppHeaderSecond />
+    </template>
+</AppHeader>
`,15),r=[l];function k(E,v,o,g,c,m){return i(),s("div",null,r)}const u=a(p,[["render",k],["__scopeId","data-v-16913960"]]);export{_ as __pageData,u as default}; diff --git a/assets/ru_vue-webapp_options_header.md.O9WP_P7o.lean.js b/assets/ru_vue-webapp_options_header.md.aBFan2Ig.lean.js similarity index 51% rename from assets/ru_vue-webapp_options_header.md.O9WP_P7o.lean.js rename to assets/ru_vue-webapp_options_header.md.aBFan2Ig.lean.js index a81b2679a..684ab3cfe 100644 --- a/assets/ru_vue-webapp_options_header.md.O9WP_P7o.lean.js +++ b/assets/ru_vue-webapp_options_header.md.aBFan2Ig.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as s,U as i,am as t,an as d,ao as n,ap as h}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Headers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/header.md","filePath":"ru/vue-webapp/options/header.md","lastUpdated":1706427418000}'),p={name:"ru/vue-webapp/options/header.md"},l=i("",15),r=[l];function k(E,f,v,o,g,c){return s(),e("div",null,r)}const _=a(p,[["render",k],["__scopeId","data-v-057840ef"]]);export{y as __pageData,_ as default}; +import{_ as a,c as s,o as i,U as t,am as e,an as d,ao as n,ap as h}from"./chunks/framework.P5TqXf0g.js";const _=JSON.parse('{"title":"Headers","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/header.md","filePath":"ru/vue-webapp/options/header.md","lastUpdated":1706553672000}'),p={name:"ru/vue-webapp/options/header.md"},l=t("",15),r=[l];function k(E,v,o,g,c,m){return i(),s("div",null,r)}const u=a(p,[["render",k],["__scopeId","data-v-16913960"]]);export{_ as __pageData,u as default}; diff --git a/assets/ru_vue-webapp_options_i18n.md.ICPnbGWR.js b/assets/ru_vue-webapp_options_i18n.md.3Hny7tfo.js similarity index 99% rename from assets/ru_vue-webapp_options_i18n.md.ICPnbGWR.js rename to assets/ru_vue-webapp_options_i18n.md.3Hny7tfo.js index e90c4c6bd..253859ca1 100644 --- a/assets/ru_vue-webapp_options_i18n.md.ICPnbGWR.js +++ b/assets/ru_vue-webapp_options_i18n.md.3Hny7tfo.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"i18n","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/i18n.md","filePath":"ru/vue-webapp/options/i18n.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/i18n.md"},e=n(`

i18n

i18next

NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже "интернационализационным фреймворком".

В то же время часто для локализации сайта в большинстве случаев требуются очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n.

В частности, обычно нужны:

  • Нахождение перевода по составному ключу - t("finance.transactions.deposit")
  • Перевод с параметром - t("hello-message", "John")
  • Массивы для списков или параграфов текста

Данный функционал с сохранением реактивности (смена языка сайта налету) можно получить простой composable функцией.

useI18nLight

Вот чистая реализация вышеуказанного функционала в 70 строчек супротив полутора мегабайт без каких-либо зависимостей.

Использование

Подключение и инициализация в main.ts:

js
import { useI18n } from "@/composables/useI18nLight";
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"i18n","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/i18n.md","filePath":"ru/vue-webapp/options/i18n.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/i18n.md"},e=n(`

i18n

i18next

NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже "интернационализационным фреймворком".

В то же время часто для локализации сайта в большинстве случаев требуются очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n.

В частности, обычно нужны:

  • Нахождение перевода по составному ключу - t("finance.transactions.deposit")
  • Перевод с параметром - t("hello-message", "John")
  • Массивы для списков или параграфов текста

Данный функционал с сохранением реактивности (смена языка сайта налету) можно получить простой composable функцией.

useI18nLight

Вот чистая реализация вышеуказанного функционала в 70 строчек супротив полутора мегабайт без каких-либо зависимостей.

Использование

Подключение и инициализация в main.ts:

js
import { useI18n } from "@/composables/useI18nLight";
 
 const { initI18n } = useI18n();
 
diff --git a/assets/ru_vue-webapp_options_i18n.md.ICPnbGWR.lean.js b/assets/ru_vue-webapp_options_i18n.md.3Hny7tfo.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_i18n.md.ICPnbGWR.lean.js
rename to assets/ru_vue-webapp_options_i18n.md.3Hny7tfo.lean.js
index fb31baeb8..fdf57dcab 100644
--- a/assets/ru_vue-webapp_options_i18n.md.ICPnbGWR.lean.js
+++ b/assets/ru_vue-webapp_options_i18n.md.3Hny7tfo.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"i18n","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/i18n.md","filePath":"ru/vue-webapp/options/i18n.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/i18n.md"},e=n("",19),l=[e];function h(p,k,E,r,d,o){return a(),i("div",null,l)}const y=s(t,[["render",h]]);export{c as __pageData,y as default};
+import{_ as s,c as i,o as a,U as n}from"./chunks/framework.P5TqXf0g.js";const c=JSON.parse('{"title":"i18n","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/i18n.md","filePath":"ru/vue-webapp/options/i18n.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/i18n.md"},e=n("",19),l=[e];function h(p,k,E,r,d,o){return a(),i("div",null,l)}const y=s(t,[["render",h]]);export{c as __pageData,y as default};
diff --git a/assets/ru_vue-webapp_options_index.md.pX-2iss8.js b/assets/ru_vue-webapp_options_index.md.PnZgplXj.js
similarity index 98%
rename from assets/ru_vue-webapp_options_index.md.pX-2iss8.js
rename to assets/ru_vue-webapp_options_index.md.PnZgplXj.js
index d8879b056..6fa625aa4 100644
--- a/assets/ru_vue-webapp_options_index.md.pX-2iss8.js
+++ b/assets/ru_vue-webapp_options_index.md.PnZgplXj.js
@@ -1 +1 @@
-import{_ as e,c as a,o as i,U as l}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Опции при создании приложения","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/index.md","filePath":"ru/vue-webapp/options/index.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/index.md"},o=l('

Опции при создании приложения

Доступные опции

На данный момент доступно конфигурирование следующих опций:

  • Layout - макет приложения
  • Header - верхняя часть в макете приложения
  • Footer - нижняя часть в макете приложения
  • Drawer - навигационная шторка
  • Navbar - навигационное меню (внутри шторки)
  • Github Pages deploy Workflow - GitHub Actions сценарий для билда и деплоя приложения на GitHub Pages
  • PWA - добавление Service worker и Манифеста к приложению
  • API модуль - абстрактный слой для связи с бэкенд API
  • JSON-RPC - адаптер для API модуля
  • Splash screen - экран-заставка во время старта приложения для улучшения UX
  • Google analytics - код для подключения статистики
  • Open graph - мета тэги для построения сниппетов соцсетями

Доступно по умолчанию

  • Dark theme - темная тема. Все подключаемые компоненты поддерживают переключение тем
  • BaseIcon - компонент иконки с возможностью динамичного указания имени
  • BaseToggle - компонент переключателя

В разработке

  • Глобальный прелоадер
  • i18n - интернационализация приложения с помощью различных вариантов i18n библиотек.

В планах

  • Онлайн витрина для динамичного тестирования различных вариантов частей приложения и функционала
  • Расширение числа вариантов layout, header, footer и других компонент
  • Auth - каркас модуля для аутентификации на JWT токенах, включая различные варианты форм регистрации и логина
  • Интеграция Auth с популярными сервис провайдерами (Firebase и др.)
  • GitHub Actions для деплоя приложения на различные сервисы (Vercel, Heroku, Firesbase) и другие полезные CI/CD сценарии.
  • Проверка при старте на свою новую версию и перезагрузка для избежания проблем с кэшем браузера
  • Themes - темы приложения (включают в себя как разные цветовые палитры, так и возможность менять другие CSS параметры для глубокой кастомизации шаблона и компонентов)
',10),r=[o];function n(s,u,c,d,h,p){return i(),a("div",null,r)}const b=e(t,[["render",n]]);export{m as __pageData,b as default}; +import{_ as e,c as a,o as i,U as l}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Опции при создании приложения","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/index.md","filePath":"ru/vue-webapp/options/index.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/index.md"},o=l('

Опции при создании приложения

Доступные опции

На данный момент доступно конфигурирование следующих опций:

  • Layout - макет приложения
  • Header - верхняя часть в макете приложения
  • Footer - нижняя часть в макете приложения
  • Drawer - навигационная шторка
  • Navbar - навигационное меню (внутри шторки)
  • Github Pages deploy Workflow - GitHub Actions сценарий для билда и деплоя приложения на GitHub Pages
  • PWA - добавление Service worker и Манифеста к приложению
  • API модуль - абстрактный слой для связи с бэкенд API
  • JSON-RPC - адаптер для API модуля
  • Splash screen - экран-заставка во время старта приложения для улучшения UX
  • Google analytics - код для подключения статистики
  • Open graph - мета тэги для построения сниппетов соцсетями

Доступно по умолчанию

  • Dark theme - темная тема. Все подключаемые компоненты поддерживают переключение тем
  • BaseIcon - компонент иконки с возможностью динамичного указания имени
  • BaseToggle - компонент переключателя

В разработке

  • Глобальный прелоадер
  • i18n - интернационализация приложения с помощью различных вариантов i18n библиотек.

В планах

  • Онлайн витрина для динамичного тестирования различных вариантов частей приложения и функционала
  • Расширение числа вариантов layout, header, footer и других компонент
  • Auth - каркас модуля для аутентификации на JWT токенах, включая различные варианты форм регистрации и логина
  • Интеграция Auth с популярными сервис провайдерами (Firebase и др.)
  • GitHub Actions для деплоя приложения на различные сервисы (Vercel, Heroku, Firesbase) и другие полезные CI/CD сценарии.
  • Проверка при старте на свою новую версию и перезагрузка для избежания проблем с кэшем браузера
  • Themes - темы приложения (включают в себя как разные цветовые палитры, так и возможность менять другие CSS параметры для глубокой кастомизации шаблона и компонентов)
',10),r=[o];function n(s,u,c,d,h,p){return i(),a("div",null,r)}const b=e(t,[["render",n]]);export{m as __pageData,b as default}; diff --git a/assets/ru_vue-webapp_options_index.md.pX-2iss8.lean.js b/assets/ru_vue-webapp_options_index.md.PnZgplXj.lean.js similarity index 91% rename from assets/ru_vue-webapp_options_index.md.pX-2iss8.lean.js rename to assets/ru_vue-webapp_options_index.md.PnZgplXj.lean.js index f5fca4d84..52bab2329 100644 --- a/assets/ru_vue-webapp_options_index.md.pX-2iss8.lean.js +++ b/assets/ru_vue-webapp_options_index.md.PnZgplXj.lean.js @@ -1 +1 @@ -import{_ as e,c as a,o as i,U as l}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Опции при создании приложения","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/index.md","filePath":"ru/vue-webapp/options/index.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/index.md"},o=l("",10),r=[o];function n(s,u,c,d,h,p){return i(),a("div",null,r)}const b=e(t,[["render",n]]);export{m as __pageData,b as default}; +import{_ as e,c as a,o as i,U as l}from"./chunks/framework.P5TqXf0g.js";const m=JSON.parse('{"title":"Опции при создании приложения","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/index.md","filePath":"ru/vue-webapp/options/index.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/index.md"},o=l("",10),r=[o];function n(s,u,c,d,h,p){return i(),a("div",null,r)}const b=e(t,[["render",n]]);export{m as __pageData,b as default}; diff --git a/assets/ru_vue-webapp_options_layout-main.md.AHjv6wz2.js b/assets/ru_vue-webapp_options_layout-main.md.mAU0YvUA.js similarity index 96% rename from assets/ru_vue-webapp_options_layout-main.md.AHjv6wz2.js rename to assets/ru_vue-webapp_options_layout-main.md.mAU0YvUA.js index 0c1e8b203..974927d89 100644 --- a/assets/ru_vue-webapp_options_layout-main.md.AHjv6wz2.js +++ b/assets/ru_vue-webapp_options_layout-main.md.mAU0YvUA.js @@ -1 +1 @@ -import{_ as e,c as o,o as a,U as t,aq as n}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"MainLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/layout-main.md","filePath":"ru/vue-webapp/options/layout-main.md","lastUpdated":1706427418000}'),i={name:"ru/vue-webapp/options/layout-main.md"},r=t('

MainLayout

Стандартный макет с хедером, футером и сайдбаром в notebook и desktop режимах. В tablet и mobile режимах сайдбар выезжает слева при нажатии на "гамбургер" иконку.

image

AppSidebar виден в режимах notebook и desktop, и скрывается в tablet и mobile

Routing

Смена содержимого центральной панели обеспечивается через маршруты vue-router

',6),c=[r];function d(p,s,u,l,m,_){return a(),o("div",null,c)}const g=e(i,[["render",d]]);export{h as __pageData,g as default}; +import{_ as e,c as o,o as a,U as t,aq as n}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"MainLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/layout-main.md","filePath":"ru/vue-webapp/options/layout-main.md","lastUpdated":1706553672000}'),i={name:"ru/vue-webapp/options/layout-main.md"},r=t('

MainLayout

Стандартный макет с хедером, футером и сайдбаром в notebook и desktop режимах. В tablet и mobile режимах сайдбар выезжает слева при нажатии на "гамбургер" иконку.

image

AppSidebar виден в режимах notebook и desktop, и скрывается в tablet и mobile

Routing

Смена содержимого центральной панели обеспечивается через маршруты vue-router

',6),c=[r];function d(p,s,u,l,m,_){return a(),o("div",null,c)}const g=e(i,[["render",d]]);export{h as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_layout-main.md.AHjv6wz2.lean.js b/assets/ru_vue-webapp_options_layout-main.md.mAU0YvUA.lean.js similarity index 90% rename from assets/ru_vue-webapp_options_layout-main.md.AHjv6wz2.lean.js rename to assets/ru_vue-webapp_options_layout-main.md.mAU0YvUA.lean.js index 3582718e8..a265c12e5 100644 --- a/assets/ru_vue-webapp_options_layout-main.md.AHjv6wz2.lean.js +++ b/assets/ru_vue-webapp_options_layout-main.md.mAU0YvUA.lean.js @@ -1 +1 @@ -import{_ as e,c as o,o as a,U as t,aq as n}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"MainLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/layout-main.md","filePath":"ru/vue-webapp/options/layout-main.md","lastUpdated":1706427418000}'),i={name:"ru/vue-webapp/options/layout-main.md"},r=t("",6),c=[r];function d(p,s,u,l,m,_){return a(),o("div",null,c)}const g=e(i,[["render",d]]);export{h as __pageData,g as default}; +import{_ as e,c as o,o as a,U as t,aq as n}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"MainLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/layout-main.md","filePath":"ru/vue-webapp/options/layout-main.md","lastUpdated":1706553672000}'),i={name:"ru/vue-webapp/options/layout-main.md"},r=t("",6),c=[r];function d(p,s,u,l,m,_){return a(),o("div",null,c)}const g=e(i,[["render",d]]);export{h as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_layout-one-column.md.LGPRCO6S.js b/assets/ru_vue-webapp_options_layout-one-column.md.S4PvENjv.js similarity index 95% rename from assets/ru_vue-webapp_options_layout-one-column.md.LGPRCO6S.js rename to assets/ru_vue-webapp_options_layout-one-column.md.S4PvENjv.js index dcece12ec..9608b07af 100644 --- a/assets/ru_vue-webapp_options_layout-one-column.md.LGPRCO6S.js +++ b/assets/ru_vue-webapp_options_layout-one-column.md.S4PvENjv.js @@ -1 +1 @@ -import{_ as e,c as o,o as t,U as a,ar as n}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"OneColumnLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/layout-one-column.md","filePath":"ru/vue-webapp/options/layout-one-column.md","lastUpdated":1706427418000}'),c={name:"ru/vue-webapp/options/layout-one-column.md"},u=a('

OneColumnLayout

Аналогичен MainLayout, но без сайдбара в notebook и desktop режимах. Может применяться, например, если вся навигация помещается в хедер. В tablet и mobile режимах сайдбар также выезжает при нажатии на "гамбургер" иконку.

image

В обоих случаях максимальная ширина лэйаута устанавливается CSS переменной --vwa-layout-max-width.

',4),p=[u];function l(m,d,s,i,r,_){return t(),o("div",null,p)}const b=e(c,[["render",l]]);export{h as __pageData,b as default}; +import{_ as e,c as o,o as t,U as a,ar as n}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"OneColumnLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/layout-one-column.md","filePath":"ru/vue-webapp/options/layout-one-column.md","lastUpdated":1706553672000}'),c={name:"ru/vue-webapp/options/layout-one-column.md"},u=a('

OneColumnLayout

Аналогичен MainLayout, но без сайдбара в notebook и desktop режимах. Может применяться, например, если вся навигация помещается в хедер. В tablet и mobile режимах сайдбар также выезжает при нажатии на "гамбургер" иконку.

image

В обоих случаях максимальная ширина лэйаута устанавливается CSS переменной --vwa-layout-max-width.

',4),p=[u];function l(m,d,s,i,r,_){return t(),o("div",null,p)}const b=e(c,[["render",l]]);export{h as __pageData,b as default}; diff --git a/assets/ru_vue-webapp_options_layout-one-column.md.LGPRCO6S.lean.js b/assets/ru_vue-webapp_options_layout-one-column.md.S4PvENjv.lean.js similarity index 91% rename from assets/ru_vue-webapp_options_layout-one-column.md.LGPRCO6S.lean.js rename to assets/ru_vue-webapp_options_layout-one-column.md.S4PvENjv.lean.js index c88ff50bb..f6ca9fc82 100644 --- a/assets/ru_vue-webapp_options_layout-one-column.md.LGPRCO6S.lean.js +++ b/assets/ru_vue-webapp_options_layout-one-column.md.S4PvENjv.lean.js @@ -1 +1 @@ -import{_ as e,c as o,o as t,U as a,ar as n}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"OneColumnLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/layout-one-column.md","filePath":"ru/vue-webapp/options/layout-one-column.md","lastUpdated":1706427418000}'),c={name:"ru/vue-webapp/options/layout-one-column.md"},u=a("",4),p=[u];function l(m,d,s,i,r,_){return t(),o("div",null,p)}const b=e(c,[["render",l]]);export{h as __pageData,b as default}; +import{_ as e,c as o,o as t,U as a,ar as n}from"./chunks/framework.P5TqXf0g.js";const h=JSON.parse('{"title":"OneColumnLayout","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/layout-one-column.md","filePath":"ru/vue-webapp/options/layout-one-column.md","lastUpdated":1706553672000}'),c={name:"ru/vue-webapp/options/layout-one-column.md"},u=a("",4),p=[u];function l(m,d,s,i,r,_){return t(),o("div",null,p)}const b=e(c,[["render",l]]);export{h as __pageData,b as default}; diff --git a/assets/ru_vue-webapp_options_navbar.md.4Tv1i2IM.js b/assets/ru_vue-webapp_options_navbar.md.4Tv1i2IM.js deleted file mode 100644 index 1cf572136..000000000 --- a/assets/ru_vue-webapp_options_navbar.md.4Tv1i2IM.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as t,U as c,as as r,at as d}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Navbar","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/navbar.md","filePath":"ru/vue-webapp/options/navbar.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/navbar.md"},o=c('

Navbar

Navbar находится внутри NavigationDrawer

На данный момент можно выбрать из двух видов:

SimpleNavbar

image

MantineSimpleNavbar

image

',7),i=[o];function p(s,v,m,l,_,b){return t(),e("div",null,i)}const g=a(n,[["render",p],["__scopeId","data-v-689ccd41"]]);export{u as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_navbar.md.nAiG-5fe.js b/assets/ru_vue-webapp_options_navbar.md.nAiG-5fe.js new file mode 100644 index 000000000..1c336ce65 --- /dev/null +++ b/assets/ru_vue-webapp_options_navbar.md.nAiG-5fe.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as t,U as r,as as d,at as n}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Navbar","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/navbar.md","filePath":"ru/vue-webapp/options/navbar.md","lastUpdated":1706553672000}'),o={name:"ru/vue-webapp/options/navbar.md"},i=r('

Navbar

Navbar находится внутри NavigationDrawer

На данный момент можно выбрать из двух видов:

SimpleNavbar

image

MantineSimpleNavbar

image

',7),p=[i];function s(v,m,c,l,_,b){return t(),e("div",null,p)}const g=a(o,[["render",s],["__scopeId","data-v-305e8d14"]]);export{u as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_navbar.md.4Tv1i2IM.lean.js b/assets/ru_vue-webapp_options_navbar.md.nAiG-5fe.lean.js similarity index 55% rename from assets/ru_vue-webapp_options_navbar.md.4Tv1i2IM.lean.js rename to assets/ru_vue-webapp_options_navbar.md.nAiG-5fe.lean.js index 7e28ddfd2..a8e428be6 100644 --- a/assets/ru_vue-webapp_options_navbar.md.4Tv1i2IM.lean.js +++ b/assets/ru_vue-webapp_options_navbar.md.nAiG-5fe.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as c,as as r,at as d}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Navbar","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/navbar.md","filePath":"ru/vue-webapp/options/navbar.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/navbar.md"},o=c("",7),i=[o];function p(s,v,m,l,_,b){return t(),e("div",null,i)}const g=a(n,[["render",p],["__scopeId","data-v-689ccd41"]]);export{u as __pageData,g as default}; +import{_ as a,c as e,o as t,U as r,as as d,at as n}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"Navbar","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/navbar.md","filePath":"ru/vue-webapp/options/navbar.md","lastUpdated":1706553672000}'),o={name:"ru/vue-webapp/options/navbar.md"},i=r("",7),p=[i];function s(v,m,c,l,_,b){return t(),e("div",null,p)}const g=a(o,[["render",s],["__scopeId","data-v-305e8d14"]]);export{u as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_open-graph.md.BXymvrPG.js b/assets/ru_vue-webapp_options_open-graph.md.x2iSdVJp.js similarity index 99% rename from assets/ru_vue-webapp_options_open-graph.md.BXymvrPG.js rename to assets/ru_vue-webapp_options_open-graph.md.x2iSdVJp.js index 847b9ce01..cf1d15741 100644 --- a/assets/ru_vue-webapp_options_open-graph.md.BXymvrPG.js +++ b/assets/ru_vue-webapp_options_open-graph.md.x2iSdVJp.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/open-graph.md","filePath":"ru/vue-webapp/options/open-graph.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/open-graph.md"},h=t(`

Google analytics

Добавляет мета тэги Open graph для index.html.

html
<!-- Facebook Meta Tags -->
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/open-graph.md","filePath":"ru/vue-webapp/options/open-graph.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/options/open-graph.md"},h=t(`

Google analytics

Добавляет мета тэги Open graph для index.html.

html
<!-- Facebook Meta Tags -->
 <!-- <meta property="og:url" content="" /> -->
 <meta property="og:type" content="website" />
 <meta property="og:title" content="-og:title-" />
diff --git a/assets/ru_vue-webapp_options_open-graph.md.BXymvrPG.lean.js b/assets/ru_vue-webapp_options_open-graph.md.x2iSdVJp.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_open-graph.md.BXymvrPG.lean.js
rename to assets/ru_vue-webapp_options_open-graph.md.x2iSdVJp.lean.js
index 99d4f2690..a4aaaff4c 100644
--- a/assets/ru_vue-webapp_options_open-graph.md.BXymvrPG.lean.js
+++ b/assets/ru_vue-webapp_options_open-graph.md.x2iSdVJp.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/open-graph.md","filePath":"ru/vue-webapp/options/open-graph.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/open-graph.md"},h=t("",4),p=[h];function k(l,e,E,r,g,o){return a(),i("div",null,p)}const F=s(n,[["render",k]]);export{y as __pageData,F as default};
+import{_ as s,c as i,o as a,U as t}from"./chunks/framework.P5TqXf0g.js";const y=JSON.parse('{"title":"Google analytics","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/open-graph.md","filePath":"ru/vue-webapp/options/open-graph.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/options/open-graph.md"},h=t("",4),p=[h];function k(l,e,E,r,g,o){return a(),i("div",null,p)}const F=s(n,[["render",k]]);export{y as __pageData,F as default};
diff --git a/assets/ru_vue-webapp_options_pwa.md.ArKSw8kR.js b/assets/ru_vue-webapp_options_pwa.md.4Gu3JEXm.js
similarity index 99%
rename from assets/ru_vue-webapp_options_pwa.md.ArKSw8kR.js
rename to assets/ru_vue-webapp_options_pwa.md.4Gu3JEXm.js
index a7002cd6f..dcbb8e216 100644
--- a/assets/ru_vue-webapp_options_pwa.md.ArKSw8kR.js
+++ b/assets/ru_vue-webapp_options_pwa.md.4Gu3JEXm.js
@@ -1,4 +1,4 @@
-import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"PWA","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/pwa.md","filePath":"ru/vue-webapp/options/pwa.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/pwa.md"},n=e(`

PWA

В приложение интегрируются простые Manifest и Service worker и работают сразу без настройки.

manifest.json

Позволяет устанавливать приложение на домашний экран и запускать его в режиме, похожем на нативный (без окна браузера).

manifest.json должен быть отредактирован в соответствии с данными вашего приложения. Подробней о файле манифеста - web.dev.

json
{
+import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"PWA","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/pwa.md","filePath":"ru/vue-webapp/options/pwa.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/pwa.md"},n=e(`

PWA

В приложение интегрируются простые Manifest и Service worker и работают сразу без настройки.

manifest.json

Позволяет устанавливать приложение на домашний экран и запускать его в режиме, похожем на нативный (без окна браузера).

manifest.json должен быть отредактирован в соответствии с данными вашего приложения. Подробней о файле манифеста - web.dev.

json
{
   "description": "Acme Corporation webapp",
   "dir": "auto",
   "display": "standalone",
diff --git a/assets/ru_vue-webapp_options_pwa.md.ArKSw8kR.lean.js b/assets/ru_vue-webapp_options_pwa.md.4Gu3JEXm.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_pwa.md.ArKSw8kR.lean.js
rename to assets/ru_vue-webapp_options_pwa.md.4Gu3JEXm.lean.js
index 4460c384b..f37c64e51 100644
--- a/assets/ru_vue-webapp_options_pwa.md.ArKSw8kR.lean.js
+++ b/assets/ru_vue-webapp_options_pwa.md.4Gu3JEXm.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"PWA","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/pwa.md","filePath":"ru/vue-webapp/options/pwa.md","lastUpdated":1706427418000}'),t={name:"ru/vue-webapp/options/pwa.md"},n=e("",11),p=[n];function h(l,k,o,r,E,d){return a(),i("div",null,p)}const g=s(t,[["render",h]]);export{u as __pageData,g as default};
+import{_ as s,c as i,o as a,U as e}from"./chunks/framework.P5TqXf0g.js";const u=JSON.parse('{"title":"PWA","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/pwa.md","filePath":"ru/vue-webapp/options/pwa.md","lastUpdated":1706553672000}'),t={name:"ru/vue-webapp/options/pwa.md"},n=e("",11),p=[n];function h(l,k,o,r,E,d){return a(),i("div",null,p)}const g=s(t,[["render",h]]);export{u as __pageData,g as default};
diff --git a/assets/ru_vue-webapp_options_splash-screen.md.R0vViLrL.js b/assets/ru_vue-webapp_options_splash-screen.md.R0vViLrL.js
deleted file mode 100644
index 297661a92..000000000
--- a/assets/ru_vue-webapp_options_splash-screen.md.R0vViLrL.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as a,c as e,o as t,U as s,au as c}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Splash screen","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/splash-screen.md","filePath":"ru/vue-webapp/options/splash-screen.md","lastUpdated":1706427418000}'),o={name:"ru/vue-webapp/options/splash-screen.md"},p=s('

Splash screen

Заставка при старте приложения вместо пустого экрана может повысить восприятие вашего приложения пользователями (UX) и укрепить узнаваемость вашего бренда.

image

Код заставки находится полностью в index.html. Контролируется CSS классом splash на body.

Убирается заставка в App.vue / onMounted() после загрузки всей необходимых для начала работы приложения ресурсов.

',5),n=[p];function d(r,_,i,l,m,h){return t(),e("div",null,n)}const g=a(o,[["render",d],["__scopeId","data-v-5c9a0694"]]);export{v as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_splash-screen.md.tgVNnDk_.js b/assets/ru_vue-webapp_options_splash-screen.md.tgVNnDk_.js new file mode 100644 index 000000000..cca16bfec --- /dev/null +++ b/assets/ru_vue-webapp_options_splash-screen.md.tgVNnDk_.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,U as s,au as o}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Splash screen","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/splash-screen.md","filePath":"ru/vue-webapp/options/splash-screen.md","lastUpdated":1706553672000}'),p={name:"ru/vue-webapp/options/splash-screen.md"},n=s('

Splash screen

Заставка при старте приложения вместо пустого экрана может повысить восприятие вашего приложения пользователями (UX) и укрепить узнаваемость вашего бренда.

image

Код заставки находится полностью в index.html. Контролируется CSS классом splash на body.

Убирается заставка в App.vue / onMounted() после загрузки всей необходимых для начала работы приложения ресурсов.

',5),d=[n];function c(r,_,i,l,m,h){return t(),a("div",null,d)}const g=e(p,[["render",c],["__scopeId","data-v-85382648"]]);export{v as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_splash-screen.md.R0vViLrL.lean.js b/assets/ru_vue-webapp_options_splash-screen.md.tgVNnDk_.lean.js similarity index 65% rename from assets/ru_vue-webapp_options_splash-screen.md.R0vViLrL.lean.js rename to assets/ru_vue-webapp_options_splash-screen.md.tgVNnDk_.lean.js index 87cac1542..2afa03ebb 100644 --- a/assets/ru_vue-webapp_options_splash-screen.md.R0vViLrL.lean.js +++ b/assets/ru_vue-webapp_options_splash-screen.md.tgVNnDk_.lean.js @@ -1 +1 @@ -import{_ as a,c as e,o as t,U as s,au as c}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Splash screen","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/splash-screen.md","filePath":"ru/vue-webapp/options/splash-screen.md","lastUpdated":1706427418000}'),o={name:"ru/vue-webapp/options/splash-screen.md"},p=s("",5),n=[p];function d(r,_,i,l,m,h){return t(),e("div",null,n)}const g=a(o,[["render",d],["__scopeId","data-v-5c9a0694"]]);export{v as __pageData,g as default}; +import{_ as e,c as a,o as t,U as s,au as o}from"./chunks/framework.P5TqXf0g.js";const v=JSON.parse('{"title":"Splash screen","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/splash-screen.md","filePath":"ru/vue-webapp/options/splash-screen.md","lastUpdated":1706553672000}'),p={name:"ru/vue-webapp/options/splash-screen.md"},n=s("",5),d=[n];function c(r,_,i,l,m,h){return t(),a("div",null,d)}const g=e(p,[["render",c],["__scopeId","data-v-85382648"]]);export{v as __pageData,g as default}; diff --git a/assets/ru_vue-webapp_options_themes.md.Kth6v22v.js b/assets/ru_vue-webapp_options_themes.md.bL3-WWM4.js similarity index 99% rename from assets/ru_vue-webapp_options_themes.md.Kth6v22v.js rename to assets/ru_vue-webapp_options_themes.md.bL3-WWM4.js index bb3ada33a..ee1a122a9 100644 --- a/assets/ru_vue-webapp_options_themes.md.Kth6v22v.js +++ b/assets/ru_vue-webapp_options_themes.md.bL3-WWM4.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as h}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Темы","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/themes.md","filePath":"ru/vue-webapp/options/themes.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/themes.md"},t=h(`

Темы

В приложении реализовано переключение светлой и тёмной тем. Все компоненты поддерживают переключение тем.

Темы управляются через CSS переменные, которые определены в файле vars.css. Выбранная пользователем тема запоминается в localStorage. За переключение тем отвечает компонент ThemeToggle

Возможна кастомизация темы и создание новых через переопределение CSS переменных, что рекомендуется делать в файле custom.scss:

css
:root {
+import{_ as s,c as i,o as a,U as h}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Темы","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/themes.md","filePath":"ru/vue-webapp/options/themes.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/options/themes.md"},t=h(`

Темы

В приложении реализовано переключение светлой и тёмной тем. Все компоненты поддерживают переключение тем.

Темы управляются через CSS переменные, которые определены в файле vars.css. Выбранная пользователем тема запоминается в localStorage. За переключение тем отвечает компонент ThemeToggle

Возможна кастомизация темы и создание новых через переопределение CSS переменных, что рекомендуется делать в файле custom.scss:

css
:root {
   --vwa-font-family-base: 'Roboto', sans-serif;
   --vwa-layout-max-width: 1280px;  
 
diff --git a/assets/ru_vue-webapp_options_themes.md.Kth6v22v.lean.js b/assets/ru_vue-webapp_options_themes.md.bL3-WWM4.lean.js
similarity index 90%
rename from assets/ru_vue-webapp_options_themes.md.Kth6v22v.lean.js
rename to assets/ru_vue-webapp_options_themes.md.bL3-WWM4.lean.js
index 3483c1d95..fdb896688 100644
--- a/assets/ru_vue-webapp_options_themes.md.Kth6v22v.lean.js
+++ b/assets/ru_vue-webapp_options_themes.md.bL3-WWM4.lean.js
@@ -1 +1 @@
-import{_ as s,c as i,o as a,U as h}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Темы","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/themes.md","filePath":"ru/vue-webapp/options/themes.md","lastUpdated":1706427418000}'),n={name:"ru/vue-webapp/options/themes.md"},t=h("",5),k=[t];function p(l,e,E,r,g,d){return a(),i("div",null,k)}const c=s(n,[["render",p]]);export{F as __pageData,c as default};
+import{_ as s,c as i,o as a,U as h}from"./chunks/framework.P5TqXf0g.js";const F=JSON.parse('{"title":"Темы","description":"","frontmatter":{"head":[["meta",{"name":"og:site_name","content":"Vue webapp builder"}],["meta",{"name":"og:image","content":"/images/vue-webapp-logo.png"}],["meta",{"name":"twitter:image","content":"/images/vue-webapp-logo.png"}]]},"headers":[],"relativePath":"ru/vue-webapp/options/themes.md","filePath":"ru/vue-webapp/options/themes.md","lastUpdated":1706553672000}'),n={name:"ru/vue-webapp/options/themes.md"},t=h("",5),k=[t];function p(l,e,E,r,g,d){return a(),i("div",null,k)}const c=s(n,[["render",p]]);export{F as __pageData,c as default};
diff --git a/assets/style.svVg-0QF.css b/assets/style.aPX1zTLG.css
similarity index 99%
rename from assets/style.svVg-0QF.css
rename to assets/style.aPX1zTLG.css
index fa840a7da..34832cf5f 100644
--- a/assets/style.svVg-0QF.css
+++ b/assets/style.aPX1zTLG.css
@@ -1 +1 @@
-@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic.jIZ9REo5.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek.Cb5wWeGA.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek-ext.9JiNzaSO.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin.bvIUbFQP.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin-ext.GZWE-KO4.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-vietnamese.paY3CzEB.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic.-nLMcIwj.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic-ext.OVycGSDq.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek.PSfer2Kc.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek-ext.hznxWNZO.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin.27E69YJn.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin-ext.RnFly65-.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-vietnamese.xzQHe1q1.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-green-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-green-1);--vp-code-line-diff-remove-color: var(--vp-c-red-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1);--vp-code-line-warning-color: var(--vp-c-yellow-soft);--vp-code-line-error-color: var(--vp-c-red-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-brand-soft);--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-gray-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-brand-1);--vp-badge-tip-bg: var(--vp-c-brand-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-brand-1)}.custom-block.tip a:hover{color:var(--vp-c-brand-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-03e59631]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-03e59631],.VPBackdrop.fade-leave-to[data-v-03e59631]{opacity:0}.VPBackdrop.fade-leave-active[data-v-03e59631]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-03e59631]{display:none}}.NotFound[data-v-821a9d89]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-821a9d89]{padding:96px 32px 168px}}.code[data-v-821a9d89]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-821a9d89]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-821a9d89]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-821a9d89]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-821a9d89]{padding-top:20px}.link[data-v-821a9d89]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-821a9d89]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-8709fa37]{position:relative;z-index:1}.nested[data-v-8709fa37]{padding-right:16px;padding-left:16px}.outline-link[data-v-8709fa37]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-8709fa37]:hover,.outline-link.active[data-v-8709fa37]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-8709fa37]{padding-left:13px}.VPDocAsideOutline[data-v-aa59da57]{display:none}.VPDocAsideOutline.has-outline[data-v-aa59da57]{display:block}.content[data-v-aa59da57]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-aa59da57]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-aa59da57]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-55432d05]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-55432d05]{flex-grow:1}.VPDocAside[data-v-55432d05] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-55432d05] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-55432d05] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-c9d0eb99]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-c9d0eb99]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-93cfaf96]{margin-top:64px}.edit-info[data-v-93cfaf96]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-93cfaf96]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-93cfaf96]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-93cfaf96]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-93cfaf96]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-93cfaf96]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-93cfaf96]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-93cfaf96]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-93cfaf96]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-93cfaf96]{margin-left:auto;text-align:right}.desc[data-v-93cfaf96]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-93cfaf96]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-fbd749fe]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-fbd749fe]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-fbd749fe]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-fbd749fe]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-fbd749fe]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-fbd749fe]{display:flex;justify-content:center}.VPDoc .aside[data-v-fbd749fe]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-fbd749fe]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-fbd749fe]{max-width:1104px}}.container[data-v-fbd749fe]{margin:0 auto;width:100%}.aside[data-v-fbd749fe]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-fbd749fe]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-fbd749fe]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-fbd749fe]::-webkit-scrollbar{display:none}.aside-curtain[data-v-fbd749fe]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-fbd749fe]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-fbd749fe]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-fbd749fe]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-fbd749fe]{order:1;margin:0;min-width:640px}}.content-container[data-v-fbd749fe]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-fbd749fe]{max-width:688px}.VPButton[data-v-d16e9b74]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-d16e9b74]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-d16e9b74]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-d16e9b74]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-d16e9b74]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-d16e9b74]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-d16e9b74]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-d16e9b74]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-d16e9b74]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-d16e9b74]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-d16e9b74]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-d16e9b74]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-d16e9b74]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-4b98881e]{display:none}.dark .VPImage.light[data-v-4b98881e]{display:none}.VPHero[data-v-ad185e75]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-ad185e75]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-ad185e75]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-ad185e75]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-ad185e75]{flex-direction:row}}.main[data-v-ad185e75]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-ad185e75]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-ad185e75]{text-align:left}}@media (min-width: 960px){.main[data-v-ad185e75]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-ad185e75]{max-width:592px}}.name[data-v-ad185e75],.text[data-v-ad185e75]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-ad185e75],.VPHero.has-image .text[data-v-ad185e75]{margin:0 auto}.name[data-v-ad185e75]{color:var(--vp-home-hero-name-color)}.clip[data-v-ad185e75]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-ad185e75],.text[data-v-ad185e75]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-ad185e75],.text[data-v-ad185e75]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-ad185e75],.VPHero.has-image .text[data-v-ad185e75]{margin:0}}.tagline[data-v-ad185e75]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-ad185e75]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-ad185e75]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-ad185e75]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-ad185e75]{margin:0}}.actions[data-v-ad185e75]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-ad185e75]{justify-content:center}@media (min-width: 640px){.actions[data-v-ad185e75]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-ad185e75]{justify-content:flex-start}}.action[data-v-ad185e75]{flex-shrink:0;padding:6px}.image[data-v-ad185e75]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-ad185e75]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-ad185e75]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-ad185e75]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-ad185e75]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-ad185e75]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-ad185e75]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-ad185e75]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-ad185e75]{width:320px;height:320px}}[data-v-ad185e75] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-ad185e75] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-ad185e75] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-b48bc3f9]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-b48bc3f9]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-b48bc3f9]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-b48bc3f9]>.VPImage{margin-bottom:20px}.icon[data-v-b48bc3f9]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-b48bc3f9]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-b48bc3f9]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-b48bc3f9]{padding-top:8px}.link-text-value[data-v-b48bc3f9]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-b48bc3f9]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-c63a12c6]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-c63a12c6]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-c63a12c6]{padding:0 64px}}.container[data-v-c63a12c6]{margin:0 auto;max-width:1152px}.items[data-v-c63a12c6]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-c63a12c6]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-c63a12c6],.item.grid-4[data-v-c63a12c6],.item.grid-6[data-v-c63a12c6]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-c63a12c6],.item.grid-4[data-v-c63a12c6]{width:50%}.item.grid-3[data-v-c63a12c6],.item.grid-6[data-v-c63a12c6]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-c63a12c6]{width:25%}}.VPHome[data-v-35757591]{padding-bottom:96px}.VPHome[data-v-35757591] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-35757591]{padding-bottom:128px}}.VPContent[data-v-5bb58b51]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-5bb58b51]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-5bb58b51]{margin:0}@media (min-width: 960px){.VPContent[data-v-5bb58b51]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-5bb58b51]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-5bb58b51]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-7e42202a]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-7e42202a]{display:none}.VPFooter[data-v-7e42202a] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-7e42202a] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-7e42202a]{padding:32px}}.container[data-v-7e42202a]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-7e42202a],.copyright[data-v-7e42202a]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-3dbbcea5]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-3dbbcea5]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-3dbbcea5]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-3dbbcea5]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-3dbbcea5]{color:var(--vp-c-text-1)}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-3dbbcea5]{font-size:14px}}.icon[data-v-3dbbcea5]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}.open>.icon[data-v-3dbbcea5]{transform:rotate(90deg)}.items[data-v-3dbbcea5]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-3dbbcea5]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-3dbbcea5]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-3dbbcea5]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-3dbbcea5]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-3dbbcea5]{transition:all .2s ease-out}.flyout-leave-active[data-v-3dbbcea5]{transition:all .15s ease-in}.flyout-enter-from[data-v-3dbbcea5],.flyout-leave-to[data-v-3dbbcea5]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-df179b54]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-df179b54]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-df179b54]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-df179b54]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-df179b54]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-df179b54]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-df179b54]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-df179b54]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-df179b54]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-df179b54]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-df179b54]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-df179b54]{display:none}}.menu-icon[data-v-df179b54]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-df179b54]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-df179b54]{padding:12px 32px 11px}}.VPSwitch[data-v-59c2c4c4]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-59c2c4c4]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-59c2c4c4]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-59c2c4c4]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-59c2c4c4] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-59c2c4c4] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-a5ffd038]{opacity:1}.moon[data-v-a5ffd038],.dark .sun[data-v-a5ffd038]{opacity:0}.dark .moon[data-v-a5ffd038]{opacity:1}.dark .VPSwitchAppearance[data-v-a5ffd038] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-1dd33068]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-1dd33068]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-78e6daba]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-78e6daba]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-78e6daba]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-78e6daba]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-837e8b02]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-837e8b02]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-837e8b02]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-837e8b02]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-920e461a]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-920e461a] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-920e461a] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-920e461a] .group:last-child{padding-bottom:0}.VPMenu[data-v-920e461a] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-920e461a] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-920e461a] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-920e461a] .action{padding-left:24px}.VPFlyout[data-v-a4fabc1b]{position:relative}.VPFlyout[data-v-a4fabc1b]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-a4fabc1b]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-a4fabc1b]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-a4fabc1b]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-a4fabc1b]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-a4fabc1b],.button[aria-expanded=true]+.menu[data-v-a4fabc1b]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-a4fabc1b]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-a4fabc1b]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-a4fabc1b]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-a4fabc1b]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-a4fabc1b]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-a4fabc1b]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-a4fabc1b]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-d7e056da]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-d7e056da]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-d7e056da]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-16f8b2f5]{display:flex;justify-content:center}.VPNavBarExtra[data-v-6c64fdd1]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-6c64fdd1]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-6c64fdd1]{display:none}}.trans-title[data-v-6c64fdd1]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-6c64fdd1],.item.social-links[data-v-6c64fdd1]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-6c64fdd1]{min-width:176px}.appearance-action[data-v-6c64fdd1]{margin-right:-2px}.social-links-list[data-v-6c64fdd1]{margin:-4px -8px}.VPNavBarHamburger[data-v-c2a14fb1]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-c2a14fb1]{display:none}}.container[data-v-c2a14fb1]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-c2a14fb1]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-c2a14fb1]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-c2a14fb1]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-c2a14fb1]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-c2a14fb1]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-c2a14fb1]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-c2a14fb1],.VPNavBarHamburger.active:hover .middle[data-v-c2a14fb1],.VPNavBarHamburger.active:hover .bottom[data-v-c2a14fb1]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-c2a14fb1],.middle[data-v-c2a14fb1],.bottom[data-v-c2a14fb1]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-c2a14fb1]{top:0;left:0;transform:translate(0)}.middle[data-v-c2a14fb1]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-c2a14fb1]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-49a9523e]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-49a9523e],.VPNavBarMenuLink[data-v-49a9523e]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-760204e0]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-760204e0]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-8dbcf1da]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-8dbcf1da]{display:flex;align-items:center}}.title[data-v-5a94dcd8]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-5a94dcd8]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-5a94dcd8]{border-bottom-color:var(--vp-c-divider)}}[data-v-5a94dcd8] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-9194bb91]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-9194bb91]{display:flex;align-items:center}}.title[data-v-9194bb91]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-42aa9df5]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .5s}.VPNavBar.has-local-nav[data-v-42aa9df5]{background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar.has-local-nav[data-v-42aa9df5]{background-color:transparent}.VPNavBar[data-v-42aa9df5]:not(.has-sidebar):not(.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-42aa9df5]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-42aa9df5]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-42aa9df5]{padding:0}}.container[data-v-42aa9df5]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-42aa9df5],.container>.content[data-v-42aa9df5]{pointer-events:none}.container[data-v-42aa9df5] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-42aa9df5]{max-width:100%}}.title[data-v-42aa9df5]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-42aa9df5]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-42aa9df5]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-42aa9df5]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-42aa9df5]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-42aa9df5]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-42aa9df5]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-42aa9df5]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.top) .content-body[data-v-42aa9df5]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-42aa9df5]{column-gap:.5rem}}.menu+.translations[data-v-42aa9df5]:before,.menu+.appearance[data-v-42aa9df5]:before,.menu+.social-links[data-v-42aa9df5]:before,.translations+.appearance[data-v-42aa9df5]:before,.appearance+.social-links[data-v-42aa9df5]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-42aa9df5]:before,.translations+.appearance[data-v-42aa9df5]:before{margin-right:16px}.appearance+.social-links[data-v-42aa9df5]:before{margin-left:16px}.social-links[data-v-42aa9df5]{margin-right:-8px}.divider[data-v-42aa9df5]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-42aa9df5]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-42aa9df5]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-42aa9df5]{width:100%;height:1px;transition:background-color .5s}.VPNavBar.has-local-nav .divider-line[data-v-42aa9df5]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.top) .divider-line[data-v-42aa9df5]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.top) .divider[data-v-42aa9df5]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-c59e684f]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-c59e684f]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-55fc374b]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-55fc374b]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-f37bbc3d]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-f37bbc3d]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-12372362]{display:block}.title[data-v-12372362]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-873aafb3]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-873aafb3]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-873aafb3]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-873aafb3]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-873aafb3]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-873aafb3]{transform:rotate(45deg)}.button[data-v-873aafb3]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-873aafb3]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-873aafb3]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-873aafb3]:first-child{padding-top:0}.group+.group[data-v-873aafb3],.group+.item[data-v-873aafb3]{padding-top:4px}.VPNavScreenTranslations[data-v-a4076537]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-a4076537]{height:auto}.title[data-v-a4076537]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-a4076537]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-a4076537]{margin-right:8px}.icon.chevron[data-v-a4076537]{margin-left:4px}.list[data-v-a4076537]{padding:4px 0 0 24px}.link[data-v-a4076537]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-2984a903]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-2984a903],.VPNavScreen.fade-leave-active[data-v-2984a903]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-2984a903],.VPNavScreen.fade-leave-active .container[data-v-2984a903]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-2984a903],.VPNavScreen.fade-leave-to[data-v-2984a903]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-2984a903],.VPNavScreen.fade-leave-to .container[data-v-2984a903]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-2984a903]{display:none}}.container[data-v-2984a903]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-2984a903],.menu+.appearance[data-v-2984a903],.translations+.appearance[data-v-2984a903]{margin-top:24px}.menu+.social-links[data-v-2984a903]{margin-top:16px}.appearance+.social-links[data-v-2984a903]{margin-top:16px}.VPNav[data-v-a832e287]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-a832e287]{position:fixed}}.VPSidebarItem.level-0[data-v-758a0e73]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-758a0e73]{padding-bottom:10px}.item[data-v-758a0e73]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-758a0e73]{cursor:pointer}.indicator[data-v-758a0e73]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-758a0e73],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-758a0e73],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-758a0e73],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-758a0e73]{background-color:var(--vp-c-brand-1)}.link[data-v-758a0e73]{display:flex;align-items:center;flex-grow:1}.text[data-v-758a0e73]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-758a0e73]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-758a0e73],.VPSidebarItem.level-2 .text[data-v-758a0e73],.VPSidebarItem.level-3 .text[data-v-758a0e73],.VPSidebarItem.level-4 .text[data-v-758a0e73],.VPSidebarItem.level-5 .text[data-v-758a0e73]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-758a0e73]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-1.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-2.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-3.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-4.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-5.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-758a0e73]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-758a0e73]{color:var(--vp-c-brand-1)}.caret[data-v-758a0e73]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-758a0e73]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-758a0e73]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-758a0e73]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-758a0e73]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-758a0e73],.VPSidebarItem.level-2 .items[data-v-758a0e73],.VPSidebarItem.level-3 .items[data-v-758a0e73],.VPSidebarItem.level-4 .items[data-v-758a0e73],.VPSidebarItem.level-5 .items[data-v-758a0e73]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-758a0e73]{display:none}.VPSidebar[data-v-464f49c9]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-464f49c9]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-464f49c9]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-464f49c9]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-464f49c9]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-464f49c9]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-464f49c9]{outline:0}.group+.group[data-v-464f49c9]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-464f49c9]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-5bd08246]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-5bd08246]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-5bd08246]{top:14px;left:16px}}.Layout[data-v-fd36441a]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-023aedc5]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-023aedc5]{margin:0 auto;max-width:1152px}.love[data-v-023aedc5]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-023aedc5]{width:28px;height:28px;fill:currentColor}.message[data-v-023aedc5]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-023aedc5]{padding-top:32px}.action[data-v-023aedc5]{padding-top:40px;text-align:center}.VPTeamPage[data-v-0e84fc64]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-0e84fc64]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-0e84fc64-s],.VPTeamMembers+.VPTeamPageSection[data-v-0e84fc64-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-0e84fc64-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-0e84fc64-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-0e84fc64-s],.VPTeamMembers+.VPTeamPageSection[data-v-0e84fc64-s]{margin-top:96px}}.VPTeamMembers[data-v-0e84fc64-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-0e84fc64-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-0e84fc64-s]{padding:0 64px}}.VPTeamPageTitle[data-v-ba7e3a9e]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-ba7e3a9e]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-ba7e3a9e]{padding:80px 64px 48px}}.title[data-v-ba7e3a9e]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-ba7e3a9e]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-ba7e3a9e]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-ba7e3a9e]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-f4481e3c]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-f4481e3c]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-f4481e3c]{padding:0 64px}}.title[data-v-f4481e3c]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-f4481e3c]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-f4481e3c]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-f4481e3c]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-f4481e3c]{padding-top:40px}.VPTeamMembersItem[data-v-d76daa77]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-d76daa77]{padding:32px}.VPTeamMembersItem.small .data[data-v-d76daa77]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-d76daa77]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-d76daa77]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-d76daa77]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-d76daa77]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-d76daa77]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-d76daa77]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-d76daa77]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-d76daa77]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-d76daa77]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-d76daa77]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-d76daa77]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-d76daa77]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-d76daa77]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-d76daa77]{text-align:center}.avatar[data-v-d76daa77]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-d76daa77]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-d76daa77]{margin:0;font-weight:600}.affiliation[data-v-d76daa77]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-d76daa77]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-d76daa77]:hover{color:var(--vp-c-brand-1)}.desc[data-v-d76daa77]{margin:0 auto}.desc[data-v-d76daa77] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-d76daa77]{display:flex;justify-content:center;height:56px}.sp-link[data-v-d76daa77]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-d76daa77]:hover,.sp .sp-link.link[data-v-d76daa77]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-d76daa77]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-dd487262]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-dd487262]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-dd487262]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-dd487262]{max-width:876px}.VPTeamMembers.medium .container[data-v-dd487262]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-dd487262]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-dd487262]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-dd487262]{max-width:760px}.container[data-v-dd487262]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.custom-block.details{margin:2em 0}.custom-block.details summary{font-size:1.3em;padding-right:24px;width:100%;position:relative;cursor:pointer;list-style:none;outline:0;margin-right:1em}.custom-block.details summary::-webkit-details-marker{display:none}.custom-block.details summary:after{content:"+";color:var(--vp-custom-block-details-text);position:absolute;font-size:2rem;line-height:0;top:50%;right:0;font-weight:200;transform-origin:center;transition:.3s linear}.custom-block.details[open] p{font-size:1.2em;line-height:1.6em;margin:1.2em 0}.custom-block.details[open] summary{margin-bottom:1.3em}.custom-block.details[open] summary:after{transform:rotate(45deg);right:-2px;top:calc(50% + 1px)}.custom-block.details[open] summary~*{opacity:1;animation:open .3s ease-in-out}.custom-block.details[open] ul,.custom-block.details[open] ol,.custom-block.details[open] blockquote p,.custom-block.details[open] pre code{font-size:1.1em}@media (max-width: 768px){.custom-block.details[open] p{font-size:1.1em}}@keyframes open{0%{opacity:0}to{opacity:1}}body{overflow-y:scroll;--vp-custom-block-code-font-size: 14px}:not(.dark) body{--vp-custom-block-details-text: #54545c}body .vp-doc h1{margin-bottom:1em}body .vp-doc p img{margin:auto}body .is-home .main .text{line-height:44px;font-size:38px}body .is-home .has-image .main .name{font-size:68px;margin-bottom:30px}body .social-links a:last-child{width:unset}body .social-links a:last-child svg{width:80px!important}.arty-crafty .VPNavBarTranslations,.arty-crafty .VPMenu .group.translations,.textbook .VPNavBarTranslations,.textbook .VPMenu .group.translations,.articles .VPNavBarTranslations,.articles .VPMenu .group.translations{display:none}.arty-crafty img:not(.logo){border:1px solid #ddd}.VPSidebarItem.level-0 h2.text{font-family:Office Code Pro,Source Code Pro,Menlo,monospace;text-transform:uppercase;letter-spacing:.07em}:root{--toastify-color-light:#fff;--toastify-color-dark:#121212;--toastify-color-info:#3498db;--toastify-color-success:#07bc0c;--toastify-color-warning:#f1c40f;--toastify-color-error:#e74c3c;--toastify-color-transparent:hsla(0,0%,100%,.7);--toastify-icon-color-info:var(--toastify-color-info);--toastify-icon-color-success:var(--toastify-color-success);--toastify-icon-color-warning:var(--toastify-color-warning);--toastify-icon-color-error:var(--toastify-color-error);--toastify-toast-width:320px;--toastify-toast-background:#fff;--toastify-toast-min-height:64px;--toastify-toast-max-height:800px;--toastify-font-family:sans-serif;--toastify-z-index:9999;--toastify-text-color-light:#757575;--toastify-text-color-dark:#fff;--toastify-text-color-info:#fff;--toastify-text-color-success:#fff;--toastify-text-color-warning:#fff;--toastify-text-color-error:#fff;--toastify-spinner-color:#616161;--toastify-spinner-color-empty-area:#e0e0e0;--toastify-color-progress-light:linear-gradient(90deg,#4cd964,#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);--toastify-color-progress-dark:#bb86fc;--toastify-color-progress-info:var(--toastify-color-info);--toastify-color-progress-success:var(--toastify-color-success);--toastify-color-progress-warning:var(--toastify-color-warning);--toastify-color-progress-error:var(--toastify-color-error);--toastify-color-progress-colored:#ddd}.Toastify__toast-container{box-sizing:border-box;color:#fff;padding:4px;position:fixed;-webkit-transform:translate3d(0,0,var(--toastify-z-index) px);transform:translate3d(0,0,var(--toastify-z-index) px);width:var(--toastify-toast-width);z-index:var(--toastify-z-index)}.Toastify__toast-container--top-left{left:1em;top:1em}.Toastify__toast-container--top-center{left:50%;top:1em;-webkit-transform:translateX(-50%);transform:translate(-50%)}.Toastify__toast-container--top-right{right:1em;top:1em}.Toastify__toast-container--bottom-left{bottom:1em;left:1em}.Toastify__toast-container--bottom-center{bottom:1em;left:50%;-webkit-transform:translateX(-50%);transform:translate(-50%)}.Toastify__toast-container--bottom-right{bottom:1em;right:1em}@media only screen and (max-width:480px){.Toastify__toast-container{left:0;margin:0;padding:0;width:100vw}.Toastify__toast-container--top-center,.Toastify__toast-container--top-left,.Toastify__toast-container--top-right{top:0;-webkit-transform:translateX(0);transform:translate(0)}.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-right{bottom:0;-webkit-transform:translateX(0);transform:translate(0)}.Toastify__toast-container--rtl{left:auto;right:0}}.Toastify__toast{border-radius:4px;box-shadow:0 1px 10px #0000001a,0 2px 15px #0000000d;box-sizing:border-box;cursor:pointer;direction:ltr;display:flex;font-family:var(--toastify-font-family);justify-content:space-between;margin-bottom:1rem;max-height:var(--toastify-toast-max-height);min-height:var(--toastify-toast-min-height);overflow:hidden;padding:8px;position:relative;z-index:0}.Toastify__toast--rtl{direction:rtl}.Toastify__toast-body{align-items:center;display:flex;flex:1 1 auto;margin:auto 0;padding:6px;white-space:pre-wrap}.Toastify__toast-body>div:last-child{flex:1}.Toastify__toast-icon{display:flex;flex-shrink:0;-webkit-margin-end:10px;margin-inline-end:10px;width:20px}.Toastify--animate{-webkit-animation-duration:.7s;animation-duration:.7s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.Toastify--animate-icon{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@media only screen and (max-width:480px){.Toastify__toast{border-radius:0;margin-bottom:0}}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--colored.Toastify__toast--default,.Toastify__toast-theme--light{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{background:var(--toastify-color-info);color:var(--toastify-text-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{background:var(--toastify-color-success);color:var(--toastify-text-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{background:var(--toastify-color-warning);color:var(--toastify-text-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{background:var(--toastify-color-error);color:var(--toastify-text-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--default{background:var(--toastify-color-progress-colored)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning{background:var(--toastify-color-transparent)}.Toastify__close-button{align-self:flex-start;background:transparent;border:none;color:#fff;cursor:pointer;opacity:.7;outline:none;padding:0;transition:.3s ease}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentcolor;height:16px;width:14px}.Toastify__close-button:focus,.Toastify__close-button:hover{opacity:1}@-webkit-keyframes Toastify__trackProgress{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}to{-webkit-transform:scaleX(0);transform:scaleX(0)}}@keyframes Toastify__trackProgress{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}to{-webkit-transform:scaleX(0);transform:scaleX(0)}}.Toastify__progress-bar{bottom:0;height:5px;left:0;opacity:.7;position:absolute;-webkit-transform-origin:left;transform-origin:left;width:100%;z-index:var(--toastify-z-index)}.Toastify__progress-bar--animated{-webkit-animation:Toastify__trackProgress linear 1 forwards;animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.Toastify__progress-bar--rtl{left:auto;right:0;-webkit-transform-origin:right;transform-origin:right}.Toastify__spinner{-webkit-animation:Toastify__spin .65s linear infinite;animation:Toastify__spin .65s linear infinite;border:2px solid;border-color:var(--toastify-spinner-color-empty-area);border-radius:100%;border-right-color:var(--toastify-spinner-color);box-sizing:border-box;height:20px;width:20px}@-webkit-keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes Toastify__bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@-webkit-keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@-webkit-keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@-webkit-keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes Toastify__bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--bottom-left,.Toastify__bounce-enter--top-left{-webkit-animation-name:Toastify__bounceInLeft;animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--bottom-right,.Toastify__bounce-enter--top-right{-webkit-animation-name:Toastify__bounceInRight;animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{-webkit-animation-name:Toastify__bounceInDown;animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{-webkit-animation-name:Toastify__bounceInUp;animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--bottom-left,.Toastify__bounce-exit--top-left{-webkit-animation-name:Toastify__bounceOutLeft;animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--bottom-right,.Toastify__bounce-exit--top-right{-webkit-animation-name:Toastify__bounceOutRight;animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{-webkit-animation-name:Toastify__bounceOutUp;animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{-webkit-animation-name:Toastify__bounceOutDown;animation-name:Toastify__bounceOutDown}@-webkit-keyframes Toastify__zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-webkit-keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{-webkit-animation-name:Toastify__zoomIn;animation-name:Toastify__zoomIn}.Toastify__zoom-exit{-webkit-animation-name:Toastify__zoomOut;animation-name:Toastify__zoomOut}@-webkit-keyframes Toastify__flipIn{0%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{opacity:1;-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes Toastify__flipIn{0%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{opacity:1;-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes Toastify__flipOut{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{opacity:1;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}@keyframes Toastify__flipOut{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{opacity:1;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}.Toastify__flip-enter{-webkit-animation-name:Toastify__flipIn;animation-name:Toastify__flipIn}.Toastify__flip-exit{-webkit-animation-name:Toastify__flipOut;animation-name:Toastify__flipOut}@-webkit-keyframes Toastify__slideInRight{0%{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInRight{0%{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInLeft{0%{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInLeft{0%{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInUp{0%{-webkit-transform:translate3d(0,110%,0);transform:translate3d(0,110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInUp{0%{-webkit-transform:translate3d(0,110%,0);transform:translate3d(0,110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInDown{0%{-webkit-transform:translate3d(0,-110%,0);transform:translate3d(0,-110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInDown{0%{-webkit-transform:translate3d(0,-110%,0);transform:translate3d(0,-110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,500px,0);transform:translate3d(0,500px,0);visibility:hidden}}@keyframes Toastify__slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,500px,0);transform:translate3d(0,500px,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,-500px,0);transform:translate3d(0,-500px,0);visibility:hidden}}@keyframes Toastify__slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,-500px,0);transform:translate3d(0,-500px,0);visibility:hidden}}.Toastify__slide-enter--bottom-left,.Toastify__slide-enter--top-left{-webkit-animation-name:Toastify__slideInLeft;animation-name:Toastify__slideInLeft}.Toastify__slide-enter--bottom-right,.Toastify__slide-enter--top-right{-webkit-animation-name:Toastify__slideInRight;animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{-webkit-animation-name:Toastify__slideInDown;animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{-webkit-animation-name:Toastify__slideInUp;animation-name:Toastify__slideInUp}.Toastify__slide-exit--bottom-left,.Toastify__slide-exit--top-left{-webkit-animation-name:Toastify__slideOutLeft;animation-name:Toastify__slideOutLeft}.Toastify__slide-exit--bottom-right,.Toastify__slide-exit--top-right{-webkit-animation-name:Toastify__slideOutRight;animation-name:Toastify__slideOutRight}.Toastify__slide-exit--top-center{-webkit-animation-name:Toastify__slideOutUp;animation-name:Toastify__slideOutUp}.Toastify__slide-exit--bottom-center{-webkit-animation-name:Toastify__slideOutDown;animation-name:Toastify__slideOutDown}@-webkit-keyframes Toastify__spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes Toastify__spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}:root{--toastify-toast-width: 420px}h3{font-weight:600;font-size:larger}img[data-v-407c766c],img[data-v-821f6c9c],img[data-v-2e9a546b],img[data-v-bc1d1363],img[data-v-cf492197],img[data-v-a1f1cc22],img[data-v-3d64d7b6]{border:1px solid #ddd}.post[data-v-6d3821ee]{border-bottom:1px solid var(--vp-c-border);margin:1rem 0 2rem}.post .title[data-v-6d3821ee]{font-size:1.3rem;font-weight:600;border-bottom:1px solid var(--vp-c-divider);margin:3rem 0 1rem;padding-bottom:1rem}.post .title a[data-v-6d3821ee]{text-decoration:none;color:var(--vp-c-text-2);transition:color .3s easy-out}.post .title a[data-v-6d3821ee]:hover{color:var(--vp-c-text-1)}.post .content[data-v-6d3821ee]{display:flex}.post .content .image[data-v-6d3821ee]{flex:1 1 30%;margin:0 1rem 1rem 0}.post .content .desc[data-v-6d3821ee]{flex:1 1 70%}@media (max-width: 768px){.post .content[data-v-6d3821ee]{flex-direction:column}}.post .footer[data-v-6d3821ee]{display:flex;justify-content:space-between;padding:2rem 0 .5rem;color:var(--vp-c-text-3)}.post .footer a[data-v-6d3821ee]{color:var(--vp-c-text-3)}img[data-v-bf9cac6b],img[data-v-339a24b8]{border:1px solid #ddd}.VPButton.alt.alt-border{border-color:#fce728}.VPButton.alt.alt-border:hover{border-color:#f4dc02}.form-container{border-radius:5px;padding:20px 0}input[type=text],textarea{width:100%;padding:12px;border:1px solid #ccc;outline-color:#ccc;border-radius:4px;box-sizing:border-box;margin-top:6px;margin-bottom:16px;resize:vertical;transition:.8s}input[type=text]:focus,textarea:focus,input[type=text]:focus-visible,textarea:focus-visible{outline-color:#6e478e}textarea{height:200px}input[type=submit]{background-color:#45166b;color:#fff;font-size:1.1em;padding:12px 20px;margin-top:1em;border:none;border-radius:4px;cursor:pointer;transition:all .3s ease-in-out}input[type=submit]:hover{background-color:#6e478e}input:scope[type=submit][disabled]{opacity:.5;cursor:unset}input:scope[type=submit][disabled]:hover{background-color:#45166b}img[data-v-06ff214a],img[data-v-32b5d500],img[data-v-86b9234c],img[data-v-22b4ffe9],img[data-v-057840ef],img[data-v-689ccd41],img[data-v-5c9a0694]{border:1px solid #ddd}.VPLocalSearchBox[data-v-fb64fd3e]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-fb64fd3e]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-fb64fd3e]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-fb64fd3e]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-fb64fd3e]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-fb64fd3e]{padding:0 8px}}.search-bar[data-v-fb64fd3e]:focus-within{border-color:var(--vp-c-brand-1)}.search-icon[data-v-fb64fd3e]{margin:8px}@media (max-width: 767px){.search-icon[data-v-fb64fd3e]{display:none}}.search-input[data-v-fb64fd3e]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-fb64fd3e]{padding:6px 4px}}.search-actions[data-v-fb64fd3e]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-fb64fd3e]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-fb64fd3e]{display:none}}.search-actions button[data-v-fb64fd3e]{padding:8px}.search-actions button[data-v-fb64fd3e]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-fb64fd3e]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-fb64fd3e]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-fb64fd3e]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-fb64fd3e]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-fb64fd3e]{display:none}}.search-keyboard-shortcuts kbd[data-v-fb64fd3e]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-fb64fd3e]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-fb64fd3e]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-fb64fd3e]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-fb64fd3e]{margin:8px}}.titles[data-v-fb64fd3e]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-fb64fd3e]{display:flex;align-items:center;gap:4px}.title.main[data-v-fb64fd3e]{font-weight:500}.title-icon[data-v-fb64fd3e]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-fb64fd3e]{opacity:.5}.result.selected[data-v-fb64fd3e]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-fb64fd3e]{position:relative}.excerpt[data-v-fb64fd3e]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-fb64fd3e]{opacity:1}.excerpt[data-v-fb64fd3e] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-fb64fd3e] mark,.excerpt[data-v-fb64fd3e] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-fb64fd3e] .vp-code-group .tabs{display:none}.excerpt[data-v-fb64fd3e] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-fb64fd3e]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-fb64fd3e]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-fb64fd3e],.result.selected .title-icon[data-v-fb64fd3e]{color:var(--vp-c-brand-1)!important}.no-results[data-v-fb64fd3e]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-fb64fd3e]{flex:none}
+@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic.jIZ9REo5.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic-ext.8T9wMG5w.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek.Cb5wWeGA.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek-ext.9JiNzaSO.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin.bvIUbFQP.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin-ext.GZWE-KO4.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-vietnamese.paY3CzEB.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic.-nLMcIwj.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic-ext.OVycGSDq.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek.PSfer2Kc.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek-ext.hznxWNZO.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin.27E69YJn.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin-ext.RnFly65-.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-vietnamese.xzQHe1q1.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-green-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-green-1);--vp-code-line-diff-remove-color: var(--vp-c-red-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1);--vp-code-line-warning-color: var(--vp-c-yellow-soft);--vp-code-line-error-color: var(--vp-c-red-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-brand-soft);--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-gray-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-brand-1);--vp-badge-tip-bg: var(--vp-c-brand-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-brand-1)}.custom-block.tip a:hover{color:var(--vp-c-brand-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-03e59631]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-03e59631],.VPBackdrop.fade-leave-to[data-v-03e59631]{opacity:0}.VPBackdrop.fade-leave-active[data-v-03e59631]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-03e59631]{display:none}}.NotFound[data-v-821a9d89]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-821a9d89]{padding:96px 32px 168px}}.code[data-v-821a9d89]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-821a9d89]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-821a9d89]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-821a9d89]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-821a9d89]{padding-top:20px}.link[data-v-821a9d89]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-821a9d89]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-8709fa37]{position:relative;z-index:1}.nested[data-v-8709fa37]{padding-right:16px;padding-left:16px}.outline-link[data-v-8709fa37]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-8709fa37]:hover,.outline-link.active[data-v-8709fa37]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-8709fa37]{padding-left:13px}.VPDocAsideOutline[data-v-aa59da57]{display:none}.VPDocAsideOutline.has-outline[data-v-aa59da57]{display:block}.content[data-v-aa59da57]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-aa59da57]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-aa59da57]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-55432d05]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-55432d05]{flex-grow:1}.VPDocAside[data-v-55432d05] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-55432d05] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-55432d05] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-c9d0eb99]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-c9d0eb99]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-93cfaf96]{margin-top:64px}.edit-info[data-v-93cfaf96]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-93cfaf96]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-93cfaf96]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-93cfaf96]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-93cfaf96]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-93cfaf96]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-93cfaf96]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-93cfaf96]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-93cfaf96]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-93cfaf96]{margin-left:auto;text-align:right}.desc[data-v-93cfaf96]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-93cfaf96]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-fbd749fe]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-fbd749fe]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-fbd749fe]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-fbd749fe]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-fbd749fe]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-fbd749fe]{display:flex;justify-content:center}.VPDoc .aside[data-v-fbd749fe]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-fbd749fe]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-fbd749fe]{max-width:1104px}}.container[data-v-fbd749fe]{margin:0 auto;width:100%}.aside[data-v-fbd749fe]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-fbd749fe]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-fbd749fe]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-fbd749fe]::-webkit-scrollbar{display:none}.aside-curtain[data-v-fbd749fe]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-fbd749fe]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-fbd749fe]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-fbd749fe]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-fbd749fe]{order:1;margin:0;min-width:640px}}.content-container[data-v-fbd749fe]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-fbd749fe]{max-width:688px}.VPButton[data-v-d16e9b74]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-d16e9b74]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-d16e9b74]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-d16e9b74]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-d16e9b74]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-d16e9b74]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-d16e9b74]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-d16e9b74]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-d16e9b74]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-d16e9b74]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-d16e9b74]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-d16e9b74]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-d16e9b74]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-4b98881e]{display:none}.dark .VPImage.light[data-v-4b98881e]{display:none}.VPHero[data-v-ad185e75]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-ad185e75]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-ad185e75]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-ad185e75]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-ad185e75]{flex-direction:row}}.main[data-v-ad185e75]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-ad185e75]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-ad185e75]{text-align:left}}@media (min-width: 960px){.main[data-v-ad185e75]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-ad185e75]{max-width:592px}}.name[data-v-ad185e75],.text[data-v-ad185e75]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-ad185e75],.VPHero.has-image .text[data-v-ad185e75]{margin:0 auto}.name[data-v-ad185e75]{color:var(--vp-home-hero-name-color)}.clip[data-v-ad185e75]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-ad185e75],.text[data-v-ad185e75]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-ad185e75],.text[data-v-ad185e75]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-ad185e75],.VPHero.has-image .text[data-v-ad185e75]{margin:0}}.tagline[data-v-ad185e75]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-ad185e75]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-ad185e75]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-ad185e75]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-ad185e75]{margin:0}}.actions[data-v-ad185e75]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-ad185e75]{justify-content:center}@media (min-width: 640px){.actions[data-v-ad185e75]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-ad185e75]{justify-content:flex-start}}.action[data-v-ad185e75]{flex-shrink:0;padding:6px}.image[data-v-ad185e75]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-ad185e75]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-ad185e75]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-ad185e75]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-ad185e75]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-ad185e75]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-ad185e75]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-ad185e75]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-ad185e75]{width:320px;height:320px}}[data-v-ad185e75] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-ad185e75] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-ad185e75] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-b48bc3f9]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-b48bc3f9]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-b48bc3f9]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-b48bc3f9]>.VPImage{margin-bottom:20px}.icon[data-v-b48bc3f9]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-b48bc3f9]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-b48bc3f9]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-b48bc3f9]{padding-top:8px}.link-text-value[data-v-b48bc3f9]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-b48bc3f9]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-c63a12c6]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-c63a12c6]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-c63a12c6]{padding:0 64px}}.container[data-v-c63a12c6]{margin:0 auto;max-width:1152px}.items[data-v-c63a12c6]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-c63a12c6]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-c63a12c6],.item.grid-4[data-v-c63a12c6],.item.grid-6[data-v-c63a12c6]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-c63a12c6],.item.grid-4[data-v-c63a12c6]{width:50%}.item.grid-3[data-v-c63a12c6],.item.grid-6[data-v-c63a12c6]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-c63a12c6]{width:25%}}.VPHome[data-v-35757591]{padding-bottom:96px}.VPHome[data-v-35757591] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-35757591]{padding-bottom:128px}}.VPContent[data-v-5bb58b51]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-5bb58b51]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-5bb58b51]{margin:0}@media (min-width: 960px){.VPContent[data-v-5bb58b51]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-5bb58b51]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-5bb58b51]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-7e42202a]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-7e42202a]{display:none}.VPFooter[data-v-7e42202a] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-7e42202a] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-7e42202a]{padding:32px}}.container[data-v-7e42202a]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-7e42202a],.copyright[data-v-7e42202a]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-3dbbcea5]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-3dbbcea5]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-3dbbcea5]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-3dbbcea5]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-3dbbcea5]{color:var(--vp-c-text-1)}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-3dbbcea5]{font-size:14px}}.icon[data-v-3dbbcea5]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}.open>.icon[data-v-3dbbcea5]{transform:rotate(90deg)}.items[data-v-3dbbcea5]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-3dbbcea5]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-3dbbcea5]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-3dbbcea5]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-3dbbcea5]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-3dbbcea5]{transition:all .2s ease-out}.flyout-leave-active[data-v-3dbbcea5]{transition:all .15s ease-in}.flyout-enter-from[data-v-3dbbcea5],.flyout-leave-to[data-v-3dbbcea5]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-df179b54]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-df179b54]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-df179b54]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-df179b54]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-df179b54]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-df179b54]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-df179b54]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-df179b54]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-df179b54]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-df179b54]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-df179b54]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-df179b54]{display:none}}.menu-icon[data-v-df179b54]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-df179b54]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-df179b54]{padding:12px 32px 11px}}.VPSwitch[data-v-59c2c4c4]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-59c2c4c4]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-59c2c4c4]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-59c2c4c4]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-59c2c4c4] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-59c2c4c4] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-a5ffd038]{opacity:1}.moon[data-v-a5ffd038],.dark .sun[data-v-a5ffd038]{opacity:0}.dark .moon[data-v-a5ffd038]{opacity:1}.dark .VPSwitchAppearance[data-v-a5ffd038] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-1dd33068]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-1dd33068]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-78e6daba]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-78e6daba]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-78e6daba]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-78e6daba]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-837e8b02]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-837e8b02]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-837e8b02]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-837e8b02]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-920e461a]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-920e461a] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-920e461a] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-920e461a] .group:last-child{padding-bottom:0}.VPMenu[data-v-920e461a] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-920e461a] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-920e461a] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-920e461a] .action{padding-left:24px}.VPFlyout[data-v-a4fabc1b]{position:relative}.VPFlyout[data-v-a4fabc1b]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-a4fabc1b]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-a4fabc1b]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-a4fabc1b]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-a4fabc1b]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-a4fabc1b],.button[aria-expanded=true]+.menu[data-v-a4fabc1b]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-a4fabc1b]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-a4fabc1b]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-a4fabc1b]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-a4fabc1b]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-a4fabc1b]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-a4fabc1b]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-a4fabc1b]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-d7e056da]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-d7e056da]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-d7e056da]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-16f8b2f5]{display:flex;justify-content:center}.VPNavBarExtra[data-v-6c64fdd1]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-6c64fdd1]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-6c64fdd1]{display:none}}.trans-title[data-v-6c64fdd1]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-6c64fdd1],.item.social-links[data-v-6c64fdd1]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-6c64fdd1]{min-width:176px}.appearance-action[data-v-6c64fdd1]{margin-right:-2px}.social-links-list[data-v-6c64fdd1]{margin:-4px -8px}.VPNavBarHamburger[data-v-c2a14fb1]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-c2a14fb1]{display:none}}.container[data-v-c2a14fb1]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-c2a14fb1]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-c2a14fb1]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-c2a14fb1]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-c2a14fb1]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-c2a14fb1]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-c2a14fb1]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-c2a14fb1],.VPNavBarHamburger.active:hover .middle[data-v-c2a14fb1],.VPNavBarHamburger.active:hover .bottom[data-v-c2a14fb1]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-c2a14fb1],.middle[data-v-c2a14fb1],.bottom[data-v-c2a14fb1]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-c2a14fb1]{top:0;left:0;transform:translate(0)}.middle[data-v-c2a14fb1]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-c2a14fb1]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-49a9523e]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-49a9523e],.VPNavBarMenuLink[data-v-49a9523e]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-760204e0]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-760204e0]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-8dbcf1da]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-8dbcf1da]{display:flex;align-items:center}}.title[data-v-5a94dcd8]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-5a94dcd8]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-5a94dcd8]{border-bottom-color:var(--vp-c-divider)}}[data-v-5a94dcd8] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-9194bb91]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-9194bb91]{display:flex;align-items:center}}.title[data-v-9194bb91]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-42aa9df5]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .5s}.VPNavBar.has-local-nav[data-v-42aa9df5]{background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar.has-local-nav[data-v-42aa9df5]{background-color:transparent}.VPNavBar[data-v-42aa9df5]:not(.has-sidebar):not(.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-42aa9df5]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-42aa9df5]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-42aa9df5]{padding:0}}.container[data-v-42aa9df5]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-42aa9df5],.container>.content[data-v-42aa9df5]{pointer-events:none}.container[data-v-42aa9df5] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-42aa9df5]{max-width:100%}}.title[data-v-42aa9df5]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-42aa9df5]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-42aa9df5]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-42aa9df5]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-42aa9df5]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-42aa9df5]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-42aa9df5]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-42aa9df5]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.top) .content-body[data-v-42aa9df5]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-42aa9df5]{column-gap:.5rem}}.menu+.translations[data-v-42aa9df5]:before,.menu+.appearance[data-v-42aa9df5]:before,.menu+.social-links[data-v-42aa9df5]:before,.translations+.appearance[data-v-42aa9df5]:before,.appearance+.social-links[data-v-42aa9df5]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-42aa9df5]:before,.translations+.appearance[data-v-42aa9df5]:before{margin-right:16px}.appearance+.social-links[data-v-42aa9df5]:before{margin-left:16px}.social-links[data-v-42aa9df5]{margin-right:-8px}.divider[data-v-42aa9df5]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-42aa9df5]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-42aa9df5]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-42aa9df5]{width:100%;height:1px;transition:background-color .5s}.VPNavBar.has-local-nav .divider-line[data-v-42aa9df5]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.top) .divider-line[data-v-42aa9df5]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.top) .divider[data-v-42aa9df5]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-c59e684f]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-c59e684f]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-55fc374b]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-55fc374b]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-f37bbc3d]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-f37bbc3d]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-12372362]{display:block}.title[data-v-12372362]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-873aafb3]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-873aafb3]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-873aafb3]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-873aafb3]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-873aafb3]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-873aafb3]{transform:rotate(45deg)}.button[data-v-873aafb3]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-873aafb3]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-873aafb3]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-873aafb3]:first-child{padding-top:0}.group+.group[data-v-873aafb3],.group+.item[data-v-873aafb3]{padding-top:4px}.VPNavScreenTranslations[data-v-a4076537]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-a4076537]{height:auto}.title[data-v-a4076537]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-a4076537]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-a4076537]{margin-right:8px}.icon.chevron[data-v-a4076537]{margin-left:4px}.list[data-v-a4076537]{padding:4px 0 0 24px}.link[data-v-a4076537]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-2984a903]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-2984a903],.VPNavScreen.fade-leave-active[data-v-2984a903]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-2984a903],.VPNavScreen.fade-leave-active .container[data-v-2984a903]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-2984a903],.VPNavScreen.fade-leave-to[data-v-2984a903]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-2984a903],.VPNavScreen.fade-leave-to .container[data-v-2984a903]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-2984a903]{display:none}}.container[data-v-2984a903]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-2984a903],.menu+.appearance[data-v-2984a903],.translations+.appearance[data-v-2984a903]{margin-top:24px}.menu+.social-links[data-v-2984a903]{margin-top:16px}.appearance+.social-links[data-v-2984a903]{margin-top:16px}.VPNav[data-v-a832e287]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-a832e287]{position:fixed}}.VPSidebarItem.level-0[data-v-758a0e73]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-758a0e73]{padding-bottom:10px}.item[data-v-758a0e73]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-758a0e73]{cursor:pointer}.indicator[data-v-758a0e73]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-758a0e73],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-758a0e73],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-758a0e73],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-758a0e73]{background-color:var(--vp-c-brand-1)}.link[data-v-758a0e73]{display:flex;align-items:center;flex-grow:1}.text[data-v-758a0e73]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-758a0e73]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-758a0e73],.VPSidebarItem.level-2 .text[data-v-758a0e73],.VPSidebarItem.level-3 .text[data-v-758a0e73],.VPSidebarItem.level-4 .text[data-v-758a0e73],.VPSidebarItem.level-5 .text[data-v-758a0e73]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-758a0e73],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-758a0e73]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-1.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-2.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-3.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-4.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-5.has-active>.item>.text[data-v-758a0e73],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-758a0e73],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-758a0e73]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-758a0e73],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-758a0e73]{color:var(--vp-c-brand-1)}.caret[data-v-758a0e73]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-758a0e73]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-758a0e73]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-758a0e73]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-758a0e73]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-758a0e73],.VPSidebarItem.level-2 .items[data-v-758a0e73],.VPSidebarItem.level-3 .items[data-v-758a0e73],.VPSidebarItem.level-4 .items[data-v-758a0e73],.VPSidebarItem.level-5 .items[data-v-758a0e73]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-758a0e73]{display:none}.VPSidebar[data-v-464f49c9]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-464f49c9]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-464f49c9]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-464f49c9]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-464f49c9]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-464f49c9]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-464f49c9]{outline:0}.group+.group[data-v-464f49c9]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-464f49c9]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-5bd08246]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-5bd08246]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-5bd08246]{top:14px;left:16px}}.Layout[data-v-fd36441a]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-023aedc5]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-023aedc5]{margin:0 auto;max-width:1152px}.love[data-v-023aedc5]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-023aedc5]{width:28px;height:28px;fill:currentColor}.message[data-v-023aedc5]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-023aedc5]{padding-top:32px}.action[data-v-023aedc5]{padding-top:40px;text-align:center}.VPTeamPage[data-v-0e84fc64]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-0e84fc64]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-0e84fc64-s],.VPTeamMembers+.VPTeamPageSection[data-v-0e84fc64-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-0e84fc64-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-0e84fc64-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-0e84fc64-s],.VPTeamMembers+.VPTeamPageSection[data-v-0e84fc64-s]{margin-top:96px}}.VPTeamMembers[data-v-0e84fc64-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-0e84fc64-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-0e84fc64-s]{padding:0 64px}}.VPTeamPageTitle[data-v-ba7e3a9e]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-ba7e3a9e]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-ba7e3a9e]{padding:80px 64px 48px}}.title[data-v-ba7e3a9e]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-ba7e3a9e]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-ba7e3a9e]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-ba7e3a9e]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-f4481e3c]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-f4481e3c]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-f4481e3c]{padding:0 64px}}.title[data-v-f4481e3c]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-f4481e3c]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-f4481e3c]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-f4481e3c]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-f4481e3c]{padding-top:40px}.VPTeamMembersItem[data-v-d76daa77]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-d76daa77]{padding:32px}.VPTeamMembersItem.small .data[data-v-d76daa77]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-d76daa77]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-d76daa77]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-d76daa77]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-d76daa77]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-d76daa77]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-d76daa77]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-d76daa77]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-d76daa77]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-d76daa77]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-d76daa77]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-d76daa77]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-d76daa77]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-d76daa77]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-d76daa77]{text-align:center}.avatar[data-v-d76daa77]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-d76daa77]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-d76daa77]{margin:0;font-weight:600}.affiliation[data-v-d76daa77]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-d76daa77]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-d76daa77]:hover{color:var(--vp-c-brand-1)}.desc[data-v-d76daa77]{margin:0 auto}.desc[data-v-d76daa77] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-d76daa77]{display:flex;justify-content:center;height:56px}.sp-link[data-v-d76daa77]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-d76daa77]:hover,.sp .sp-link.link[data-v-d76daa77]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-d76daa77]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-dd487262]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-dd487262]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-dd487262]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-dd487262]{max-width:876px}.VPTeamMembers.medium .container[data-v-dd487262]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-dd487262]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-dd487262]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-dd487262]{max-width:760px}.container[data-v-dd487262]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.custom-block.details{margin:2em 0}.custom-block.details summary{font-size:1.3em;padding-right:24px;width:100%;position:relative;cursor:pointer;list-style:none;outline:0;margin-right:1em}.custom-block.details summary::-webkit-details-marker{display:none}.custom-block.details summary:after{content:"+";color:var(--vp-custom-block-details-text);position:absolute;font-size:2rem;line-height:0;top:50%;right:0;font-weight:200;transform-origin:center;transition:.3s linear}.custom-block.details[open] p{font-size:1.2em;line-height:1.6em;margin:1.2em 0}.custom-block.details[open] summary{margin-bottom:1.3em}.custom-block.details[open] summary:after{transform:rotate(45deg);right:-2px;top:calc(50% + 1px)}.custom-block.details[open] summary~*{opacity:1;animation:open .3s ease-in-out}.custom-block.details[open] ul,.custom-block.details[open] ol,.custom-block.details[open] blockquote p,.custom-block.details[open] pre code{font-size:1.1em}@media (max-width: 768px){.custom-block.details[open] p{font-size:1.1em}}@keyframes open{0%{opacity:0}to{opacity:1}}body{overflow-y:scroll;--vp-custom-block-code-font-size: 14px}:not(.dark) body{--vp-custom-block-details-text: #54545c}body .vp-doc h1{margin-bottom:1em}body .vp-doc p img{margin:auto}body .is-home .main .text{line-height:44px;font-size:38px}body .is-home .has-image .main .name{font-size:68px;margin-bottom:30px}body .social-links a:last-child{width:unset}body .social-links a:last-child svg{width:80px!important}.arty-crafty .VPNavBarTranslations,.arty-crafty .VPMenu .group.translations,.textbook .VPNavBarTranslations,.textbook .VPMenu .group.translations,.articles .VPNavBarTranslations,.articles .VPMenu .group.translations{display:none}.arty-crafty img:not(.logo){border:1px solid #ddd}.VPSidebarItem.level-0 h2.text{font-family:Office Code Pro,Source Code Pro,Menlo,monospace;text-transform:uppercase;letter-spacing:.07em}:root{--toastify-color-light:#fff;--toastify-color-dark:#121212;--toastify-color-info:#3498db;--toastify-color-success:#07bc0c;--toastify-color-warning:#f1c40f;--toastify-color-error:#e74c3c;--toastify-color-transparent:hsla(0,0%,100%,.7);--toastify-icon-color-info:var(--toastify-color-info);--toastify-icon-color-success:var(--toastify-color-success);--toastify-icon-color-warning:var(--toastify-color-warning);--toastify-icon-color-error:var(--toastify-color-error);--toastify-toast-width:320px;--toastify-toast-background:#fff;--toastify-toast-min-height:64px;--toastify-toast-max-height:800px;--toastify-font-family:sans-serif;--toastify-z-index:9999;--toastify-text-color-light:#757575;--toastify-text-color-dark:#fff;--toastify-text-color-info:#fff;--toastify-text-color-success:#fff;--toastify-text-color-warning:#fff;--toastify-text-color-error:#fff;--toastify-spinner-color:#616161;--toastify-spinner-color-empty-area:#e0e0e0;--toastify-color-progress-light:linear-gradient(90deg,#4cd964,#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);--toastify-color-progress-dark:#bb86fc;--toastify-color-progress-info:var(--toastify-color-info);--toastify-color-progress-success:var(--toastify-color-success);--toastify-color-progress-warning:var(--toastify-color-warning);--toastify-color-progress-error:var(--toastify-color-error);--toastify-color-progress-colored:#ddd}.Toastify__toast-container{box-sizing:border-box;color:#fff;padding:4px;position:fixed;-webkit-transform:translate3d(0,0,var(--toastify-z-index) px);transform:translate3d(0,0,var(--toastify-z-index) px);width:var(--toastify-toast-width);z-index:var(--toastify-z-index)}.Toastify__toast-container--top-left{left:1em;top:1em}.Toastify__toast-container--top-center{left:50%;top:1em;-webkit-transform:translateX(-50%);transform:translate(-50%)}.Toastify__toast-container--top-right{right:1em;top:1em}.Toastify__toast-container--bottom-left{bottom:1em;left:1em}.Toastify__toast-container--bottom-center{bottom:1em;left:50%;-webkit-transform:translateX(-50%);transform:translate(-50%)}.Toastify__toast-container--bottom-right{bottom:1em;right:1em}@media only screen and (max-width:480px){.Toastify__toast-container{left:0;margin:0;padding:0;width:100vw}.Toastify__toast-container--top-center,.Toastify__toast-container--top-left,.Toastify__toast-container--top-right{top:0;-webkit-transform:translateX(0);transform:translate(0)}.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-right{bottom:0;-webkit-transform:translateX(0);transform:translate(0)}.Toastify__toast-container--rtl{left:auto;right:0}}.Toastify__toast{border-radius:4px;box-shadow:0 1px 10px #0000001a,0 2px 15px #0000000d;box-sizing:border-box;cursor:pointer;direction:ltr;display:flex;font-family:var(--toastify-font-family);justify-content:space-between;margin-bottom:1rem;max-height:var(--toastify-toast-max-height);min-height:var(--toastify-toast-min-height);overflow:hidden;padding:8px;position:relative;z-index:0}.Toastify__toast--rtl{direction:rtl}.Toastify__toast-body{align-items:center;display:flex;flex:1 1 auto;margin:auto 0;padding:6px;white-space:pre-wrap}.Toastify__toast-body>div:last-child{flex:1}.Toastify__toast-icon{display:flex;flex-shrink:0;-webkit-margin-end:10px;margin-inline-end:10px;width:20px}.Toastify--animate{-webkit-animation-duration:.7s;animation-duration:.7s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.Toastify--animate-icon{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@media only screen and (max-width:480px){.Toastify__toast{border-radius:0;margin-bottom:0}}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--colored.Toastify__toast--default,.Toastify__toast-theme--light{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{background:var(--toastify-color-info);color:var(--toastify-text-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{background:var(--toastify-color-success);color:var(--toastify-text-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{background:var(--toastify-color-warning);color:var(--toastify-text-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{background:var(--toastify-color-error);color:var(--toastify-text-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--default{background:var(--toastify-color-progress-colored)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning{background:var(--toastify-color-transparent)}.Toastify__close-button{align-self:flex-start;background:transparent;border:none;color:#fff;cursor:pointer;opacity:.7;outline:none;padding:0;transition:.3s ease}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentcolor;height:16px;width:14px}.Toastify__close-button:focus,.Toastify__close-button:hover{opacity:1}@-webkit-keyframes Toastify__trackProgress{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}to{-webkit-transform:scaleX(0);transform:scaleX(0)}}@keyframes Toastify__trackProgress{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}to{-webkit-transform:scaleX(0);transform:scaleX(0)}}.Toastify__progress-bar{bottom:0;height:5px;left:0;opacity:.7;position:absolute;-webkit-transform-origin:left;transform-origin:left;width:100%;z-index:var(--toastify-z-index)}.Toastify__progress-bar--animated{-webkit-animation:Toastify__trackProgress linear 1 forwards;animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.Toastify__progress-bar--rtl{left:auto;right:0;-webkit-transform-origin:right;transform-origin:right}.Toastify__spinner{-webkit-animation:Toastify__spin .65s linear infinite;animation:Toastify__spin .65s linear infinite;border:2px solid;border-color:var(--toastify-spinner-color-empty-area);border-radius:100%;border-right-color:var(--toastify-spinner-color);box-sizing:border-box;height:20px;width:20px}@-webkit-keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes Toastify__bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@-webkit-keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@-webkit-keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@-webkit-keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@-webkit-keyframes Toastify__bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes Toastify__bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--bottom-left,.Toastify__bounce-enter--top-left{-webkit-animation-name:Toastify__bounceInLeft;animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--bottom-right,.Toastify__bounce-enter--top-right{-webkit-animation-name:Toastify__bounceInRight;animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{-webkit-animation-name:Toastify__bounceInDown;animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{-webkit-animation-name:Toastify__bounceInUp;animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--bottom-left,.Toastify__bounce-exit--top-left{-webkit-animation-name:Toastify__bounceOutLeft;animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--bottom-right,.Toastify__bounce-exit--top-right{-webkit-animation-name:Toastify__bounceOutRight;animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{-webkit-animation-name:Toastify__bounceOutUp;animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{-webkit-animation-name:Toastify__bounceOutDown;animation-name:Toastify__bounceOutDown}@-webkit-keyframes Toastify__zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@-webkit-keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{-webkit-animation-name:Toastify__zoomIn;animation-name:Toastify__zoomIn}.Toastify__zoom-exit{-webkit-animation-name:Toastify__zoomOut;animation-name:Toastify__zoomOut}@-webkit-keyframes Toastify__flipIn{0%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{opacity:1;-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes Toastify__flipIn{0%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{opacity:1;-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes Toastify__flipOut{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{opacity:1;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}@keyframes Toastify__flipOut{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{opacity:1;-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}to{opacity:0;-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg)}}.Toastify__flip-enter{-webkit-animation-name:Toastify__flipIn;animation-name:Toastify__flipIn}.Toastify__flip-exit{-webkit-animation-name:Toastify__flipOut;animation-name:Toastify__flipOut}@-webkit-keyframes Toastify__slideInRight{0%{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInRight{0%{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInLeft{0%{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInLeft{0%{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInUp{0%{-webkit-transform:translate3d(0,110%,0);transform:translate3d(0,110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInUp{0%{-webkit-transform:translate3d(0,110%,0);transform:translate3d(0,110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideInDown{0%{-webkit-transform:translate3d(0,-110%,0);transform:translate3d(0,-110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes Toastify__slideInDown{0%{-webkit-transform:translate3d(0,-110%,0);transform:translate3d(0,-110%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@-webkit-keyframes Toastify__slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(110%,0,0);transform:translate3d(110%,0,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(-110%,0,0);transform:translate3d(-110%,0,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,500px,0);transform:translate3d(0,500px,0);visibility:hidden}}@keyframes Toastify__slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,500px,0);transform:translate3d(0,500px,0);visibility:hidden}}@-webkit-keyframes Toastify__slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,-500px,0);transform:translate3d(0,-500px,0);visibility:hidden}}@keyframes Toastify__slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{-webkit-transform:translate3d(0,-500px,0);transform:translate3d(0,-500px,0);visibility:hidden}}.Toastify__slide-enter--bottom-left,.Toastify__slide-enter--top-left{-webkit-animation-name:Toastify__slideInLeft;animation-name:Toastify__slideInLeft}.Toastify__slide-enter--bottom-right,.Toastify__slide-enter--top-right{-webkit-animation-name:Toastify__slideInRight;animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{-webkit-animation-name:Toastify__slideInDown;animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{-webkit-animation-name:Toastify__slideInUp;animation-name:Toastify__slideInUp}.Toastify__slide-exit--bottom-left,.Toastify__slide-exit--top-left{-webkit-animation-name:Toastify__slideOutLeft;animation-name:Toastify__slideOutLeft}.Toastify__slide-exit--bottom-right,.Toastify__slide-exit--top-right{-webkit-animation-name:Toastify__slideOutRight;animation-name:Toastify__slideOutRight}.Toastify__slide-exit--top-center{-webkit-animation-name:Toastify__slideOutUp;animation-name:Toastify__slideOutUp}.Toastify__slide-exit--bottom-center{-webkit-animation-name:Toastify__slideOutDown;animation-name:Toastify__slideOutDown}@-webkit-keyframes Toastify__spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes Toastify__spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}:root{--toastify-toast-width: 420px}h3{font-weight:600;font-size:larger}img[data-v-52bcbab3],img[data-v-7525b2ed],img[data-v-f09cfbcf],img[data-v-b356ff83],img[data-v-b9be24d1],img[data-v-14c7baca],img[data-v-1e450a90]{border:1px solid #ddd}.post[data-v-502123cd]{border-bottom:1px solid var(--vp-c-border);margin:1rem 0 2rem}.post .title[data-v-502123cd]{font-size:1.3rem;font-weight:600;border-bottom:1px solid var(--vp-c-divider);margin:3rem 0 1rem;padding-bottom:1rem}.post .title a[data-v-502123cd]{text-decoration:none;color:var(--vp-c-text-2);transition:color .3s easy-out}.post .title a[data-v-502123cd]:hover{color:var(--vp-c-text-1)}.post .content[data-v-502123cd]{display:flex}.post .content .image[data-v-502123cd]{flex:1 1 30%;margin:0 1rem 1rem 0}.post .content .desc[data-v-502123cd]{flex:1 1 70%}@media (max-width: 768px){.post .content[data-v-502123cd]{flex-direction:column}}.post .footer[data-v-502123cd]{display:flex;justify-content:space-between;padding:2rem 0 .5rem;color:var(--vp-c-text-3)}.post .footer a[data-v-502123cd]{color:var(--vp-c-text-3)}img[data-v-c283e5e5],img[data-v-ad8ddfa1]{border:1px solid #ddd}.VPButton.alt.alt-border{border-color:#fce728}.VPButton.alt.alt-border:hover{border-color:#f4dc02}.form-container{border-radius:5px;padding:20px 0}input[type=text],textarea{width:100%;padding:12px;border:1px solid #ccc;outline-color:#ccc;border-radius:4px;box-sizing:border-box;margin-top:6px;margin-bottom:16px;resize:vertical;transition:.8s}input[type=text]:focus,textarea:focus,input[type=text]:focus-visible,textarea:focus-visible{outline-color:#6e478e}textarea{height:200px}input[type=submit]{background-color:#45166b;color:#fff;font-size:1.1em;padding:12px 20px;margin-top:1em;border:none;border-radius:4px;cursor:pointer;transition:all .3s ease-in-out}input[type=submit]:hover{background-color:#6e478e}input:scope[type=submit][disabled]{opacity:.5;cursor:unset}input:scope[type=submit][disabled]:hover{background-color:#45166b}img[data-v-1f7d28d6],img[data-v-403afc04],img[data-v-603c5e0b],img[data-v-f20ed386],img[data-v-16913960],img[data-v-305e8d14],img[data-v-85382648]{border:1px solid #ddd}.VPLocalSearchBox[data-v-fb64fd3e]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-fb64fd3e]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-fb64fd3e]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-fb64fd3e]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-fb64fd3e]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-fb64fd3e]{padding:0 8px}}.search-bar[data-v-fb64fd3e]:focus-within{border-color:var(--vp-c-brand-1)}.search-icon[data-v-fb64fd3e]{margin:8px}@media (max-width: 767px){.search-icon[data-v-fb64fd3e]{display:none}}.search-input[data-v-fb64fd3e]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-fb64fd3e]{padding:6px 4px}}.search-actions[data-v-fb64fd3e]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-fb64fd3e]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-fb64fd3e]{display:none}}.search-actions button[data-v-fb64fd3e]{padding:8px}.search-actions button[data-v-fb64fd3e]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-fb64fd3e]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-fb64fd3e]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-fb64fd3e]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-fb64fd3e]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-fb64fd3e]{display:none}}.search-keyboard-shortcuts kbd[data-v-fb64fd3e]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-fb64fd3e]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-fb64fd3e]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-fb64fd3e]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-fb64fd3e]{margin:8px}}.titles[data-v-fb64fd3e]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-fb64fd3e]{display:flex;align-items:center;gap:4px}.title.main[data-v-fb64fd3e]{font-weight:500}.title-icon[data-v-fb64fd3e]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-fb64fd3e]{opacity:.5}.result.selected[data-v-fb64fd3e]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-fb64fd3e]{position:relative}.excerpt[data-v-fb64fd3e]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-fb64fd3e]{opacity:1}.excerpt[data-v-fb64fd3e] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-fb64fd3e] mark,.excerpt[data-v-fb64fd3e] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-fb64fd3e] .vp-code-group .tabs{display:none}.excerpt[data-v-fb64fd3e] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-fb64fd3e]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-fb64fd3e]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-fb64fd3e],.result.selected .title-icon[data-v-fb64fd3e]{color:var(--vp-c-brand-1)!important}.no-results[data-v-fb64fd3e]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-fb64fd3e]{flex:none}
diff --git a/en/backend/api.html b/en/backend/api.html
index 397d741ba..66fc5974f 100644
--- a/en/backend/api.html
+++ b/en/backend/api.html
@@ -6,13 +6,13 @@
     Backend link abstraction | Vue FAQ
     
     
-    
+    
     
-    
+    
     
     
-    
-    
+    
+    
     
     
     
@@ -66,8 +66,8 @@
   async getUserData(params) {
     return await http.get("/api/users/user", params);
   },
-};

http.js is a wrapper around requests to the server via your favorite library.

What is the convenience of abstracting the backend communication code from the main application code into a separate service?

You can easily replace axios with fetch or XHR, REST with JSON-RPC or WebSockets. The code in the components does not change and remains simple and explicit.

- +};

http.js is a wrapper around requests to the server via your favorite library.

What is the convenience of abstracting the backend communication code from the main application code into a separate service?

You can easily replace axios with fetch or XHR, REST with JSON-RPC or WebSockets. The code in the components does not change and remains simple and explicit.

+ \ No newline at end of file diff --git a/en/backend/auth.html b/en/backend/auth.html index 4097f2678..0c171e87c 100644 --- a/en/backend/auth.html +++ b/en/backend/auth.html @@ -6,13 +6,13 @@ Authentication and authorization | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Authentication and authorization

What is authentication and authorization

Roughly speaking:

Authentication is when the system verifies that it is John Doe who logged in, for example, by checking his username and password

Authorization - when the system verifies that the user requesting the resource/action has the right to access it. For example, a senior manager has the right to delete an item in the admin, but a simple manager does not.

How to make an authentication system on the site

For SPA the most common way - on JWT tokens. There are many variants of this, depending on the requirements of the security level (John Doe's personal blog with guest comments and online store with deposits and bonuses - two big differences).

JWT is a standard for writing a small amount of information into a string (token) and signing it (cryptography). It is done by the backend. So only the backend can make sure that the token is written by it and has valid information in it.

There is no standard for token authentication as such, there are best practices.

Options:

  1. backend generates token (access token - AT) and puts it in httpOnly cookie. The frontend does not have access to the token, the browser just returns the cookie. This method is undeservedly rarely used, but it is quite reliable. The frontend removes all the hassles of manipulating AT.

Scenario:

  • Front logs in, gets user data from the backend and works with it. When receiving any 401 request, it directs the user to the login form and resets the user data to zero.
  • Back at login creates httpOnly cookie with token with certain lifetime. At each request it checks the token, determines the person to whom this token is issued and his rights, and then decides whether to allow access. If the lifetime of the token has expired, it returns 401.

2 The backend generates an access token (AT) and passes it to the front. The front saves it and sends it back each time. In essence the same as in the first case, plus unnecessary steps and the possibility of losing the token through XSS.

  1. two tokens are used - short-lived access token (AT) and longer-lived refresh token (RT) sent in httpOnly cookie. AT works as in the second case. When its lifetime expires, the backend checks the RT and if it is valid, refreshes the AT. RT expires - the user is sent to re-login.
Where to store access token on the frontend?

In 95% of cases in LocalStorage. You should also duplicate it in a regular JS variable because, for example, some iPhones have a power-saving policy enabled when the battery is low, which can result in localStorage being constantly cleared by the browser.

What is oAuth and SSO?

oAuth - Login "via Google". Also when, for example, a user has the option on your site to save something to Google Drive. In order to get permission for your site to work with the user's Google Drive account, you ask the user to allow your site to access their account via Google. So we have four parts - Google (the authorization center), the third-party resource (Google Drive), your site, and the user

SSO - single sign-on - a user logs in to a certain company's portal once, and then has transparent access to its different services. For example, login to GMail and access to Google Drive, Google Photo and so on.

Does authentication via JWT give security?

Security is a very complex concept, and JWT authentication is just one of its elements. For critical applications, it is possible to capture the user's browser fingerprint and force the user to re-login as soon as they change. Same with IP. In this way you can fight AT theft. Also set very small AT lifetime if RT is used. But the main security measures are not related to authentication, but to constant monitoring of the system for suspicious actions.

Authorization

If it is necessary to give users different levels of access to site resources, it is common to use either RBAC (Role-based access control) or PBA (Policy-Based Authorization).

In the first case, users are assigned to roles (admin, manager, user) and the level of access is determined by the role.

In the second case, it is possible to set permissions for each user individually for any action in a more granular way.

It should be understood that on the front authorization is done for convenience (the user does not see the sections of the site that are forbidden to him), but the back is responsible for security - he must check each time whether the user has the right to access the requested resource, even if on the front it should not be visible. It is not very difficult to break the front end.

- +
Skip to content

Authentication and authorization

What is authentication and authorization

Roughly speaking:

Authentication is when the system verifies that it is John Doe who logged in, for example, by checking his username and password

Authorization - when the system verifies that the user requesting the resource/action has the right to access it. For example, a senior manager has the right to delete an item in the admin, but a simple manager does not.

How to make an authentication system on the site

For SPA the most common way - on JWT tokens. There are many variants of this, depending on the requirements of the security level (John Doe's personal blog with guest comments and online store with deposits and bonuses - two big differences).

JWT is a standard for writing a small amount of information into a string (token) and signing it (cryptography). It is done by the backend. So only the backend can make sure that the token is written by it and has valid information in it.

There is no standard for token authentication as such, there are best practices.

Options:

  1. backend generates token (access token - AT) and puts it in httpOnly cookie. The frontend does not have access to the token, the browser just returns the cookie. This method is undeservedly rarely used, but it is quite reliable. The frontend removes all the hassles of manipulating AT.

Scenario:

  • Front logs in, gets user data from the backend and works with it. When receiving any 401 request, it directs the user to the login form and resets the user data to zero.
  • Back at login creates httpOnly cookie with token with certain lifetime. At each request it checks the token, determines the person to whom this token is issued and his rights, and then decides whether to allow access. If the lifetime of the token has expired, it returns 401.

2 The backend generates an access token (AT) and passes it to the front. The front saves it and sends it back each time. In essence the same as in the first case, plus unnecessary steps and the possibility of losing the token through XSS.

  1. two tokens are used - short-lived access token (AT) and longer-lived refresh token (RT) sent in httpOnly cookie. AT works as in the second case. When its lifetime expires, the backend checks the RT and if it is valid, refreshes the AT. RT expires - the user is sent to re-login.
Where to store access token on the frontend?

In 95% of cases in LocalStorage. You should also duplicate it in a regular JS variable because, for example, some iPhones have a power-saving policy enabled when the battery is low, which can result in localStorage being constantly cleared by the browser.

What is oAuth and SSO?

oAuth - Login "via Google". Also when, for example, a user has the option on your site to save something to Google Drive. In order to get permission for your site to work with the user's Google Drive account, you ask the user to allow your site to access their account via Google. So we have four parts - Google (the authorization center), the third-party resource (Google Drive), your site, and the user

SSO - single sign-on - a user logs in to a certain company's portal once, and then has transparent access to its different services. For example, login to GMail and access to Google Drive, Google Photo and so on.

Does authentication via JWT give security?

Security is a very complex concept, and JWT authentication is just one of its elements. For critical applications, it is possible to capture the user's browser fingerprint and force the user to re-login as soon as they change. Same with IP. In this way you can fight AT theft. Also set very small AT lifetime if RT is used. But the main security measures are not related to authentication, but to constant monitoring of the system for suspicious actions.

Authorization

If it is necessary to give users different levels of access to site resources, it is common to use either RBAC (Role-based access control) or PBA (Policy-Based Authorization).

In the first case, users are assigned to roles (admin, manager, user) and the level of access is determined by the role.

In the second case, it is possible to set permissions for each user individually for any action in a more granular way.

It should be understood that on the front authorization is done for convenience (the user does not see the sections of the site that are forbidden to him), but the back is responsible for security - he must check each time whether the user has the right to access the requested resource, even if on the front it should not be visible. It is not very difficult to break the front end.

+ \ No newline at end of file diff --git a/en/backend/backend.html b/en/backend/backend.html index 5e96eeb87..f21b6e81e 100644 --- a/en/backend/backend.html +++ b/en/backend/backend.html @@ -6,13 +6,13 @@ Options to leverage your backend for frontenders | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Options to leverage your backend for frontenders

How to test frontend on backend data?

There are many services that offer their API with different data for testing or full-fledged work

For example, jsonplaceholder.typicode.com.

Google "json placeholder".

Are there any free open APIs with real data?

Plenty. For example, here

Google public api.

You can also poke around relevant sites in DevTools / Network for endpoints with data in a suitable format

How to make your own backend?

If you already know JavaScript, it should not be a problem to install and run Node.js with an HTTP server.

Node.js is not a very popular server for the Internet, but for a small project will do.

In absolute terms, it is easiest to install and start working with Nginx and PHP

Most major cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to run a virtual server. By putting what is required there, you can want both a back end and a front end bundle.

What is BaaS (Backend as a service)?

It is a cloud solution where the backend in the form of a database and its access interface, and possibly the ability to use some logic, is provided by a BaaS provider.

For example, a NoSQL database and access to it is provided by Google using its Firebase service

Alternative with PostgreSQL - Supabase

That is, your frontend will access their specific endpoints and get the services you need - for example, to save and query data in the database.

Both services provide the ability to do authentication on the site. Thus, a front-end developer can write an application using such a service without writing his own backend code and without placing it somewhere on a server on the Internet.

These services have free plans with rather large resources.

Business logic on BaaS

Most BaaS services provide not only CRUD access to their database, but also the ability to write custom logic in the form of Cloud Functions in Firebase, Edge Functions in Supabase, AWS Lambda in Amazon, etc.

These functions are code in some programming language that will be called when a certain backend endpoint is accessed.

In case a frontend developer wants to make a full-fledged application, but doesn't want to bother with a standalone backend, this is a pretty good and very economical solution.

How Edge/Cloud/Lamda features work

It's basically a backend in miniature

Your front end accesses a given endpoint (via the BaaS provider's BaaS service API gateway) - e.g. /api/somefunc

There lies a script written by you in js or other programming language, which is executed, has access to the database and can do other things (load data from the internet for example).

Then the script generates a result and returns it to your front end.

- +
Skip to content

Options to leverage your backend for frontenders

How to test frontend on backend data?

There are many services that offer their API with different data for testing or full-fledged work

For example, jsonplaceholder.typicode.com.

Google "json placeholder".

Are there any free open APIs with real data?

Plenty. For example, here

Google public api.

You can also poke around relevant sites in DevTools / Network for endpoints with data in a suitable format

How to make your own backend?

If you already know JavaScript, it should not be a problem to install and run Node.js with an HTTP server.

Node.js is not a very popular server for the Internet, but for a small project will do.

In absolute terms, it is easiest to install and start working with Nginx and PHP

Most major cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to run a virtual server. By putting what is required there, you can want both a back end and a front end bundle.

What is BaaS (Backend as a service)?

It is a cloud solution where the backend in the form of a database and its access interface, and possibly the ability to use some logic, is provided by a BaaS provider.

For example, a NoSQL database and access to it is provided by Google using its Firebase service

Alternative with PostgreSQL - Supabase

That is, your frontend will access their specific endpoints and get the services you need - for example, to save and query data in the database.

Both services provide the ability to do authentication on the site. Thus, a front-end developer can write an application using such a service without writing his own backend code and without placing it somewhere on a server on the Internet.

These services have free plans with rather large resources.

Business logic on BaaS

Most BaaS services provide not only CRUD access to their database, but also the ability to write custom logic in the form of Cloud Functions in Firebase, Edge Functions in Supabase, AWS Lambda in Amazon, etc.

These functions are code in some programming language that will be called when a certain backend endpoint is accessed.

In case a frontend developer wants to make a full-fledged application, but doesn't want to bother with a standalone backend, this is a pretty good and very economical solution.

How Edge/Cloud/Lamda features work

It's basically a backend in miniature

Your front end accesses a given endpoint (via the BaaS provider's BaaS service API gateway) - e.g. /api/somefunc

There lies a script written by you in js or other programming language, which is executed, has access to the database and can do other things (load data from the internet for example).

Then the script generates a result and returns it to your front end.

+ \ No newline at end of file diff --git a/en/backend/cors.html b/en/backend/cors.html index ec8ef0184..ce2969c84 100644 --- a/en/backend/cors.html +++ b/en/backend/cors.html @@ -6,13 +6,13 @@ CORS | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@
Skip to content

CORS

What are CORS?

Roughly speaking, CORS is used to protect your backend from outside requests by setting special HTTP headers.

More specifically, CORS (Cross-Origin Resource Sharing) is a standard that allows web pages to access objects from third-party Internet resources. A third-party resource is any Internet resource that differs from the requested one in protocol, domain, or port.

Access is granted by specialized requests. The Internet resource that receives the request contains a list of trusted sources that are allowed to access the objects. The source page of the request is granted access if it is on the list of trusted sources. The "*" mask is used to grant access to all third-party web pages.

Accordingly, only the backend can do all this, and it is configured on the backend. The specific solution depends on the backend language, the framework used, and even the webserver.

CORS working principle

When creating an HTTP cross-request, the client browser adds a domain declaration of the web page initiating the request. The domain is declared in the Origin section.

For example, the page https://client-1.com/page.html requests data from the page https://server-site.com/info. An example of a request from a client browser using CORS methods is shown below:

GET /info HTTP/1.1
 Host: server-site.com
-Origin: client-1.com

If the server at www.server-site.com allows the request source page to access data from the domain, the Access-Control-Allow-Origin line with the name of the declared domain will appear in its response to the request:

Access-Control-Allow-Origin: https://client-1.com

If the server to which access is requested does not add the specified string to the response, the client browser will return an error code instead of the info file data.

If the server allows pages from any third-party domain to access the resource, the response will contain the "*" mask.

Access-Control-Allow-Origin: *

If the server allows access not to all but a few third-party clients, the server response contains the names of all these domains printed as separate lines or separated by spaces:

Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com
Problems with CORS

CORS problems can occur only when a resource is accessed by a browser, not by a separate program like Postman or other backend.

As a temporary solution CORS proxy, which becomes an intermediary between frontend and backend, or browser extensions can help during development.

Vite provides such proxy for development.

- +Origin: client-1.com

If the server at www.server-site.com allows the request source page to access data from the domain, the Access-Control-Allow-Origin line with the name of the declared domain will appear in its response to the request:

Access-Control-Allow-Origin: https://client-1.com

If the server to which access is requested does not add the specified string to the response, the client browser will return an error code instead of the info file data.

If the server allows pages from any third-party domain to access the resource, the response will contain the "*" mask.

Access-Control-Allow-Origin: *

If the server allows access not to all but a few third-party clients, the server response contains the names of all these domains printed as separate lines or separated by spaces:

Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com
Problems with CORS

CORS problems can occur only when a resource is accessed by a browser, not by a separate program like Postman or other backend.

As a temporary solution CORS proxy, which becomes an intermediary between frontend and backend, or browser extensions can help during development.

Vite provides such proxy for development.

+ \ No newline at end of file diff --git a/en/backend/protocols.html b/en/backend/protocols.html index 4c84e3c74..d74c1f004 100644 --- a/en/backend/protocols.html +++ b/en/backend/protocols.html @@ -6,13 +6,13 @@ Protocols. To REST or not to REST? | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Protocols. To REST or not to REST?

REST, WebSockets, JSON-RPC

For a beginner, of course, it's more convenient to start with REST - requests to the server in any way.

For the more experienced, especially fullstackers, I suggest to take a look at JSON-RPC.

WebSockets is convenient because it gives bidirectional communication (the server can send messages to the client), but requires special software on the backend.

Why JSON-RPC?

After an experience with JSON-RPC, communication with back end is usually never the same again.

It gives order, clarity, rigor and at the same time flexibility. It greatly simplifies and makes code understandable both on the frontend and backend.

In addition, JSON-RPC is the de facto standard for Web 3.0 communications.

A variant of TypeScript implementation of frontend api service on JSON-RPC - here.

When using JSON-RPC, switching to WebSockets or other transport protocols will not cause any difficulties due to the unification of the message format.

How to organize reconnection of WebSocket connection on the front?

You need an Event bus, which will work as a proxy for incoming messages.

You can use mitt.

What is GraphGL?

A complex thing, an attempt to translate SQL query language for client-server queries on the web.

It has a rather specific use, mostly with third-party data providers via APIs.

For your own fullstack application - 99% unnecessary solution.

- +
Skip to content

Protocols. To REST or not to REST?

REST, WebSockets, JSON-RPC

For a beginner, of course, it's more convenient to start with REST - requests to the server in any way.

For the more experienced, especially fullstackers, I suggest to take a look at JSON-RPC.

WebSockets is convenient because it gives bidirectional communication (the server can send messages to the client), but requires special software on the backend.

Why JSON-RPC?

After an experience with JSON-RPC, communication with back end is usually never the same again.

It gives order, clarity, rigor and at the same time flexibility. It greatly simplifies and makes code understandable both on the frontend and backend.

In addition, JSON-RPC is the de facto standard for Web 3.0 communications.

A variant of TypeScript implementation of frontend api service on JSON-RPC - here.

When using JSON-RPC, switching to WebSockets or other transport protocols will not cause any difficulties due to the unification of the message format.

How to organize reconnection of WebSocket connection on the front?

You need an Event bus, which will work as a proxy for incoming messages.

You can use mitt.

What is GraphGL?

A complex thing, an attempt to translate SQL query language for client-server queries on the web.

It has a rather specific use, mostly with third-party data providers via APIs.

For your own fullstack application - 99% unnecessary solution.

+ \ No newline at end of file diff --git a/en/deployment/ci-cd.html b/en/deployment/ci-cd.html index 2a2d69042..86f0e7b23 100644 --- a/en/deployment/ci-cd.html +++ b/en/deployment/ci-cd.html @@ -6,13 +6,13 @@ CI/CD | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

CI/CD

What is CI/CD?

CI/CD (Continuous Integration, Continuous Delivery) is a technology for automating the build, testing and deployment of a project under development.

In other words, the process of transition of code lying in a repository into a working product on a cloud server, for example.

CI/CD elements are useful not only for a devops engineer, but also for a simple front-end developer, allowing him after git commit/push code changes to get a working site, for example, on GitHub Pages without additional actions.

Main tools for CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis

- +
Skip to content

CI/CD

What is CI/CD?

CI/CD (Continuous Integration, Continuous Delivery) is a technology for automating the build, testing and deployment of a project under development.

In other words, the process of transition of code lying in a repository into a working product on a cloud server, for example.

CI/CD elements are useful not only for a devops engineer, but also for a simple front-end developer, allowing him after git commit/push code changes to get a working site, for example, on GitHub Pages without additional actions.

Main tools for CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis

+ \ No newline at end of file diff --git a/en/deployment/docker.html b/en/deployment/docker.html index 51b96478f..b011fc4d3 100644 --- a/en/deployment/docker.html +++ b/en/deployment/docker.html @@ -6,13 +6,13 @@ Docker | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ - - + + \ No newline at end of file diff --git a/en/deployment/github-actions.html b/en/deployment/github-actions.html index 3ef1bed3e..f40860ba2 100644 --- a/en/deployment/github-actions.html +++ b/en/deployment/github-actions.html @@ -6,13 +6,13 @@ Github Actions | Vue FAQ - + - + - - + + @@ -186,8 +186,8 @@ backups_remove_count=5; cd $backup_dir && rm -rf work logs images; cd $root_backup_dir && dirs_to_be_removed=`ls -dt "$root_backup_dir/"* | tail -n +$backups_remove_count`; - rm $dirs_to_be_removed -rf;
- + rm $dirs_to_be_removed -rf;
+ \ No newline at end of file diff --git a/en/deployment/hosting.html b/en/deployment/hosting.html index baa3e5fc1..412aa2c45 100644 --- a/en/deployment/hosting.html +++ b/en/deployment/hosting.html @@ -6,13 +6,13 @@ Hosting | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Hosting

Where to host a website?

After building a frontend project, you get a set of html/css/js/jpeg and other static files that need to be hosted on some webserver for your website to be online.

Hosting options with free plans:

Also, many cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to get a virtual server on which you can install a webserver (Nginx, Apache) and your website yourself. In this case, the backend can also be placed on it.

Domain

Buying a domain is now very easy and inexpensive (from $1 per year), so it is recommended to do so. GitHub Pages and other hosting providers allow you to connect a custom domain to your site. Subdomains are convenient for organizing development environments:

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL certificates

Modern browsers require a website to be accessible via HTTPS protocol. This requires an SSL certificate for your domain. Hosting providers like Firebase or Github Pages will provide you with the certificate themselves. If you host your site yourself on a cloud server, you can generate the certificate using CertBot software.

- +
Skip to content

Hosting

Where to host a website?

After building a frontend project, you get a set of html/css/js/jpeg and other static files that need to be hosted on some webserver for your website to be online.

Hosting options with free plans:

Also, many cloud providers (Amazon, Google, Oracle, Microsoft) provide free plans with the ability to get a virtual server on which you can install a webserver (Nginx, Apache) and your website yourself. In this case, the backend can also be placed on it.

Domain

Buying a domain is now very easy and inexpensive (from $1 per year), so it is recommended to do so. GitHub Pages and other hosting providers allow you to connect a custom domain to your site. Subdomains are convenient for organizing development environments:

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL certificates

Modern browsers require a website to be accessible via HTTPS protocol. This requires an SSL certificate for your domain. Hosting providers like Firebase or Github Pages will provide you with the certificate themselves. If you host your site yourself on a cloud server, you can generate the certificate using CertBot software.

+ \ No newline at end of file diff --git a/en/development/architectural-patterns.html b/en/development/architectural-patterns.html index 97ff87ae4..ed9b3c66e 100644 --- a/en/development/architectural-patterns.html +++ b/en/development/architectural-patterns.html @@ -6,13 +6,13 @@ Architectural patterns | Vue FAQ - + - + - - + + @@ -111,8 +111,8 @@ startLoading(); product.value = await api.products.product(props.productId); -stopLoading();

uuid - any function to generate a unique id.

- +stopLoading();

uuid - any function to generate a unique id.

+ \ No newline at end of file diff --git a/en/development/assets.html b/en/development/assets.html index 0f063322f..9621f7ad8 100644 --- a/en/development/assets.html +++ b/en/development/assets.html @@ -6,13 +6,13 @@ Application Resources | Vue FAQ - + - + - - + + @@ -148,8 +148,8 @@ import json from "./example.json"; // import a root field as named exports - helps with tree-shaking! -import { field } from "./example.json";
- +import { field } from "./example.json";
+ \ No newline at end of file diff --git a/en/development/building.html b/en/development/building.html index a7597934f..c8d17e537 100644 --- a/en/development/building.html +++ b/en/development/building.html @@ -6,13 +6,13 @@ Create and build an application | Vue FAQ - + - + - - + + @@ -58,8 +58,8 @@ } }

You may also need to set alias in ESLint config for plugins like eslint-plugin-import and eslint-import-resolver-typescript if they are used.

How can I see how much my js bundle has different libraries?

rollup-plugin-visualizer is a great tool to do this

Generating statistics from the command line works like this (one of the options):

sh
npx vite-bundle-visualizer
 npx vite-bundle-visualizer -t list
-npx vite-bundle-visualizer -t raw-data
- +npx vite-bundle-visualizer -t raw-data + \ No newline at end of file diff --git a/en/development/ide.html b/en/development/ide.html index 76bf24007..93ad031b3 100644 --- a/en/development/ide.html +++ b/en/development/ide.html @@ -6,13 +6,13 @@ Configuring the IDE | Vue FAQ - + - + - - + + @@ -280,8 +280,8 @@ "vite.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, webpack.config.*, windi.config.*", "vue.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, webpack.config.*, windi.config.*" } -}
ESlint

Linter is a coder's right hand. It checks for errors, formats code, and does many other useful things

At the same time, it is quite a nontrivial task to set up ESlint well. There are a lot of plugins for it, some of them are outdated, many of them conflict with each other.

That's why for not very sophisticated ESlint connoisseurs it's best to use a ready-made solution. The second person in Vue ecosystem Antony Fu shared his config.

To install it, just add the @antfu/eslint-config package to package.json devDependencies. If you look inside, there are dozens of picked packages and configurations.

Unfortunately, formatting the <style> block in .vue files doesn't work, so you have to enable Prettier in manual mode as well.

Online sandboxes for Vue 3
More programs useful in web development
What computer configuration is suitable for frontend development?

At least 16GB RAM and a good (fast) SSD disk, everything else is secondary, including the processor. Spend your money on a quality second 22+ inch monitor, a comfortable keyboard and mouse.

For fullstack development (and not only) it is convenient to have a mini-PC where you can transfer database, webserver and other [micro]services. It can work as a server, without a monitor and keyboard.

You can also put a source code repository on it. From the main machine the connection goes to VS Code via SSH Remote connection. As a result, both back and front end (Node.js) run on your miniserver, and your laptop no longer gets warm and tries to take off with the help of frantically spinning fans.

It is much more productive (MySQL, webservers, Docker run faster and more reliably on Linux, as does Node.js), comfortable and quieter. The cooler of the mini-PC in normal mode is turned on only for a couple of seconds when the OS is booting.

- +}
ESlint

Linter is a coder's right hand. It checks for errors, formats code, and does many other useful things

At the same time, it is quite a nontrivial task to set up ESlint well. There are a lot of plugins for it, some of them are outdated, many of them conflict with each other.

That's why for not very sophisticated ESlint connoisseurs it's best to use a ready-made solution. The second person in Vue ecosystem Antony Fu shared his config.

To install it, just add the @antfu/eslint-config package to package.json devDependencies. If you look inside, there are dozens of picked packages and configurations.

Unfortunately, formatting the <style> block in .vue files doesn't work, so you have to enable Prettier in manual mode as well.

Online sandboxes for Vue 3
More programs useful in web development
What computer configuration is suitable for frontend development?

At least 16GB RAM and a good (fast) SSD disk, everything else is secondary, including the processor. Spend your money on a quality second 22+ inch monitor, a comfortable keyboard and mouse.

For fullstack development (and not only) it is convenient to have a mini-PC where you can transfer database, webserver and other [micro]services. It can work as a server, without a monitor and keyboard.

You can also put a source code repository on it. From the main machine the connection goes to VS Code via SSH Remote connection. As a result, both back and front end (Node.js) run on your miniserver, and your laptop no longer gets warm and tries to take off with the help of frantically spinning fans.

It is much more productive (MySQL, webservers, Docker run faster and more reliably on Linux, as does Node.js), comfortable and quieter. The cooler of the mini-PC in normal mode is turned on only for a couple of seconds when the OS is booting.

+ \ No newline at end of file diff --git a/en/development/libraries.html b/en/development/libraries.html index 80791a0c3..eec0bc597 100644 --- a/en/development/libraries.html +++ b/en/development/libraries.html @@ -6,13 +6,13 @@ Tell me a handy library | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Tell me a handy library

For working with dates

moment is irretrievably obsolete. There's day.js and day-fnc.js.

However, in 95% of cases the capabilities of the standard JavaScript Intl package are sufficient

For UI components

There are quite a few CSS and UI libraries out there

Here in this article is a small overview of their heavyweight nature

Quasar and PrimeVue look solid.

- +
Skip to content

Tell me a handy library

For working with dates

moment is irretrievably obsolete. There's day.js and day-fnc.js.

However, in 95% of cases the capabilities of the standard JavaScript Intl package are sufficient

For UI components

There are quite a few CSS and UI libraries out there

Here in this article is a small overview of their heavyweight nature

Quasar and PrimeVue look solid.

+ \ No newline at end of file diff --git a/en/development/misc.html b/en/development/misc.html index 8595a06cc..adbbbb67d 100644 --- a/en/development/misc.html +++ b/en/development/misc.html @@ -6,13 +6,13 @@ Helpful hints | Vue FAQ - + - + - - + + @@ -43,8 +43,8 @@ delete window.devtoolsFormatters; // will print out data without custom formatting console.log(obj); -window.devtoolsFormatters = old; - +window.devtoolsFormatters = old; + \ No newline at end of file diff --git a/en/development/stores.html b/en/development/stores.html index 0b0e016f3..9003aec3d 100644 --- a/en/development/stores.html +++ b/en/development/stores.html @@ -6,13 +6,13 @@ State management in Vue 3 | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

State management in Vue 3

Why State management?

Sometimes in an application you need to pass reactive data or a function from one component to another, and these components do not belong to the same hierarchy. Props/invents or provide/inject mechanisms are not suitable for this. That's why Vue 2 introduced Vuex, a state management library that allows you to store a reactive state and provide access to it from anywhere.

A frontend state management library is usually called a "store".

How can I pass reactive data from one component to another in Vue 3?
  • If one component is a direct descendant of another - props and events
  • If one component is an indirect descendant of another - provide/inject or prop/event dribbling (bad practice).
  • If they are in different branches of the hierarchy - store or Vue 3 ref/reactive

Vue 3 ref/reactive is when you define and export a reactive variable in a separate js module:

export const userLoggedIn = ref(false);

It is then available throughout the application via the import of this module.

However, it is architecturally a bad idea to just share a variable. Usually there is business logic around this variable, which should be made available.

For example, authentication requires not only the fact that the user is logged in, but also the associated methods - login(), logout(), register(), isAuthenticated(). Synthesizing some kind of steit and the accompanying business logic yielded the so-called composable functions in Vue 3.

In some sense, it is an analog of an object in OOP.

What is a store on the frontend?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Store (such as Pinia) is an entity that contains state and business logic that is not bound to your Component tree. In other words, this is where the global state resides. It's sort of like a component that is always present, and that anyone can read and write to.

_ Official Pinia documentation.

Looks like a very unfortunate, ambiguous and confusing definition.

From the perspective of a non-frontend developer (basically any language other than JavaScript, plus partially JavaScript), the analog of a construct called store would be a database - SQL, NoSQL or caching Redis. There are analogs of state and getters (View in SQL database). But in 99.99% of cases, there will be no business logic in the database except for data consistency constraints (e.g., unique or foreign keys).

From a non-frontend developer's perspective, frontend stores are just objects / stateful services built on a singleton pattern. Calling them "global stores" is at least illogical.

It's likely that this happened historically. First there was one Vuex, it was one store and global. Then it had modules. Then Pinia modules became independent and spread all over the application. As a result, the application has a bunch of small local (by area of use) storages, each of which considers itself global, even if it is used by 2-3 components out of 1000 on the project, and even if this storage has 1% of steate and 99% of business and related logic.

In this respect, using composable functions for the same purpose (an entity holding state and business logic that isn't bound to your Component tree) - is much more logical. And they should be called useAuth or useAuthService instead of useAuthStore.

Vuex or Pinia?

In Vue 3, Pinia has become the main external library for managing the stack. Unlike Vuex, it has TypeScript support, is more convenient, and naturally takes advantage of Vue 3.

Vuex is officially deprecated

Pinia or Composables functions?

In Vue 3 there is something that makes a separate library for managing the state unnecessary. Namely, reactive types Ref and Reactive that can be used outside of a component. It became possible to make your own storages on the basis of composable functions and connect them in any component.

The main declared difference of Pinia is integration with Vue DevTools, plugins and SSR support. However, whether he needs one or the other, each developer decides for himself. It is quite comfortable to work with composables in DevTools.

Composable function, in its turn, can have both global and local (variables are declared inside the function) states. This can be useful in certain cases - you can create several instances of composable functions, each with its own state. For example, when you have several news widgets on your site, differing only by news category.

Also, from a functional point of view, composable functions have full access to the entire Vue Reactivity API, which makes them more flexible than Pinia.

Composable functions with global states do not work in SSR mode.

As for performance, according to tests Pinia is about 1.5 times slower on Reactive changes than Vue 3, and 20 times slower on Ref. This is because Ref (primitive types) in Pinia becomes a part of Reactive. Setup stores does not solve this problem.

You should also keep in mind that any dependency (in this case the Pinia library) can bring problems similar to the "RIP Vuex" situation when the library dies, becomes obsolete, is no longer supported, or vulnerabilities are found in it. Composable features, on the other hand, look like a thorough innovation to the Vue framework.

Here is an interesting discussion about it on /r/vuejs. Code example from Reddit user @ferferga shows how to use TypeScript classes with private modifiers, getters, setters (no .value) and first class type support as composable stores (which would be impossible with Pinia). Using TS classes here might not be a good practice but demonstrates flexibility and power of the Composition API.

Also here is a lifehack for Devtools from user @coolcosmos: I just use refs. The cons is you lose the Devtools but in dev mode I import all my refs and pass them to pinia so I have all the pros and no cons.

How to split logic between component and composable functions?

It is convenient to think of it as MVC pattern, where the role of View (and partially Controller) is played by components, which are mainly responsible for visualization, and the logic and model (Model and partially Controller) fall on composable functions and their reactive state.

To understand what to put in a composable and what to put in a component (which may consist of several components), imagine that you change the component to another one - displaying your data in some other way. Ideally, the model (composite) should remain the same, you are only rewriting the component that has logic responsible for displaying it.

At the same time, the logic (Controller) can be shared between the component and the composable. For example, validation of form data can happen in the component (checking that the field is populated), in the component using a third-party utility (checking that the password is "complex"), and in the composable (checking that username is unique)

- +
Skip to content

State management in Vue 3

Why State management?

Sometimes in an application you need to pass reactive data or a function from one component to another, and these components do not belong to the same hierarchy. Props/invents or provide/inject mechanisms are not suitable for this. That's why Vue 2 introduced Vuex, a state management library that allows you to store a reactive state and provide access to it from anywhere.

A frontend state management library is usually called a "store".

How can I pass reactive data from one component to another in Vue 3?
  • If one component is a direct descendant of another - props and events
  • If one component is an indirect descendant of another - provide/inject or prop/event dribbling (bad practice).
  • If they are in different branches of the hierarchy - store or Vue 3 ref/reactive

Vue 3 ref/reactive is when you define and export a reactive variable in a separate js module:

export const userLoggedIn = ref(false);

It is then available throughout the application via the import of this module.

However, it is architecturally a bad idea to just share a variable. Usually there is business logic around this variable, which should be made available.

For example, authentication requires not only the fact that the user is logged in, but also the associated methods - login(), logout(), register(), isAuthenticated(). Synthesizing some kind of steit and the accompanying business logic yielded the so-called composable functions in Vue 3.

In some sense, it is an analog of an object in OOP.

What is a store on the frontend?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Store (such as Pinia) is an entity that contains state and business logic that is not bound to your Component tree. In other words, this is where the global state resides. It's sort of like a component that is always present, and that anyone can read and write to.

_ Official Pinia documentation.

Looks like a very unfortunate, ambiguous and confusing definition.

From the perspective of a non-frontend developer (basically any language other than JavaScript, plus partially JavaScript), the analog of a construct called store would be a database - SQL, NoSQL or caching Redis. There are analogs of state and getters (View in SQL database). But in 99.99% of cases, there will be no business logic in the database except for data consistency constraints (e.g., unique or foreign keys).

From a non-frontend developer's perspective, frontend stores are just objects / stateful services built on a singleton pattern. Calling them "global stores" is at least illogical.

It's likely that this happened historically. First there was one Vuex, it was one store and global. Then it had modules. Then Pinia modules became independent and spread all over the application. As a result, the application has a bunch of small local (by area of use) storages, each of which considers itself global, even if it is used by 2-3 components out of 1000 on the project, and even if this storage has 1% of steate and 99% of business and related logic.

In this respect, using composable functions for the same purpose (an entity holding state and business logic that isn't bound to your Component tree) - is much more logical. And they should be called useAuth or useAuthService instead of useAuthStore.

Vuex or Pinia?

In Vue 3, Pinia has become the main external library for managing the stack. Unlike Vuex, it has TypeScript support, is more convenient, and naturally takes advantage of Vue 3.

Vuex is officially deprecated

Pinia or Composables functions?

In Vue 3 there is something that makes a separate library for managing the state unnecessary. Namely, reactive types Ref and Reactive that can be used outside of a component. It became possible to make your own storages on the basis of composable functions and connect them in any component.

The main declared difference of Pinia is integration with Vue DevTools, plugins and SSR support. However, whether he needs one or the other, each developer decides for himself. It is quite comfortable to work with composables in DevTools.

Composable function, in its turn, can have both global and local (variables are declared inside the function) states. This can be useful in certain cases - you can create several instances of composable functions, each with its own state. For example, when you have several news widgets on your site, differing only by news category.

Also, from a functional point of view, composable functions have full access to the entire Vue Reactivity API, which makes them more flexible than Pinia.

Composable functions with global states do not work in SSR mode.

As for performance, according to tests Pinia is about 1.5 times slower on Reactive changes than Vue 3, and 20 times slower on Ref. This is because Ref (primitive types) in Pinia becomes a part of Reactive. Setup stores does not solve this problem.

You should also keep in mind that any dependency (in this case the Pinia library) can bring problems similar to the "RIP Vuex" situation when the library dies, becomes obsolete, is no longer supported, or vulnerabilities are found in it. Composable features, on the other hand, look like a thorough innovation to the Vue framework.

Here is an interesting discussion about it on /r/vuejs. Code example from Reddit user @ferferga shows how to use TypeScript classes with private modifiers, getters, setters (no .value) and first class type support as composable stores (which would be impossible with Pinia). Using TS classes here might not be a good practice but demonstrates flexibility and power of the Composition API.

Also here is a lifehack for Devtools from user @coolcosmos: I just use refs. The cons is you lose the Devtools but in dev mode I import all my refs and pass them to pinia so I have all the pros and no cons.

How to split logic between component and composable functions?

It is convenient to think of it as MVC pattern, where the role of View (and partially Controller) is played by components, which are mainly responsible for visualization, and the logic and model (Model and partially Controller) fall on composable functions and their reactive state.

To understand what to put in a composable and what to put in a component (which may consist of several components), imagine that you change the component to another one - displaying your data in some other way. Ideally, the model (composite) should remain the same, you are only rewriting the component that has logic responsible for displaying it.

At the same time, the logic (Controller) can be shared between the component and the composable. For example, validation of form data can happen in the component (checking that the field is populated), in the component using a third-party utility (checking that the password is "complex"), and in the composable (checking that username is unique)

+ \ No newline at end of file diff --git a/en/development/testing.html b/en/development/testing.html index 29424f519..fcb20a3f0 100644 --- a/en/development/testing.html +++ b/en/development/testing.html @@ -6,13 +6,13 @@ Testing | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Testing

Do I need testing on the frontend?

There are several types of tests, among them are unit tests and integration (e2e) tests

Unit testing in Vue is done by Vitest, Jest.

You should be more careful with front-end testing, as writing and rewriting tests can often take time comparable to the development itself. At the same time, the usefulness of these tests will be highly questionable. Their expediency appears on large projects with a large number of developers. There unit tests also take time but reduce the probability that someone will mess something up. At the same time, unit tests are not the most necessary ingredient for quick MVP creation at a startup.

Frontend development in this aspect is very different from backend development, where unit tests are really useful.

Good article on this topic - Unit Test Fetish

What are e2e tests?

On the front end, especially for a web application that is already in production and needs to be updated from time to time, e2e tests are important.

e2e (end-to-end) testing is a software testing process that simulates real user actions at the interface level.

In this case, a browser will be launched (usually in headless mode - without UI), and it will use the scripts written to check the work of the site - the presence of elements on the page, the possibility of login, etc.

The main tools for e2e testing are Cypress, WebdriverIO.

In CI/CD projects, running tests is one of the main moments along with linting and build.

- +
Skip to content

Testing

Do I need testing on the frontend?

There are several types of tests, among them are unit tests and integration (e2e) tests

Unit testing in Vue is done by Vitest, Jest.

You should be more careful with front-end testing, as writing and rewriting tests can often take time comparable to the development itself. At the same time, the usefulness of these tests will be highly questionable. Their expediency appears on large projects with a large number of developers. There unit tests also take time but reduce the probability that someone will mess something up. At the same time, unit tests are not the most necessary ingredient for quick MVP creation at a startup.

Frontend development in this aspect is very different from backend development, where unit tests are really useful.

Good article on this topic - Unit Test Fetish

What are e2e tests?

On the front end, especially for a web application that is already in production and needs to be updated from time to time, e2e tests are important.

e2e (end-to-end) testing is a software testing process that simulates real user actions at the interface level.

In this case, a browser will be launched (usually in headless mode - without UI), and it will use the scripts written to check the work of the site - the presence of elements on the page, the possibility of login, etc.

The main tools for e2e testing are Cypress, WebdriverIO.

In CI/CD projects, running tests is one of the main moments along with linting and build.

+ \ No newline at end of file diff --git a/en/frontend/about-frameworks.html b/en/frontend/about-frameworks.html index 74214179a..29a3031ac 100644 --- a/en/frontend/about-frameworks.html +++ b/en/frontend/about-frameworks.html @@ -6,13 +6,13 @@ About frontend frameworks | Vue FAQ - + - + - - + + @@ -39,8 +39,8 @@ someArr = [...someArr, newItem]; // Vue -someArr.value.push(newItem.value);

Using ES6 native Proxy object avoids decomposition and creating an intermediate array. Also it should more performant.

- +someArr.value.push(newItem.value);

Using ES6 native Proxy object avoids decomposition and creating an intermediate array. Also it should more performant.

+ \ No newline at end of file diff --git a/en/frontend/architecture.html b/en/frontend/architecture.html index c6f3242d6..c1c0e9283 100644 --- a/en/frontend/architecture.html +++ b/en/frontend/architecture.html @@ -6,13 +6,13 @@ Frontend application architecture | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Frontend application architecture

What is a good web application architecture

There are different theoretical definitions and justifications for this concept, but roughly speaking it is the following.

Let's say you are developing a project, already at the final stage. A customer comes to you and says something like: I want to add a shadow to all buttons, I want to change the UI library, we decided to support multiple languages, we decided to replace this module with another, we need to make more detailed adaptability for different resolutions, we decided to add themes, we are changing the provider of payment processing services, we have an increasing number of users / the site is slowing down / need to speed it up, need to increase the level of security of the site, we took a middle programmer, bring him up to speed quickly, and let him add functionality or fix the b

A good frontend application architecture allows you to accomplish all of this most efficiently with the least amount of effort.

OOP on the frontend

Many people coming from development in object-oriented languages try to use OOP concepts on the frontend and program with classes, inheritance, polymorphism and other things.

This is a mistake. The main computations on the front end are related to UI - displaying data, handling user interaction. Class systems and microservices are simply not needed on them. Of course, you can create a basic button, wrap it in two custom components and consider it inheritance, but you can't do it in code. That's why you have to learn to think in other categories - components, composable functions, js modules. And use your JavaScript power, not trying to stretch it on OOP.

At the same time, a good analogy of an object with a global ("static") and local ("object") state is a composable function. It can be used in certain situations.

Useful tips
Avoid dependencies

If there is a possibility not to introduce a new dependency (not to plug in a new npm package) - don't do it. It may save you a bit of time, but a third-party library will sooner or later become obsolete, no longer supported, and may have a vulnerability. Besides, it increases the size of your bundle, which directly affects the performance of your application. Tree shaking is good in advertising, but it doesn't always work in reality.

If you need, for example, the debounce function, don't hurry to plug it together with some library. Google its implementation and copy 15 lines of code and make your own function.


Use wrappers over components of UI libraries and third-party utilities

If you use components of some UI library, don't use them directly - make wrappers for them. For example, BaseButton or BaseInput. This will make styling the components much easier, and will also make it much easier to switch to another library, or replace them with your own components.

The same goes for utilities.


Regular refactoring

Do code refactoring from time to time, moving components and modules to where they should logically be, renaming them, and structuring and improving the code itself. This is good for both the code and your professional growth.


Use CSS3

Try to use pure CSS3 for adaptability. Do not be tied to columnar models of CSS and UI libraries, unless it is a "done and forgotten, let the customer continue to suffer with it" project.

Spend a couple of days to learn Flexbox and you will be able to layout on it faster and better than on any Tailwind.


Use modern standards and language features

For example, HTML5 semantic elements - aside, header, section, article, details, etc.

CSS3 - Flexbox and Grid, Container query


Document the project

Draw use-case and other diagrams, describe the main functionality of the project and important details of its implementation - this will at least raise your level as a software developer.

VitePress is a very handy tool for technical documentation.

- +
Skip to content

Frontend application architecture

What is a good web application architecture

There are different theoretical definitions and justifications for this concept, but roughly speaking it is the following.

Let's say you are developing a project, already at the final stage. A customer comes to you and says something like: I want to add a shadow to all buttons, I want to change the UI library, we decided to support multiple languages, we decided to replace this module with another, we need to make more detailed adaptability for different resolutions, we decided to add themes, we are changing the provider of payment processing services, we have an increasing number of users / the site is slowing down / need to speed it up, need to increase the level of security of the site, we took a middle programmer, bring him up to speed quickly, and let him add functionality or fix the b

A good frontend application architecture allows you to accomplish all of this most efficiently with the least amount of effort.

OOP on the frontend

Many people coming from development in object-oriented languages try to use OOP concepts on the frontend and program with classes, inheritance, polymorphism and other things.

This is a mistake. The main computations on the front end are related to UI - displaying data, handling user interaction. Class systems and microservices are simply not needed on them. Of course, you can create a basic button, wrap it in two custom components and consider it inheritance, but you can't do it in code. That's why you have to learn to think in other categories - components, composable functions, js modules. And use your JavaScript power, not trying to stretch it on OOP.

At the same time, a good analogy of an object with a global ("static") and local ("object") state is a composable function. It can be used in certain situations.

Useful tips
Avoid dependencies

If there is a possibility not to introduce a new dependency (not to plug in a new npm package) - don't do it. It may save you a bit of time, but a third-party library will sooner or later become obsolete, no longer supported, and may have a vulnerability. Besides, it increases the size of your bundle, which directly affects the performance of your application. Tree shaking is good in advertising, but it doesn't always work in reality.

If you need, for example, the debounce function, don't hurry to plug it together with some library. Google its implementation and copy 15 lines of code and make your own function.


Use wrappers over components of UI libraries and third-party utilities

If you use components of some UI library, don't use them directly - make wrappers for them. For example, BaseButton or BaseInput. This will make styling the components much easier, and will also make it much easier to switch to another library, or replace them with your own components.

The same goes for utilities.


Regular refactoring

Do code refactoring from time to time, moving components and modules to where they should logically be, renaming them, and structuring and improving the code itself. This is good for both the code and your professional growth.


Use CSS3

Try to use pure CSS3 for adaptability. Do not be tied to columnar models of CSS and UI libraries, unless it is a "done and forgotten, let the customer continue to suffer with it" project.

Spend a couple of days to learn Flexbox and you will be able to layout on it faster and better than on any Tailwind.


Use modern standards and language features

For example, HTML5 semantic elements - aside, header, section, article, details, etc.

CSS3 - Flexbox and Grid, Container query


Document the project

Draw use-case and other diagrams, describe the main functionality of the project and important details of its implementation - this will at least raise your level as a software developer.

VitePress is a very handy tool for technical documentation.

+ \ No newline at end of file diff --git a/en/frontend/css-ui-libs.html b/en/frontend/css-ui-libs.html index 7d71cd028..81bb35afe 100644 --- a/en/frontend/css-ui-libs.html +++ b/en/frontend/css-ui-libs.html @@ -6,13 +6,13 @@ CSS and UI libraries | Vue FAQ - + - + - - + + @@ -35,8 +35,8 @@
Skip to content

CSS and UI libraries

What are CSS and UI libraries?

CSS and UI libraries either provide their own or help you create custom UI components like Button or Select? which can speed up your development.

CSS libraries do not contain JavaScript code and therefore have limitations for complex components like Select or Dropdown.

There is a separate type of Headless-UI libraries that offer components without stylized visualization - only component logic and Accessibility requirements. The developer needs to add CSS styles himself.

Pros and cons of UI libraries?

Pros: shortens the development, if you use it on the project as much as possible, brings a unified style to the application

Cons: as any dependency can become obsolete (Vuetify 2 tragedy), adds weight to the final bundle.

How to reduce dependency on foreign libraries?

Wrap up UI library components in your own custom components.

vue
<!-- BaseButton.vue -->
 <template>
   <QButton ... />
-</template>

and use BaseButton in your code. This way it will be much easier for you to upgrade, replace the library or replace this component with a self-designed one. And even just change the styles of the component.

Layout and adaptability of pages by means of CSS and UI libraries

Using the column system and other functionality of CSS and UI libraries like the popular Tailwind is convenient for small projects and sometimes speeds up layout, but very much worsens the quality of the code as a whole, including its maintainability and extensibility. It's as if the world went back to the days of IE6, when all styles and JavaScript were also located in tag attributes, and the whole evolution of CSS into a clear, convenient, beautiful hierarchical class model was for nothing, just like the division of the web into document (template), presentation layer (CSS styles) and logic (JavaScript).

The web is full of articles why an approach like Tailwind is a bad thing. We can only note that with proper skill, layout on pure CSS3 is also fast and much more convenient and pleasant in terms of DX than through CSS and UI libraries.

Quote

Good developers know the reasons why standards, patterns and good practices have become the way they are.

Bad developers stick to whatever new trend that might save them some learning curve.

- +</template>

and use BaseButton in your code. This way it will be much easier for you to upgrade, replace the library or replace this component with a self-designed one. And even just change the styles of the component.

Layout and adaptability of pages by means of CSS and UI libraries

Using the column system and other functionality of CSS and UI libraries like the popular Tailwind is convenient for small projects and sometimes speeds up layout, but very much worsens the quality of the code as a whole, including its maintainability and extensibility. It's as if the world went back to the days of IE6, when all styles and JavaScript were also located in tag attributes, and the whole evolution of CSS into a clear, convenient, beautiful hierarchical class model was for nothing, just like the division of the web into document (template), presentation layer (CSS styles) and logic (JavaScript).

The web is full of articles why an approach like Tailwind is a bad thing. We can only note that with proper skill, layout on pure CSS3 is also fast and much more convenient and pleasant in terms of DX than through CSS and UI libraries.

Quote

Good developers know the reasons why standards, patterns and good practices have become the way they are.

Bad developers stick to whatever new trend that might save them some learning curve.

+ \ No newline at end of file diff --git a/en/frontend/learning.html b/en/frontend/learning.html index e47e02273..7f41b3c76 100644 --- a/en/frontend/learning.html +++ b/en/frontend/learning.html @@ -6,13 +6,13 @@ Learning Vue | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Learning Vue

Sources of information on Vue

For some reason, it is believed that there are only two ways to get knowledge on frontend - Vue documentation and tutorial videos from YouTube and all kinds of courses.

But documentation is not a textbook, but a reference book, and it is very difficult to separate grains from chaff on YouTube. I met some useful videos, but all of them were intended for developers who already know Vue quite well and showed some new or non-standard moments.


The main teacher should be a book that teaches, not a reference book.

An excellent Vue tutorial in English is the May 2023 Vue.js 3 Design Patterns and Best Practices. You can register on oReilly and read for 10 days for free. Even download it. In spite of the title, the book teaches programming, and from a fairly basic level.

Code examples from the book are in the public repository and well worth studying.

Note

We can draw an analogy between a good developer and a driver:

  1. learning the basics of driving, traffic rules and the internal combustion engine - Vue documentation and JavaScript specification
  2. Practical driving training at a driving school - good textbooks like "Vue.js 3 Design Patterns and Best Practices"
  3. Real driving experience - commercial development experience
  4. Extreme driving courses, put a glass of water on the hood and drive a twenty year old car with a manual transmission through broken streets - quality open source projects and certifications

It is impossible to become a good developer/driver both without 1. and only with 1. Training videos from the internet (both paid and free) can both be part of 4. and be completely useless and even harmful (very often), depending on their quality and the motivation of the student.

Vue 2 or Vue 3?

Vue 3.
Composition API.

If you need Vue 2 to support an existing project, you'll know the answer to that question yourself.

The difference between Vue 2 and Vue 3 is big. It's not a case of learning the previous version beforehand to better and more easily understand the next one.

Do I need to know JavaScript beforehand?

Absolutely, at least an intermediate level. If not, I would suggest taking a short javascript course first, so that the person knows about the document object, knows how to handle array methods and is not too afraid of promises. Also, HTML and CSS at least at a basic level.

Here is an easy to read book - "Morgan N. - JavaScript for Kids. A Programming Self-Tutorial - 2016. Before you start learning Vue, it is advisable to understand 70% of the first part as well as paragraphs 10 and 12.


tip

Also an absolutely necessary pre-skill is the ability to google.

Is there a certification for Vue?

Vue.js Certification

Vue Style Guide

Be sure to check out the Vue Style Guide and try to follow its best practices when writing code.

Go back to this source from time to time and improve your code.

ESlint also helps you keep your code in line with best practices.

Do I need a mentor?

A mentor is useful for both a beginner and an experienced developer. You can uselessly kill two days to solve a problem that can be explained in 20 minutes by a more experienced person. And this two-day "experience" will never be useful again.

In companies, this role is usually played by more competent and friendly colleagues.

There are services like Solvery on the Internet that can help in this matter.

I still want video

There are quality ones from Vue Mastery, but most are outdated.

What else to look at besides Vue? React?

You can do React if you have a real option to use that knowledge, but it's much better to expand your developer horizons. Try to write a simple API on the backend. The easiest and most convenient language for this is PHP, but you can also use Node.js or Python. Try JSON-RPC and WebSockets transport protocols. Upload your application to GitHub Pages or another similar service, experiment with GitHub Actions - they help a lot with deploy automation and CI/CD in general. Work with Cloud providers (many offer free resources), set up a virtual server. Register a domain, make a product finished site - even if it's just your resume site or something basic on VitePress (used by this site). Work with FireStore and open APIs for various data. Check out Swagger. Learn SQL, install MySQL and play around with it, or do it on SupaBase. Understanding how data is stored and processed on the backend will help a lot in choosing the right strategies on the frontend.

Study how the modern internet works and what technologies and best practices are prevalent on it now.

- +
Skip to content

Learning Vue

Sources of information on Vue

For some reason, it is believed that there are only two ways to get knowledge on frontend - Vue documentation and tutorial videos from YouTube and all kinds of courses.

But documentation is not a textbook, but a reference book, and it is very difficult to separate grains from chaff on YouTube. I met some useful videos, but all of them were intended for developers who already know Vue quite well and showed some new or non-standard moments.


The main teacher should be a book that teaches, not a reference book.

An excellent Vue tutorial in English is the May 2023 Vue.js 3 Design Patterns and Best Practices. You can register on oReilly and read for 10 days for free. Even download it. In spite of the title, the book teaches programming, and from a fairly basic level.

Code examples from the book are in the public repository and well worth studying.

Note

We can draw an analogy between a good developer and a driver:

  1. learning the basics of driving, traffic rules and the internal combustion engine - Vue documentation and JavaScript specification
  2. Practical driving training at a driving school - good textbooks like "Vue.js 3 Design Patterns and Best Practices"
  3. Real driving experience - commercial development experience
  4. Extreme driving courses, put a glass of water on the hood and drive a twenty year old car with a manual transmission through broken streets - quality open source projects and certifications

It is impossible to become a good developer/driver both without 1. and only with 1. Training videos from the internet (both paid and free) can both be part of 4. and be completely useless and even harmful (very often), depending on their quality and the motivation of the student.

Vue 2 or Vue 3?

Vue 3.
Composition API.

If you need Vue 2 to support an existing project, you'll know the answer to that question yourself.

The difference between Vue 2 and Vue 3 is big. It's not a case of learning the previous version beforehand to better and more easily understand the next one.

Do I need to know JavaScript beforehand?

Absolutely, at least an intermediate level. If not, I would suggest taking a short javascript course first, so that the person knows about the document object, knows how to handle array methods and is not too afraid of promises. Also, HTML and CSS at least at a basic level.

Here is an easy to read book - "Morgan N. - JavaScript for Kids. A Programming Self-Tutorial - 2016. Before you start learning Vue, it is advisable to understand 70% of the first part as well as paragraphs 10 and 12.


tip

Also an absolutely necessary pre-skill is the ability to google.

Is there a certification for Vue?

Vue.js Certification

Vue Style Guide

Be sure to check out the Vue Style Guide and try to follow its best practices when writing code.

Go back to this source from time to time and improve your code.

ESlint also helps you keep your code in line with best practices.

Do I need a mentor?

A mentor is useful for both a beginner and an experienced developer. You can uselessly kill two days to solve a problem that can be explained in 20 minutes by a more experienced person. And this two-day "experience" will never be useful again.

In companies, this role is usually played by more competent and friendly colleagues.

There are services like Solvery on the Internet that can help in this matter.

I still want video

There are quality ones from Vue Mastery, but most are outdated.

What else to look at besides Vue? React?

You can do React if you have a real option to use that knowledge, but it's much better to expand your developer horizons. Try to write a simple API on the backend. The easiest and most convenient language for this is PHP, but you can also use Node.js or Python. Try JSON-RPC and WebSockets transport protocols. Upload your application to GitHub Pages or another similar service, experiment with GitHub Actions - they help a lot with deploy automation and CI/CD in general. Work with Cloud providers (many offer free resources), set up a virtual server. Register a domain, make a product finished site - even if it's just your resume site or something basic on VitePress (used by this site). Work with FireStore and open APIs for various data. Check out Swagger. Learn SQL, install MySQL and play around with it, or do it on SupaBase. Understanding how data is stored and processed on the backend will help a lot in choosing the right strategies on the frontend.

Study how the modern internet works and what technologies and best practices are prevalent on it now.

+ \ No newline at end of file diff --git a/en/frontend/spa-pwa-ssr-ssg.html b/en/frontend/spa-pwa-ssr-ssg.html index 8b639667d..5ed3c4fa8 100644 --- a/en/frontend/spa-pwa-ssr-ssg.html +++ b/en/frontend/spa-pwa-ssr-ssg.html @@ -6,14 +6,14 @@ SPA, PWA, SSG, SSR and SEO | Vue FAQ - + - + - + - + @@ -33,8 +33,8 @@ -
Skip to content

SPA, PWA, SSG, SSR and SEO

Web 1.0 -> Web 2.0

First there was static HTML and browsers showed it. A little bit later a little bit of JavaScript was invented to process forms and do a little animation. Then CSS came along and everyone saw that it was beautiful. Then someone proposed the idea of JSON for data format, and then Microsoft gave the world XMLHttpRequest, and JavaScript was allowed to send and receive data from the server.

That's how SPA was born.

SPA

SPA (Single Page Application) works like a regular desktop/mobile application - when first accessing the server, it receives the shell necessary to display the site, and then sends data to/from the server, usually in JSON format. This is much more efficient than the way when with each request from the server came a new HTML page with all the resources.

For the user UX increases significantly.

spa-vs-mpa

PWA

PWA (Progressive Web Application) is another step to improve user experience and make web applications as close as possible to native web applications.

With PWA, two elements are added to the SPA:

  1. Manifest. A text file with the properties of the application. With this, the icon of the web application can be set as well as native applications to the home screen of the smartphone. In addition, when PWA is launched, it may not show browser elements and appear to be a normal application.

  2. Service worker. This is a layer in the browser between the server and the browser itself that allows you to do managed caching. In other words, store the app with all the resources on the smartphone/computer so that when you start it, it will run immediately. If you don't need data from the server, the app can run offline (e.g. Notes).

You can read more about PWA on the website created by the Chrome team - https://web.dev/

Upgrading SPA to PWA is very small in labor cost, but very significant in benefit. Developing SPA and not making it a PWA is like renting a luxury hotel room but sleeping on a mat at its entrance in the corridor because it's too lazy to walk to the bedroom.

PWA -> Workbox and vite-plugin-pwa

Manifest and Service worker are so simple that creating a wrapper over SW - Workbox, and a plugin for Vite - vite-plugin-pwa is not logical. You get several times more code, need to load additional dependencies and understand wrapper configurations. Simple things have been made complex.

It is better to use Manifest and Service worker as they were created originally, and write these two simple files using templates from the specifications.

SSG

SSG (Static Site Generation) is an approach where the content of a website is pre-generated into html files, which are then distributed from the server.

Immediately suitable for indexing by search engines.

SSR

SSR (Server Side Rendering), a way of generating html on the server side, when generation occurs at the moment of request. After the client requests a page, the server executes API requests on its side and then generates the html page. Accordingly, the server needs a Node.js server, which is quite a heavy load on the hardware.

In addition, there are a lot of restrictions when writing code and using certain JavaScript and Vue features. As Google writes regarding SSR - "A rehydration problem: one app for the price of two".

SEO optimization

In order for a search engine to index a page on your site, it must receive HTML with content (text, images, video) when accessing it. With SPA sites, where content is loaded dynamically by JavaScript, this is often not possible.

The most popular and inefficient method to bypass this is to use SSR (SSG is suitable for simple structured sites without backend, like documentation).

Google allows you to see how your site looks/indexed by its crawler, which somehow still works with scripts, so first check if you need to get complicated at all.

If you find problems, you can use dynamic rendering

dynamic-rendering

The point is to handle requests from normal users and search bots differently and give them different pages. For users - SPA, for search bots - pages generated on the fly or in advance. Distribution can be handled by a webserver or an entry point to your site (index.php instead of index.html).

The above picture implies some kind of Prerenderer (which are also available as a third-party service or their own solution), but in most cases it is much easier to generate HTML page for the bot directly.

That is, for example, for a product page in an online store it can be its text description with pictures and customer reviews in any HTML formatting. For this purpose it is enough a script on PHP/Express/Python, etc. in 100-200 lines, which is much less labor-intensive than SSR solutions, and also reduces the requirements in the server "hardware" by orders of magnitude (the output can be cached in a static HTML file).

When the actual content (text, images) of such a page coincides with the content of SPA in the browser, Google does not consider the simplified version for its bot as a deception. This method has been around since before the advent of SSRs. Verified by many years of use.

PageSpeed and other performance tests

PageSpeed and similar tools are very useful in identifying unoptimized places in your web application, but it is not quite right for SPA and PWA.

More precisely, some of its metrics don't take into account UX as a whole. A well-built PWA, when first downloaded and installed, will of course lose by FCP metrics to its SSR counterpart, but after placing all its resources locally on the client's browser, no SSR will come close to it in terms of speed and user comfort, not to mention other features like offline operation and installation as a native application.

SSR can probably be useful for some exceptional cases, but in general it looks like a dead-end branch in frontend development.

- +
Skip to content

SPA, PWA, SSG, SSR and SEO

Web 1.0 -> Web 2.0

First there was static HTML and browsers showed it. A little bit later a little bit of JavaScript was invented to process forms and do a little animation. Then CSS came along and everyone saw that it was beautiful. Then someone proposed the idea of JSON for data format, and then Microsoft gave the world XMLHttpRequest, and JavaScript was allowed to send and receive data from the server.

That's how SPA was born.

SPA

SPA (Single Page Application) works like a regular desktop/mobile application - when first accessing the server, it receives the shell necessary to display the site, and then sends data to/from the server, usually in JSON format. This is much more efficient than the way when with each request from the server came a new HTML page with all the resources.

For the user UX increases significantly.

spa-vs-mpa

PWA

PWA (Progressive Web Application) is another step to improve user experience and make web applications as close as possible to native web applications.

With PWA, two elements are added to the SPA:

  1. Manifest. A text file with the properties of the application. With this, the icon of the web application can be set as well as native applications to the home screen of the smartphone. In addition, when PWA is launched, it may not show browser elements and appear to be a normal application.

  2. Service worker. This is a layer in the browser between the server and the browser itself that allows you to do managed caching. In other words, store the app with all the resources on the smartphone/computer so that when you start it, it will run immediately. If you don't need data from the server, the app can run offline (e.g. Notes).

You can read more about PWA on the website created by the Chrome team - https://web.dev/

Upgrading SPA to PWA is very small in labor cost, but very significant in benefit. Developing SPA and not making it a PWA is like renting a luxury hotel room but sleeping on a mat at its entrance in the corridor because it's too lazy to walk to the bedroom.

PWA -> Workbox and vite-plugin-pwa

Manifest and Service worker are so simple that creating a wrapper over SW - Workbox, and a plugin for Vite - vite-plugin-pwa is not logical. You get several times more code, need to load additional dependencies and understand wrapper configurations. Simple things have been made complex.

It is better to use Manifest and Service worker as they were created originally, and write these two simple files using templates from the specifications.

SSG

SSG (Static Site Generation) is an approach where the content of a website is pre-generated into html files, which are then distributed from the server.

Immediately suitable for indexing by search engines.

SSR

SSR (Server Side Rendering), a way of generating html on the server side, when generation occurs at the moment of request. After the client requests a page, the server executes API requests on its side and then generates the html page. Accordingly, the server needs a Node.js server, which is quite a heavy load on the hardware.

In addition, there are a lot of restrictions when writing code and using certain JavaScript and Vue features. As Google writes regarding SSR - "A rehydration problem: one app for the price of two".

SEO optimization

In order for a search engine to index a page on your site, it must receive HTML with content (text, images, video) when accessing it. With SPA sites, where content is loaded dynamically by JavaScript, this is often not possible.

The most popular and inefficient method to bypass this is to use SSR (SSG is suitable for simple structured sites without backend, like documentation).

Google allows you to see how your site looks/indexed by its crawler, which somehow still works with scripts, so first check if you need to get complicated at all.

If you find problems, you can use dynamic rendering

dynamic-rendering

The point is to handle requests from normal users and search bots differently and give them different pages. For users - SPA, for search bots - pages generated on the fly or in advance. Distribution can be handled by a webserver or an entry point to your site (index.php instead of index.html).

The above picture implies some kind of Prerenderer (which are also available as a third-party service or their own solution), but in most cases it is much easier to generate HTML page for the bot directly.

That is, for example, for a product page in an online store it can be its text description with pictures and customer reviews in any HTML formatting. For this purpose it is enough a script on PHP/Express/Python, etc. in 100-200 lines, which is much less labor-intensive than SSR solutions, and also reduces the requirements in the server "hardware" by orders of magnitude (the output can be cached in a static HTML file).

When the actual content (text, images) of such a page coincides with the content of SPA in the browser, Google does not consider the simplified version for its bot as a deception. This method has been around since before the advent of SSRs. Verified by many years of use.

PageSpeed and other performance tests

PageSpeed and similar tools are very useful in identifying unoptimized places in your web application, but it is not quite right for SPA and PWA.

More precisely, some of its metrics don't take into account UX as a whole. A well-built PWA, when first downloaded and installed, will of course lose by FCP metrics to its SSR counterpart, but after placing all its resources locally on the client's browser, no SSR will come close to it in terms of speed and user comfort, not to mention other features like offline operation and installation as a native application.

SSR can probably be useful for some exceptional cases, but in general it looks like a dead-end branch in frontend development.

+ \ No newline at end of file diff --git a/en/index.html b/en/index.html index b79845646..77cdbcac6 100644 --- a/en/index.html +++ b/en/index.html @@ -6,13 +6,13 @@ Vue FAQ - + - + - - + + @@ -33,7 +33,7 @@
Skip to content

Vue FAQ

Vue JavaScript framework FAQ

Most frequently asked questions about Vue.js

Vue FAQ
- + \ No newline at end of file diff --git a/en/misc/CHANGELOG.html b/en/misc/CHANGELOG.html index c85a98005..977e87536 100644 --- a/en/misc/CHANGELOG.html +++ b/en/misc/CHANGELOG.html @@ -6,13 +6,13 @@ Changelog | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Changelog


v1.4 (24-11-2023)

Changed

  • Frontend / How to learn Vue?
  • vue-webapp


v1.3 (10-10-2023)

Changed

  • Backend / CORS
  • Frontend / How to learn Vue?
  • Development / Useful tips


v1.2 (28-09-2023)

New

  • Deployment / Github Actions

Changed

  • Deployment / CI/CD
  • Deployment / Stores - Vuex, Pinia and Composition API
  • Frontend / About frontend frameworks


v1.1 (15-09-2023)

New

  • Development / Stores

Changed

  • Development / Helpful hints.


v1.0 (11-09-2023)

New

  • Initial launch
- +
Skip to content

Changelog


v1.4 (24-11-2023)

Changed

  • Frontend / How to learn Vue?
  • vue-webapp


v1.3 (10-10-2023)

Changed

  • Backend / CORS
  • Frontend / How to learn Vue?
  • Development / Useful tips


v1.2 (28-09-2023)

New

  • Deployment / Github Actions

Changed

  • Deployment / CI/CD
  • Deployment / Stores - Vuex, Pinia and Composition API
  • Frontend / About frontend frameworks


v1.1 (15-09-2023)

New

  • Development / Stores

Changed

  • Development / Helpful hints.


v1.0 (11-09-2023)

New

  • Initial launch
+ \ No newline at end of file diff --git a/en/misc/cheat-sheets.html b/en/misc/cheat-sheets.html index facff9d7c..561dcca9b 100644 --- a/en/misc/cheat-sheets.html +++ b/en/misc/cheat-sheets.html @@ -6,13 +6,13 @@ Cheat Sheet | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ - - + + \ No newline at end of file diff --git a/en/misc/contribute.html b/en/misc/contribute.html index b7958d971..a78e111ef 100644 --- a/en/misc/contribute.html +++ b/en/misc/contribute.html @@ -6,13 +6,13 @@ Contribute to the development of this resource | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Contribute to the development of this resource

You can suggest corrections to any or add a new Q/A using the form below.

GitHub way of making changes (fork -> edit -> create PR) is also very welcome.

- +
Skip to content

Contribute to the development of this resource

You can suggest corrections to any or add a new Q/A using the form below.

GitHub way of making changes (fork -> edit -> create PR) is also very welcome.

+ \ No newline at end of file diff --git a/en/misc/glossary.html b/en/misc/glossary.html index b88ca003e..e65fd81af 100644 --- a/en/misc/glossary.html +++ b/en/misc/glossary.html @@ -6,13 +6,13 @@ Glossary and abbreviations | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Glossary and abbreviations

  • DX (developer experience) - developer's experience, the convenience of working on the application. This includes everything - code quality, IDE usability, competent project architecture, commenting, documentation quality, using proven and best practices on the project, etc.
  • UX (user experience) - user's experience. Its general impression of the user's convenience in working with the site/application.
  • UI (user interface) - website/application design from the point of view of visual aesthetics and style.
  • SW (service worker) - Service Worker (PWA element)
  • AT (access token) - JWT authentication token
  • RT (refresh token) - JWT authentication token
- +
Skip to content

Glossary and abbreviations

  • DX (developer experience) - developer's experience, the convenience of working on the application. This includes everything - code quality, IDE usability, competent project architecture, commenting, documentation quality, using proven and best practices on the project, etc.
  • UX (user experience) - user's experience. Its general impression of the user's convenience in working with the site/application.
  • UI (user interface) - website/application design from the point of view of visual aesthetics and style.
  • SW (service worker) - Service Worker (PWA element)
  • AT (access token) - JWT authentication token
  • RT (refresh token) - JWT authentication token
+ \ No newline at end of file diff --git a/en/misc/introduction.html b/en/misc/introduction.html index 97ca6e98b..179c120a4 100644 --- a/en/misc/introduction.html +++ b/en/misc/introduction.html @@ -6,13 +6,13 @@ Introduction | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Introduction

This FAQ (Frequently Asked Questions) is created on the most frequently touched topics in Reddit r/vuejs/ and Telegram chat @vuejs_ru.

The level of questions and answers covers both beginners and experienced frontend developers.

As answers are used both generally recognized, verified and objective information, and subjective opinion of the author.

The increase in complexity does not come from the top down. The first questions and answers describe non-obvious points that may be interesting for experienced programmers.

The main sources of information - official documentation of Vue 3 and Vite, the book Vue.js 3 Design Patterns and Best Practices, r/vuejs/, @vuejs_ru.

Relevance of the information - 2022-2023 years.


About the author:

Ruslan Makarov - independent consultant, full-stack engineer with 20+ years of experience in SD, AWS Certified Solutions Architect, Sun Certified Java Developer.

- +
Skip to content

Introduction

This FAQ (Frequently Asked Questions) is created on the most frequently touched topics in Reddit r/vuejs/ and Telegram chat @vuejs_ru.

The level of questions and answers covers both beginners and experienced frontend developers.

As answers are used both generally recognized, verified and objective information, and subjective opinion of the author.

The increase in complexity does not come from the top down. The first questions and answers describe non-obvious points that may be interesting for experienced programmers.

The main sources of information - official documentation of Vue 3 and Vite, the book Vue.js 3 Design Patterns and Best Practices, r/vuejs/, @vuejs_ru.

Relevance of the information - 2022-2023 years.


About the author:

Ruslan Makarov - independent consultant, full-stack engineer with 20+ years of experience in SD, AWS Certified Solutions Architect, Sun Certified Java Developer.

+ \ No newline at end of file diff --git a/en/vue-webapp/contribution.html b/en/vue-webapp/contribution.html index 7f04f3ac9..e57c7c1ab 100644 --- a/en/vue-webapp/contribution.html +++ b/en/vue-webapp/contribution.html @@ -6,13 +6,13 @@ Project participation | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ - - + + \ No newline at end of file diff --git a/en/vue-webapp/getting-started.html b/en/vue-webapp/getting-started.html index bbc436089..6b9379a30 100644 --- a/en/vue-webapp/getting-started.html +++ b/en/vue-webapp/getting-started.html @@ -6,13 +6,13 @@ Getting started | Vue FAQ - + - + - - + + @@ -34,46 +34,46 @@ -
Skip to content

Getting started

Installation via create vue-webapp

With this method, you can select which options will be installed:

sh
$ pnpm create vue-webapp
-
- Project name: ... my-vue-project
- Add a Splash screen? ... no / yes
- Make it PWA (adds service worker and manifest)? ... no / yes
- Add Open Graph meta tags? ... no / yes
- Add Google Analytics code? ... no / yes
- Add Github Action Workflow for publishing it on GitHub Pages? ... no / yes
- Select application layout » MainLayout
- Select navigation drawer » SimpleDrawer
- Select webapp navbar » MantineSimpleNavbar
- Select webapp header » MantineSimpleHeader
- Select webapp footer » MantineRichFooter
- Add API layer (REST)? ... no / yes
- Add JSON-RPC adapter? ... no / yes
-
-Scaffolding project in /home/ubuntu/my-vue-project...
Silent installation

It is possible to scaffold the app without manually entering parameters by specifying a configuration file with options:

bash
pnpm create vue-webapp -c config.json
-// or
-pnpm create vue-webapp --config config.json

The format of the config.json file should be like this:

json
{
-  "projectName": "my-vue-project",
-  "splashScreen": false,
-  "pwa": true,
-  "openGraph": false,
-  "googleAnalytics": false,
-  "githubActionsGithubPagesWorkflow": true,
-  "layout": "mainLayout",
-  "navigationDrawer": "SimpleDrawer",
-  "navbar": "MantineSimpleNavbar",
-  "header": "MantineSimpleHeader",
-  "footer": "MantineRichFooter",
-  "api": true,
-  "jsonRpc": false,
-  "overwrite": true
-}

The overwrite parameter tells whether to overwrite the content in case of existing directory. It accepts values: "yes", "no" and "ignore".

Also, the command

bash
$ pnpm create vue-webapp .

will create the project in the current directory.

This method will only install the selected components and functionality

Initializing and launching a web application

sh
$ cd my-vue-project
-$ pnpm i
-$ pnpm dev

Result in a browser:

image

Installation from the repository

With this method everything will be installed, but a minimum of functionality will be enabled. It is useful for testing all available components and functionality.

sh
$ git clone https://github.com/vuesence/vue-webapp.git
-$ cd vue-webapp
-$ pnpm i
-$ pnpm dev
- +
Skip to content

Getting started

Installation via create vue-webapp

With this method, you can select which options will be installed:

sh
$ pnpm create vue-webapp
+
+ Project name: ... my-vue-project
+ Add a Splash screen? ... no / yes
+ Make it PWA (adds service worker and manifest)? ... no / yes
+ Add Open Graph meta tags? ... no / yes
+ Add Google Analytics code? ... no / yes
+ Add Github Action Workflow for publishing it on GitHub Pages? ... no / yes
+ Select application layout » MainLayout
+ Select navigation drawer » SimpleDrawer
+ Select webapp navbar » MantineSimpleNavbar
+ Select webapp header » MantineSimpleHeader
+ Select webapp footer » MantineRichFooter
+ Add API layer (REST)? ... no / yes
+ Add JSON-RPC adapter? ... no / yes
+
+Scaffolding project in /home/ubuntu/my-vue-project...
Silent installation

It is possible to scaffold the app without manually entering parameters by specifying a configuration file with options:

bash
pnpm create vue-webapp -c config.json
+// or
+pnpm create vue-webapp --config config.json

The format of the config.json file should be like this:

json
{
+  "projectName": "my-vue-project",
+  "splashScreen": false,
+  "pwa": true,
+  "openGraph": false,
+  "googleAnalytics": false,
+  "githubActionsGithubPagesWorkflow": true,
+  "layout": "mainLayout",
+  "navigationDrawer": "SimpleDrawer",
+  "navbar": "MantineSimpleNavbar",
+  "header": "MantineSimpleHeader",
+  "footer": "MantineRichFooter",
+  "api": true,
+  "jsonRpc": false,
+  "overwrite": true
+}

The overwrite parameter tells whether to overwrite the content in case of existing directory. It accepts values: "yes", "no" and "ignore".

Also, the command

bash
$ pnpm create vue-webapp .

will create the project in the current directory.

This method will only install the selected components and functionality

Initializing and launching a web application

sh
$ cd my-vue-project
+$ pnpm i
+$ pnpm dev

Result in a browser:

image

Installation from the repository

With this method everything will be installed, but a minimum of functionality will be enabled. It is useful for testing all available components and functionality.

sh
$ git clone https://github.com/vuesence/vue-webapp.git
+$ cd vue-webapp
+$ pnpm i
+$ pnpm dev
+ \ No newline at end of file diff --git a/en/vue-webapp/guidelines.html b/en/vue-webapp/guidelines.html index 7be0a47f5..1689ded1c 100644 --- a/en/vue-webapp/guidelines.html +++ b/en/vue-webapp/guidelines.html @@ -6,13 +6,13 @@ Guidelines | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Guidelines

  • Lightweight, efficient web application with modern UI/UX
  • Vue 3, Composition API, script setup syntax
  • Do not use third party libraries unnecessarily. The only necessary dependency is vue-router.
  • Use clean and efficient HTML5 and CSS3 for layout
  • Include specific functionality only when needed
  • High degree of customization

  • Plugging in specific functionality, such as i18n, means not just adding that library to package.json, but a full-fledged minimal working integration - creating a corresponding composable function, multiple locales, and applying t() in a template for illustration with necessary comments in the code to facilitate later use and customization.

  • Integrating certain functionality that uses a third-party library (e.g. toaster or modal window) should be done through a wrapper, so that it would be easy for the developer to change the specific package that implements the functionality if desired.

  • The scaffolded web application uses TypeScript, but it is possible to continue developing the application in pure JavaScript.

  • Vite is used as the builder.

  • SCSS is used as the CSS preprocessor.

  • Antony Fu's eslint-config is used for linting and formatting in ESlint.

  • The result should be a Vue 3 application without not-needed dependencies, unless the user explicitly includes them in the framework.

- +
Skip to content

Guidelines

  • Lightweight, efficient web application with modern UI/UX
  • Vue 3, Composition API, script setup syntax
  • Do not use third party libraries unnecessarily. The only necessary dependency is vue-router.
  • Use clean and efficient HTML5 and CSS3 for layout
  • Include specific functionality only when needed
  • High degree of customization

  • Plugging in specific functionality, such as i18n, means not just adding that library to package.json, but a full-fledged minimal working integration - creating a corresponding composable function, multiple locales, and applying t() in a template for illustration with necessary comments in the code to facilitate later use and customization.

  • Integrating certain functionality that uses a third-party library (e.g. toaster or modal window) should be done through a wrapper, so that it would be easy for the developer to change the specific package that implements the functionality if desired.

  • The scaffolded web application uses TypeScript, but it is possible to continue developing the application in pure JavaScript.

  • Vite is used as the builder.

  • SCSS is used as the CSS preprocessor.

  • Antony Fu's eslint-config is used for linting and formatting in ESlint.

  • The result should be a Vue 3 application without not-needed dependencies, unless the user explicitly includes them in the framework.

+ \ No newline at end of file diff --git a/en/vue-webapp/index.html b/en/vue-webapp/index.html index a551da2aa..531d11c25 100644 --- a/en/vue-webapp/index.html +++ b/en/vue-webapp/index.html @@ -6,13 +6,13 @@ Scaffolding a Vue webapp | Vue FAQ - + - + - - + + @@ -34,15 +34,15 @@ -
Skip to content

Scaffolding a Vue webapp

Summary

Vue 3 website builder/scaffolder (GitHub) for developers, with a choice of business template (portfolio, blog, store, etc.), layout template, design and functionality (API module, i18n, PWA, splash screen, auth module, themes, etc.), for further convenient customization and content filling.

sh
$ pnpm create vue-webapp
-
- Project name: ... my-vue-project
- Add a Splash screen? ... no / yes
- Make it PWA (adds service worker and manifest)? ... no / yes
- Add Open Graph meta tags? ... no / yes
- Add Google Analytics code? ... no / yes
-...

Justification

There are quite a few (mostly specific and quickly becoming obsolete) boilerplate templates for creating a Vue application. Usually it means creating an empty project with certain libraries. In other words, it's just setting up an environment to start development without, actually, code.

At the same time, many other frontend and backend frameworks have starter-kits that allow you to quickly create a ready-made blog, online store, business card site, portfolio, documentation, etc., which greatly helps in learning the framework itself, relevant technologies and best practices, as well as for solving business tasks.

As a result, it may seem that Vue is a rather low-level framework, and to create web applications quickly, efficiently and conveniently, you need to take some "metaframwork" or other solution - like Nuxt, Astro, VitePress, Vue Storefront - which explicitly position themselves as tools for solving certain (or a wide range of) business tasks.

There is a need for a tool similar to create-vue, for scaffolding a ready-to-go web application. On the one hand, a quite workable, adaptive website with the necessary functionality so that a novice developer could familiarize himself with a proven approach to solving the tasks involved. On the other hand, it should be minimalistic enough not to impose unwanted technologies and libraries on an experienced developer and create a skeleton of established best practices for further development of the application.

It is clear that defining one or another "best practice" (fetch or axios?) can be quite controversial, but nevertheless.

image

- +
Skip to content

Scaffolding a Vue webapp

Summary

Vue 3 website builder/scaffolder (GitHub) for developers, with a choice of business template (portfolio, blog, store, etc.), layout template, design and functionality (API module, i18n, PWA, splash screen, auth module, themes, etc.), for further convenient customization and content filling.

sh
$ pnpm create vue-webapp
+
+ Project name: ... my-vue-project
+ Add a Splash screen? ... no / yes
+ Make it PWA (adds service worker and manifest)? ... no / yes
+ Add Open Graph meta tags? ... no / yes
+ Add Google Analytics code? ... no / yes
+...

Justification

There are quite a few (mostly specific and quickly becoming obsolete) boilerplate templates for creating a Vue application. Usually it means creating an empty project with certain libraries. In other words, it's just setting up an environment to start development without, actually, code.

At the same time, many other frontend and backend frameworks have starter-kits that allow you to quickly create a ready-made blog, online store, business card site, portfolio, documentation, etc., which greatly helps in learning the framework itself, relevant technologies and best practices, as well as for solving business tasks.

As a result, it may seem that Vue is a rather low-level framework, and to create web applications quickly, efficiently and conveniently, you need to take some "metaframwork" or other solution - like Nuxt, Astro, VitePress, Vue Storefront - which explicitly position themselves as tools for solving certain (or a wide range of) business tasks.

There is a need for a tool similar to create-vue, for scaffolding a ready-to-go web application. On the one hand, a quite workable, adaptive website with the necessary functionality so that a novice developer could familiarize himself with a proven approach to solving the tasks involved. On the other hand, it should be minimalistic enough not to impose unwanted technologies and libraries on an experienced developer and create a skeleton of established best practices for further development of the application.

It is clear that defining one or another "best practice" (fetch or axios?) can be quite controversial, but nevertheless.

image

+ \ No newline at end of file diff --git a/en/vue-webapp/objectives.html b/en/vue-webapp/objectives.html index 5f0f08b2a..e1e7758a5 100644 --- a/en/vue-webapp/objectives.html +++ b/en/vue-webapp/objectives.html @@ -6,13 +6,13 @@ Objectives | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Objectives

  1. Create a scaffolder of simple out-of-the-box SPA applications for a specific task in a few minutes, with the possibility of further customization and filling it with content.
  2. Fine-tune the application using effective functional code blocks.
  3. Collect and generalize the best techniques and practices for creating a modern reactive Vue application.
  4. Enable novice developers to familiarize themselves with the Vue.js ecosystem with ready-made examples, learn front-end and Vue 3 best practices, from building application architecture to naming CSS classes.
  5. Enable experienced developers to quickly and efficiently scaffold a ready to use web application and leverage reusable code blocks (boilerplates), especially those that cannot be distributed as NPM packages.

This application should act as a website wireframe builder, with the ability to choose when scaffolding:

  • A global business website template (portfolio, blog, online store, etc.)
  • Variations of the general layout of the web application
  • Specific component options (header, footer, navigation drawer, etc.)
  • General style/design options
  • Specific functionality injected as functional fragments (API module, i18n, PWA, splash screen, Auth module, themes, etc.)
  • GitHub actions options with the ability to build and deploy to popular hosting solutions
  • Ability to connect/integrate popular libraries (including UI) if needed
  • Possibility to integrate with certain headless CRM and API services

Separately, it is planned to create a web showcase, where the user, dynamically changing the parameters, will be able to view and test the available site layouts, themes/styling, components (header, footer, etc.) and functionality of future application, as well as their combination with each other.

- +
Skip to content

Objectives

  1. Create a scaffolder of simple out-of-the-box SPA applications for a specific task in a few minutes, with the possibility of further customization and filling it with content.
  2. Fine-tune the application using effective functional code blocks.
  3. Collect and generalize the best techniques and practices for creating a modern reactive Vue application.
  4. Enable novice developers to familiarize themselves with the Vue.js ecosystem with ready-made examples, learn front-end and Vue 3 best practices, from building application architecture to naming CSS classes.
  5. Enable experienced developers to quickly and efficiently scaffold a ready to use web application and leverage reusable code blocks (boilerplates), especially those that cannot be distributed as NPM packages.

This application should act as a website wireframe builder, with the ability to choose when scaffolding:

  • A global business website template (portfolio, blog, online store, etc.)
  • Variations of the general layout of the web application
  • Specific component options (header, footer, navigation drawer, etc.)
  • General style/design options
  • Specific functionality injected as functional fragments (API module, i18n, PWA, splash screen, Auth module, themes, etc.)
  • GitHub actions options with the ability to build and deploy to popular hosting solutions
  • Ability to connect/integrate popular libraries (including UI) if needed
  • Possibility to integrate with certain headless CRM and API services

Separately, it is planned to create a web showcase, where the user, dynamically changing the parameters, will be able to view and test the available site layouts, themes/styling, components (header, footer, etc.) and functionality of future application, as well as their combination with each other.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/adaptability.html b/en/vue-webapp/options/adaptability.html index 72fa24ab3..d70857de0 100644 --- a/en/vue-webapp/options/adaptability.html +++ b/en/vue-webapp/options/adaptability.html @@ -6,13 +6,13 @@ Adaptability | Vue FAQ - + - + - - + + @@ -57,8 +57,8 @@ <div class="box"></div> <div class="box"></div> <div class="box"></div> -</div> - +</div> + \ No newline at end of file diff --git a/en/vue-webapp/options/api.html b/en/vue-webapp/options/api.html index 818fb1182..1a9865fad 100644 --- a/en/vue-webapp/options/api.html +++ b/en/vue-webapp/options/api.html @@ -6,13 +6,13 @@ API module | Vue FAQ - + - + - - + + @@ -72,8 +72,8 @@ }; export { api } -export default api;

TIP

The JSON-RPC protocol is very convenient and is the de facto standard for web 3.0. Recommended for use instead of REST

- +export default api;

TIP

The JSON-RPC protocol is very convenient and is the de facto standard for web 3.0. Recommended for use instead of REST

+ \ No newline at end of file diff --git a/en/vue-webapp/options/baseIcon.html b/en/vue-webapp/options/baseIcon.html index 4bcebcbc6..d4472299f 100644 --- a/en/vue-webapp/options/baseIcon.html +++ b/en/vue-webapp/options/baseIcon.html @@ -6,13 +6,13 @@ BaseIcon | Vue FAQ - + - + - - + + @@ -45,8 +45,8 @@ <header class="header"> <BaseIcon name="hamburger" class="drawer-toggle" @click="isDrawerOpen = !isDrawerOpen" /> </header> -</template>

utils.ts when initialized uses import.meta.glob to read all files with extensions .svg and .png from the @/assets/images/ directory and uses their names as icon identifiers for BaseIcon.

- +</template>

utils.ts when initialized uses import.meta.glob to read all files with extensions .svg and .png from the @/assets/images/ directory and uses their names as icon identifiers for BaseIcon.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/description.html b/en/vue-webapp/options/description.html index 83ec49ee6..f35bfcc69 100644 --- a/en/vue-webapp/options/description.html +++ b/en/vue-webapp/options/description.html @@ -6,13 +6,13 @@ Implementation details | Vue FAQ - + - + - - + + @@ -37,8 +37,8 @@
Skip to content

Implementation details

Code injections in the index.html

To avoid bloating index.html injections of code fragments into it (Open graph, Google analytics, Splash screen, Service worker etc.) are done via vite-plugin-html-injection Vite plugin.

The code snippets themselves are located in the ./src/utils/injections/ directory. The plugin configuration file injection-config.ts is also located there.

CSS tricks

A hack is applied in the application on large screen resolutions to prevent screen jumping when the main scrollbar appears/disappears

css
html {
   overflow-x: hidden;
   margin-right: calc(-1 * (100vw - 100%))
-}
- +} + \ No newline at end of file diff --git a/en/vue-webapp/options/drawer.html b/en/vue-webapp/options/drawer.html index 51953148f..b6e2da251 100644 --- a/en/vue-webapp/options/drawer.html +++ b/en/vue-webapp/options/drawer.html @@ -6,13 +6,13 @@ Navigation drawers | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Navigation drawers

There are currently two types of navigation drawers to choose from.

SimpleDrawer

image

It is always on for notebook and desktop screen resolutions, and can be opened for mobile and tablet by clicking/tapping on the "hamburger" icon.

TouchSlideoutDrawer

image

Similar to SimpleDrawer, but is controlled by touch on touch screens. Adds a nice UX.

Functionality is implemented with useTouchSwipe composable function and TouchSlideoutDrawer component.

- +
Skip to content

Navigation drawers

There are currently two types of navigation drawers to choose from.

SimpleDrawer

image

It is always on for notebook and desktop screen resolutions, and can be opened for mobile and tablet by clicking/tapping on the "hamburger" icon.

TouchSlideoutDrawer

image

Similar to SimpleDrawer, but is controlled by touch on touch screens. Adds a nice UX.

Functionality is implemented with useTouchSwipe composable function and TouchSlideoutDrawer component.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/footer.html b/en/vue-webapp/options/footer.html index 6b547bff8..816ad401d 100644 --- a/en/vue-webapp/options/footer.html +++ b/en/vue-webapp/options/footer.html @@ -6,13 +6,13 @@ Footers | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/en/vue-webapp/options/ga-gp.html b/en/vue-webapp/options/ga-gp.html index c91b24f7e..8e0b370b6 100644 --- a/en/vue-webapp/options/ga-gp.html +++ b/en/vue-webapp/options/ga-gp.html @@ -6,13 +6,13 @@ GitHub Actions script to deploy to GitHub Pages | Vue FAQ - + - + - - + + @@ -36,8 +36,8 @@
Skip to content

GitHub Actions script to deploy to GitHub Pages

Deployment

Uses JamesIves/github-pages-deploy-action GitHub Action to deploy a site to the gh-pages branch of the same GitHub repository, which automatically makes the website available at https://youGitHubUsername.github.io/my-vue-webapp (if your project and repository has name my-vue-webapp).

  • Create a branch in the repository called gh-pages
  • Go to the "Settings" section of your repository
  • Under "Code and automation" in the sidebar, click Pages.
  • Under "Build and deployment" under the "Source", select "Deploy from a branch".
  • Under "Build and deployment" under the "Branch" heading, use the branch drop-down menu and select the branch you want - gh-pages.

More details:

Setting base in Vite config

If you don't have a custom domain, you need to put the name of your repository as base in vite.config.ts so that the site can be accessed from the above link:

js
export default defineConfig({
   base:"/my-vue-webapp/"
-});

If you have a custom domain (like yourname.com), this parameter is not needed.

- +});

If you have a custom domain (like yourname.com), this parameter is not needed.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/google-analytics.html b/en/vue-webapp/options/google-analytics.html index 745f107a9..aa739a537 100644 --- a/en/vue-webapp/options/google-analytics.html +++ b/en/vue-webapp/options/google-analytics.html @@ -6,13 +6,13 @@ Google analytics | Vue FAQ - + - + - - + + @@ -41,8 +41,8 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-JL65GWRNQQQ'); -</script>

You should replace the id value with your own.

- +</script>

You should replace the id value with your own.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/header.html b/en/vue-webapp/options/header.html index 93b9c746f..0045da5b6 100644 --- a/en/vue-webapp/options/header.html +++ b/en/vue-webapp/options/header.html @@ -6,13 +6,13 @@ Headers | Vue FAQ - + - + - - + + @@ -34,16 +34,16 @@ -
Skip to content

Headers

All headers are adaptive.

SimpleHeader

image

Simple sticky header

MantineSimpleHeader

image

Simple sticky header in Mantine UI style

MantineLayeredHeader

image

Layered sticky header in Mantine UI style

SlidingHeader

image

Can contain two different headers, the second one appears after the user scrolls down the page

template
<AppHeader :threshold-hide="200" :threshold-open="400">
-    <template #first-header>
-        <AppHeaderFirst />
-    </template>
-
-    <template #second-header>
-        <AppHeaderSecond />
-    </template>
-<AppHeader>
- +
Skip to content

Headers

All headers are adaptive.

SimpleHeader

image

Simple sticky header

MantineSimpleHeader

image

Simple sticky header in Mantine UI style

MantineLayeredHeader

image

Layered sticky header in Mantine UI style

SlidingHeader

image

Can contain two different headers, the second one appears after the user scrolls down the page

template
<AppHeader :threshold-hide="200" :threshold-open="400">
+    <template #first-header>
+        <AppHeaderFirst />
+    </template>
+
+    <template #second-header>
+        <AppHeaderSecond />
+    </template>
+<AppHeader>
+ \ No newline at end of file diff --git a/en/vue-webapp/options/i18n.html b/en/vue-webapp/options/i18n.html index ccc9ba45b..374f6d2a2 100644 --- a/en/vue-webapp/options/i18n.html +++ b/en/vue-webapp/options/i18n.html @@ -6,13 +6,13 @@ i18n | Vue FAQ - + - + - - + + @@ -58,8 +58,8 @@ {{ t('msg') }} ({{ locale.code }}) </button> </div> -</template>

i18next extensions

i18next has an extension for Vue DevTools (pretty useless), and there is an extension I18next Ally for VS Code (pretty useful). So i18next Ally works with the new implementation if vue-i18n package is specified in package.json in dependencies (you don't need to use it in the code). Recommended. Both extensions, however, consume RAM and CPU resources quite well, so it is better to use them only as needed.

As a result

JavaScript bundle after the build is 50 Kb smaller than with i18next. The necessary functionality is there.

- +</template>

i18next extensions

i18next has an extension for Vue DevTools (pretty useless), and there is an extension I18next Ally for VS Code (pretty useful). So i18next Ally works with the new implementation if vue-i18n package is specified in package.json in dependencies (you don't need to use it in the code). Recommended. Both extensions, however, consume RAM and CPU resources quite well, so it is better to use them only as needed.

As a result

JavaScript bundle after the build is 50 Kb smaller than with i18next. The necessary functionality is there.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/index.html b/en/vue-webapp/options/index.html index a19eb8688..6e464d44a 100644 --- a/en/vue-webapp/options/index.html +++ b/en/vue-webapp/options/index.html @@ -6,13 +6,13 @@ Options when creating an application | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Options when creating an application

Available options

The following options are currently available for configuration:

  • Layout - application layout
  • Header - top part in the application template
  • Footer - bottom part of the application template
  • Drawer - navigation bar
  • Navbar - navigation menu (inside the drawer).
  • Github Pages deploy Workflow - GitHub Actions script for build and deploy application to GitHub Pages
  • PWA - addition of Service worker and Manifest to the application
  • API module - abstraction layer for communication with backend API
  • JSON-RPC - adapter for API module
  • Splash screen - splash screen during application startup to improve UX
  • Google analytics - code for integration of Google analytics
  • Open graph - meta tags for building snippets by social networks

Available by default

  • Dark theme. All plugins support theme switching
  • BaseIcon - icon component with the ability to dynamically specify a name
  • BaseToggle - toggle component

In development

  • Global Preloader
  • i18n - internationalization of the application using different variants of i18n libraries.

Planned

  • Online showcase for dynamic testing of different variants of application parts and functionality
  • Expanding the number of variants of layout, header, footer and other components
  • Auth - module framework for authentication on JWT tokens, including different variants of registration and login forms.
  • Auth integration with popular service providers (Firebase and others).
  • GitHub Actions for application deployment to various services (Vercel, Heroku, Firesbase) and other useful CI/CD scripts.
  • Check on startup for application new version and reload to avoid browser cache issues
  • Themes - application themes (include both different color palettes and the ability to change other CSS parameters for deep customization of the templates and components)
- +
Skip to content

Options when creating an application

Available options

The following options are currently available for configuration:

  • Layout - application layout
  • Header - top part in the application template
  • Footer - bottom part of the application template
  • Drawer - navigation bar
  • Navbar - navigation menu (inside the drawer).
  • Github Pages deploy Workflow - GitHub Actions script for build and deploy application to GitHub Pages
  • PWA - addition of Service worker and Manifest to the application
  • API module - abstraction layer for communication with backend API
  • JSON-RPC - adapter for API module
  • Splash screen - splash screen during application startup to improve UX
  • Google analytics - code for integration of Google analytics
  • Open graph - meta tags for building snippets by social networks

Available by default

  • Dark theme. All plugins support theme switching
  • BaseIcon - icon component with the ability to dynamically specify a name
  • BaseToggle - toggle component

In development

  • Global Preloader
  • i18n - internationalization of the application using different variants of i18n libraries.

Planned

  • Online showcase for dynamic testing of different variants of application parts and functionality
  • Expanding the number of variants of layout, header, footer and other components
  • Auth - module framework for authentication on JWT tokens, including different variants of registration and login forms.
  • Auth integration with popular service providers (Firebase and others).
  • GitHub Actions for application deployment to various services (Vercel, Heroku, Firesbase) and other useful CI/CD scripts.
  • Check on startup for application new version and reload to avoid browser cache issues
  • Themes - application themes (include both different color palettes and the ability to change other CSS parameters for deep customization of the templates and components)
+ \ No newline at end of file diff --git a/en/vue-webapp/options/layout-main.html b/en/vue-webapp/options/layout-main.html index 675b2b418..abf1c053e 100644 --- a/en/vue-webapp/options/layout-main.html +++ b/en/vue-webapp/options/layout-main.html @@ -6,13 +6,13 @@ MainLayout | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

MainLayout

Standard layout with header, footer and sidebar in notebook and desktop modes. In tablet and mobile modes the sidebar is hidden and moves in from the left when user clicks on the "hamburger" icon.

image

Routing

Changing the content of the main panel is provided via vue-router routes.

- +
Skip to content

MainLayout

Standard layout with header, footer and sidebar in notebook and desktop modes. In tablet and mobile modes the sidebar is hidden and moves in from the left when user clicks on the "hamburger" icon.

image

Routing

Changing the content of the main panel is provided via vue-router routes.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/layout-one-column.html b/en/vue-webapp/options/layout-one-column.html index fc74194ae..109adab89 100644 --- a/en/vue-webapp/options/layout-one-column.html +++ b/en/vue-webapp/options/layout-one-column.html @@ -6,13 +6,13 @@ OneColumnLayout | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

OneColumnLayout

Similar to MainLayout, but without the sidebar in notebook and desktop modes. Can be used, for example, if all navigation is located in the header. In tablet and mobile modes, the sidebar also pops out when the "hamburger" icon is clicked.

image

In all layout cases, the maximum width of the layout is set by the CSS variable --vwa-layout-max-width.

- +
Skip to content

OneColumnLayout

Similar to MainLayout, but without the sidebar in notebook and desktop modes. Can be used, for example, if all navigation is located in the header. In tablet and mobile modes, the sidebar also pops out when the "hamburger" icon is clicked.

image

In all layout cases, the maximum width of the layout is set by the CSS variable --vwa-layout-max-width.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/navbar.html b/en/vue-webapp/options/navbar.html index 4b03851c4..334e01ba6 100644 --- a/en/vue-webapp/options/navbar.html +++ b/en/vue-webapp/options/navbar.html @@ -6,13 +6,13 @@ Navbar | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Navbar

The Navbar is located inside the NavigationDrawer

At the moment it is possible to choose from two variants:

SimpleNavbar

image

MantineSimpleNavbar

image

- +
Skip to content

Navbar

The Navbar is located inside the NavigationDrawer

At the moment it is possible to choose from two variants:

SimpleNavbar

image

MantineSimpleNavbar

image

+ \ No newline at end of file diff --git a/en/vue-webapp/options/open-graph.html b/en/vue-webapp/options/open-graph.html index 17edcbfa0..774e4376a 100644 --- a/en/vue-webapp/options/open-graph.html +++ b/en/vue-webapp/options/open-graph.html @@ -6,13 +6,13 @@ Google analytics | Vue FAQ - + - + - - + + @@ -47,8 +47,8 @@ <!-- <meta property="twitter:url" content="" /> --> <meta name="twitter:title" content="-twitter:title-" /> <meta name="twitter:description" content="" /> -<meta name="twitter:image" content="images" />

You should set your meta tags values.

- +<meta name="twitter:image" content="images" />

You should set your meta tags values.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/pwa.html b/en/vue-webapp/options/pwa.html index 98c96f9a7..151e3bf0c 100644 --- a/en/vue-webapp/options/pwa.html +++ b/en/vue-webapp/options/pwa.html @@ -6,13 +6,13 @@ PWA | Vue FAQ - + - + - - + + @@ -48,8 +48,8 @@ "development", "education" ], - "icons": [...]

Service worker

Allows to make client-side caching manageable and greatly improve UX.

This implementation of service-worker.js does not use third-party libraries like Workbox.

The Cache first strategy is used for caching. Three separate caches are created for different types of resources: assets (js and css), images and fonts. Versioning is supported for each.

With the release of a new version of the application you can change the value of VERSION in service-worker.js. This will clear all cache in the client browser.

- + "icons": [...]

Service worker

Allows to make client-side caching manageable and greatly improve UX.

This implementation of service-worker.js does not use third-party libraries like Workbox.

The Cache first strategy is used for caching. Three separate caches are created for different types of resources: assets (js and css), images and fonts. Versioning is supported for each.

With the release of a new version of the application you can change the value of VERSION in service-worker.js. This will clear all cache in the client browser.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/splash-screen.html b/en/vue-webapp/options/splash-screen.html index 819bf8d58..522ae721b 100644 --- a/en/vue-webapp/options/splash-screen.html +++ b/en/vue-webapp/options/splash-screen.html @@ -6,13 +6,13 @@ Splash screen | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Splash screen

A splash screen during application startup instead of a blank screen can enhance application user experience and strengthen brand recognition.

image

The splash screen code is located entirely in the index.html. It is controlled by the CSS class splash on the body tag.

The splash screen is removed in App.vue / onMounted() after all the resources needed to ignite the application have been loaded.

- +
Skip to content

Splash screen

A splash screen during application startup instead of a blank screen can enhance application user experience and strengthen brand recognition.

image

The splash screen code is located entirely in the index.html. It is controlled by the CSS class splash on the body tag.

The splash screen is removed in App.vue / onMounted() after all the resources needed to ignite the application have been loaded.

+ \ No newline at end of file diff --git a/en/vue-webapp/options/themes.html b/en/vue-webapp/options/themes.html index aba94ac6c..42f48d839 100644 --- a/en/vue-webapp/options/themes.html +++ b/en/vue-webapp/options/themes.html @@ -6,13 +6,13 @@ Themes | Vue FAQ - + - + - - + + @@ -52,8 +52,8 @@ --vwa-c-text-3: rgba(235, 235, 245, 0.38); } -/* ... etc */ - +/* ... etc */ + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 4f9be36ff..0dd832f27 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"en_deployment_hosting.md":"bOwl1cI0","en_backend_api.md":"QipZFH-M","en_deployment_docker.md":"p5ZFnPVP","en_development_architectural-patterns.md":"DMr5v5ci","en_deployment_ci-cd.md":"VQJPAgq0","en_misc_contribute.md":"P2I6J5n0","en_misc_cheat-sheets.md":"OVKRNKkw","ru_arty-crafty_showcase_codeium.md":"dlQlpzmR","ru_arty-crafty_showcase_favourites.md":"vOEdr0Y2","en_deployment_github-actions.md":"pl-x1DsQ","en_vue-webapp_options_pwa.md":"cMz8h-_W","ru_arty-crafty_showcase_customization.md":"Le45mzmr","en_vue-webapp_getting-started.md":"swrJpB-M","en_misc_introduction.md":"Lebr-N6a","ru_arty-crafty_showcase_product-category.md":"tupoR0jK","en_frontend_learning.md":"x65PGI3R","en_backend_auth.md":"HB4EcL1a","en_development_assets.md":"rVbydSNn","en_vue-webapp_options_ga-gp.md":"9MdylQDP","en_vue-webapp_guidelines.md":"1txsRKM_","en_vue-webapp_contribution.md":"NconB5ME","en_vue-webapp_options_google-analytics.md":"7KdBILW3","en_vue-webapp_options_header.md":"MFJe_5jf","en_vue-webapp_options_layout-main.md":"fjfkBH8z","en_vue-webapp_options_i18n.md":"HG3LbCml","en_vue-webapp_options_layout-one-column.md":"DxxTBbwX","index.md":"wadnEZHb","ru_arty-crafty_analysis_architecture-and-design.md":"7sPp31hp","ru_arty-crafty_analysis_business-analysis.md":"-3KX24ef","ru_articles_index.md":"WU4bL9_u","en_vue-webapp_options_api.md":"934Pw7UQ","en_misc_changelog.md":"w8s-w063","en_index.md":"TkbC4UZv","ru_arty-crafty_analysis_data-model.md":"sKAmZqDC","ru_arty-crafty_analysis_tech-stack.md":"8wEDRqJY","ru_arty-crafty_analysis_research.md":"iym1ZPBV","ru_arty-crafty_analysis_ui-layout.md":"gF-4He_1","ru_arty-crafty_analysis_ui-design.md":"kn1ra5hl","ru_arty-crafty_introduction_goals.md":"o1PQwptX","ru_development_testing.md":"eG1m_hL_","ru_arty-crafty_backend_db-data-model.md":"xvWHZ0hs","ru_arty-crafty_showcase-data_mobile-menu.md":"SSyf7tEn","ru_arty-crafty_showcase-data_api-service-adapter.md":"FPYxk1GO","en_vue-webapp_options_baseicon.md":"yE5JntjF","en_vue-webapp_options_description.md":"Z-SyWUnv","en_vue-webapp_options_footer.md":"W3PJvNen","en_vue-webapp_options_drawer.md":"wzGVBjpS","ru_backend_api.md":"adFG6R4x","ru_book_chapter_6__progressive_web_applications.md":"8fAww607","ru_book_chapter_10__deploying_your_application.md":"-FlkJQ-f","en_misc_glossary.md":"z5_tk0gO","en_development_libraries.md":"1rB3ZLlM","en_vue-webapp_options_adaptability.md":"1JK3sLzs","en_development_misc.md":"3ecaA0IZ","ru_book_appendix__migrating_from_vue_2.md":"auFSlyEb","en_vue-webapp_index.md":"iv0pLR79","en_backend_backend.md":"8e9cMM_I","en_development_building.md":"S-5E4ojj","ru_book_chapter_4__user_interface_composition_with_components.md":"pb7O2bym","ru_book_chapter_3__setting_up_a_working_project.md":"TT0BrNOD","en_vue-webapp_options_index.md":"rNI8zLmW","en_vue-webapp_options_splash-screen.md":"7Plx8rUM","en_vue-webapp_options_open-graph.md":"jrZzZWcu","en_frontend_spa-pwa-ssr-ssg.md":"5rjxI0WA","en_vue-webapp_options_navbar.md":"27abBKkt","en_vue-webapp_objectives.md":"nAWsEsKj","ru_arty-crafty_introduction_repository.md":"kDvdY_WI","ru_development_building.md":"riCj-tlN","ru_development_ide.md":"URuu0WX8","ru_development_libraries.md":"JMPie-jI","ru_development_misc.md":"hSw6bLx2","ru_development_stores.md":"IPyYTrHp","ru_frontend_about-frameworks.md":"PeuasWWO","ru_frontend_spa-pwa-ssr-ssg.md":"b7Meyx6a","ru_frontend_learning.md":"6ZobhGeK","ru_index.md":"hFF131S2","ru_misc_changelog.md":"cOUMC_PG","ru_misc_cheat-sheets.md":"-Aqav2yK","ru_arty-crafty_backend_baas-choosing.md":"Ahjjvk-8","ru_deployment_hosting.md":"o2goqYFw","ru_deployment_ci-cd.md":"6l-WW8pm","ru_deployment_docker.md":"zQL-SFzA","ru_book_summary.md":"PjGGLL_W","ru_deployment_github-actions.md":"T6cBmLdZ","en_development_stores.md":"rV65euee","ru_vue-webapp_options_layout-one-column.md":"LGPRCO6S","ru_arty-crafty_index.md":"pF89O97c","ru_vue-webapp_options_navbar.md":"4Tv1i2IM","ru_vue-webapp_options_open-graph.md":"BXymvrPG","ru_book_chapter_7__data_flow_management.md":"4kedV1g-","ru_development_assets.md":"Z6Ws8qcS","ru_book_chapter_9__testing_and_source_control.md":"udrgfCq6","ru_book_chapter_2__software_design_principles_and_patterns.md":"TPYeksQI","ru_book_index.md":"n3JGVia-","ru_frontend_architecture.md":"Q6KROnXC","ru_misc_glossary.md":"TvcpXh2r","ru_development_architectural-patterns.md":"BL1U-uei","ru_vue-webapp_contribution.md":"g6Z6NUb5","ru_vue-webapp_guidelines.md":"73ssn_Fa","ru_misc_introduction.md":"jvAtBfIU","ru_vue-webapp_index.md":"1abyIYnK","ru_vue-webapp_options_adaptability.md":"Gfxd7XZF","ru_vue-webapp_options_api.md":"Wkjz6ywD","ru_vue-webapp_objectives.md":"hYhwbtkG","ru_vue-webapp_options_baseicon.md":"CcMHd_oI","ru_vue-webapp_options_description.md":"ioGQSz4b","ru_vue-webapp_options_google-analytics.md":"EGW541ll","ru_vue-webapp_options_ga-gp.md":"tcaA_Wxz","ru_vue-webapp_options_footer.md":"9ESCQk_c","ru_vue-webapp_options_index.md":"pX-2iss8","ru_vue-webapp_options_drawer.md":"FSdeA8Wt","ru_vue-webapp_options_i18n.md":"ICPnbGWR","ru_vue-webapp_options_header.md":"O9WP_P7o","ru_vue-webapp_options_pwa.md":"ArKSw8kR","ru_vue-webapp_options_splash-screen.md":"R0vViLrL","ru_vue-webapp_options_themes.md":"Kth6v22v","ru_arty-crafty_backend_supabase-api.md":"CLBPquSJ","en_backend_protocols.md":"J89YnQDP","ru_arty-crafty_backend_hoppscotch.md":"O6_QBg6u","ru_arty-crafty_introduction_development-stages.md":"zIvgLxbC","en_frontend_about-frameworks.md":"DsMsuNr8","en_development_testing.md":"nR02ZwkV","en_backend_cors.md":"_1z5L3Ml","en_frontend_architecture.md":"4wmf8xCn","ru_arty-crafty_showcase_project-setup.md":"_7BDFCyp","ru_misc_contribute.md":"LbBCHFLN","ru_arty-crafty_backend_supabase.md":"Tl-sPm4O","ru_book_chapter_1__the_vue_3_framework.md":"2KhDHAc_","ru_backend_backend.md":"a0tcM5iL","ru_backend_protocols.md":"ynkMm8xX","en_development_ide.md":"8LaVkPGa","ru_backend_auth.md":"RuQFau0I","ru_backend_cors.md":"acP7AuFL","ru_frontend_css-ui-libs.md":"RVCMtFt_","en_frontend_css-ui-libs.md":"162_8Xne","en_vue-webapp_options_themes.md":"0NU1O5S3","ru_vue-webapp_options_layout-main.md":"AHjv6wz2","ru_book_chapter_5__single-page_applications.md":"XL7e2wQ0","ru_vue-webapp_getting-started.md":"Bb8mL-Ia","ru_book_chapter_11__bonus_chapter_-_ux_patterns.md":"gta8mx10","ru_book_chapter_8__multithreading_with_web_workers.md":"buni53i0"} +{"en_deployment_ci-cd.md":"PJIpJdHA","en_deployment_hosting.md":"-XiBnR9w","en_deployment_docker.md":"6-y4RM0b","en_backend_auth.md":"KBvlY8-7","en_development_building.md":"yaawOfbG","en_backend_protocols.md":"GRCJd-cS","en_vue-webapp_options_navbar.md":"mhHeVyic","en_vue-webapp_options_layout-main.md":"_g3ZTK-o","en_vue-webapp_options_layout-one-column.md":"eU6iV2wo","en_backend_backend.md":"Dc1YQFrm","en_index.md":"5FO_61F0","en_development_assets.md":"VgFcQL7I","en_backend_api.md":"53LIXnkL","en_development_libraries.md":"XxHR0pP1","en_vue-webapp_options_i18n.md":"hklg8J6I","en_development_misc.md":"6C4sfdHc","en_vue-webapp_index.md":"JooLn6no","en_development_architectural-patterns.md":"Ow-fYR7u","ru_arty-crafty_analysis_architecture-and-design.md":"eCUc5ji3","en_frontend_about-frameworks.md":"pYQh8eAE","en_development_stores.md":"NIyxoDLo","en_vue-webapp_options_footer.md":"ZC6q6Wtf","en_development_testing.md":"d3LcqJaY","en_deployment_github-actions.md":"gG8niTIX","ru_book_chapter_1__the_vue_3_framework.md":"hRH8uAb3","ru_arty-crafty_introduction_goals.md":"qEMDrY7L","en_vue-webapp_getting-started.md":"mj19E3NW","en_frontend_spa-pwa-ssr-ssg.md":"5-hdfyIW","ru_arty-crafty_introduction_repository.md":"sRB3gGt5","en_frontend_learning.md":"tUwfnh_F","ru_arty-crafty_showcase_customization.md":"ZXmxQW2W","ru_arty-crafty_showcase-data_api-service-adapter.md":"8G4m32oB","ru_arty-crafty_backend_supabase.md":"BkSWx3iw","ru_arty-crafty_index.md":"0azonwI3","ru_arty-crafty_showcase_project-setup.md":"CqGYaox8","ru_arty-crafty_showcase-data_mobile-menu.md":"NIj8HtJ_","ru_backend_api.md":"Dzes0lIw","en_frontend_architecture.md":"dHsY5TwI","ru_backend_protocols.md":"2ctpmcpi","ru_book_appendix__migrating_from_vue_2.md":"PHMdkqfb","en_vue-webapp_guidelines.md":"wUC6izSp","ru_arty-crafty_analysis_data-model.md":"RIraf0Xk","ru_book_chapter_10__deploying_your_application.md":"MNTrkDv9","en_vue-webapp_objectives.md":"25sSut2f","en_vue-webapp_options_baseicon.md":"owgtwcEq","en_vue-webapp_options_adaptability.md":"nHoaFtNN","en_vue-webapp_options_drawer.md":"68cPJfxv","en_misc_introduction.md":"Rp1fQ250","en_vue-webapp_options_open-graph.md":"KEKiTz40","en_misc_contribute.md":"s8RT8URP","en_vue-webapp_options_splash-screen.md":"9Vf2ZYLw","index.md":"Rk8ysRWy","en_vue-webapp_contribution.md":"LkYDMpY1","en_vue-webapp_options_description.md":"GraRzW11","ru_arty-crafty_introduction_development-stages.md":"RbGhkZLY","en_vue-webapp_options_google-analytics.md":"s8gajhQb","en_development_ide.md":"Ve6NOYDN","ru_backend_auth.md":"DlcF9MHz","ru_arty-crafty_analysis_ui-layout.md":"zk6cqLLW","ru_arty-crafty_analysis_tech-stack.md":"JdNJDRNI","ru_arty-crafty_analysis_research.md":"hLSKxFwk","en_misc_changelog.md":"aRNbjEuk","ru_arty-crafty_analysis_ui-design.md":"56SRmB7J","ru_arty-crafty_backend_db-data-model.md":"lSQztL8g","en_vue-webapp_options_ga-gp.md":"pxgVZY5a","en_vue-webapp_options_pwa.md":"XDIn1wLn","ru_arty-crafty_backend_hoppscotch.md":"HFkvmbIr","en_misc_glossary.md":"Ro7yOndb","en_vue-webapp_options_header.md":"xIw9DKI4","en_backend_cors.md":"AEgp7eqQ","en_vue-webapp_options_index.md":"8LzfbKvw","en_vue-webapp_options_themes.md":"zBa3ncdf","ru_arty-crafty_backend_supabase-api.md":"DPIT5NhC","ru_arty-crafty_showcase_product-category.md":"D13vdiVu","en_vue-webapp_options_api.md":"-4ZcX4py","ru_vue-webapp_options_drawer.md":"dcvPqHG3","ru_vue-webapp_options_footer.md":"HDpMf0ZY","ru_book_chapter_11__bonus_chapter_-_ux_patterns.md":"VFEWywZs","ru_vue-webapp_options_layout-main.md":"mAU0YvUA","ru_vue-webapp_options_ga-gp.md":"fKJ7YOmv","ru_vue-webapp_objectives.md":"DTLaKSHQ","ru_deployment_docker.md":"af4jKnuv","ru_backend_backend.md":"WOTwKYpp","en_misc_cheat-sheets.md":"qaB2IoCS","ru_misc_changelog.md":"FmBCcMOt","ru_vue-webapp_options_layout-one-column.md":"S4PvENjv","ru_arty-crafty_showcase_favourites.md":"UXzQaial","ru_vue-webapp_options_adaptability.md":"ytbCRp7v","ru_development_testing.md":"FHj2DJPG","ru_frontend_about-frameworks.md":"QDjLbL5A","ru_frontend_architecture.md":"et3W1cWI","ru_frontend_css-ui-libs.md":"LyeDWX4O","ru_frontend_learning.md":"ZQxEVbQX","ru_misc_introduction.md":"fitoRiBp","ru_frontend_spa-pwa-ssr-ssg.md":"DePUW-dF","ru_index.md":"dxXdamCT","ru_vue-webapp_options_navbar.md":"nAiG-5fe","ru_arty-crafty_showcase_codeium.md":"vavWD1Qd","ru_misc_contribute.md":"vor1kH7M","ru_vue-webapp_options_description.md":"Ohf5aovV","ru_vue-webapp_options_open-graph.md":"x2iSdVJp","ru_backend_cors.md":"ipRg9p-1","ru_vue-webapp_contribution.md":"JQrZGxDM","ru_vue-webapp_options_pwa.md":"4Gu3JEXm","ru_vue-webapp_guidelines.md":"ihh4Ek53","ru_misc_glossary.md":"Wg97CvCV","ru_arty-crafty_analysis_business-analysis.md":"wAQmXhES","ru_vue-webapp_options_index.md":"PnZgplXj","ru_book_index.md":"RmDnakgK","en_frontend_css-ui-libs.md":"AwyllyZn","ru_vue-webapp_options_header.md":"aBFan2Ig","ru_development_building.md":"h_DTCEFb","ru_arty-crafty_backend_baas-choosing.md":"QBMw27p7","ru_development_stores.md":"fGoABZW6","ru_vue-webapp_index.md":"zGi9vV4Z","ru_vue-webapp_getting-started.md":"0RG3MV12","ru_deployment_github-actions.md":"W03pVg1-","ru_deployment_ci-cd.md":"Ki1so5jw","ru_development_misc.md":"xXSfg52U","ru_vue-webapp_options_baseicon.md":"jxSYdiEK","ru_vue-webapp_options_splash-screen.md":"tgVNnDk_","ru_book_chapter_6__progressive_web_applications.md":"-0Rj0Qvu","ru_vue-webapp_options_i18n.md":"3Hny7tfo","ru_development_assets.md":"W5Ne8Rvk","ru_vue-webapp_options_themes.md":"bL3-WWM4","ru_articles_index.md":"2J_uX4HA","ru_development_ide.md":"OcUhVyLP","ru_vue-webapp_options_api.md":"YjTpTbF-","ru_development_libraries.md":"8LYDjbMs","ru_book_summary.md":"kKn25AHO","ru_book_chapter_9__testing_and_source_control.md":"zTRfTVpt","ru_book_chapter_4__user_interface_composition_with_components.md":"gcbH8GXH","ru_misc_cheat-sheets.md":"7-z4zJxQ","ru_vue-webapp_options_google-analytics.md":"EOiIrWbw","ru_deployment_hosting.md":"sdjk58bF","ru_book_chapter_2__software_design_principles_and_patterns.md":"PaigrACQ","ru_development_architectural-patterns.md":"mJwiNHV_","ru_book_chapter_7__data_flow_management.md":"49uZ6IeN","ru_book_chapter_3__setting_up_a_working_project.md":"dySWkMvT","ru_book_chapter_5__single-page_applications.md":"NNsvLbhA","ru_book_chapter_8__multithreading_with_web_workers.md":"Jj18pQkg"} diff --git a/index.html b/index.html index 6738dc4bf..b087d398f 100644 --- a/index.html +++ b/index.html @@ -6,13 +6,13 @@ Vue FAQ - + - + - - + + @@ -31,7 +31,7 @@
Skip to content

Vue FAQ

Vue JavaScript framework FAQ

Most frequently asked questions about Vue.js

Vue FAQ
- + \ No newline at end of file diff --git a/ru/articles/index.html b/ru/articles/index.html index 7dd8af231..ce2cbdcef 100644 --- a/ru/articles/index.html +++ b/ru/articles/index.html @@ -6,13 +6,13 @@ Наши статьи на других ресурсах | Vue FAQ - + - + - - + + @@ -32,13 +32,13 @@ -
Skip to content

Наши статьи на других ресурсах


Facebook выпустил новую CSS-in-JS библиотеку — StyleX

Верней оформил 5 декабря 2023 года оформил для всех то, чем его разработчики пользуются уже давно. Позиционируется данный помощник для js-подобных фреймворков типа React, Preact, Solid, lit-html и Angular, однако оперирующие html шаблонами Vue и Svelte тоже могут задействовать StyleX, но после предварительной специальной её кастомизации.

Vue state management: Pinia stores или composables с глобальными рефами?

На Reddit прошла интересная дискуссия с 25К+ просмотрами по вопросу предпочтений разработчиков при необходимости управлять глобальным состоянием во Vue 3. Ниже её итоги.

Google и Yandex SEO оптимизация для SPA приложений

Google и Yandex утверждают, что что-то уже могут по индексированию SPA приложений. В статье показаны результаты проведенного эксперимента по индексации чистого SPA вебсайта.
Результат: Google - хорошо, Yandex - не очень

Atomic CSS здорового человека. UnoCSS

Продолжение перевода статьи «Reimagine Atomic CSS» двухлетней давности одного из членов команды Vue core Anthony Fu, автора UnoCSS, в которой рассматривается уже сам UnoCSS.

План «Барбаросса» от Vue.js

После выхода крайней и достаточно революционной в плане добавления Composition API версии Vue 3.0 более чем три года назад, каких-либо серьезных изменений от команды Evan You в самом фреймворке больше не было. Только стандартные багфиксы, оптимизация и робкие попытки стать с TypeScript ближе. Основное внимание переключилось на экосистему - Vite, Nuxt, VitePress, Pinia и другие.
В то же время, отчетливо заметно масштабирование работы не вглубь, а вширь. Интересы команды уже давно явно выходят за пределы фреймворка.

Билдер Vue 3 веб приложений

Vue 3 вебсайт билдер (npm пакет vue-webapp) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.

Vue.js 3 — шаблоны проектирования и лучшие практики

Предлагается перевод книги Vue.js 3 Design Patterns and Best Practices автора Pablo Garaguso.
Книга вышла в мае 2023 года, написана очень компетентно, оперирует современными технологиями и стандартами. Материал книги будет полезен разработчикам не только Vue, но и других фронтенд фреймворков.

Vue-faq.org — FAQ о фронтенде в целом и Vue в частности

https://vue-faq.org - попытка охватить наиболее часто задаваемые в профильных чатах и конференциях вопросы о фронтенде в целом и Vue.js фреймворке в частности.

Написание Vite плагина

Сборщик Vite предоставляет не только хороший функционал, но и удобный API для создания плагинов, позволяющих кастомизировать его практически под любую задачу. То есть, плагины можно писать не только для публикации их в npmjs.com репозитории, но и для автоматизации исключительно своих задач.

Сравнение тяжеловесности популярных библиотек UI компонент для Vue 3

Библиотеки UI компонент популярны и удобны в некоторых случаях, но у них тоже есть обратные стороны. Одно дело, когда делаешь админку и используешь десятки компонент, другое - когда тебе надо всего пару компонент.
Было проведено исследование - взяты три HTML элемента: Button, Input и Select, и проверено, насколько увеличатся js и css бандлы если использовать для них одну из 10 распространенных UI библиотек для Vue 3.

Детокс для i18n

NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже "интернационализационным фреймворком". +
Skip to content

Наши статьи на других ресурсах


Facebook выпустил новую CSS-in-JS библиотеку — StyleX

Верней оформил 5 декабря 2023 года оформил для всех то, чем его разработчики пользуются уже давно. Позиционируется данный помощник для js-подобных фреймворков типа React, Preact, Solid, lit-html и Angular, однако оперирующие html шаблонами Vue и Svelte тоже могут задействовать StyleX, но после предварительной специальной её кастомизации.

Vue state management: Pinia stores или composables с глобальными рефами?

На Reddit прошла интересная дискуссия с 25К+ просмотрами по вопросу предпочтений разработчиков при необходимости управлять глобальным состоянием во Vue 3. Ниже её итоги.

Google и Yandex SEO оптимизация для SPA приложений

Google и Yandex утверждают, что что-то уже могут по индексированию SPA приложений. В статье показаны результаты проведенного эксперимента по индексации чистого SPA вебсайта.
Результат: Google - хорошо, Yandex - не очень

Atomic CSS здорового человека. UnoCSS

Продолжение перевода статьи «Reimagine Atomic CSS» двухлетней давности одного из членов команды Vue core Anthony Fu, автора UnoCSS, в которой рассматривается уже сам UnoCSS.

План «Барбаросса» от Vue.js

После выхода крайней и достаточно революционной в плане добавления Composition API версии Vue 3.0 более чем три года назад, каких-либо серьезных изменений от команды Evan You в самом фреймворке больше не было. Только стандартные багфиксы, оптимизация и робкие попытки стать с TypeScript ближе. Основное внимание переключилось на экосистему - Vite, Nuxt, VitePress, Pinia и другие.
В то же время, отчетливо заметно масштабирование работы не вглубь, а вширь. Интересы команды уже давно явно выходят за пределы фреймворка.

Билдер Vue 3 веб приложений

Vue 3 вебсайт билдер (npm пакет vue-webapp) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.

Vue.js 3 — шаблоны проектирования и лучшие практики

Предлагается перевод книги Vue.js 3 Design Patterns and Best Practices автора Pablo Garaguso.
Книга вышла в мае 2023 года, написана очень компетентно, оперирует современными технологиями и стандартами. Материал книги будет полезен разработчикам не только Vue, но и других фронтенд фреймворков.

Vue-faq.org — FAQ о фронтенде в целом и Vue в частности

https://vue-faq.org - попытка охватить наиболее часто задаваемые в профильных чатах и конференциях вопросы о фронтенде в целом и Vue.js фреймворке в частности.

Написание Vite плагина

Сборщик Vite предоставляет не только хороший функционал, но и удобный API для создания плагинов, позволяющих кастомизировать его практически под любую задачу. То есть, плагины можно писать не только для публикации их в npmjs.com репозитории, но и для автоматизации исключительно своих задач.

Сравнение тяжеловесности популярных библиотек UI компонент для Vue 3

Библиотеки UI компонент популярны и удобны в некоторых случаях, но у них тоже есть обратные стороны. Одно дело, когда делаешь админку и используешь десятки компонент, другое - когда тебе надо всего пару компонент.
Было проведено исследование - взяты три HTML элемента: Button, Input и Select, и проверено, насколько увеличатся js и css бандлы если использовать для них одну из 10 распространенных UI библиотек для Vue 3.

Детокс для i18n

NPM библиотека для интернационализации и локализации i18n очень популярна, однако за последние годы она сильно располнела. В ней много возможностей для локализации дат, чисел, установки нужных склонений, поддержки RTL языков, загрузки локалей с сервера и кучи еще чего. На сайте i18next она называется уже даже "интернационализационным фреймворком".
- В то же время часто для локализации сайта нужны очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n. Ниже будет описана несложная процедура избавления от i18next-ной зависимости в данном случае.

Работа с i18n — автоматизация Google Translate и другие полезные советы

NPM-пакет для интернационализации i18n используется на фронтэнде для создания мультиязычных вебсайтов очень часто. Перевод текста в нем содержится обычно в json или в js файлах, и требует дальнейшей обработки, чтобы с ним с комфортом могли работать контент-редакторы. В статье описывается как максимально упростить и сделать удобным хранение и внесение изменений в перевод.

Популяризация JSON-RPC

+ В то же время часто для локализации сайта нужны очень простые вещи, занимающие всего пару процентов от всего функционала тяжеловеса i18n. Ниже будет описана несложная процедура избавления от i18next-ной зависимости в данном случае.

Работа с i18n — автоматизация Google Translate и другие полезные советы

NPM-пакет для интернационализации i18n используется на фронтэнде для создания мультиязычных вебсайтов очень часто. Перевод текста в нем содержится обычно в json или в js файлах, и требует дальнейшей обработки, чтобы с ним с комфортом могли работать контент-редакторы. В статье описывается как максимально упростить и сделать удобным хранение и внесение изменений в перевод.

Популяризация JSON-RPC

Для передачи данных по сети есть хорошо зарекомендовавшие себя стандарты - например, SOAP, gRPC, AMQP, REST, GraphQL.
-При создании вебсайтов малой, средней и большой сложности с потоками данных к бэкенду и обратно в JSON формате обычно используются последние два с их вариантами. Верней, только варианты, потому что REST и GraphQL - ресурсо-ориентированные стандарты. Это как бы просто перенос элементарной работы с базой данных на клиента (хотя под "ресурсом" может пониматься и абстракция). Обычно таких запросов не больше трети от всего бэкенд API.
- +При создании вебсайтов малой, средней и большой сложности с потоками данных к бэкенду и обратно в JSON формате обычно используются последние два с их вариантами. Верней, только варианты, потому что REST и GraphQL - ресурсо-ориентированные стандарты. Это как бы просто перенос элементарной работы с базой данных на клиента (хотя под "ресурсом" может пониматься и абстракция). Обычно таких запросов не больше трети от всего бэкенд API.
+ \ No newline at end of file diff --git a/ru/arty-crafty/analysis/architecture-and-design.html b/ru/arty-crafty/analysis/architecture-and-design.html index 6e3aa49d6..56f24f70a 100644 --- a/ru/arty-crafty/analysis/architecture-and-design.html +++ b/ru/arty-crafty/analysis/architecture-and-design.html @@ -6,13 +6,13 @@ Архитектура и дизайн | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Архитектура и дизайн

Упрощение сложного

Самое главное правило при проектировании любых систем - KISS (keep it simple, stupid). Более благозвучно это формулируется как: "Всё гениальное просто".

Для того, чтобы управлять сложными системами, издревле люди стали разбивать их на более простые. Принцип: "Разделяй и властвуй", относится именно к этому.

image

Любое современное государство управляется через иерархичное разбиение и подчинение, давая возможность любому управляющему быть ответственным за небольшую часть системы, которую он может контролировать.

Аналогично программная система любой сложности может быть разбита на отдельные подсистемы. Чем менее две таких подсистемы будут связаны друг с другом (loosely coupled), тем проще с ними будет работать, исправлять баги, вводить в курс новых разработчиков.

Абстракция и инкапсуляция

Эти два метода объектно-ориентированного программирования хорошо действуют и здесь в веб разработке на Vue, для определения функциональных границ подсистем, и данных, которыми они обменивается между собой и с окружающим миром.

Например, у нас на фронтенде будет два представления на экране (views) - категория товара и сам товар. Кажется, что они связаны друг с другом, потому что оперируют одними сущностями, но на самом деле они вообще никак не связаны (если отвлечься от визуального вида). Каждое получает свои данные с бэкенда. Когда происходит клик на какой-либо товар в списке категории, то id товара отправляется во vue-router, который уже вызывает страницу товара с нужным id.

То же самое в паре меню категорий и самого представления категории с товарами. Меню категорий может быть довольно сложным, и вынести его в отдельную подсистему тогда будет полезно.

Это пример, как можно разбивать систему на несвязанные (или слабосвязанные) подсистемы, что очень сильно облегчает дальнейшую разработку.

Разбиение проекта на подсистемы

Замечание

Иногда будут вставать вопросы, над которыми читателю полезно подумать самому. В таких случаях, я буду формулировать вопрос, а свой ответ прятать под спойлер. Ваш вариант ответа вполне может оказаться полней и точней.

Вопрос: на какие слабосвязанные подсистемы можно разбить наш проект маркетплейса? Имеется ввиду только фронтенд. Предлагаю взять для примера Озон и исследовать его.

Вариант ответа
  • Меню категорий
  • Фильтры поиска
  • Представление категории товара
  • Представление товара
  • Секция "Похожие товары"
  • Отзывы о товаре
  • Рекламные баннеры
  • Блоки спецпредложений и рекомендаций
  • Вспомогательные страницы (подарочные сертификаты, акции и т.п.)
  • Сравнение товаров
  • Избранное
  • Заказы
  • Страница профиля
  • Корзина
  • Модуль оплаты
  • Модуль выбора вида доставки
  • Локация пункта выдачи
  • и ещё другие

Package Diagram

Примерный вид диаграммы пакетов:

image

Пакеты здесь аналоги будущих модулей в нашем приложении.

Клиент-серверная архитектура

Архитектурно приложение будет являться классическим трехуровневых приложением - фронтенд, бэкенд, база данных. На первом этапе бэкенд и база данных представляют собой статичные json файлы. Затем за них будет отвечать Headless CMS

В связи с тем, что мы разрабатываем SPA, часть бизнес логики будет на фронтенде.

image

Routing

Роутинг используется в том числе и для того, чтобы сделать наши подсистемы слабосвязанными.

На первом этапе нам нужны три маршрута:

  • главная страница
  • товары определенной категории
  • страница определенного товара

Для простоты главную страницу оставим пустой.

- +
Skip to content

Архитектура и дизайн

Упрощение сложного

Самое главное правило при проектировании любых систем - KISS (keep it simple, stupid). Более благозвучно это формулируется как: "Всё гениальное просто".

Для того, чтобы управлять сложными системами, издревле люди стали разбивать их на более простые. Принцип: "Разделяй и властвуй", относится именно к этому.

image

Любое современное государство управляется через иерархичное разбиение и подчинение, давая возможность любому управляющему быть ответственным за небольшую часть системы, которую он может контролировать.

Аналогично программная система любой сложности может быть разбита на отдельные подсистемы. Чем менее две таких подсистемы будут связаны друг с другом (loosely coupled), тем проще с ними будет работать, исправлять баги, вводить в курс новых разработчиков.

Абстракция и инкапсуляция

Эти два метода объектно-ориентированного программирования хорошо действуют и здесь в веб разработке на Vue, для определения функциональных границ подсистем, и данных, которыми они обменивается между собой и с окружающим миром.

Например, у нас на фронтенде будет два представления на экране (views) - категория товара и сам товар. Кажется, что они связаны друг с другом, потому что оперируют одними сущностями, но на самом деле они вообще никак не связаны (если отвлечься от визуального вида). Каждое получает свои данные с бэкенда. Когда происходит клик на какой-либо товар в списке категории, то id товара отправляется во vue-router, который уже вызывает страницу товара с нужным id.

То же самое в паре меню категорий и самого представления категории с товарами. Меню категорий может быть довольно сложным, и вынести его в отдельную подсистему тогда будет полезно.

Это пример, как можно разбивать систему на несвязанные (или слабосвязанные) подсистемы, что очень сильно облегчает дальнейшую разработку.

Разбиение проекта на подсистемы

Замечание

Иногда будут вставать вопросы, над которыми читателю полезно подумать самому. В таких случаях, я буду формулировать вопрос, а свой ответ прятать под спойлер. Ваш вариант ответа вполне может оказаться полней и точней.

Вопрос: на какие слабосвязанные подсистемы можно разбить наш проект маркетплейса? Имеется ввиду только фронтенд. Предлагаю взять для примера Озон и исследовать его.

Вариант ответа
  • Меню категорий
  • Фильтры поиска
  • Представление категории товара
  • Представление товара
  • Секция "Похожие товары"
  • Отзывы о товаре
  • Рекламные баннеры
  • Блоки спецпредложений и рекомендаций
  • Вспомогательные страницы (подарочные сертификаты, акции и т.п.)
  • Сравнение товаров
  • Избранное
  • Заказы
  • Страница профиля
  • Корзина
  • Модуль оплаты
  • Модуль выбора вида доставки
  • Локация пункта выдачи
  • и ещё другие

Package Diagram

Примерный вид диаграммы пакетов:

image

Пакеты здесь аналоги будущих модулей в нашем приложении.

Клиент-серверная архитектура

Архитектурно приложение будет являться классическим трехуровневых приложением - фронтенд, бэкенд, база данных. На первом этапе бэкенд и база данных представляют собой статичные json файлы. Затем за них будет отвечать Headless CMS

В связи с тем, что мы разрабатываем SPA, часть бизнес логики будет на фронтенде.

image

Routing

Роутинг используется в том числе и для того, чтобы сделать наши подсистемы слабосвязанными.

На первом этапе нам нужны три маршрута:

  • главная страница
  • товары определенной категории
  • страница определенного товара

Для простоты главную страницу оставим пустой.

+ \ No newline at end of file diff --git a/ru/arty-crafty/analysis/business-analysis.html b/ru/arty-crafty/analysis/business-analysis.html index 0635788eb..fbc83a1f4 100644 --- a/ru/arty-crafty/analysis/business-analysis.html +++ b/ru/arty-crafty/analysis/business-analysis.html @@ -6,13 +6,13 @@ Бизнес-анализ | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Бизнес-анализ

Границы проекта

Наш случай (витрина-магазин-маркетплейс) - довольно распространенный, изученный и проверенный. Есть известные решения и лучшие практики для него - как технические (код), так и в плане подбора нужного функционала.

Если бы заказчиком был некий отдельный клиент, необходимо было бы четко задокументировать с ним в SRS каждый функционал, каждый элемент экрана сайта для избежания дальнейших проблем и претензий с обеих сторон, но так как мы "пишем с натуры", то этот момент можно опустить.

Существующие решения

Есть ли решения, который можно использовать? О бэкенде речь ниже, для фронтенда не было найдено ничего. Vue Storefront мутный продукт, предлагаемый в основном как сервис, да еще и написанный на Nuxt 2. Больше серьезных решений на Vue найдено не было.

Рассмотрим намеченные этапы развития проекта.

Витрина

На начальном этапе пользователь должен иметь возможность просматривать каталог и отдельные продукты. Визуально это означает, что в нашем веб приложении будет секция с каталогом категорий, а так же представление (view) со списком продуктов выбранной категории, и представление с описанием продукта.

С точки зрения потоков данных, веб приложение должно получать информацию о каталоге, о продуктах в определенной категории и о конкретном продукте, что означает три типа запросов к бэкенду.

На первом этапе "бэкенд" будет простыми json файлами, отдаваемыми самим сервером фронтенда.

Данные файлы будут: каталог категорий, пара файлов категорий продуктов, несколько файлов продуктов.

Задача первого этапа - настроить маршрутизацию (vue routing) и сделать возможность просматривать каталог продуктов, получая данные по сети. Данный скелет приложения позволит в дальнейшем наращивать на него функциональность.

Магазин

Здесь потребуется добавление Корзины (Shopping cart) и системы заказов (Orders). На этом этапе (и даже чуть раньше) нужно будет подключать полноценный бэкенд. Мы возьмем какое-нибудь Headless CMS e-commerce решение. Если бы это был просто наш магазин, можно было бы написать свой несложный бэкенд, однако нужна полноценная админка для технически неподкованых продавцов (merchants), а это очень трудоемко.

Со сторонним заказчиком необходимо бы было провести анализ существующих подходящих Headless CMS e-commerce решение с расчетом дальнейших затрат. Мы же ориентируемся на наличие open source решений для этого, например medusa.js, в которых есть возможность работы режиме маркетплейса.

В любом случае, решаем задачи по мере их поступления. Если мы остановимся на невозможности что-то реализовать в силу объективных обстоятельств, то как минимум витрина с возможностью сделать заказ (без онлайн оплаты) у нас будет, а значит исходная задача в необходимой мере будет решена.

Маркетплейс

На фронтенде факторизация по продавцам - это, по сути, выборка по специальному аттрибуту, который есть у каждого продукта. Однако в админке этот функционал намного более обширен. В том числе и поэтому мы ориентируемся на стороннее решение для бэкенда.

Use case диаграмма

Одним из методов решения задач бизнес анализа являются UML диаграммы, в частности, Use case диаграмма.

Use case диаграмма нашего проекта может выглядеть примерно так:

image

Разбивка по этапам очень условна.

Вот более детальный пример Use case диаграммы онлайн магазина:

Use case online store example

image

- +
Skip to content

Бизнес-анализ

Границы проекта

Наш случай (витрина-магазин-маркетплейс) - довольно распространенный, изученный и проверенный. Есть известные решения и лучшие практики для него - как технические (код), так и в плане подбора нужного функционала.

Если бы заказчиком был некий отдельный клиент, необходимо было бы четко задокументировать с ним в SRS каждый функционал, каждый элемент экрана сайта для избежания дальнейших проблем и претензий с обеих сторон, но так как мы "пишем с натуры", то этот момент можно опустить.

Существующие решения

Есть ли решения, который можно использовать? О бэкенде речь ниже, для фронтенда не было найдено ничего. Vue Storefront мутный продукт, предлагаемый в основном как сервис, да еще и написанный на Nuxt 2. Больше серьезных решений на Vue найдено не было.

Рассмотрим намеченные этапы развития проекта.

Витрина

На начальном этапе пользователь должен иметь возможность просматривать каталог и отдельные продукты. Визуально это означает, что в нашем веб приложении будет секция с каталогом категорий, а так же представление (view) со списком продуктов выбранной категории, и представление с описанием продукта.

С точки зрения потоков данных, веб приложение должно получать информацию о каталоге, о продуктах в определенной категории и о конкретном продукте, что означает три типа запросов к бэкенду.

На первом этапе "бэкенд" будет простыми json файлами, отдаваемыми самим сервером фронтенда.

Данные файлы будут: каталог категорий, пара файлов категорий продуктов, несколько файлов продуктов.

Задача первого этапа - настроить маршрутизацию (vue routing) и сделать возможность просматривать каталог продуктов, получая данные по сети. Данный скелет приложения позволит в дальнейшем наращивать на него функциональность.

Магазин

Здесь потребуется добавление Корзины (Shopping cart) и системы заказов (Orders). На этом этапе (и даже чуть раньше) нужно будет подключать полноценный бэкенд. Мы возьмем какое-нибудь Headless CMS e-commerce решение. Если бы это был просто наш магазин, можно было бы написать свой несложный бэкенд, однако нужна полноценная админка для технически неподкованых продавцов (merchants), а это очень трудоемко.

Со сторонним заказчиком необходимо бы было провести анализ существующих подходящих Headless CMS e-commerce решение с расчетом дальнейших затрат. Мы же ориентируемся на наличие open source решений для этого, например medusa.js, в которых есть возможность работы режиме маркетплейса.

В любом случае, решаем задачи по мере их поступления. Если мы остановимся на невозможности что-то реализовать в силу объективных обстоятельств, то как минимум витрина с возможностью сделать заказ (без онлайн оплаты) у нас будет, а значит исходная задача в необходимой мере будет решена.

Маркетплейс

На фронтенде факторизация по продавцам - это, по сути, выборка по специальному аттрибуту, который есть у каждого продукта. Однако в админке этот функционал намного более обширен. В том числе и поэтому мы ориентируемся на стороннее решение для бэкенда.

Use case диаграмма

Одним из методов решения задач бизнес анализа являются UML диаграммы, в частности, Use case диаграмма.

Use case диаграмма нашего проекта может выглядеть примерно так:

image

Разбивка по этапам очень условна.

Вот более детальный пример Use case диаграммы онлайн магазина:

Use case online store example

image

+ \ No newline at end of file diff --git a/ru/arty-crafty/analysis/data-model.html b/ru/arty-crafty/analysis/data-model.html index 7e4a36a2f..dd379c91e 100644 --- a/ru/arty-crafty/analysis/data-model.html +++ b/ru/arty-crafty/analysis/data-model.html @@ -6,13 +6,13 @@ Модель данных | Vue FAQ - + - + - - + + @@ -53,8 +53,8 @@ "description": "...", "icon": "..." } -} - +} + \ No newline at end of file diff --git a/ru/arty-crafty/analysis/research.html b/ru/arty-crafty/analysis/research.html index c906bafdf..cd46fc5e9 100644 --- a/ru/arty-crafty/analysis/research.html +++ b/ru/arty-crafty/analysis/research.html @@ -6,13 +6,13 @@ Анализ рынка | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Анализ рынка

Изучение конкурентов

Исследуем вебсайты других магазинов и маркетплейсов, чтобы изучить, как они выглядят и функционируют.

Сайты-аналоги

Погуглим "best marketplace". Мне выпало в том числе:

Для начала отмечаем, что для фронтенда разница между маркетплейсом и магазином - минимальна. Как функционально, так и в дизайне страницы. В случае маркетплейса на странице товара есть маленькая ссылка на магазин, и есть фильтрация по магазинам, которую можно представлять, как отдельную категорию для каждого магазина. Правда отображение товаров в этой категории отличается от обычных категорий.

Делаем мы на первом этапе витрину, но в уме держим маркетплейс. Мы не должны принимать таких решений, которые бы в будущем заставили сильно рефакторить код. Но, очевидно, что мы можем ориентироваться в дизайне на простые магазины. Расширить потом до маркетплейса будет несложно.

Самый удобный магазин/маркетплейс, с моей точки зрения, Ozon, что подтверждается его успешностью. Его структуру мы и будем копировать.

Совет

Изучать похожие сайты полезно не только для вдохновения по дизайну, но и, например, при выборе наименования того или иного компонента - посмотрите через DevTools какие названия классов используются на аналогичном html блоке у конкурентов.

- +
Skip to content

Анализ рынка

Изучение конкурентов

Исследуем вебсайты других магазинов и маркетплейсов, чтобы изучить, как они выглядят и функционируют.

Сайты-аналоги

Погуглим "best marketplace". Мне выпало в том числе:

Для начала отмечаем, что для фронтенда разница между маркетплейсом и магазином - минимальна. Как функционально, так и в дизайне страницы. В случае маркетплейса на странице товара есть маленькая ссылка на магазин, и есть фильтрация по магазинам, которую можно представлять, как отдельную категорию для каждого магазина. Правда отображение товаров в этой категории отличается от обычных категорий.

Делаем мы на первом этапе витрину, но в уме держим маркетплейс. Мы не должны принимать таких решений, которые бы в будущем заставили сильно рефакторить код. Но, очевидно, что мы можем ориентироваться в дизайне на простые магазины. Расширить потом до маркетплейса будет несложно.

Самый удобный магазин/маркетплейс, с моей точки зрения, Ozon, что подтверждается его успешностью. Его структуру мы и будем копировать.

Совет

Изучать похожие сайты полезно не только для вдохновения по дизайну, но и, например, при выборе наименования того или иного компонента - посмотрите через DevTools какие названия классов используются на аналогичном html блоке у конкурентов.

+ \ No newline at end of file diff --git a/ru/arty-crafty/analysis/tech-stack.html b/ru/arty-crafty/analysis/tech-stack.html index f76ddf7f2..2a13fe4f9 100644 --- a/ru/arty-crafty/analysis/tech-stack.html +++ b/ru/arty-crafty/analysis/tech-stack.html @@ -6,13 +6,13 @@ Технический стек проекта | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Технический стек проекта

Фронтенд должен писаться на Vue 3, Vite. Из обязательных библиотек - vue-router. Действует правило: если можем обойтись без какой-то зависимости - обходимся без нее. Вместо Pinia используется Composition API напрямую.

Используем TypeScript, но в меру. Типизируем только основные сущности и интерфейсы. TypeScript должен облегчать работу разработчика, а не превращать её в кошмар.

CSS3 лучше любого CSS фреймворка/библиотеки, поэтому используем его (SCSS).

ESlint конфигурация от Antony Fu.

Насчет использования библиотек UI компонент - в идеале постараемся иметь только свои компоненты, однако для быстрого прототипирования мы можем задействовать какую-то библиотеку, оборачивая ее компоненты в свои обертки для последующего безболезненного перехода на свой UI kit. То же относится к VueUse.

Для адаптивности мы устанавливаем на тэг body четыре глобальных класса - mobile, tablet, notebook и desktop, в зависимости от разрешения экрана, и используем их в стилях в компонентах. Это намного удобней прямой работы с CSS media query.

- +
Skip to content

Технический стек проекта

Фронтенд должен писаться на Vue 3, Vite. Из обязательных библиотек - vue-router. Действует правило: если можем обойтись без какой-то зависимости - обходимся без нее. Вместо Pinia используется Composition API напрямую.

Используем TypeScript, но в меру. Типизируем только основные сущности и интерфейсы. TypeScript должен облегчать работу разработчика, а не превращать её в кошмар.

CSS3 лучше любого CSS фреймворка/библиотеки, поэтому используем его (SCSS).

ESlint конфигурация от Antony Fu.

Насчет использования библиотек UI компонент - в идеале постараемся иметь только свои компоненты, однако для быстрого прототипирования мы можем задействовать какую-то библиотеку, оборачивая ее компоненты в свои обертки для последующего безболезненного перехода на свой UI kit. То же относится к VueUse.

Для адаптивности мы устанавливаем на тэг body четыре глобальных класса - mobile, tablet, notebook и desktop, в зависимости от разрешения экрана, и используем их в стилях в компонентах. Это намного удобней прямой работы с CSS media query.

+ \ No newline at end of file diff --git a/ru/arty-crafty/analysis/ui-design.html b/ru/arty-crafty/analysis/ui-design.html index a24c4488a..388c856fa 100644 --- a/ru/arty-crafty/analysis/ui-design.html +++ b/ru/arty-crafty/analysis/ui-design.html @@ -6,13 +6,13 @@ UI дизайн | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

UI дизайн

Дизайн сайта

Дизайн в плане визуального оформления сайта - довольно непростая вещь. Вернее, хороший дизайн. Плюс в том, что его всегда можно сделать в самую последнюю очередь.

Пока будем работать над функционалом сайта (в том числе, адаптивностью), а со стилизацией - как будет желание.

Творческие способности

Если вы не сильно творчески одаренный человек, то создать сайт полностью самому вряд ли получится. Это примерно то же, что и написать хорошую картину.

Но в отличие от картины, дизайн сайта можно перенять. Как целиком, так и по частям - главный лэйаут, функционал, типы виджетов, их компоновка, цветовые гаммы, UI компоненты, шрифт, эффекты и многое другое. Может показаться воровством, но представим, что идете вы по улице, и видите дом. Красивый. Рассматриваете кровлю, структуру штукатурки, отделку фундамента. Потом приходите к себе, закупаете стройматериалы, заказываете строительную бригаду, и делаете себе примерно так же, но своё. Воровство?

- +
Skip to content

UI дизайн

Дизайн сайта

Дизайн в плане визуального оформления сайта - довольно непростая вещь. Вернее, хороший дизайн. Плюс в том, что его всегда можно сделать в самую последнюю очередь.

Пока будем работать над функционалом сайта (в том числе, адаптивностью), а со стилизацией - как будет желание.

Творческие способности

Если вы не сильно творчески одаренный человек, то создать сайт полностью самому вряд ли получится. Это примерно то же, что и написать хорошую картину.

Но в отличие от картины, дизайн сайта можно перенять. Как целиком, так и по частям - главный лэйаут, функционал, типы виджетов, их компоновка, цветовые гаммы, UI компоненты, шрифт, эффекты и многое другое. Может показаться воровством, но представим, что идете вы по улице, и видите дом. Красивый. Рассматриваете кровлю, структуру штукатурки, отделку фундамента. Потом приходите к себе, закупаете стройматериалы, заказываете строительную бригаду, и делаете себе примерно так же, но своё. Воровство?

+ \ No newline at end of file diff --git a/ru/arty-crafty/analysis/ui-layout.html b/ru/arty-crafty/analysis/ui-layout.html index f5e1ff89d..3fb32ca25 100644 --- a/ru/arty-crafty/analysis/ui-layout.html +++ b/ru/arty-crafty/analysis/ui-layout.html @@ -6,13 +6,13 @@ UI макет | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

UI макет

Подберем подходящий макет (layout) для нашего сайта. Для этого можно еще раз взглянуть на уже найденные онлайн магазины в интернете.

Основные компоненты страницы

У магазинов обычно лэйаут состоит из четырех частей - header, footer, sidebar слева и центральная панель

image

Сверху будет хедер. Слева в нем будет логотип, в середине - строка поиска, справа элементы входа в личный кабинет, корзина, избранное. Сверху основного хедера можно будет добавить дополнительный сабхедер, с ссылками Снизу основного хедера будет подхедер с меню-каталогом. У нас изначально будет всего несколько пунктов там, но в дальнейшем это можно превратить в мегаменю.

В мобильной версии хедер сильно облегчен.

При показе страницы категории товаров, слева показывается сайдбар с различными фильтрами. В мобильной версии он переносится наверх. Когда показывается страница товара, то меню слева обычно нет.

Main panel

В центральной панели показывается список товаров выбранной категории либо информация о товаре.

Футер - самый простой копонент, в нем функционала практически нет, так что ничем он не примечателен.

Мобильная версия

В мобильной версии внизу появляется отдельное зафиксированное меню с ссылками:

  • Главная
  • Каталог
  • Корзина
  • Избранное
  • Логин/личный кабинет

Сразу отметим, что сайдбар, выезжающий слева в мобильной версии (каталог), это не то же самое, что сайдбар на десктопе (фильтры).

Слабая связанность

Подобное разделение на подсистемы позволяет сохранить между ними слабую связанность. Основная логика подсистемы заключена в ней самой, и с окружающим миром она взаимодействует пока только через router.

В дальнейшем, если понадобиться из одной подсистемы вызвать команду в другой, это, скорей всего, будет делаться через Composable с глобальным стейтом.

Адаптивность

Сайдбар с фильтрами, который то слева, то сверху, легко реализовать через CSS Flexbox. То же самое с различным хедером для основной и мобильной версий. Вообще, всё что можно сделать с помощью CSS, лучше делать с помощью CSS.

Вывод

Таким образом, у нас уже намечены пять компонент, которые мы можем расположить на странице, и она будет адаптивная.

На данный момент все страницы можно технически реализовать через один Layout - MainLayout. Если потом понадобится другое расположение (для страниц заказов, личного кабинета и прочего), мы добавим.

- +
Skip to content

UI макет

Подберем подходящий макет (layout) для нашего сайта. Для этого можно еще раз взглянуть на уже найденные онлайн магазины в интернете.

Основные компоненты страницы

У магазинов обычно лэйаут состоит из четырех частей - header, footer, sidebar слева и центральная панель

image

Сверху будет хедер. Слева в нем будет логотип, в середине - строка поиска, справа элементы входа в личный кабинет, корзина, избранное. Сверху основного хедера можно будет добавить дополнительный сабхедер, с ссылками Снизу основного хедера будет подхедер с меню-каталогом. У нас изначально будет всего несколько пунктов там, но в дальнейшем это можно превратить в мегаменю.

В мобильной версии хедер сильно облегчен.

При показе страницы категории товаров, слева показывается сайдбар с различными фильтрами. В мобильной версии он переносится наверх. Когда показывается страница товара, то меню слева обычно нет.

Main panel

В центральной панели показывается список товаров выбранной категории либо информация о товаре.

Футер - самый простой копонент, в нем функционала практически нет, так что ничем он не примечателен.

Мобильная версия

В мобильной версии внизу появляется отдельное зафиксированное меню с ссылками:

  • Главная
  • Каталог
  • Корзина
  • Избранное
  • Логин/личный кабинет

Сразу отметим, что сайдбар, выезжающий слева в мобильной версии (каталог), это не то же самое, что сайдбар на десктопе (фильтры).

Слабая связанность

Подобное разделение на подсистемы позволяет сохранить между ними слабую связанность. Основная логика подсистемы заключена в ней самой, и с окружающим миром она взаимодействует пока только через router.

В дальнейшем, если понадобиться из одной подсистемы вызвать команду в другой, это, скорей всего, будет делаться через Composable с глобальным стейтом.

Адаптивность

Сайдбар с фильтрами, который то слева, то сверху, легко реализовать через CSS Flexbox. То же самое с различным хедером для основной и мобильной версий. Вообще, всё что можно сделать с помощью CSS, лучше делать с помощью CSS.

Вывод

Таким образом, у нас уже намечены пять компонент, которые мы можем расположить на странице, и она будет адаптивная.

На данный момент все страницы можно технически реализовать через один Layout - MainLayout. Если потом понадобится другое расположение (для страниц заказов, личного кабинета и прочего), мы добавим.

+ \ No newline at end of file diff --git a/ru/arty-crafty/backend/baas-choosing.html b/ru/arty-crafty/backend/baas-choosing.html index a328668a7..a6e7c462a 100644 --- a/ru/arty-crafty/backend/baas-choosing.html +++ b/ru/arty-crafty/backend/baas-choosing.html @@ -6,13 +6,13 @@ Выбор BaaS или CMS | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Выбор BaaS или CMS

JSON файлы товаров

Дальнейшая работа с json файлами продуктов и категорий имеет мало смысла - их придется делать несколько, небольшое изменение схемы потребует изменение всех файлов вручную и т.п.

Проще перейти уже к нормальному бэкенду, с динамичными данными.

Выбор CMS

После довольно долгого исследования рынка для реализации витрины и, частично, магазина, выбор пал на Supabase.

Основными критериями при выборе на этом этапе были:

  • Простота
  • Open source
  • Бесплатность при использовании из облачных сервисов (это нужно не только нам, но и тем, кто будет использовать наш проект)
  • RDBMS (SQL) в качестве базы данных (почему не подошел Firebase)
  • Возможность потом несложно переехать на другой сервис/БД/свой сервер.

Большинство CMS продуктов предлагает платные low-code решения, завязанные на них и оперирующие не с данными, как нам надо, а с более высокоуровневыми конструкциями для построения сайта.

Среди Baas (Backend as a Service) решений были рассмотрены Firebase, Appwrite, Supabase, Amplify.

Модель данных обычного магазина очень хорошо ложится именно на реляционную модель данных, уже давно хорошо зарекомендовавшую себя, в отличие от NoSQL.

Сервисы Supabase

Supabase предлагает непосредственно Postgres базу данных (можно подсоединяться прямо к ней), API сервис для доступа к базе данных посредством REST запросов, сервис для парольной и OAuth аутентификаций, Edge Functions (серверные функции), на которых можно реализовать логику бэкенда. Лимиты бесплатного плана достаточно большие.

В дальнейшем возможно разворачивание Postgres на своем сервере и использование Supabase кода через Docker, либо своего API слоя. При желании можно будет даже поменять базу на MySQL. Всё это очень важная гибкость выстраиваемой архитектуры. Если мы чего-то не учтем сейчас, или ошибемся, то потом можно будет внести изменения с некритичными затратами.

Адаптеры

Мы помним, что одним из факторов успеха при создании сложной системы является её разбиение на слабосвязные более простые подсистемы. Конкретно тут мы имеем подсистемы "База данных", "Бэкенд (API сервис Supabase)", наш фронтенд.

Компоненты фронтенда должны обмениваться данными с API Supabase. Если мы в каждом компоненте будем прописывать обращение к API через Fetch или Axios, то при замене Supabase на другой бэкенд, или на наш свой, по всему коду фронтенда надо будет делать изменения, что очень затратно. Для нивелирования этого вызовы к API выносятся в отдельный модуль - api, и теперь в компонентах будет только вызов api.products(), который при смене бэкенда менять не надо, нужно будет поменять только его реализацию в api.

В этом случае, мы применяем шаблон проектирования "Адаптер". При работе, например, с Firebase нам нужно будет написать другой адаптер, при работе со своим бэкендом - еще один. Каждый из них будет преобразовывать запрос к определенному эндпойнту за списком товаров в массив для возвращения в функции api.products().

Когда делают системы широкого пользования, то предусматривают подключение к различным сервисам. Например, тот же Vue Storefront имеет адаптеры для интеграции с API бэкендов Magento, PrestaShop, Spree и других ecommerce решений.

image

Но у нас пока только Supabase, концентрируемся на нём.

- +
Skip to content

Выбор BaaS или CMS

JSON файлы товаров

Дальнейшая работа с json файлами продуктов и категорий имеет мало смысла - их придется делать несколько, небольшое изменение схемы потребует изменение всех файлов вручную и т.п.

Проще перейти уже к нормальному бэкенду, с динамичными данными.

Выбор CMS

После довольно долгого исследования рынка для реализации витрины и, частично, магазина, выбор пал на Supabase.

Основными критериями при выборе на этом этапе были:

  • Простота
  • Open source
  • Бесплатность при использовании из облачных сервисов (это нужно не только нам, но и тем, кто будет использовать наш проект)
  • RDBMS (SQL) в качестве базы данных (почему не подошел Firebase)
  • Возможность потом несложно переехать на другой сервис/БД/свой сервер.

Большинство CMS продуктов предлагает платные low-code решения, завязанные на них и оперирующие не с данными, как нам надо, а с более высокоуровневыми конструкциями для построения сайта.

Среди Baas (Backend as a Service) решений были рассмотрены Firebase, Appwrite, Supabase, Amplify.

Модель данных обычного магазина очень хорошо ложится именно на реляционную модель данных, уже давно хорошо зарекомендовавшую себя, в отличие от NoSQL.

Сервисы Supabase

Supabase предлагает непосредственно Postgres базу данных (можно подсоединяться прямо к ней), API сервис для доступа к базе данных посредством REST запросов, сервис для парольной и OAuth аутентификаций, Edge Functions (серверные функции), на которых можно реализовать логику бэкенда. Лимиты бесплатного плана достаточно большие.

В дальнейшем возможно разворачивание Postgres на своем сервере и использование Supabase кода через Docker, либо своего API слоя. При желании можно будет даже поменять базу на MySQL. Всё это очень важная гибкость выстраиваемой архитектуры. Если мы чего-то не учтем сейчас, или ошибемся, то потом можно будет внести изменения с некритичными затратами.

Адаптеры

Мы помним, что одним из факторов успеха при создании сложной системы является её разбиение на слабосвязные более простые подсистемы. Конкретно тут мы имеем подсистемы "База данных", "Бэкенд (API сервис Supabase)", наш фронтенд.

Компоненты фронтенда должны обмениваться данными с API Supabase. Если мы в каждом компоненте будем прописывать обращение к API через Fetch или Axios, то при замене Supabase на другой бэкенд, или на наш свой, по всему коду фронтенда надо будет делать изменения, что очень затратно. Для нивелирования этого вызовы к API выносятся в отдельный модуль - api, и теперь в компонентах будет только вызов api.products(), который при смене бэкенда менять не надо, нужно будет поменять только его реализацию в api.

В этом случае, мы применяем шаблон проектирования "Адаптер". При работе, например, с Firebase нам нужно будет написать другой адаптер, при работе со своим бэкендом - еще один. Каждый из них будет преобразовывать запрос к определенному эндпойнту за списком товаров в массив для возвращения в функции api.products().

Когда делают системы широкого пользования, то предусматривают подключение к различным сервисам. Например, тот же Vue Storefront имеет адаптеры для интеграции с API бэкендов Magento, PrestaShop, Spree и других ecommerce решений.

image

Но у нас пока только Supabase, концентрируемся на нём.

+ \ No newline at end of file diff --git a/ru/arty-crafty/backend/db-data-model.html b/ru/arty-crafty/backend/db-data-model.html index edb6ea7cc..50d4c1765 100644 --- a/ru/arty-crafty/backend/db-data-model.html +++ b/ru/arty-crafty/backend/db-data-model.html @@ -6,13 +6,13 @@ Модель данных в базе данных | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности products и categories. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

В реляционных базах данных такие отношения делаются отдельной таблицей, которая хранит связи между товарами и категориями.

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Categories table

image

Products table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у products есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы, естественно, захотим искать по полному описанию товара, который находится в поле data таблицы products. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое. Таким образом, хранение данных в json полях не ограничивает функционал реляционных баз данных.

- +
Skip to content

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности products и categories. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

В реляционных базах данных такие отношения делаются отдельной таблицей, которая хранит связи между товарами и категориями.

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Categories table

image

Products table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у products есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы, естественно, захотим искать по полному описанию товара, который находится в поле data таблицы products. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое. Таким образом, хранение данных в json полях не ограничивает функционал реляционных баз данных.

+ \ No newline at end of file diff --git a/ru/arty-crafty/backend/hoppscotch.html b/ru/arty-crafty/backend/hoppscotch.html index acc38dc7b..2db7d8290 100644 --- a/ru/arty-crafty/backend/hoppscotch.html +++ b/ru/arty-crafty/backend/hoppscotch.html @@ -6,13 +6,13 @@ Hoppscotch | Vue FAQ - + - + - - + + @@ -47,8 +47,8 @@ curl --request GET \ --url 'https://client_id.supabase.co/rest/v1/products?select=id,title,desc,data&id=eq.2' \ --header 'Authorization: Bearer $apiKey$' \ - --header 'apikey: $apiKey$'

Второй запрос - это LEFT JOIN на таблицах categories и products. К сожалению документация Supabase не очень детально описывает join-ы, пришлось поэкспериментировать.

- + --header 'apikey: $apiKey$'

Второй запрос - это LEFT JOIN на таблицах categories и products. К сожалению документация Supabase не очень детально описывает join-ы, пришлось поэкспериментировать.

+ \ No newline at end of file diff --git a/ru/arty-crafty/backend/supabase-api.html b/ru/arty-crafty/backend/supabase-api.html index ae7fefa00..410b3c279 100644 --- a/ru/arty-crafty/backend/supabase-api.html +++ b/ru/arty-crafty/backend/supabase-api.html @@ -6,13 +6,13 @@ Supabase REST API | Vue FAQ - + - + - - + + @@ -66,8 +66,8 @@ curl -X DELETE 'https://client_id.supabase.co/rest/v1/products?some_column=eq.someValue' \ -H "apikey: SUPABASE_CLIENT_ANON_KEY" \ --H "Authorization: Bearer SUPABASE_CLIENT_ANON_KEY"

Мы будем использовать второй способ, - опять же, чтобы не внедрять необязательные зависимости. Плюс, дебажить явные HTTP запросы намного проще.

Доступ через REST API использует библиотеку PostgREST, написанную на Haskell. На её сайте можно ознакомиться с богатым синтаксисом возможных запросов.

Таким образом, на данный момент мы используем Postgres базу данных и PostgREST библиотеку/сервер. От самой Supabase пока что только удобная админка для управления БД.

- +-H "Authorization: Bearer SUPABASE_CLIENT_ANON_KEY"

Мы будем использовать второй способ, - опять же, чтобы не внедрять необязательные зависимости. Плюс, дебажить явные HTTP запросы намного проще.

Доступ через REST API использует библиотеку PostgREST, написанную на Haskell. На её сайте можно ознакомиться с богатым синтаксисом возможных запросов.

Таким образом, на данный момент мы используем Postgres базу данных и PostgREST библиотеку/сервер. От самой Supabase пока что только удобная админка для управления БД.

+ \ No newline at end of file diff --git a/ru/arty-crafty/backend/supabase.html b/ru/arty-crafty/backend/supabase.html index 65ed5734a..e6607a9ef 100644 --- a/ru/arty-crafty/backend/supabase.html +++ b/ru/arty-crafty/backend/supabase.html @@ -6,13 +6,13 @@ Supabase | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Supabase

Создание проекта

Зарегистрироваться и создать проект на Supabase достаточно несложно. После регистрации предоставляется два API ключа. Один - рутовский secret, и второй - public, для обычного доступа к REST API. В дальнейшем будем говорить только о ключе public.

image

Безопасность и доступ

Доступ к таблицам в базе данных Supabase регулируется ключом и политиками (policies). При отсутствий политик, зная ключ через REST API можно выполнять основные CRUD SQL запросы. Соответственно, если мы делаем запрос, скажем, к таблице product с фронтенда, то ключ будет в бандле приложения, и вытащить его и запустить другие запросы не составит труда.

Соответственно, необходимо разрешить использование ключа для REST запросов только на чтение (select). Делается это созданием соответствующей политики у таблицы.

image

Этого вполне достаточно для варианта "Витрина", в котором не нужно размещать заказы, создавать пользователей и прочее. В дальнейшем, при необходимости записи в базу данных, придется использовать свой слой бэкенда либо иное решение.

Если использовать сервис аутентификации Supabase, то возможно создавать политики для зарегистрированных пользователей - то есть, например, позволить работать со своим профилем, личным кабинетом, заказами. Но для лучшей безопасности лучше все-таки, всё это пропускать через свой бэкенд.

- +
Skip to content

Supabase

Создание проекта

Зарегистрироваться и создать проект на Supabase достаточно несложно. После регистрации предоставляется два API ключа. Один - рутовский secret, и второй - public, для обычного доступа к REST API. В дальнейшем будем говорить только о ключе public.

image

Безопасность и доступ

Доступ к таблицам в базе данных Supabase регулируется ключом и политиками (policies). При отсутствий политик, зная ключ через REST API можно выполнять основные CRUD SQL запросы. Соответственно, если мы делаем запрос, скажем, к таблице product с фронтенда, то ключ будет в бандле приложения, и вытащить его и запустить другие запросы не составит труда.

Соответственно, необходимо разрешить использование ключа для REST запросов только на чтение (select). Делается это созданием соответствующей политики у таблицы.

image

Этого вполне достаточно для варианта "Витрина", в котором не нужно размещать заказы, создавать пользователей и прочее. В дальнейшем, при необходимости записи в базу данных, придется использовать свой слой бэкенда либо иное решение.

Если использовать сервис аутентификации Supabase, то возможно создавать политики для зарегистрированных пользователей - то есть, например, позволить работать со своим профилем, личным кабинетом, заказами. Но для лучшей безопасности лучше все-таки, всё это пропускать через свой бэкенд.

+ \ No newline at end of file diff --git a/ru/arty-crafty/index.html b/ru/arty-crafty/index.html index 16fd19bf2..7a6f1ffeb 100644 --- a/ru/arty-crafty/index.html +++ b/ru/arty-crafty/index.html @@ -6,13 +6,13 @@ Онлайн маркетплейс | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Онлайн маркетплейс

Проект Arty-Crafty

Здесь будет описываться процесс разработки онлайн маркетплейса. Разработка будет вестись поэтапно: витрина => магазин => маркетплейс. В некотором виде, туториал создания программного продукта от начала и до конца (какого-то). Репозиторий проекта.

Причины

Однажды я познакомился с мастером, которая вязала вот такие очень красивые интерьерные игрушки:

игрушки

image

Предложил ей сделать в интернете выставочную витрину. Однако когда я попытался найти готовые или полуготовые удобные современные open source решения для этого, оказалось, что их нет. Были опробованы headless e-commerce решения, вроде medusajs, и фронтенды типа VueStorefront, однако единственное, что нормально смогло заработать без значительных вложений времени и средств, был старый добрый php-ный OpenCart. И то, сразу же возникли проблемы при импорте данных.

Так появилось решение об этом проекте.

Цель

Создать e-commerce софт, который можно потом будет легко кастомизировать и настраивать для работы с любыми CMS, выйти на IPO и заработать много миллионов денег. Ниша свободна. Попутно сделать витрину/магазин для игрушек.

Также проект хорошо подходит как сайд или пет-проект, для обучения и развития, так что можно присоединяться к разработке.

Что здесь будет?

Описание организации проекта, его основных этапов, ключевых действий, объяснение причин принятия тех или иных решений. Здесь кода особо не будет (в репозитории). Будут CMV (coding music video).

Youtube-ов не планируется, монетизация от "курсов" не предусмотрена. Фидбеки, вопросы и советы можно оставлять в Telegram в комментариях.

Для чего?

В приличных вузах аспиранты обязаны заниматься преподавательской деятельностью. Подготовка материала и "проговаривание" его другим даёт возможность достичь более глубокого уровня понимания предмета. Поэтому польза тут обоюдная.


Замечание

Основная цель данного проекта - создать продукт высокого качества. Образовательный аспект - попутный. Поэтому стратегии: "Сперва сделаем плохо, а потом будем улучшать", не будет. Сразу делаем хорошо.


image

- +
Skip to content

Онлайн маркетплейс

Проект Arty-Crafty

Здесь будет описываться процесс разработки онлайн маркетплейса. Разработка будет вестись поэтапно: витрина => магазин => маркетплейс. В некотором виде, туториал создания программного продукта от начала и до конца (какого-то). Репозиторий проекта.

Причины

Однажды я познакомился с мастером, которая вязала вот такие очень красивые интерьерные игрушки:

игрушки

image

Предложил ей сделать в интернете выставочную витрину. Однако когда я попытался найти готовые или полуготовые удобные современные open source решения для этого, оказалось, что их нет. Были опробованы headless e-commerce решения, вроде medusajs, и фронтенды типа VueStorefront, однако единственное, что нормально смогло заработать без значительных вложений времени и средств, был старый добрый php-ный OpenCart. И то, сразу же возникли проблемы при импорте данных.

Так появилось решение об этом проекте.

Цель

Создать e-commerce софт, который можно потом будет легко кастомизировать и настраивать для работы с любыми CMS, выйти на IPO и заработать много миллионов денег. Ниша свободна. Попутно сделать витрину/магазин для игрушек.

Также проект хорошо подходит как сайд или пет-проект, для обучения и развития, так что можно присоединяться к разработке.

Что здесь будет?

Описание организации проекта, его основных этапов, ключевых действий, объяснение причин принятия тех или иных решений. Здесь кода особо не будет (в репозитории). Будут CMV (coding music video).

Youtube-ов не планируется, монетизация от "курсов" не предусмотрена. Фидбеки, вопросы и советы можно оставлять в Telegram в комментариях.

Для чего?

В приличных вузах аспиранты обязаны заниматься преподавательской деятельностью. Подготовка материала и "проговаривание" его другим даёт возможность достичь более глубокого уровня понимания предмета. Поэтому польза тут обоюдная.


Замечание

Основная цель данного проекта - создать продукт высокого качества. Образовательный аспект - попутный. Поэтому стратегии: "Сперва сделаем плохо, а потом будем улучшать", не будет. Сразу делаем хорошо.


image

+ \ No newline at end of file diff --git a/ru/arty-crafty/introduction/development-stages.html b/ru/arty-crafty/introduction/development-stages.html index a3ca0a3ac..3d60def20 100644 --- a/ru/arty-crafty/introduction/development-stages.html +++ b/ru/arty-crafty/introduction/development-stages.html @@ -6,13 +6,13 @@ План работы | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

План работы

Стадии разработки ПО

Классически разработка программного обеспечения состоит из следующих шагов (software development lifecycle - SDLC):

  1. Бизнес-анализ
  2. Архитектура и дизайн
  3. Разработка
  4. Развертывание
  5. Тестирование и QA
  6. Документирование
  7. Поддержка

С пятого шага можно вернуться на второй или третий для корректировки требований и плана, и таких итераций может быть много.

Рассмотрим каждую стадию отдельно.

Бизнес-анализ

Цель данной стадии в том, чтобы изучить представление заказчика о том, что он хочет получить, и перевести его на язык, понятный разработчикам. Даже если клиент и разработчик - это вы. Проблема кроется в восприятии, терминах и понятийном аппарате в целом. Недопонимание может привести к нарушению сроков, «раздутому» бюджету проекта и несоответствию результата целям бизнеса.

В процессе работы аналитика, как интерпретатора с языка бизнеса на язык IT, как правило, возникают следующие артефакты:

  • Видение проекта. Определяются границы проекта.
  • Скоуп задач. Позволяет определить, кто и какие задачи будет выполнять.
  • Описание сущностей. Описание логических связей между сущностями, потоков данных.
  • Диаграммы. Используются для наглядного описания процессов, алгоритмов, взаимосвязей между сущностями и т.д.
  • Описание поведения UI интерфейса. Нужно для более чёткого понимания, как работает интерфейс, какие существуют правила и как обрабатываются альтернативные сценарии.
  • Нефункциональные требования. Касаются производительности, безопасности и т.д.
  • Пользовательская документация. Объясняет, как пользователю использовать программу.

Архитектура и дизайн

Архитектура системы описывает ее основные компоненты, их взаимосвязи и способы взаимодействия друг с другом.

Она определяет структурированное решение, удовлетворяющее всем техническим и эксплуатационным требованиям, оптимизируя при этом общие атрибуты качества, такие как производительность и безопасность.

Кроме того, она включает в себя набор важных решений, связанных с разработкой программного обеспечения, и каждое из этих решений может оказать значительное влияние на качество, сопровождаемость, производительность и общий успех конечного продукта. Эти решения включают в себя:

  • Выбор основных структурных элементов и их интерфейсов, из которых состоит система.
  • Поведение, определяемое взаимодействием между этими элементами.
  • Объединение этих структурных и поведенческих элементов в бОльшую подсистему.
  • Согласование архитектурных решений с бизнес-целями.
  • Архитектурное руководство по стилю (style guide) для дальнейшей разработки.

Хорошая архитектура позволяет комфортно разрабатывать проект и удобно поддерживать и модифицировать его в долгосрочной перспективе.

Дизайн программной системы предусматривает разработку спецификации (software requirements specification - SRS), которая описывает элементы системы, их соответствие и совместную работу для выполнения требований, предъявляемых к системе. Дизайн выполняет роль чертежа в процессе разработки.

Разработка

Разработка включает в себя реализацию поставленных в спецификации задач.

Развертывание

Развертывание на сервере. CI/CD для автоматизации не только доставки, билда и деплоя, но и тестирования, бэкапа, версионности.

Тестирование и QA

Тестирование на первом этапе ручное, после - интеграционные (e2e) тесты.

Документирование

Данное руководство будет служить документацией, пока не понадобится отдельная.

Поддержка

Поддержка включает в себя не только оказание помощи пользователям и исправление ошибок, но и получение обратной связи от них с целью улучшения продукта.

- +
Skip to content

План работы

Стадии разработки ПО

Классически разработка программного обеспечения состоит из следующих шагов (software development lifecycle - SDLC):

  1. Бизнес-анализ
  2. Архитектура и дизайн
  3. Разработка
  4. Развертывание
  5. Тестирование и QA
  6. Документирование
  7. Поддержка

С пятого шага можно вернуться на второй или третий для корректировки требований и плана, и таких итераций может быть много.

Рассмотрим каждую стадию отдельно.

Бизнес-анализ

Цель данной стадии в том, чтобы изучить представление заказчика о том, что он хочет получить, и перевести его на язык, понятный разработчикам. Даже если клиент и разработчик - это вы. Проблема кроется в восприятии, терминах и понятийном аппарате в целом. Недопонимание может привести к нарушению сроков, «раздутому» бюджету проекта и несоответствию результата целям бизнеса.

В процессе работы аналитика, как интерпретатора с языка бизнеса на язык IT, как правило, возникают следующие артефакты:

  • Видение проекта. Определяются границы проекта.
  • Скоуп задач. Позволяет определить, кто и какие задачи будет выполнять.
  • Описание сущностей. Описание логических связей между сущностями, потоков данных.
  • Диаграммы. Используются для наглядного описания процессов, алгоритмов, взаимосвязей между сущностями и т.д.
  • Описание поведения UI интерфейса. Нужно для более чёткого понимания, как работает интерфейс, какие существуют правила и как обрабатываются альтернативные сценарии.
  • Нефункциональные требования. Касаются производительности, безопасности и т.д.
  • Пользовательская документация. Объясняет, как пользователю использовать программу.

Архитектура и дизайн

Архитектура системы описывает ее основные компоненты, их взаимосвязи и способы взаимодействия друг с другом.

Она определяет структурированное решение, удовлетворяющее всем техническим и эксплуатационным требованиям, оптимизируя при этом общие атрибуты качества, такие как производительность и безопасность.

Кроме того, она включает в себя набор важных решений, связанных с разработкой программного обеспечения, и каждое из этих решений может оказать значительное влияние на качество, сопровождаемость, производительность и общий успех конечного продукта. Эти решения включают в себя:

  • Выбор основных структурных элементов и их интерфейсов, из которых состоит система.
  • Поведение, определяемое взаимодействием между этими элементами.
  • Объединение этих структурных и поведенческих элементов в бОльшую подсистему.
  • Согласование архитектурных решений с бизнес-целями.
  • Архитектурное руководство по стилю (style guide) для дальнейшей разработки.

Хорошая архитектура позволяет комфортно разрабатывать проект и удобно поддерживать и модифицировать его в долгосрочной перспективе.

Дизайн программной системы предусматривает разработку спецификации (software requirements specification - SRS), которая описывает элементы системы, их соответствие и совместную работу для выполнения требований, предъявляемых к системе. Дизайн выполняет роль чертежа в процессе разработки.

Разработка

Разработка включает в себя реализацию поставленных в спецификации задач.

Развертывание

Развертывание на сервере. CI/CD для автоматизации не только доставки, билда и деплоя, но и тестирования, бэкапа, версионности.

Тестирование и QA

Тестирование на первом этапе ручное, после - интеграционные (e2e) тесты.

Документирование

Данное руководство будет служить документацией, пока не понадобится отдельная.

Поддержка

Поддержка включает в себя не только оказание помощи пользователям и исправление ошибок, но и получение обратной связи от них с целью улучшения продукта.

+ \ No newline at end of file diff --git a/ru/arty-crafty/introduction/goals.html b/ru/arty-crafty/introduction/goals.html index b3065a278..55cab3572 100644 --- a/ru/arty-crafty/introduction/goals.html +++ b/ru/arty-crafty/introduction/goals.html @@ -6,13 +6,13 @@ Цели и задачи проекта | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Цели и задачи проекта

Цели данного проекта:

  1. Постепенное построение продукта: начиная с витрины с простым статичным бэкендом в форме json файлов и заканчивая полноценным маркетплейсом со сторонним headless e-commerce решением.
  2. При разработке должны использоваться последние проверенные достижения Vue.js экосистемы и лучшие практики в разработке программного обеспечения.
  3. Проект должен быть примером грамотной реализации проекта по разработке ПО, начиная с архитектуры и заканчивая кодом.
  4. Программная система должна быть удобна для использования, кастомизации и развертывания для человека, не знакомого с Vue, - то есть, представлять из себя продукт для конечного пользователя.

Нефункциональные требования (software quality attributes)

  1. Высокий UX
  2. Производительность
  3. Безопасность
  4. Функциональность
  5. Расширяемость
  6. Понятный задокументированный чистый код, использование лучших практик

Общие функциональные требования

  1. PWA
  2. Глубоко настраиваемые темы. Как общие, так и для каждого магазина маркетплейса.
  3. i18n (интернационализация)

Этапы развития приложения (приблизительно)

  1. Витрина (показ каталога категорий и товаров из них)
  2. Бэкенд и база данных
  3. Поиск по товарам, маркетплейс (отдельные магазины)
  4. UI/UX
  5. Интеграция с E-commerce headless решением
  6. Аутентификация и авторизация
  7. Корзина для покупок, оформление заказов, личный кабинет покупателя
  8. Добавление различного функционала: методы оплаты, доставки, рейтинги товаров, отзывы покупателей, customer service
  9. SEO оптимизация
  10. Административная панель для магазинов маркетплейса

Разработка будет вестись постепенно, по этапам, описанным выше. После каждого этапа должно получаться рабочее (продуктовое) приложение. Разбиение большой задачи на небольшие подзадачи и всего процесса стадии сильно упрощает управление проектом и повышает вероятность итогового положительного исхода.

- +
Skip to content

Цели и задачи проекта

Цели данного проекта:

  1. Постепенное построение продукта: начиная с витрины с простым статичным бэкендом в форме json файлов и заканчивая полноценным маркетплейсом со сторонним headless e-commerce решением.
  2. При разработке должны использоваться последние проверенные достижения Vue.js экосистемы и лучшие практики в разработке программного обеспечения.
  3. Проект должен быть примером грамотной реализации проекта по разработке ПО, начиная с архитектуры и заканчивая кодом.
  4. Программная система должна быть удобна для использования, кастомизации и развертывания для человека, не знакомого с Vue, - то есть, представлять из себя продукт для конечного пользователя.

Нефункциональные требования (software quality attributes)

  1. Высокий UX
  2. Производительность
  3. Безопасность
  4. Функциональность
  5. Расширяемость
  6. Понятный задокументированный чистый код, использование лучших практик

Общие функциональные требования

  1. PWA
  2. Глубоко настраиваемые темы. Как общие, так и для каждого магазина маркетплейса.
  3. i18n (интернационализация)

Этапы развития приложения (приблизительно)

  1. Витрина (показ каталога категорий и товаров из них)
  2. Бэкенд и база данных
  3. Поиск по товарам, маркетплейс (отдельные магазины)
  4. UI/UX
  5. Интеграция с E-commerce headless решением
  6. Аутентификация и авторизация
  7. Корзина для покупок, оформление заказов, личный кабинет покупателя
  8. Добавление различного функционала: методы оплаты, доставки, рейтинги товаров, отзывы покупателей, customer service
  9. SEO оптимизация
  10. Административная панель для магазинов маркетплейса

Разработка будет вестись постепенно, по этапам, описанным выше. После каждого этапа должно получаться рабочее (продуктовое) приложение. Разбиение большой задачи на небольшие подзадачи и всего процесса стадии сильно упрощает управление проектом и повышает вероятность итогового положительного исхода.

+ \ No newline at end of file diff --git a/ru/arty-crafty/introduction/repository.html b/ru/arty-crafty/introduction/repository.html index c0b3cd833..5f900675f 100644 --- a/ru/arty-crafty/introduction/repository.html +++ b/ru/arty-crafty/introduction/repository.html @@ -6,13 +6,13 @@ Репозиторий и сайт проекта | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ - - + + \ No newline at end of file diff --git a/ru/arty-crafty/showcase-data/api-service-adapter.html b/ru/arty-crafty/showcase-data/api-service-adapter.html index d4fcc05c1..2fa54da6c 100644 --- a/ru/arty-crafty/showcase-data/api-service-adapter.html +++ b/ru/arty-crafty/showcase-data/api-service-adapter.html @@ -6,13 +6,13 @@ Работа с API на фронтенде | Vue FAQ - + - + - - + + @@ -45,8 +45,8 @@ },

Ну и запрос информации о товаре:

js
async product(id: number) {
   const data = await http.get(`${SB}/products?select=id,title,summary,data&id=eq.${id}`);
   return data[0] ?? null;
-},

Как видно, вынос транспортной логики в отдельный сервис сильно облегчает работу при замене бэкенда и делает код в основном приложении чище и понятней.

- +},

Как видно, вынос транспортной логики в отдельный сервис сильно облегчает работу при замене бэкенда и делает код в основном приложении чище и понятней.

+ \ No newline at end of file diff --git a/ru/arty-crafty/showcase-data/mobile-menu.html b/ru/arty-crafty/showcase-data/mobile-menu.html index 8ab3089ea..1ddcbc388 100644 --- a/ru/arty-crafty/showcase-data/mobile-menu.html +++ b/ru/arty-crafty/showcase-data/mobile-menu.html @@ -6,13 +6,13 @@ Мобильное меню, CSS | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Мобильное меню, CSS

IconButton

В мобильном виде обычно на подобных сайтах есть нижнее меню. Кнопки с иконками тут сильно похожи на те, что используются в главном хедере, значит пора выделить их в отдельный компонент BaseIconButton. При создании базовых UI компонент есть искушение сделать его как можно универсальней, со множеством опций, но лучше делать самое необходимое с возможностью расширения позже. В нашем случае добавим только badge.

image

Заменяем в AppHeader кнопки на BaseIconButton.

SCSS => CSS

От SCSS мы используем только nesting (вкладывание селекторов друг в друга). Эта удобная фунциональность уже часть современного CSS, поддерживается последними версиями всех браузеров, но общая поддержка около 90%. Через полгода-год уже должна быть достаточная поддержка браузерами, чтобы мы использовали чистый CSS.

Перейдем на него уже сейчас, и будем использовать postcss-nesting пакет для преобразования CSS с nesting в простой CSS. Это позволит в будущем просто убрать этот пакет из проекта, не меняя код. В противном случае при переходе надо будет немного править каждый блок SCSS в каждом SFC.

Итак, убираем из зависимостей пакет sass, добавляем postcss-nesting, в каждом SFC файле убираем lang="scss", и заменяем двуслешные // ... комментарии SCSS на /* ... */ комментарии CSS. Всё работает.

Есть небольшая терпимая проблема с подсветкой CSS с nesting в VS Code, но есть и "плюс" - теперь по селектору из блока стилей можно по SHIFT+F12 попасть в нужное место в шаблоне. С SCSS это было нельзя.

Tag и CMV

Загружаем в репозиторий и ставим тэг - v0.4

Coding music video

- +
Skip to content

Мобильное меню, CSS

IconButton

В мобильном виде обычно на подобных сайтах есть нижнее меню. Кнопки с иконками тут сильно похожи на те, что используются в главном хедере, значит пора выделить их в отдельный компонент BaseIconButton. При создании базовых UI компонент есть искушение сделать его как можно универсальней, со множеством опций, но лучше делать самое необходимое с возможностью расширения позже. В нашем случае добавим только badge.

image

Заменяем в AppHeader кнопки на BaseIconButton.

SCSS => CSS

От SCSS мы используем только nesting (вкладывание селекторов друг в друга). Эта удобная фунциональность уже часть современного CSS, поддерживается последними версиями всех браузеров, но общая поддержка около 90%. Через полгода-год уже должна быть достаточная поддержка браузерами, чтобы мы использовали чистый CSS.

Перейдем на него уже сейчас, и будем использовать postcss-nesting пакет для преобразования CSS с nesting в простой CSS. Это позволит в будущем просто убрать этот пакет из проекта, не меняя код. В противном случае при переходе надо будет немного править каждый блок SCSS в каждом SFC.

Итак, убираем из зависимостей пакет sass, добавляем postcss-nesting, в каждом SFC файле убираем lang="scss", и заменяем двуслешные // ... комментарии SCSS на /* ... */ комментарии CSS. Всё работает.

Есть небольшая терпимая проблема с подсветкой CSS с nesting в VS Code, но есть и "плюс" - теперь по селектору из блока стилей можно по SHIFT+F12 попасть в нужное место в шаблоне. С SCSS это было нельзя.

Tag и CMV

Загружаем в репозиторий и ставим тэг - v0.4

Coding music video

+ \ No newline at end of file diff --git a/ru/arty-crafty/showcase/codeium.html b/ru/arty-crafty/showcase/codeium.html index 6c7dd5244..d01f694fa 100644 --- a/ru/arty-crafty/showcase/codeium.html +++ b/ru/arty-crafty/showcase/codeium.html @@ -6,13 +6,13 @@ Codeium | Vue FAQ - + - + - - + + @@ -41,8 +41,8 @@ */ function listFavourites(): Array<number> { return Array.from(favourites.value); -}

Добавились типы и сгенерился JSDoc, который можно получить используя только команду Generate JSDoc.

Теперь если в месте использования функции мы наведем курсор на неё, получим полное описание:

image

Explain даёт текстовое объяснение функции:

This code defines a function called listFavourites that returns a list of favorite product IDs. The function uses the Array.from method to convert the favourites.value array-like object into a proper array. The function has a return type annotation of Array<number>, indicating that it returns an array of numbers.

Explain problem

При подчеркивании ошибки ESlint-ом Codeium часто предлагает опцию Explain problem, в которой будет не только объяснение ошибки, но и генерация "правильного" кода. С ошибками TypeScript работает очень неплохо.

Вывод

Codeium - не панацея, если не умеешь программировать, но экономит много времени, если что-то умеешь.

- +}

Добавились типы и сгенерился JSDoc, который можно получить используя только команду Generate JSDoc.

Теперь если в месте использования функции мы наведем курсор на неё, получим полное описание:

image

Explain даёт текстовое объяснение функции:

This code defines a function called listFavourites that returns a list of favorite product IDs. The function uses the Array.from method to convert the favourites.value array-like object into a proper array. The function has a return type annotation of Array<number>, indicating that it returns an array of numbers.

Explain problem

При подчеркивании ошибки ESlint-ом Codeium часто предлагает опцию Explain problem, в которой будет не только объяснение ошибки, но и генерация "правильного" кода. С ошибками TypeScript работает очень неплохо.

Вывод

Codeium - не панацея, если не умеешь программировать, но экономит много времени, если что-то умеешь.

+ \ No newline at end of file diff --git a/ru/arty-crafty/showcase/customization.html b/ru/arty-crafty/showcase/customization.html index 7f0934795..4b0560dd5 100644 --- a/ru/arty-crafty/showcase/customization.html +++ b/ru/arty-crafty/showcase/customization.html @@ -6,13 +6,13 @@ Кастомизация | Vue FAQ - + - + - - + + @@ -34,26 +34,26 @@ -
Skip to content

Кастомизация

Персонализация

Заменим везде имя на "Arty-Crafty", изменим описание в package.json. Найдем в интернете подходящую иконку для логотипа, и заменим штатную.

Теперь скроем сайдбар в tablet и desktop режимах, потому что в нем должен быть каталог только в мобильном режиме. Для других каталог будет из меню в хедере.

Далее, мы будем делать приложение в модульной архитектуре. Общие компоненты, утилиты, композаблы и ресурсы у нас будут в модуле app, то, что относится к каталогу, категориям товаров и самим товарам - в products, и так далее. Поэтому нужно в src создать дирректорию app и перенести всё в неё, с заменой путей, где надо.

Загружаем все на GitHub и ставим тэг - v0.1. Для этого нужно опубликовать релиз.

Views

Чистим главную страницу, i18n убираем пока подальше. Переименовываем основные view на:

  • HomeView (остается)
  • ProductCategoryView
  • ProductView

Замечание

Предпочтительно использовать термин View, а не Page потому, что View может быть частью другого View, а Page - нет (семантически).

ProductCategoryView и ProductView убираем в директорию views модуля products.

Routes

Обновляем routes. Добавляем роуты для product, category, favourites, cart и login

js
const routes: RouteRecordRaw[] = [
-  // ...
-  {
-    path: "/product/:productId",
-    name: "product",
-    component: ProductView,
-  },
-  {
-    path: "/category/:categoryId",
-    name: "category",
-    component: ProductCategoryView,
-  },
-  {
-    path: "/favourites",
-    name: "favourites",
-    component: ProductCategoryView,
-  },
-  // ...
-];

Маршруты пока оставляем в главном модуле, при росте их числа - разобьем.

Отмечаем, что в солидных магазинах ссылка на категорию выглядит примерно так: /category/muzhskaya-odezhda-7542/. То есть, slug названия категории и её id. У нас будет пока только categoryId, но в дальнейшем мы сделаем такую человеко-понятную ссылку - это полезно для UX и для SEO. То же самое с продуктами.

Делаем хедер - с лого, поисковой строкой, иконками корзины, логина/аккаунта, избранного справа, и снизу меню с 2-3 категориями.

На аналогичных сайтах поисковая строка может быть весьма непростой - с выпадающим меню с подсказками, например, или каталогом. Поэтому сразу выделим её в отдельный компонент - AppSearchBar. Находим в интернете подходящую стилизацию input и используем её.

Подходящие иконки можно поискать на iconbuddy.app и icones.js.org. Для их отображения используем BaseIcon.

Добавляем немного эффектов, адаптивности, и получаем:

image

В выдвигающемся слева сайдбаре также захардкодим несколько категорий. Более тщательную кастомизацию оставим на потом.

В итоге:

image

Небольшой рефакторинг

Переименуем наш кастомизированный компонент MantineSimpleHeader в AppHeader и все остальные также.

Загружаем в репозиторий и ставим тэг - v0.2.

- +
Skip to content

Кастомизация

Персонализация

Заменим везде имя на "Arty-Crafty", изменим описание в package.json. Найдем в интернете подходящую иконку для логотипа, и заменим штатную.

Теперь скроем сайдбар в tablet и desktop режимах, потому что в нем должен быть каталог только в мобильном режиме. Для других каталог будет из меню в хедере.

Далее, мы будем делать приложение в модульной архитектуре. Общие компоненты, утилиты, композаблы и ресурсы у нас будут в модуле app, то, что относится к каталогу, категориям товаров и самим товарам - в products, и так далее. Поэтому нужно в src создать дирректорию app и перенести всё в неё, с заменой путей, где надо.

Загружаем все на GitHub и ставим тэг - v0.1. Для этого нужно опубликовать релиз.

Views

Чистим главную страницу, i18n убираем пока подальше. Переименовываем основные view на:

  • HomeView (остается)
  • ProductCategoryView
  • ProductView

Замечание

Предпочтительно использовать термин View, а не Page потому, что View может быть частью другого View, а Page - нет (семантически).

ProductCategoryView и ProductView убираем в директорию views модуля products.

Routes

Обновляем routes. Добавляем роуты для product, category, favourites, cart и login

js
const routes: RouteRecordRaw[] = [
+  // ...
+  {
+    path: "/product/:productId",
+    name: "product",
+    component: ProductView,
+  },
+  {
+    path: "/category/:categoryId",
+    name: "category",
+    component: ProductCategoryView,
+  },
+  {
+    path: "/favourites",
+    name: "favourites",
+    component: ProductCategoryView,
+  },
+  // ...
+];

Маршруты пока оставляем в главном модуле, при росте их числа - разобьем.

Отмечаем, что в солидных магазинах ссылка на категорию выглядит примерно так: /category/muzhskaya-odezhda-7542/. То есть, slug названия категории и её id. У нас будет пока только categoryId, но в дальнейшем мы сделаем такую человеко-понятную ссылку - это полезно для UX и для SEO. То же самое с продуктами.

Делаем хедер - с лого, поисковой строкой, иконками корзины, логина/аккаунта, избранного справа, и снизу меню с 2-3 категориями.

На аналогичных сайтах поисковая строка может быть весьма непростой - с выпадающим меню с подсказками, например, или каталогом. Поэтому сразу выделим её в отдельный компонент - AppSearchBar. Находим в интернете подходящую стилизацию input и используем её.

Подходящие иконки можно поискать на iconbuddy.app и icones.js.org. Для их отображения используем BaseIcon.

Добавляем немного эффектов, адаптивности, и получаем:

image

В выдвигающемся слева сайдбаре также захардкодим несколько категорий. Более тщательную кастомизацию оставим на потом.

В итоге:

image

Небольшой рефакторинг

Переименуем наш кастомизированный компонент MantineSimpleHeader в AppHeader и все остальные также.

Загружаем в репозиторий и ставим тэг - v0.2.

+ \ No newline at end of file diff --git a/ru/arty-crafty/showcase/favourites.html b/ru/arty-crafty/showcase/favourites.html index 6ed4c2fbc..2525e4837 100644 --- a/ru/arty-crafty/showcase/favourites.html +++ b/ru/arty-crafty/showcase/favourites.html @@ -6,13 +6,13 @@ Избранное | Vue FAQ - + - + - - + + @@ -70,8 +70,8 @@ localStorage.setItem("ac-favourites", JSON.stringify(listFavourites()));

В дальнейшем возможно понадобится сохранять в LocalStorage и другие параметры нашего приложения и настройки пользователя, тогда список "Избранное" желательно будет объединить с ними в один объект и написать утилиту для него, но пока можно и так.

В итоге наш useFavourites.ts.

Бэджик

При работе над иконкой в AppHeader, а также при наблюдении над другими магазинами можно обратить внимание, что бэджик с числом может быть не только над иконкой "Избранное", но и над "Заказы" и может и чем другим. Самое время вынести его в отдельный код. Хоть он и небольшой, но будет возможность менять стили в одном месте.

Варианта тут четыре - директива, отдельный компонент IconBadge, расширение функционала BaseIcon или новый компонент IconWithBadge. Директива логичней - как бы, бэдж принадлежт иконке. Компонент более явен, позволяет делать кастомизацию через пропсы, если понадобится, и, вообще, более читабельней. По третьему варианту - из-за двух мест усложнять BaseIcon точно не стоит. IconWithBadge, в принципе, неплохо выглядит.

Пока создаем компонент IconBadge в app/components/ui. Минус подхода - иконку с бэджем надо явно оборачивать в div с position: relative:

template
<div class="icon-wrapper">
   <BaseIcon size="20" name="favourites" class="icon" />
   <IconBadge :num="listFavourites().length" />
-</div>

По сути, это и есть IconWithBadge если мы захотим позже его реализовать.

Tag и CMV

Загружаем в репозиторий и ставим тэг - v0.3

Coding music video

- +</div>

По сути, это и есть IconWithBadge если мы захотим позже его реализовать.

Tag и CMV

Загружаем в репозиторий и ставим тэг - v0.3

Coding music video

+ \ No newline at end of file diff --git a/ru/arty-crafty/showcase/product-category.html b/ru/arty-crafty/showcase/product-category.html index 683839aef..efa80e26b 100644 --- a/ru/arty-crafty/showcase/product-category.html +++ b/ru/arty-crafty/showcase/product-category.html @@ -6,13 +6,13 @@ Категория товаров | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Категория товаров

Layout

Страница категории товаров выглядит как идущие рядами и колонками карточки товаров. Число колонок зависит от ширины экрана. В мобильном варианте - только одна колонка на ширину устройства.

Сверху страницы название категории, возможно её описание и breadcrumbs (путь к категории в каталоге).

Карточки разместить можно с помощью flexbox (flex-wrap) и grid. Мне привычнее первый, поэтому использую его. Для самой карточки товара создаем компонент ProductCard.

image

Данные и API

Если посмотреть другие магазины, то на карточках товара обычно одна или несколько картинок, название, краткое описание, стоимость, дополнительная информация (рейтинг, скидка, вес, материал и т.п.)

Данные будем получать по сети. Лежать они будут в json файлах в директории public/api. Создадим несколько файлов вроде category-products-3.json.

Как может быть устроена схема REST API на бэкенде для серьезных магазинов можно посмотреть на примере Magento WebAPI.

- +
Skip to content

Категория товаров

Layout

Страница категории товаров выглядит как идущие рядами и колонками карточки товаров. Число колонок зависит от ширины экрана. В мобильном варианте - только одна колонка на ширину устройства.

Сверху страницы название категории, возможно её описание и breadcrumbs (путь к категории в каталоге).

Карточки разместить можно с помощью flexbox (flex-wrap) и grid. Мне привычнее первый, поэтому использую его. Для самой карточки товара создаем компонент ProductCard.

image

Данные и API

Если посмотреть другие магазины, то на карточках товара обычно одна или несколько картинок, название, краткое описание, стоимость, дополнительная информация (рейтинг, скидка, вес, материал и т.п.)

Данные будем получать по сети. Лежать они будут в json файлах в директории public/api. Создадим несколько файлов вроде category-products-3.json.

Как может быть устроена схема REST API на бэкенде для серьезных магазинов можно посмотреть на примере Magento WebAPI.

+ \ No newline at end of file diff --git a/ru/arty-crafty/showcase/project-setup.html b/ru/arty-crafty/showcase/project-setup.html index 792d3bfd4..a325a8c76 100644 --- a/ru/arty-crafty/showcase/project-setup.html +++ b/ru/arty-crafty/showcase/project-setup.html @@ -6,13 +6,13 @@ Создание проекта | Vue FAQ - + - + - - + + @@ -34,28 +34,28 @@ -
Skip to content

Создание проекта

Репозиторий на GitHub

Создаем репозиторий на GitHub, клонируем локально

sh
$ git clone https://github.com/vuesence/arty-crafty.git

vue-webapp

Используем, естественно, vue-webapp для создания скелета проекта со следующими опциями:

sh
$ cd arty-crafty
-$ pnpm create vue-webapp .
-
- Project name: ... arty-crafty
- Add a Splash screen? ... yes
- Make it PWA (adds service worker and manifest)? ... yes
- Add Open Graph meta tags? ... yes
- Add Google Analytics code? ... no
- Add Github Action Workflow for publishing it on GitHub Pages? ... yes
- Select application layout » MainLayout
- Select navigation drawer » TouchSlideoutDrawer
- Select webapp navbar » MantineSimpleNavbar
- Select webapp header » MantineSimpleHeader
- Select webapp footer » MantineSimpleFooter
- Add light version of i18n? ... yes
- Add API layer (REST)? ... yes
- Add JSON-RPC adapter? ... no
- Current directory is not empty. Please choose how to proceed: » Ignore files and continue
-
-Scaffolding project in \Vuesence\arty-crafty...

Запускаем:

sh
$ pnpm i
-$ pnpm dev

Работает:

image

Теперь ставим base: "/arty-crafty/" в vite.config.ts. Также надо поставить этот префикс перед путями в инъекциях sw.js и splash-screen.html, и в путях к иконкам в manifest.json. При хостинге со своим доменом нужно будет этот префикс убрать.

Загружаем все на GitHub.

Далее настраиваем GitHub Pages и получаем наш сайт по адресу: https://vuesence.github.io/arty-crafty/

Сайт задеплоится сам автоматически из-за того, что у нас есть соответствующий GitHub Actions Workflow файл в проекте. Ветка gh-pages тоже создастся автоматически.

Теперь закомментируем подключение service-worker.js в файле sw.js - во время разработки кэширование сильно мешает. Включим его уже в продакшне.

- +
Skip to content

Создание проекта

Репозиторий на GitHub

Создаем репозиторий на GitHub, клонируем локально

sh
$ git clone https://github.com/vuesence/arty-crafty.git

vue-webapp

Используем, естественно, vue-webapp для создания скелета проекта со следующими опциями:

sh
$ cd arty-crafty
+$ pnpm create vue-webapp .
+
+ Project name: ... arty-crafty
+ Add a Splash screen? ... yes
+ Make it PWA (adds service worker and manifest)? ... yes
+ Add Open Graph meta tags? ... yes
+ Add Google Analytics code? ... no
+ Add Github Action Workflow for publishing it on GitHub Pages? ... yes
+ Select application layout » MainLayout
+ Select navigation drawer » TouchSlideoutDrawer
+ Select webapp navbar » MantineSimpleNavbar
+ Select webapp header » MantineSimpleHeader
+ Select webapp footer » MantineSimpleFooter
+ Add light version of i18n? ... yes
+ Add API layer (REST)? ... yes
+ Add JSON-RPC adapter? ... no
+ Current directory is not empty. Please choose how to proceed: » Ignore files and continue
+
+Scaffolding project in \Vuesence\arty-crafty...

Запускаем:

sh
$ pnpm i
+$ pnpm dev

Работает:

image

Теперь ставим base: "/arty-crafty/" в vite.config.ts. Также надо поставить этот префикс перед путями в инъекциях sw.js и splash-screen.html, и в путях к иконкам в manifest.json. При хостинге со своим доменом нужно будет этот префикс убрать.

Загружаем все на GitHub.

Далее настраиваем GitHub Pages и получаем наш сайт по адресу: https://vuesence.github.io/arty-crafty/

Сайт задеплоится сам автоматически из-за того, что у нас есть соответствующий GitHub Actions Workflow файл в проекте. Ветка gh-pages тоже создастся автоматически.

Теперь закомментируем подключение service-worker.js в файле sw.js - во время разработки кэширование сильно мешает. Включим его уже в продакшне.

+ \ No newline at end of file diff --git a/ru/backend/api.html b/ru/backend/api.html index be184da2a..42d8df112 100644 --- a/ru/backend/api.html +++ b/ru/backend/api.html @@ -6,13 +6,13 @@ Абстракция канала связи с бэкендом | Vue FAQ - + - + - - + + @@ -66,8 +66,8 @@ async getUserData(params) { return await http.get("/api/users/user", params); }, -};

http.js - обертка вокруг запросов на сервер через вашу любимую библиотеку.

Чем удобно абстрагирование кода связи с бэкендом от основного кода приложения в отдельный сервис?

Можно легко заменить axios на fetch или XHR, REST на JSON-RPC или WebSockets. Код в компонентах не меняется и остается простым и явным.

- +};

http.js - обертка вокруг запросов на сервер через вашу любимую библиотеку.

Чем удобно абстрагирование кода связи с бэкендом от основного кода приложения в отдельный сервис?

Можно легко заменить axios на fetch или XHR, REST на JSON-RPC или WebSockets. Код в компонентах не меняется и остается простым и явным.

+ \ No newline at end of file diff --git a/ru/backend/auth.html b/ru/backend/auth.html index 87bda6523..6c83bfb05 100644 --- a/ru/backend/auth.html +++ b/ru/backend/auth.html @@ -6,13 +6,13 @@ Аутентификация и авторизация | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Аутентификация и авторизация

Что такое аутентификация и авторизация

Грубо говоря:

Аутентификация - когда система удостоверяется, что в неё залогинился именно Вася Пупкин, например, проверив его логин и пароль

Авторизация - когда система удостоверяется, что запрашивающий ресурс/действие пользователь имеет право доступа к нему. Например, старший менеджер имеет право удаления товара в админке, а простой менеджер - нет.

Как сделать систему аутентификации на сайта

Для SPA самый распространенный способ - на JWT токенах. Вариантов это сделать много, в зависимости от требований уровня безопасности (личный блог Васи Пупкина с комментариями гостей и онлайн магазин с депозитами и бонусами - две большие разницы).

JWT - это стандарт записи небольшого количества информации в строку (токен) и подписывания её (криптография). Делает это бэкенд. Таким образом только бэкенд может удостовериться, что токен выписан им, и в нем действительная информация.

Стандарта аутентификация на токенах как такового нет, есть лучшие практики.

Варианты:

  1. Бэкенд генерит токен (access token - AT) и кладет в httpOnly cookie. Фронтэнд доступа к токену не имеет, браузер просто возвращает куку. Метод незаслужено редко используемый, но вполне надежный. С фронта снимаются все заморочки по манипуляции с АТ.

Сценарий:

  • Фронт логинится, получает данные пользователя с бэка и работает с ними. При получении при любом запросе 401 - направляет пользователя на форму логина, обнуляет данные пользователя.
  • Бэк при логине создает httpOnly cookie с токеном с определенным сроком жизни. На каждом запросе проверяет токен, определяет того, кому выписан этот токен и его права, и дальше решает разрешать ли доступ. Если срок жизни токена кончился - возвращает 401.
  1. Бэкенд генерит токен (access token - AT) и передаёт фронту. Фронт сохраняет его и каждый раз отправляет его обратно. По сути то же самое, что и в первом случае, плюс лишние телодвижения и возможность потерять токен через XSS.

  2. Используются два токена - короткоживущий access token (AT) и дольше живущий refresh token (RT) пересылаемый в httpOnly cookie. AT работает как во втором случае. Когда записанный в нем срок его жизни кончается, бэкенд проверяет RT, и если он валиден, обновляет AT. Кончается RT - пользователь направляется на перелогин.

Подробнее по данной теме можно ознакомиться в, например, этой статье

Где хранить access token на фронте?

В 95% случаев в LocalStorage. Необходимо также дублировать его в обычной JS переменной, потому что, например, у iPhone при слабом заряде включается политика энергосбережения, в результате чего localStorage может постоянно очищаться браузером.

Что такое oAuth и SSO?

oAuth - Логин "через Google". Также когда, например, у пользователь есть возможность на твоем сайте сохранить что-то в Google Drive. Чтобы получить разрешение для твоего сайта работы с Google Drive аккаунтом пользователя, ты просишь его дать через Google разрешения твоему сайту лазить в его аккаунт. Итого у нас есть четыре части - Google (авторизационный центр), сторонний ресурс (Google Drive), твой сайт и пользователь

SSO - single sign-on - логин пользователя на портал некой компании один раз, и затем прозрачный доступ на разные его сервисы. Например, логин в GMail и доступ в сразу в Google Диск, Google Photo и так далее.

Дает ли аутентификация через JWT безопасность?

Безопасность - очень комплексное понятие, аутентификация через JWT - всего лишь один из её элементов. Для критичных приложений можно снимать отпечаток системы пользователя (browser fingerprint) и заставлять пользователя перелогиниваться как только он изменился. То же самое с IP. Таким образом можно бороться с кражей АТ. Также ставить очень маленький срок жизни AT, если используется RT. Но основные меры безопасности связаны не с аутентификацией, а с постоянным мониторингом системы на подозрительные действия.

Авторизация

Если нужно давать пользователям разный уровень доступа к ресурсам сайта, то обычно применяется или RBAC (Role-based access control) или PBA - Policy-Based Authorization (Permission-Based Authorization).

В первом случае пользователи распределяются по ролям (админ, менеджер, юзер) и уровень доступа определяется ролью.

Во-втором можно более гранулировано задать разрешение каждому пользователю индивидуально на любое действие.

Нужно понимать, что на фронте авторизация делается для удобства (пользователь не видит разделы сайта, которые ему запрещены), но за безопасность отвечает бэк - он должен проверять каждый раз, имеет ли пользователь право доступа к запрашиваемому ресурсу, даже если на фронте его как бы видно не должно быть. Сломать фронт - очень несложно.

- +
Skip to content

Аутентификация и авторизация

Что такое аутентификация и авторизация

Грубо говоря:

Аутентификация - когда система удостоверяется, что в неё залогинился именно Вася Пупкин, например, проверив его логин и пароль

Авторизация - когда система удостоверяется, что запрашивающий ресурс/действие пользователь имеет право доступа к нему. Например, старший менеджер имеет право удаления товара в админке, а простой менеджер - нет.

Как сделать систему аутентификации на сайта

Для SPA самый распространенный способ - на JWT токенах. Вариантов это сделать много, в зависимости от требований уровня безопасности (личный блог Васи Пупкина с комментариями гостей и онлайн магазин с депозитами и бонусами - две большие разницы).

JWT - это стандарт записи небольшого количества информации в строку (токен) и подписывания её (криптография). Делает это бэкенд. Таким образом только бэкенд может удостовериться, что токен выписан им, и в нем действительная информация.

Стандарта аутентификация на токенах как такового нет, есть лучшие практики.

Варианты:

  1. Бэкенд генерит токен (access token - AT) и кладет в httpOnly cookie. Фронтэнд доступа к токену не имеет, браузер просто возвращает куку. Метод незаслужено редко используемый, но вполне надежный. С фронта снимаются все заморочки по манипуляции с АТ.

Сценарий:

  • Фронт логинится, получает данные пользователя с бэка и работает с ними. При получении при любом запросе 401 - направляет пользователя на форму логина, обнуляет данные пользователя.
  • Бэк при логине создает httpOnly cookie с токеном с определенным сроком жизни. На каждом запросе проверяет токен, определяет того, кому выписан этот токен и его права, и дальше решает разрешать ли доступ. Если срок жизни токена кончился - возвращает 401.
  1. Бэкенд генерит токен (access token - AT) и передаёт фронту. Фронт сохраняет его и каждый раз отправляет его обратно. По сути то же самое, что и в первом случае, плюс лишние телодвижения и возможность потерять токен через XSS.

  2. Используются два токена - короткоживущий access token (AT) и дольше живущий refresh token (RT) пересылаемый в httpOnly cookie. AT работает как во втором случае. Когда записанный в нем срок его жизни кончается, бэкенд проверяет RT, и если он валиден, обновляет AT. Кончается RT - пользователь направляется на перелогин.

Подробнее по данной теме можно ознакомиться в, например, этой статье

Где хранить access token на фронте?

В 95% случаев в LocalStorage. Необходимо также дублировать его в обычной JS переменной, потому что, например, у iPhone при слабом заряде включается политика энергосбережения, в результате чего localStorage может постоянно очищаться браузером.

Что такое oAuth и SSO?

oAuth - Логин "через Google". Также когда, например, у пользователь есть возможность на твоем сайте сохранить что-то в Google Drive. Чтобы получить разрешение для твоего сайта работы с Google Drive аккаунтом пользователя, ты просишь его дать через Google разрешения твоему сайту лазить в его аккаунт. Итого у нас есть четыре части - Google (авторизационный центр), сторонний ресурс (Google Drive), твой сайт и пользователь

SSO - single sign-on - логин пользователя на портал некой компании один раз, и затем прозрачный доступ на разные его сервисы. Например, логин в GMail и доступ в сразу в Google Диск, Google Photo и так далее.

Дает ли аутентификация через JWT безопасность?

Безопасность - очень комплексное понятие, аутентификация через JWT - всего лишь один из её элементов. Для критичных приложений можно снимать отпечаток системы пользователя (browser fingerprint) и заставлять пользователя перелогиниваться как только он изменился. То же самое с IP. Таким образом можно бороться с кражей АТ. Также ставить очень маленький срок жизни AT, если используется RT. Но основные меры безопасности связаны не с аутентификацией, а с постоянным мониторингом системы на подозрительные действия.

Авторизация

Если нужно давать пользователям разный уровень доступа к ресурсам сайта, то обычно применяется или RBAC (Role-based access control) или PBA - Policy-Based Authorization (Permission-Based Authorization).

В первом случае пользователи распределяются по ролям (админ, менеджер, юзер) и уровень доступа определяется ролью.

Во-втором можно более гранулировано задать разрешение каждому пользователю индивидуально на любое действие.

Нужно понимать, что на фронте авторизация делается для удобства (пользователь не видит разделы сайта, которые ему запрещены), но за безопасность отвечает бэк - он должен проверять каждый раз, имеет ли пользователь право доступа к запрашиваемому ресурсу, даже если на фронте его как бы видно не должно быть. Сломать фронт - очень несложно.

+ \ No newline at end of file diff --git a/ru/backend/backend.html b/ru/backend/backend.html index 1cbb81fc5..8cc00a118 100644 --- a/ru/backend/backend.html +++ b/ru/backend/backend.html @@ -6,13 +6,13 @@ Варианты задействовать свой бэкенд для фронтендера | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Варианты задействовать свой бэкенд для фронтендера

Как протестировать фронт на данных с бэка?

Есть много сервисов, предлагающих свой API с различными данными для тестирования либо полноценной работы

Например, jsonplaceholder.typicode.com

Гуглить по "json placeholder"

Есть ли бесплатные открытые API с реальными данными?

Полно. Например, тут

Гуглить по "public api"

Также можно похакать релевантные сайты в DevTools / Network на предмет эндпойнтов с данными в подходящем формате

Как сделать свой бэкенд?

Если уже знаете JavaScript, поставить и запустить Node.js с HTTP сервером проблем вызвать не должно.

Node.js далеко не очень популярный сервер для интернета, но для небольшого проекта пойдет.

В абсолютном значении проще всего установить и начать работать с Nginx и PHP

Большинство крупных облачных провайдеров (Amazon, Google, Oracle, Microsoft) предоставляет бесплатные планы с возможностью запустить виртуальный сервер. Поставив туда что требуется, можно захостить и бэк, и бандл фронта.

Что такое BaaS (Backend as a service)?

Это облачное решение, когда бэкенд в виде базы данных и интерфейса доступа к ней, а возможно и возможность использовать некоторую логику, предоставляет BaaS провайдер.

Например, NoSQL базу данных и доступ к ней предоставляет Google с помощью своего сервиcа Firebase

Альтернатива с PostgreSQL - Supabase

То есть, ваш фронтэнд будет обращаться к их определенным эндпойнтам и получать нужные сервисы - например, сохранять и запрашивать данные в базе данных.

Оба сервиса предоставляют возможность сделать аутентификацию на сайте. Таким образом, фронтэндер может написать приложение используя подобный сервис без написания своего бэкенд кода и без размещения его где-то на сервере в интернете.

У данных сервисов есть бесплатные планы с довольно большими ресурсами.

Бизнес логика на BaaS

Большинство BaaS сервисов предоставляет не только CRUD доступ к своей базе данных, но и возможность написать кастомную логику в виде Cloud Functions у Firebase, Edge Functions у Supabase, AWS Lambda у Amazon и т.д.

Данные функции являются кодом на каком-то языке программирования, который будет вызываться при обращении к определенному эндпойнту бэкенда.

В случае, если фронтенд разработчик хочет сделать полноценное приложение, но заморачиваться на самостоятельный бэкенд не хочет, это является довольно неплохим и очень экономичным решением.

Как работают Edge/Cloud/Lamda функции

По сути, это бэкенд в миниатюре

Твой фронт обращаешься к заданному эндпойнту (через API gateway сервиса BaaS провайдера) - например, /api/somefunc

Там лежит написанный тобой скрипт на js или другом языке программирования который выполняется, имеет доступ к базе данных и может делать другие вещи (грузить данные из инета например)

Затем скрипт формирует результат и возвращает его твоему фронту

- +
Skip to content

Варианты задействовать свой бэкенд для фронтендера

Как протестировать фронт на данных с бэка?

Есть много сервисов, предлагающих свой API с различными данными для тестирования либо полноценной работы

Например, jsonplaceholder.typicode.com

Гуглить по "json placeholder"

Есть ли бесплатные открытые API с реальными данными?

Полно. Например, тут

Гуглить по "public api"

Также можно похакать релевантные сайты в DevTools / Network на предмет эндпойнтов с данными в подходящем формате

Как сделать свой бэкенд?

Если уже знаете JavaScript, поставить и запустить Node.js с HTTP сервером проблем вызвать не должно.

Node.js далеко не очень популярный сервер для интернета, но для небольшого проекта пойдет.

В абсолютном значении проще всего установить и начать работать с Nginx и PHP

Большинство крупных облачных провайдеров (Amazon, Google, Oracle, Microsoft) предоставляет бесплатные планы с возможностью запустить виртуальный сервер. Поставив туда что требуется, можно захостить и бэк, и бандл фронта.

Что такое BaaS (Backend as a service)?

Это облачное решение, когда бэкенд в виде базы данных и интерфейса доступа к ней, а возможно и возможность использовать некоторую логику, предоставляет BaaS провайдер.

Например, NoSQL базу данных и доступ к ней предоставляет Google с помощью своего сервиcа Firebase

Альтернатива с PostgreSQL - Supabase

То есть, ваш фронтэнд будет обращаться к их определенным эндпойнтам и получать нужные сервисы - например, сохранять и запрашивать данные в базе данных.

Оба сервиса предоставляют возможность сделать аутентификацию на сайте. Таким образом, фронтэндер может написать приложение используя подобный сервис без написания своего бэкенд кода и без размещения его где-то на сервере в интернете.

У данных сервисов есть бесплатные планы с довольно большими ресурсами.

Бизнес логика на BaaS

Большинство BaaS сервисов предоставляет не только CRUD доступ к своей базе данных, но и возможность написать кастомную логику в виде Cloud Functions у Firebase, Edge Functions у Supabase, AWS Lambda у Amazon и т.д.

Данные функции являются кодом на каком-то языке программирования, который будет вызываться при обращении к определенному эндпойнту бэкенда.

В случае, если фронтенд разработчик хочет сделать полноценное приложение, но заморачиваться на самостоятельный бэкенд не хочет, это является довольно неплохим и очень экономичным решением.

Как работают Edge/Cloud/Lamda функции

По сути, это бэкенд в миниатюре

Твой фронт обращаешься к заданному эндпойнту (через API gateway сервиса BaaS провайдера) - например, /api/somefunc

Там лежит написанный тобой скрипт на js или другом языке программирования который выполняется, имеет доступ к базе данных и может делать другие вещи (грузить данные из инета например)

Затем скрипт формирует результат и возвращает его твоему фронту

+ \ No newline at end of file diff --git a/ru/backend/cors.html b/ru/backend/cors.html index 4a2203d3f..63571302e 100644 --- a/ru/backend/cors.html +++ b/ru/backend/cors.html @@ -6,13 +6,13 @@ CORS | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@
Skip to content

CORS

Что такое CORS?

Грубо говоря, CORS служит для защиты вашего бэкенда от запросов к нему со стороны путем установки специальных HTTP заголовков.

Более точно, CORS (Cross-Origin Resource Sharing, англ.  «совместное использование ресурсов разных источников») — это стандарт, позволяющий предоставлять веб-страницам доступ к объектам сторонних интернет-ресурсов. Сторонним считается любой интернет-ресурс, который отличается от запрашиваемого протоколом, доменом или портом.

Доступ предоставляется по специализированным запросам. Интернет-ресурс, принимающий запрос, содержит список доверенных источников, которым разрешен доступ к объектам. Страница-источник запроса получает доступ, если входит в список доверенных источников. Для предоставления доступа всем сторонним интернет-страницам используется маска «*».

Соответственно, делать всё это может только бэкенд, и настраивается это на нем. Конкретное решение зависит от языка бэкенда, используемого фреймворка и даже вебсервера.

Принцип работы CORS

При создании перекрестного HTTP-запроса браузер клиента добавляет в него объявление домена веб-страницы, инициирующей запрос. Домен объявляется в разделе Origin.

Например, страница https://client-1.com/page.html запрашивает данные со страницы https://server-site.com/info. Пример запроса от браузера клиента, использующего методы CORS, приведен ниже:

GET /info HTTP/1.1
 Host: server-site.com
-Origin: client-1.com

В случае, если сервер по адресу www.server-site.com разрешает странице-источнику запроса доступ к данным с домена, в его ответе на запрос появится строка Access-Control-Allow-Origin с именем объявленного домена:

Access-Control-Allow-Origin: https://client-1.com

Если сервер, на который запрошен доступ, не добавит в ответ указанную строку, браузер клиента вместо данных файла info вернет код ошибки.

Если на сервере разрешен доступ к ресурсу страницам любого стороннего домена, в ответе будет указана маска «*».

Access-Control-Allow-Origin: *

Если на сервере разрешен доступ не всем, а нескольким сторонним клиентам, ответ сервера содержит имена всех этих доменов, выведенных отдельными строками или разделенных пробелами:

Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com

В стандарте CORS много нюансов. Вот более подробная статья по теме CORS

Проблемы с CORS

CORS проблемы могут возникнуть только когда к ресурсу обращается браузер, а не отдельная программа типа Postman или другой бэкенд.

Как временное решение при разработке могут помочь CORS proxy, которые становятся посредником между фронтендом и бэкендом, или расширения браузера.

Vite предоставляет подобный прокси для dev режима.

- +Origin: client-1.com

В случае, если сервер по адресу www.server-site.com разрешает странице-источнику запроса доступ к данным с домена, в его ответе на запрос появится строка Access-Control-Allow-Origin с именем объявленного домена:

Access-Control-Allow-Origin: https://client-1.com

Если сервер, на который запрошен доступ, не добавит в ответ указанную строку, браузер клиента вместо данных файла info вернет код ошибки.

Если на сервере разрешен доступ к ресурсу страницам любого стороннего домена, в ответе будет указана маска «*».

Access-Control-Allow-Origin: *

Если на сервере разрешен доступ не всем, а нескольким сторонним клиентам, ответ сервера содержит имена всех этих доменов, выведенных отдельными строками или разделенных пробелами:

Access-Control-Allow-Origin: https://client-1.com https://client-2.com https://client-3.com

В стандарте CORS много нюансов. Вот более подробная статья по теме CORS

Проблемы с CORS

CORS проблемы могут возникнуть только когда к ресурсу обращается браузер, а не отдельная программа типа Postman или другой бэкенд.

Как временное решение при разработке могут помочь CORS proxy, которые становятся посредником между фронтендом и бэкендом, или расширения браузера.

Vite предоставляет подобный прокси для dev режима.

+ \ No newline at end of file diff --git a/ru/backend/protocols.html b/ru/backend/protocols.html index bc8b7e128..421bbfb5f 100644 --- a/ru/backend/protocols.html +++ b/ru/backend/protocols.html @@ -6,13 +6,13 @@ Протоколы. To REST или не REST? | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Протоколы. To REST или не REST?

REST, WebSockets, JSON-RPC

Для новичка, конечно, удобнее начинать с REST - запросы на сервер абы как.

Для более опытных, особенно, фулстеков, предлагаю взглянуть на JSON-RPC

WebSockets удобен тем, что дает двунаправленную связь (сервер может посылать сообщения на клиент), но требует специального программного обеспечения на бэкенде.

Почему JSON-RPC?

После опыта с JSON-RPC общение с бэком обычно уже никогда не бывает прежним.

Он дает порядок, четкость, строгость и вместе с тем гибкость. Сильно упрощает и делает понятным код как на фронте, так и на бэке.

Кроме того, JSON-RPC - де-факто стандарт для Web 3.0 коммуникаций.

Вот две мои статьи на эту тему - Популяризация JSON-RPC (часть 1) и Популяризация JSON-RPC (часть 2)

Вариант TypeScript реализации фронтэнд api сервиса на JSON-RPC - здесь

При использовании JSON-RPC переход на WebSockets или другие транспортные протоколы не вызовет никаких трудностей из-за унификации формата сообщений.

Как организовать реконнект WebSocket соединения на фронте?

Нужна шина, или Еvent bus, которая будет работать как прокси для приходящих сообщений.

Можно использовать mitt.

Что такое GraphGL?

Сложная штука, попытка перевести язык запросов SQL для клиент-серверных запросов в интернете.

Имеет довольно специфичное применение, преимущественно у сторонних поставщиков данных через API.

Для своего фулстек приложения - на 99% ненужное решение.

- +
Skip to content

Протоколы. To REST или не REST?

REST, WebSockets, JSON-RPC

Для новичка, конечно, удобнее начинать с REST - запросы на сервер абы как.

Для более опытных, особенно, фулстеков, предлагаю взглянуть на JSON-RPC

WebSockets удобен тем, что дает двунаправленную связь (сервер может посылать сообщения на клиент), но требует специального программного обеспечения на бэкенде.

Почему JSON-RPC?

После опыта с JSON-RPC общение с бэком обычно уже никогда не бывает прежним.

Он дает порядок, четкость, строгость и вместе с тем гибкость. Сильно упрощает и делает понятным код как на фронте, так и на бэке.

Кроме того, JSON-RPC - де-факто стандарт для Web 3.0 коммуникаций.

Вот две мои статьи на эту тему - Популяризация JSON-RPC (часть 1) и Популяризация JSON-RPC (часть 2)

Вариант TypeScript реализации фронтэнд api сервиса на JSON-RPC - здесь

При использовании JSON-RPC переход на WebSockets или другие транспортные протоколы не вызовет никаких трудностей из-за унификации формата сообщений.

Как организовать реконнект WebSocket соединения на фронте?

Нужна шина, или Еvent bus, которая будет работать как прокси для приходящих сообщений.

Можно использовать mitt.

Что такое GraphGL?

Сложная штука, попытка перевести язык запросов SQL для клиент-серверных запросов в интернете.

Имеет довольно специфичное применение, преимущественно у сторонних поставщиков данных через API.

Для своего фулстек приложения - на 99% ненужное решение.

+ \ No newline at end of file diff --git a/ru/book/Appendix__Migrating_from_Vue_2.html b/ru/book/Appendix__Migrating_from_Vue_2.html index 041fce7b7..a1cc1d4a6 100644 --- a/ru/book/Appendix__Migrating_from_Vue_2.html +++ b/ru/book/Appendix__Migrating_from_Vue_2.html @@ -6,13 +6,13 @@ Приложение: Миграция с Vue 2 | Vue FAQ - + - + - - + + @@ -66,8 +66,8 @@     <strong>{{data.surname}}, {{data.name}}</strong><br>     <strong>{{person.surname}}, {{person.name}}</strong> </template>

Обратите внимание на разницу в синтаксисе. В этот момент вы можете задуматься, когда использовать то или иное. Вот небольшое сравнение того, когда следует использовать каждый из них:

ref()reactive()
- Применяется к любому типу данных, а не только к примитивам.
- При применении к объектам или массивам вы можете заменить их.
- Он использует методы получения и установки для обнаружения изменений и запуска реактивной реакции.
- Используйте его по умолчанию для простых данных. Для массивов и объектов (сложных типов) рекомендуется использовать reactive() при работе с их внутренними элементами. Когда будет заменен весь объект, удобно использовать ref().
- Применяется к объектам и массивам, но не к примитивам. Делает их атрибуты реактивными.
- Объект не может быть заменен, только его атрибуты.
- Он использует нативную реализацию обработчиков Proxy() для обнаружения изменений и запуска реактивности.
- Используйте когда вам нужно сгруппировать большое количество переменных, которые должны «путешествовать» вместе.

Таблица А.1 - Простое руководство по выбору между ref() и reactive().

Каждый метод имеет свои преимущества. С точки зрения реактивных свойств со сложными типами не имеет значения, какой из них использовать. В некоторых случаях reactive() может быть более производительным за счет использования нативных реализаций в браузере.

Изменения в v-model, props и events

Это большое изменение по сравнению с Vue 2, которое может привести к поломке вашего кода. В Vue 3 мы больше не получаем и не испускаем значение свойства. Вместо этого любой props может быть входным/выходным, например v-model. По умолчанию атрибут v-model принимается в prop с именем modelValue, а аналог emit добавляет update:, поэтому он называется update:modelValue.

В Vue 3 появилась возможность одновременного использования нескольких v-моделей. Например, мы можем иметь v-model:person="person" в нашем компоненте, определить prop как "modelPerson" и событие как "update:modelPerson".

Props и emits теперь являются макросами (макрос - это специальная функция, предоставляемая сборщиком или фреймворком). Props имеют тот же смысл, что и в Vue 2, поэтому их можно определять как массивы, объекты, включаемые типы, значения по умолчанию и т. д.

Приведем пример с v-моделью по умолчанию и нотированной моделью:

js
const $props = defineProps(['modelValue','modelPerson']),
-$emit = defineEmits(['update:modelValue','update:modelPerson'])

Более подробно реквизиты и эмиты рассматриваются в этой книге в главе 4, Композиция пользовательского интерфейса с компонентами.

Удалена совместимость со старыми браузерами

Vue 3 был создан для скорости и "современного" JavaScript. Обратная совместимость со старыми браузерами была удалена. Многие внутренние функции, используемые для обеспечения реактивности, теперь по умолчанию используют нативные реализации (например, Proxy API).

Если вам необходимо поддерживать приложение в устаревшем браузере, то лучше остановиться на Vue 2, но не стоит бояться! Для Vue 2 существует официальный плагин для использования нового Composition API, включающий script setup синтаксис:

  • Vue 2.7 включает его без плагинов (https://blog.vuejs.org/posts/vue-2-7-naruto.html )
  • Если вы используете Vue 2.6 или ниже, вы можете найти плагин здесь: https://github.com/vuejs/composition-api
  • Если вам все же нужна скорость Vue 3, существует специальная сборка для миграции, которая имеет практически тот же API, что и Vue 2 (см. https://v3-migration.vuejs.org/migration-build.html )
  • Зачем удалять совместимость со старыми браузерами? На это есть много причин, в том числе следующие:
    • В мире доля использования старых браузеров упала до значительного уровня, и ожидается, что она продолжит снижаться с течением времени.
    • После удаления старого кода и проверок на совместимость, полученная реализация ядра Vue становится легче и производительнее. Увеличение скорости и уменьшение размера пакета является значительным, что позволяет нашим приложениям загружаться быстрее и быть более отзывчивыми.

На практике большую часть рынка занимают два браузерных движка: браузеры на базе Chromium и браузеры на базе Mozilla Firefox. Проверьте www.caniuse.com, если вам необходимо использовать функцию, которая может быть недоступна в старых браузерах.

Изменения в организации каталогов и файлов

На организацию структуры каталогов в Vue 2 в некоторой степени повлияли тогдашний сборщик WebPack и Vue CLI. Теперь, когда Vue 3 перешел на Vite, файлы были организованы таким образом, чтобы лучше отражать рабочий процесс разработки.

Так, например, index.html переместился в корневую папку из папки Public/. Теперь он занимает более заметное место в процессе компоновки. Эти и другие изменения описаны в главе 3, Установка рабочего проекта.

Изменения в роутере и state manager

Новый подход к компонентам и модульности также затрагивает маршрутизатор и управление состоянием. В то время как для Vue 3 была разработана новая версия маршрутизатора, официальное решение для управления состоянием перешло от Vuex к Pinia. Более подробную информацию о новом маршрутизаторе и Pinia можно найти в главе 5, Одностраничные приложения, и в главе 7, Управление потоком данных, соответственно.

В новом маршрутизаторе реализован иной подход к определению режимов, используются конструкторы createWebHashHistory (режим хэша), createWebHistory (режим истории) и createMemoryHistory (навигация только в памяти).

Это изменение также затронуло конфигурацию собираемого пакета. В WebPack в режиме истории путь развертывания был частью конфигурации сборщика. Теперь путь передается в конструктор в качестве параметра и полностью обрабатывается маршрутизатором.

Новые компоненты и другие изменения.

В Vue 3 также появились новые компоненты, такие как Teleport (специальный компонент, позволяющий размещать реактивные шаблоны вне дерева компонентов Vue, внутри другого элемента DOM), а также были сняты некоторые ограничения, существовавшие в Vue 2. Например, компоненты теперь могут иметь более одного корневого элемента. Для получения более подробной информации о новых компонентах в Vue 3 обратитесь к официальной документации.

Другие изменения

Полный список изменений, не упомянутых здесь, можно найти в официальной документации по адресу https://v3-migration.vuejs.org/breaking-changes/.

Итог

Переход с Vue 2 на Vue 3 имеет четкую траекторию, с небольшим количеством изменений, о которых следует знать. Новый API Composition, однако, требует изменения менталитета, но это происходит естественно при использовании синтаксиса script setup.

Но самая важная особенность Vue 3 - это рост производительности и уменьшение размера. Одним словом, Vue 3 работает быстро, очень быстро, и переход на него стоит того.

Для проектов, поддерживающих устаревшие браузеры, существуют плагины для ветви Vue 2.x, которые обеспечивают некоторые преимущества Vue 3, но для других проектов, стремящихся получить положительные результаты от Vue 3, переход на него вполне оправдан.

- +$emit = defineEmits(['update:modelValue','update:modelPerson'])

Более подробно реквизиты и эмиты рассматриваются в этой книге в главе 4, Композиция пользовательского интерфейса с компонентами.

Удалена совместимость со старыми браузерами

Vue 3 был создан для скорости и "современного" JavaScript. Обратная совместимость со старыми браузерами была удалена. Многие внутренние функции, используемые для обеспечения реактивности, теперь по умолчанию используют нативные реализации (например, Proxy API).

Если вам необходимо поддерживать приложение в устаревшем браузере, то лучше остановиться на Vue 2, но не стоит бояться! Для Vue 2 существует официальный плагин для использования нового Composition API, включающий script setup синтаксис:

  • Vue 2.7 включает его без плагинов (https://blog.vuejs.org/posts/vue-2-7-naruto.html )
  • Если вы используете Vue 2.6 или ниже, вы можете найти плагин здесь: https://github.com/vuejs/composition-api
  • Если вам все же нужна скорость Vue 3, существует специальная сборка для миграции, которая имеет практически тот же API, что и Vue 2 (см. https://v3-migration.vuejs.org/migration-build.html )
  • Зачем удалять совместимость со старыми браузерами? На это есть много причин, в том числе следующие:
    • В мире доля использования старых браузеров упала до значительного уровня, и ожидается, что она продолжит снижаться с течением времени.
    • После удаления старого кода и проверок на совместимость, полученная реализация ядра Vue становится легче и производительнее. Увеличение скорости и уменьшение размера пакета является значительным, что позволяет нашим приложениям загружаться быстрее и быть более отзывчивыми.

На практике большую часть рынка занимают два браузерных движка: браузеры на базе Chromium и браузеры на базе Mozilla Firefox. Проверьте www.caniuse.com, если вам необходимо использовать функцию, которая может быть недоступна в старых браузерах.

Изменения в организации каталогов и файлов

На организацию структуры каталогов в Vue 2 в некоторой степени повлияли тогдашний сборщик WebPack и Vue CLI. Теперь, когда Vue 3 перешел на Vite, файлы были организованы таким образом, чтобы лучше отражать рабочий процесс разработки.

Так, например, index.html переместился в корневую папку из папки Public/. Теперь он занимает более заметное место в процессе компоновки. Эти и другие изменения описаны в главе 3, Установка рабочего проекта.

Изменения в роутере и state manager

Новый подход к компонентам и модульности также затрагивает маршрутизатор и управление состоянием. В то время как для Vue 3 была разработана новая версия маршрутизатора, официальное решение для управления состоянием перешло от Vuex к Pinia. Более подробную информацию о новом маршрутизаторе и Pinia можно найти в главе 5, Одностраничные приложения, и в главе 7, Управление потоком данных, соответственно.

В новом маршрутизаторе реализован иной подход к определению режимов, используются конструкторы createWebHashHistory (режим хэша), createWebHistory (режим истории) и createMemoryHistory (навигация только в памяти).

Это изменение также затронуло конфигурацию собираемого пакета. В WebPack в режиме истории путь развертывания был частью конфигурации сборщика. Теперь путь передается в конструктор в качестве параметра и полностью обрабатывается маршрутизатором.

Новые компоненты и другие изменения.

В Vue 3 также появились новые компоненты, такие как Teleport (специальный компонент, позволяющий размещать реактивные шаблоны вне дерева компонентов Vue, внутри другого элемента DOM), а также были сняты некоторые ограничения, существовавшие в Vue 2. Например, компоненты теперь могут иметь более одного корневого элемента. Для получения более подробной информации о новых компонентах в Vue 3 обратитесь к официальной документации.

Другие изменения

Полный список изменений, не упомянутых здесь, можно найти в официальной документации по адресу https://v3-migration.vuejs.org/breaking-changes/.

Итог

Переход с Vue 2 на Vue 3 имеет четкую траекторию, с небольшим количеством изменений, о которых следует знать. Новый API Composition, однако, требует изменения менталитета, но это происходит естественно при использовании синтаксиса script setup.

Но самая важная особенность Vue 3 - это рост производительности и уменьшение размера. Одним словом, Vue 3 работает быстро, очень быстро, и переход на него стоит того.

Для проектов, поддерживающих устаревшие браузеры, существуют плагины для ветви Vue 2.x, которые обеспечивают некоторые преимущества Vue 3, но для других проектов, стремящихся получить положительные результаты от Vue 3, переход на него вполне оправдан.

+ \ No newline at end of file diff --git a/ru/book/Chapter_10__Deploying_Your_Application.html b/ru/book/Chapter_10__Deploying_Your_Application.html index bf12583c5..fc06012e7 100644 --- a/ru/book/Chapter_10__Deploying_Your_Application.html +++ b/ru/book/Chapter_10__Deploying_Your_Application.html @@ -6,13 +6,13 @@ Развертывание приложения | Vue FAQ - + - + - - + + @@ -59,8 +59,8 @@ location / { //3 try_files $uri $uri/ /index.html; //4 } -}

Рассмотрим предыдущий код:

  • В строке //1 мы размещаем абсолютный путь локального хранилища к нашему приложению.
  • В строке //2 мы объявляем домены и поддомены, которые будут связаны с этим серверным блоком.
  • В строке //3, мы объявляем путь расположения для обработки. В данном примере мы размещаем приложение в корне (/). При размещении в mydomain.com/app мы бы написали location /app .
  • И наконец, в строке //4, мы указываем NGINX попытаться найти корректный каталог/файл и, если это не удается, передать его в наш файл index.html .

Как и ранее, если мы используем режим web hash, то нам не нужно делать эти изменения. Мы можем просто использовать конфигурацию по умолчанию для обслуживания файлов с диска.

Другие серверы

Существует множество других используемых серверов и возможных конфигураций, которые невозможно рассмотреть здесь. Однако в официальной документации Vue Router есть очень хорошие примеры для других серверов и рекомендации для тех, которые не рассматриваются. Ссылку можно найти по этой ссылке.

Давайте посмотрим, как перенести наши файлы на наш онлайн-сервер.

Перенос файлов на сервер

Теперь, когда домен указывает на наш сервер, а конфигурация настроена, пришло время загрузить файлы дистрибутива. В зависимости от выбранного хостинга это можно сделать через веб-интерфейс, приложение File Transfer Protocol (FTP) или безопасную передачу по протоколу Secure Shell Protocol (SSH).

Для последних двух вариантов рекомендуется использовать приложение, которое возьмет на себя всю тяжесть работы. Отличным вариантом является использование FileZilla, которая работает с вышеупомянутымипротоколами. Она доступна для Linux, Windows и macOS.

Как мы уже упоминали в главе 9, Тестирование и контроль исходного кода, вы также можете настроить свой VPS-сервер на получение исходного кода из удаленного репозитория с помощью Git. В этом случае папка приложения будет настроена на указание на папку /dist в локальном репозитории.

Мы можем, например, открыть удаленный терминал на сервере, запустить синхронизацию (pull), а затем скомпилировать приложение на самом сервере, взять ветку с уже скомпилированным приложением, отправить наши коммиты непосредственно на сервер и так далее.

Существует множество вариантов использования Git, и еще больше - при использовании таких сервисов, как GitHub или GitLab с мощными инструментами для непрерывной интеграции и доставки.

Эту тему стоит изучить, если вы не хотите использовать S/FTP-приложения или хотите автоматизировать процесс. Каждая реализация будет специфичной и не входит в рамки данной книги, поэтому мы перейдем к следующей теме, предполагая, что наши файлы теперь находятся на сервере.

Защита веб-приложения с помощью Let's Encrypt

Интернет-адреса указываются в самом начале используемого протокола. По умолчанию вся веб-навигация осуществляется с помощью протокола Hypertext Transfer Protocol (HTTP), который, хотя и является основополагающим, не считается безопасным.

Если между клиентом и сервером предусмотрен уровень шифрования, то обмен данными осуществляется по протоколу HTTPS (буква S означает Secure). Этот уровень шифрования обеспечивается и подтверждается сертифицирующим органом, поэтому сертификат должен быть приобретен именно у него.

Хостинг-провайдеры обычно предлагают купить и установить такой сертификат на своих серверах, однако существует и бесплатная и надежная альтернатива, предоставляемая фондом Let's Encrypt.

Для установки сертификата Let's Encrypt необходим SSH доступ к серверу. Если его нет, то приходится полагаться на услугу, предоставляемую хостингом. Список совместимых сертифицированных хостинг-провайдеров находится здесь.

В том случае, если мы имеем доступ к серверу через удаленный SSH доступ, процесс также несложен. Фонд Let's Encrypt и Electronic Frontier Foundation (EFF) предоставляют приложение certbot (робот сертификации), которое автоматизирует установку сертификатов безопасности, а также настраивает файлы локального веб-сервера на использование HTTPS. В данном случае у нас есть два варианта:

  • Установить сертификат для каждого домена и каждого поддомена
  • Установить общий (wild) сертификат, который охватывает каждый домен и все возможные поддомены

Инструкции по установке certbot и последующему запуску процесса отличаются для каждой операционной системы и веб-сервера, а также для типа упомянутого сертификата. В связи с этим EFF предоставляет веб-страницу с настраиваемыми опциями для каждого возможного варианта и простыми для выполнения шагами. Мастер можно найти здесь.

image

Рисунок 10.2 - Инструкции Certbot для NGINX и Ubuntu 20.

В целом, инструкция состоит из следующих шагов:

  1. Установите certbot .
  2. Запустите certbot. В результате появится ряд опций, содержащих все найденные домены на данном веб-сервере.
  3. Выберите тип сертификата для установки.
  4. Выберите, если активно, автообновление сертификата. Отказ от этой опции приведет к необходимости ручного обновления.

Бесплатный сертификат действует только 3 месяца единовременно, в отличие от коммерческого сертификата, который можно купить на больший срок. По истечении 3 месяцев его необходимо вручную продлевать. К счастью, в certbot включена функция автоматического обновления до истечения срока действия.

Даже для простых тестовых приложений важно и рекомендуется всегда защищать сайт с помощью сертификата безопасности. Не будем также забывать, что наличие сертификата безопасности и обслуживание приложения по HTTPS является жестким требованием для PWA.

Подведение итогов

В этой главе мы рассмотрели основы публикации нашего Vue-приложения в собственном открытом пространстве в Интернете. Мы также познакомились с важными концепциями понимания инструкций при покупке и резервировании домена и настройке DNS-записей, если и когда это необходимо сделать.

Мы также узнали о том, как приспособить конфигурацию нашего пакета при использовании режима истории HTML5 в Vue Router, о различных типах онлайн-хостинга, которые мы можем арендовать, о вариантах копирования файлов дистрибутива на рабочий сервер и о рекомендациях по защите нашего сайта с помощью бесплатного сертификата Let's Encrypt для обслуживания наших приложений по протоколу HTTPS. Всё это важные навыки, и вам будет полезно хотя бы раз получить опыт их применения.

После развертывания нашего приложения мы рассмотрели в этой книге основные этапы и темы создания приложения Vue 3, начиная с знакомства с фреймворком и заканчивая тестированием отдельных компонентов и установкой готовых к производству файлов на веб-сервер.

Вопросы для проверки

  • Что такое домен верхнего уровня и чем он отличается от домена?
  • Существует ли ограничение на количество поддоменов, которые мы можем создать для нашего домена? Почему?
  • Что такое DNS? Что такое DNS-записи?
  • Какие существуют варианты публикации веб-приложения в Интернете?
  • Какие изменения необходимо внести в код и веб-сервер при использовании Vue Router в режиме веб-истории?
  • Какие распространенные веб-серверы используются в виртуальном хостинге и VPS?
  • Что такое certbot и что он делает?
- +}

Рассмотрим предыдущий код:

  • В строке //1 мы размещаем абсолютный путь локального хранилища к нашему приложению.
  • В строке //2 мы объявляем домены и поддомены, которые будут связаны с этим серверным блоком.
  • В строке //3, мы объявляем путь расположения для обработки. В данном примере мы размещаем приложение в корне (/). При размещении в mydomain.com/app мы бы написали location /app .
  • И наконец, в строке //4, мы указываем NGINX попытаться найти корректный каталог/файл и, если это не удается, передать его в наш файл index.html .

Как и ранее, если мы используем режим web hash, то нам не нужно делать эти изменения. Мы можем просто использовать конфигурацию по умолчанию для обслуживания файлов с диска.

Другие серверы

Существует множество других используемых серверов и возможных конфигураций, которые невозможно рассмотреть здесь. Однако в официальной документации Vue Router есть очень хорошие примеры для других серверов и рекомендации для тех, которые не рассматриваются. Ссылку можно найти по этой ссылке.

Давайте посмотрим, как перенести наши файлы на наш онлайн-сервер.

Перенос файлов на сервер

Теперь, когда домен указывает на наш сервер, а конфигурация настроена, пришло время загрузить файлы дистрибутива. В зависимости от выбранного хостинга это можно сделать через веб-интерфейс, приложение File Transfer Protocol (FTP) или безопасную передачу по протоколу Secure Shell Protocol (SSH).

Для последних двух вариантов рекомендуется использовать приложение, которое возьмет на себя всю тяжесть работы. Отличным вариантом является использование FileZilla, которая работает с вышеупомянутымипротоколами. Она доступна для Linux, Windows и macOS.

Как мы уже упоминали в главе 9, Тестирование и контроль исходного кода, вы также можете настроить свой VPS-сервер на получение исходного кода из удаленного репозитория с помощью Git. В этом случае папка приложения будет настроена на указание на папку /dist в локальном репозитории.

Мы можем, например, открыть удаленный терминал на сервере, запустить синхронизацию (pull), а затем скомпилировать приложение на самом сервере, взять ветку с уже скомпилированным приложением, отправить наши коммиты непосредственно на сервер и так далее.

Существует множество вариантов использования Git, и еще больше - при использовании таких сервисов, как GitHub или GitLab с мощными инструментами для непрерывной интеграции и доставки.

Эту тему стоит изучить, если вы не хотите использовать S/FTP-приложения или хотите автоматизировать процесс. Каждая реализация будет специфичной и не входит в рамки данной книги, поэтому мы перейдем к следующей теме, предполагая, что наши файлы теперь находятся на сервере.

Защита веб-приложения с помощью Let's Encrypt

Интернет-адреса указываются в самом начале используемого протокола. По умолчанию вся веб-навигация осуществляется с помощью протокола Hypertext Transfer Protocol (HTTP), который, хотя и является основополагающим, не считается безопасным.

Если между клиентом и сервером предусмотрен уровень шифрования, то обмен данными осуществляется по протоколу HTTPS (буква S означает Secure). Этот уровень шифрования обеспечивается и подтверждается сертифицирующим органом, поэтому сертификат должен быть приобретен именно у него.

Хостинг-провайдеры обычно предлагают купить и установить такой сертификат на своих серверах, однако существует и бесплатная и надежная альтернатива, предоставляемая фондом Let's Encrypt.

Для установки сертификата Let's Encrypt необходим SSH доступ к серверу. Если его нет, то приходится полагаться на услугу, предоставляемую хостингом. Список совместимых сертифицированных хостинг-провайдеров находится здесь.

В том случае, если мы имеем доступ к серверу через удаленный SSH доступ, процесс также несложен. Фонд Let's Encrypt и Electronic Frontier Foundation (EFF) предоставляют приложение certbot (робот сертификации), которое автоматизирует установку сертификатов безопасности, а также настраивает файлы локального веб-сервера на использование HTTPS. В данном случае у нас есть два варианта:

  • Установить сертификат для каждого домена и каждого поддомена
  • Установить общий (wild) сертификат, который охватывает каждый домен и все возможные поддомены

Инструкции по установке certbot и последующему запуску процесса отличаются для каждой операционной системы и веб-сервера, а также для типа упомянутого сертификата. В связи с этим EFF предоставляет веб-страницу с настраиваемыми опциями для каждого возможного варианта и простыми для выполнения шагами. Мастер можно найти здесь.

image

Рисунок 10.2 - Инструкции Certbot для NGINX и Ubuntu 20.

В целом, инструкция состоит из следующих шагов:

  1. Установите certbot .
  2. Запустите certbot. В результате появится ряд опций, содержащих все найденные домены на данном веб-сервере.
  3. Выберите тип сертификата для установки.
  4. Выберите, если активно, автообновление сертификата. Отказ от этой опции приведет к необходимости ручного обновления.

Бесплатный сертификат действует только 3 месяца единовременно, в отличие от коммерческого сертификата, который можно купить на больший срок. По истечении 3 месяцев его необходимо вручную продлевать. К счастью, в certbot включена функция автоматического обновления до истечения срока действия.

Даже для простых тестовых приложений важно и рекомендуется всегда защищать сайт с помощью сертификата безопасности. Не будем также забывать, что наличие сертификата безопасности и обслуживание приложения по HTTPS является жестким требованием для PWA.

Подведение итогов

В этой главе мы рассмотрели основы публикации нашего Vue-приложения в собственном открытом пространстве в Интернете. Мы также познакомились с важными концепциями понимания инструкций при покупке и резервировании домена и настройке DNS-записей, если и когда это необходимо сделать.

Мы также узнали о том, как приспособить конфигурацию нашего пакета при использовании режима истории HTML5 в Vue Router, о различных типах онлайн-хостинга, которые мы можем арендовать, о вариантах копирования файлов дистрибутива на рабочий сервер и о рекомендациях по защите нашего сайта с помощью бесплатного сертификата Let's Encrypt для обслуживания наших приложений по протоколу HTTPS. Всё это важные навыки, и вам будет полезно хотя бы раз получить опыт их применения.

После развертывания нашего приложения мы рассмотрели в этой книге основные этапы и темы создания приложения Vue 3, начиная с знакомства с фреймворком и заканчивая тестированием отдельных компонентов и установкой готовых к производству файлов на веб-сервер.

Вопросы для проверки

  • Что такое домен верхнего уровня и чем он отличается от домена?
  • Существует ли ограничение на количество поддоменов, которые мы можем создать для нашего домена? Почему?
  • Что такое DNS? Что такое DNS-записи?
  • Какие существуют варианты публикации веб-приложения в Интернете?
  • Какие изменения необходимо внести в код и веб-сервер при использовании Vue Router в режиме веб-истории?
  • Какие распространенные веб-серверы используются в виртуальном хостинге и VPS?
  • Что такое certbot и что он делает?
+ \ No newline at end of file diff --git a/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html b/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html index 0de0d6641..b1440ea00 100644 --- a/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html +++ b/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html @@ -6,13 +6,13 @@ Бонусная глава - Шаблоны UX | Vue FAQ - + - + - - + + @@ -87,8 +87,8 @@ section{      display: flex;      flex-direction: row; -}

Обратите внимание, что в код включена точка останова на ширине 600 пикселей. Вы можете управлять различными размерами экрана, применяя несколько медиазапросов с точками останова.

Домашняя ссылка

Этот шаблон настолько распространен, что мы даже не задумываемся о нем. Главный логотип компании размещается в левой верхней части страницы как ссылка на главный экран. Такое расположение не случайно, оно связано с тем, как пользователи "сканируют" страницу.

Разные пользователи при загрузке страницы бросают беглый взгляд, направляя глаза в направлении Z, L или T по странице. Размещение логотипа в виде ссылки в левом верхнем углу гарантирует, что он будет первым элементом, который зарегистрирует пользователь. В данной главе хорошим примером этого шаблона являются рисунки 11.21 и 11.22. Но есть и исключения, например, домашняя страница Google:

Рисунок 11.24 - Главная страница Google является исключением из этого шаблона, так как логотип не является ссылкой

Однако исключение, показанное на предыдущем рисунке, является лишь временным, так как Google возвращается к этому шаблону, когда выводит результаты поиска:

Рисунок 11.25 - Результат поиска Google применяет шаблон

Шаблон "Главная ссылка" должен возвращать вас либо на главную страницу, либо на первый шаг процесса. Этот шаблон настолько широко распространен и понятен пользователям, что любое исключение из него должно делаться очень осторожно, с хорошим пониманием поведения и взаимодействия пользовательской базы.

Главная (hero) секция, призыв к действию (call to action) и иконки социальных сетей

Раздел hero - это первая часть, которая отображается при загрузке страницы в браузере и идет от самого верха (где находятся главная ссылка и главное меню) до, максимум, видимой нижней части экрана. Все содержимое, расположенное ниже этого раздела, называется "ниже сгиба (“below the fold)", т.е. чтобы увидеть его, пользователю необходимо прокрутить страницу вниз.

Hero раздел считается наиболее важной частью главной страницы и местом, где размещается первоначальный призыв к действию (call to action). Мы уже рассматривали эту концепцию в этой главе, когда говорили о принципах и контрастах дизайна пользовательского интерфейса. В настоящее время большинство сайтов придерживаются этой схемы и отображают раздел-герой контрастно, с большими изображениями или каруселью и преобладающим призывом к действию.

Рисунок 11.26 - Героический раздел главной страницы Kobold Press - красочный и непосредственный

В предыдущем примере от Kobold Press мы видим, как они применили несколько шаблонов, описанных здесь, начиная с главной ссылки и главного меню и заканчивая героической секцией и призывом к действию.

Обратите внимание также на то, что слева в виде плавающей боковой панели отображаются иконки социальных сетей. Становится шаблонным размещение таких значков со ссылками на адреса социальных сетей для каждого учреждения, а в случае постов или статей - со ссылкой "поделиться" контентом. Обычно панель социальных иконок размещается следующим образом:

  • В нижнем колонтитуле сайта
  • В начале и/или конце статьи
  • В описании продукта

При размещении ссылок на прямой доступ к контенту из приложения Vue (например, к товару из интернет-магазина) важно, чтобы ссылка и приложение Vue указывали непосредственно на такой товар. Необходимо обратить пристальное внимание на то, как формируется и интерпретируется навигационный URL при первой загрузке приложения Vue, чтобы избежать размещения ссылок, открывающих домашний экран вместо нужного раздела приложения.

Другие шаблоны

Есть и другие шаблоны, сотни, если не тысячи, которые оказывают непосредственное влияние на пользовательский опыт. Я рекомендую вам продолжить их изучение, например, следующие:

  • Шаблоны корзины
  • Пользовательский onboarding
  • Шаблоны геймификации
  • Шаблоны регистрации и снятия с регистрации

Однако у пользовательского опыта есть и темная сторона, связанная с использованием манипулятивных и обманных приемов. Как этичный разработчик, вы должны избегать использования любых из этих темных шаблонов.

Темные шаблоны

Темные шаблоны - это тщательно продуманные интерфейсы и взаимодействия с единственной целью - манипулировать или обмануть пользователя, заставить его совершить непредусмотренные действия или даже втянуть его во вредоносные результаты. После такого определения можно подумать, что подобные действия относятся к самым глубоким теневым уголкам Интернета. К сожалению, даже крупные компании часто следуют этой неэтичной практике. Собственно говоря, все воспроизведенные в этих разделах примеры относятся именно к такой категории, и, как это часто бывает с шаблонами проектирования, многие из них пересекаются или могут быть вложены друг в друга. Давайте рассмотрим их по очереди.

Вопросы с подвохом

Этот шаблон представляет собой простую или сложную игру слов, направленную на то, чтобы обмануть пользователя и заставить его сделать противоположное тому, что он задумал. Вот пример:

Рисунок 11.27 - Вопрос с подвохом для подписки на рассылку

Как видно из приведенного примера, у пользователя, заполняющего форму, может возникнуть соблазн оставить этот флажок не отмеченным, если он не хочет получать рассылку новостей от компании. Обычная тенденция - обратить внимание на выделенный жирным шрифтом текст, который является своего рода заголовком. Реальное же действие флажка находится в конце абзаца, который большинство пользователей не читает: Отметьте эту опцию, если вы не хотите получать нашу рассылку.

Проникновение в корзину

Этот темный шаблон встречается во многих приложениях для покупок, довольно часто в таких сервисах, как хостинг и авиабилеты. Он заключается в том, что при оформлении заказа в корзину помещаются товары, которые пользователь не выбрал, обычно это представляется как предложение или "необходимый" товар на небольшую сумму. Вот пример:

Рисунок 11.28 - В корзину добавлен дополнительный товар

В данном примере после оформления заказа на новый домен в корзину был автоматически добавлен новый пункт Первая настройка. Этот пункт не имеет другого объяснения, а его сумма кажется "маленькой" по сравнению с основной целью покупки. Часто такие товары являются "мошенническими" и не имеют никакого другого смысла, кроме как добавлять копейку за копейкой к конечной сумме. В некоторых случаях есть возможность удалить такие элементы до подтверждения покупки, но чаще всего такой возможности нет.

Приманка для тараканов (Roach motels)

Этот шаблон довольно часто встречается для услуг и подписок. Он заключается в том, что покупка совершается очень легко, часто после бесплатного пробного периода, с условием, что списание средств будет продолжаться до тех пор, пока пользователь явно не отменит покупку. Вот здесь-то и проявляется темная сторона: усложнение или невозможность отмены подписки. Например, некоторые компании требуют, чтобы пользователь обратился в службу поддержки с подписанным письмом, сопровождаемым документом, удостоверяющим личность. Основная концепция - "заманить пользователя в ловушку", чтобы отказ от услуг стал практически невозможным.

Privacy Zuckering

Эта темная схема названа в честь основателя известной компании, работающей в социальных сетях. Она заключается в том, что пользователю предлагается большое количество бесплатных сервисов, а при использовании приложений ведется мониторинг активности и поведения пользователя. Затем эти данные собираются и продаются сторонним компаниям без ведома пользователя. Зачастую такая практика так или иначе называется в довольно объемном договоре об условиях предоставления услуг, который пользователь должен принять перед использованием сервисов. Таким образом, компания утверждает, что пользователь дал свое согласие и осведомлен, в то время как очень немногие пользователи вообще читают или правильно интерпретируют такое соглашение.

Предотвращение сравнения цен

В данном случае сайт представляет пользователю несколько тарифных планов на услуги, но намеренно скрывает или маскирует либо характеристики, либо индивидуальные цены, в результате чего пользователь не может провести прямое сравнение и выбрать наиболее подходящий вариант.

Цена скрыта или замаскирована таким образом, что пользователь не может принять обоснованное решение и вынужден выбирать вариант на основе характеристик или других атрибутов.

Ненаправленность

Это еще один шаблон, часто используемый в рабочих процессах корзины. Он заключается в использовании названий и опций, которые сбивают пользователя с толку, а предварительно выбранные варианты скрывают альтернативные и более выгодные ценовые предложения. Если система имеет плавающее значение цены (например, для гостиниц или авиабилетов), этот шаблон часто используется для манипулирования пользователем с целью заставить его выбрать тот вариант, который отвечает интересам компании.

Скрытые расходы

В данном случае при выборе пользователем товара или услуги не раскрывается полное или исчерпывающее описание сопутствующих расходов (помимо налогов). Либо при первоначальной покупке, либо при последующих покупках общая сумма оплаты оказывается выше, чем та, на которую рассчитывал пользователь в первый раз.

Приманка и подмена

Эта схема широко используется рекламодателями в Интернете и вызывает наибольшую ненависть у пользователей. Он просто маскирует одну опцию под другую или прямо противоположную той, которую задумал пользователь. Классический пример - во всплывающем окне отображается кнопка Закрыть (обычно простая X), но когда пользователь нажимает ее, намереваясь закрыть диалоговое окно, открывается новая вкладка с рекламируемым сайтом.

Подтверждение позора (Confirm shaming)

Весьма манипулятивная схема, предполагающая намеренное использование формулировок или действий для того, чтобы пристыдить и высмеять пользователя, заставив его сделать то, чего он не хотел в начале сделки. Он может варьироваться от легкого раздражения до откровенного оскорбления. Часто используется вместе с другими темными шаблонами. Вот пример:

Рисунок 11.29 - Диалог подтверждения при удалении услуги из корзины

Заметьте, что в примере формулировки кнопок действий носят манипулятивный характер, хотя исходный вопрос таковым не является. Этот шаблон является обоюдоострым мечом, так как пользователь может почувствовать отказ от всей услуги и отменить всю операцию.

Замаскированная реклама

При внедрении рекламы на страницу она может маскироваться под реальный контент, имитируя стили и кнопки действий с целью заставить пользователя вызвать перенаправление или загрузить файл. В некоторых случаях маскировка такова, что отличить призыв к действию на сайте от рекламы невозможно. Подобная схема популярна на бесплатных сайтах, предлагающих размещение файлов для скачивания, где часто можно встретить несколько кнопок Скачать на странице, но только одна из них действительно загружает нужный файл, а остальные перенаправляют пользователя на сторонний сайт. Вот один из примеров:

Рисунок 11.30 - FileHippo.com размещает бесплатное программное обеспечение. Некоторые рекламные объявления маскируются под кнопки загрузки

На этом скриншоте с сайта FileHippo.com при переходе на страницу загрузки VLC Media Player на сайте представлены несколько кнопок Скачать. Если пользователь не обратит на них внимания, это может вызвать действие, отличное от предполагаемой загрузки программного обеспечения.

Дружественный спам

В этом темном шаблоне приложение запрашивает доступ к контактам пользователя с целью расширения его сети или круга общения. Если пользователь соглашается, то весь его список контактов "забрасывается" письмами, как бы исходящими от него, с предложением услуги. Зачастую после предоставления этой информации она также передается сторонним организациям и рекламодателям.

Перечень темных шаблонов может не быть напрямую связан с каким-либо одним средством массовой информации или структурой, но избегать или предотвращать их - этическая обязанность людей, работающих в этой отрасли.

Подведение итогов

В этой главе мы рассмотрели важные закономерности, позволяющие создать для пользователя удовлетворительный пользовательский опыт. Мы также познакомились с важными терминами, позволяющими разговаривать с дизайнерами на равных и с взаимопониманием, что является необходимым условием для сотрудничества и предоставления пользователю максимально положительного опыта.

Мы также рассмотрели некоторые из наиболее распространенных "темных" шаблонов, которые представляют собой приемы и реализации рабочих процессов, направленные на манипулирование пользователями и зачастую лишающие их конфиденциальности и ресурсов.

Хотя эта глава носит в основном информационный характер, она должна дать вам более полное представление о среде, в которой создаются веб-приложения, и о том, каких стандартов следует придерживаться для удобства работы с ними. Все это - знания, которые должен знать хороший инженер и разработчик.

Вопросы для проверки

Приведем несколько простых вопросов, которые помогут вам обобщить то, что вы узнали в этой главе:

  • Что такое UI и UX шаблоны?
  • Можете ли вы назвать преимущества использования шаблонов UX?
  • Какую пользу может принести использование стандартных шаблонов в компонентах Vue 3?
  • Что такое темные шаблоны и почему их следует избегать?
- +}

Обратите внимание, что в код включена точка останова на ширине 600 пикселей. Вы можете управлять различными размерами экрана, применяя несколько медиазапросов с точками останова.

Домашняя ссылка

Этот шаблон настолько распространен, что мы даже не задумываемся о нем. Главный логотип компании размещается в левой верхней части страницы как ссылка на главный экран. Такое расположение не случайно, оно связано с тем, как пользователи "сканируют" страницу.

Разные пользователи при загрузке страницы бросают беглый взгляд, направляя глаза в направлении Z, L или T по странице. Размещение логотипа в виде ссылки в левом верхнем углу гарантирует, что он будет первым элементом, который зарегистрирует пользователь. В данной главе хорошим примером этого шаблона являются рисунки 11.21 и 11.22. Но есть и исключения, например, домашняя страница Google:

Рисунок 11.24 - Главная страница Google является исключением из этого шаблона, так как логотип не является ссылкой

Однако исключение, показанное на предыдущем рисунке, является лишь временным, так как Google возвращается к этому шаблону, когда выводит результаты поиска:

Рисунок 11.25 - Результат поиска Google применяет шаблон

Шаблон "Главная ссылка" должен возвращать вас либо на главную страницу, либо на первый шаг процесса. Этот шаблон настолько широко распространен и понятен пользователям, что любое исключение из него должно делаться очень осторожно, с хорошим пониманием поведения и взаимодействия пользовательской базы.

Главная (hero) секция, призыв к действию (call to action) и иконки социальных сетей

Раздел hero - это первая часть, которая отображается при загрузке страницы в браузере и идет от самого верха (где находятся главная ссылка и главное меню) до, максимум, видимой нижней части экрана. Все содержимое, расположенное ниже этого раздела, называется "ниже сгиба (“below the fold)", т.е. чтобы увидеть его, пользователю необходимо прокрутить страницу вниз.

Hero раздел считается наиболее важной частью главной страницы и местом, где размещается первоначальный призыв к действию (call to action). Мы уже рассматривали эту концепцию в этой главе, когда говорили о принципах и контрастах дизайна пользовательского интерфейса. В настоящее время большинство сайтов придерживаются этой схемы и отображают раздел-герой контрастно, с большими изображениями или каруселью и преобладающим призывом к действию.

Рисунок 11.26 - Героический раздел главной страницы Kobold Press - красочный и непосредственный

В предыдущем примере от Kobold Press мы видим, как они применили несколько шаблонов, описанных здесь, начиная с главной ссылки и главного меню и заканчивая героической секцией и призывом к действию.

Обратите внимание также на то, что слева в виде плавающей боковой панели отображаются иконки социальных сетей. Становится шаблонным размещение таких значков со ссылками на адреса социальных сетей для каждого учреждения, а в случае постов или статей - со ссылкой "поделиться" контентом. Обычно панель социальных иконок размещается следующим образом:

  • В нижнем колонтитуле сайта
  • В начале и/или конце статьи
  • В описании продукта

При размещении ссылок на прямой доступ к контенту из приложения Vue (например, к товару из интернет-магазина) важно, чтобы ссылка и приложение Vue указывали непосредственно на такой товар. Необходимо обратить пристальное внимание на то, как формируется и интерпретируется навигационный URL при первой загрузке приложения Vue, чтобы избежать размещения ссылок, открывающих домашний экран вместо нужного раздела приложения.

Другие шаблоны

Есть и другие шаблоны, сотни, если не тысячи, которые оказывают непосредственное влияние на пользовательский опыт. Я рекомендую вам продолжить их изучение, например, следующие:

  • Шаблоны корзины
  • Пользовательский onboarding
  • Шаблоны геймификации
  • Шаблоны регистрации и снятия с регистрации

Однако у пользовательского опыта есть и темная сторона, связанная с использованием манипулятивных и обманных приемов. Как этичный разработчик, вы должны избегать использования любых из этих темных шаблонов.

Темные шаблоны

Темные шаблоны - это тщательно продуманные интерфейсы и взаимодействия с единственной целью - манипулировать или обмануть пользователя, заставить его совершить непредусмотренные действия или даже втянуть его во вредоносные результаты. После такого определения можно подумать, что подобные действия относятся к самым глубоким теневым уголкам Интернета. К сожалению, даже крупные компании часто следуют этой неэтичной практике. Собственно говоря, все воспроизведенные в этих разделах примеры относятся именно к такой категории, и, как это часто бывает с шаблонами проектирования, многие из них пересекаются или могут быть вложены друг в друга. Давайте рассмотрим их по очереди.

Вопросы с подвохом

Этот шаблон представляет собой простую или сложную игру слов, направленную на то, чтобы обмануть пользователя и заставить его сделать противоположное тому, что он задумал. Вот пример:

Рисунок 11.27 - Вопрос с подвохом для подписки на рассылку

Как видно из приведенного примера, у пользователя, заполняющего форму, может возникнуть соблазн оставить этот флажок не отмеченным, если он не хочет получать рассылку новостей от компании. Обычная тенденция - обратить внимание на выделенный жирным шрифтом текст, который является своего рода заголовком. Реальное же действие флажка находится в конце абзаца, который большинство пользователей не читает: Отметьте эту опцию, если вы не хотите получать нашу рассылку.

Проникновение в корзину

Этот темный шаблон встречается во многих приложениях для покупок, довольно часто в таких сервисах, как хостинг и авиабилеты. Он заключается в том, что при оформлении заказа в корзину помещаются товары, которые пользователь не выбрал, обычно это представляется как предложение или "необходимый" товар на небольшую сумму. Вот пример:

Рисунок 11.28 - В корзину добавлен дополнительный товар

В данном примере после оформления заказа на новый домен в корзину был автоматически добавлен новый пункт Первая настройка. Этот пункт не имеет другого объяснения, а его сумма кажется "маленькой" по сравнению с основной целью покупки. Часто такие товары являются "мошенническими" и не имеют никакого другого смысла, кроме как добавлять копейку за копейкой к конечной сумме. В некоторых случаях есть возможность удалить такие элементы до подтверждения покупки, но чаще всего такой возможности нет.

Приманка для тараканов (Roach motels)

Этот шаблон довольно часто встречается для услуг и подписок. Он заключается в том, что покупка совершается очень легко, часто после бесплатного пробного периода, с условием, что списание средств будет продолжаться до тех пор, пока пользователь явно не отменит покупку. Вот здесь-то и проявляется темная сторона: усложнение или невозможность отмены подписки. Например, некоторые компании требуют, чтобы пользователь обратился в службу поддержки с подписанным письмом, сопровождаемым документом, удостоверяющим личность. Основная концепция - "заманить пользователя в ловушку", чтобы отказ от услуг стал практически невозможным.

Privacy Zuckering

Эта темная схема названа в честь основателя известной компании, работающей в социальных сетях. Она заключается в том, что пользователю предлагается большое количество бесплатных сервисов, а при использовании приложений ведется мониторинг активности и поведения пользователя. Затем эти данные собираются и продаются сторонним компаниям без ведома пользователя. Зачастую такая практика так или иначе называется в довольно объемном договоре об условиях предоставления услуг, который пользователь должен принять перед использованием сервисов. Таким образом, компания утверждает, что пользователь дал свое согласие и осведомлен, в то время как очень немногие пользователи вообще читают или правильно интерпретируют такое соглашение.

Предотвращение сравнения цен

В данном случае сайт представляет пользователю несколько тарифных планов на услуги, но намеренно скрывает или маскирует либо характеристики, либо индивидуальные цены, в результате чего пользователь не может провести прямое сравнение и выбрать наиболее подходящий вариант.

Цена скрыта или замаскирована таким образом, что пользователь не может принять обоснованное решение и вынужден выбирать вариант на основе характеристик или других атрибутов.

Ненаправленность

Это еще один шаблон, часто используемый в рабочих процессах корзины. Он заключается в использовании названий и опций, которые сбивают пользователя с толку, а предварительно выбранные варианты скрывают альтернативные и более выгодные ценовые предложения. Если система имеет плавающее значение цены (например, для гостиниц или авиабилетов), этот шаблон часто используется для манипулирования пользователем с целью заставить его выбрать тот вариант, который отвечает интересам компании.

Скрытые расходы

В данном случае при выборе пользователем товара или услуги не раскрывается полное или исчерпывающее описание сопутствующих расходов (помимо налогов). Либо при первоначальной покупке, либо при последующих покупках общая сумма оплаты оказывается выше, чем та, на которую рассчитывал пользователь в первый раз.

Приманка и подмена

Эта схема широко используется рекламодателями в Интернете и вызывает наибольшую ненависть у пользователей. Он просто маскирует одну опцию под другую или прямо противоположную той, которую задумал пользователь. Классический пример - во всплывающем окне отображается кнопка Закрыть (обычно простая X), но когда пользователь нажимает ее, намереваясь закрыть диалоговое окно, открывается новая вкладка с рекламируемым сайтом.

Подтверждение позора (Confirm shaming)

Весьма манипулятивная схема, предполагающая намеренное использование формулировок или действий для того, чтобы пристыдить и высмеять пользователя, заставив его сделать то, чего он не хотел в начале сделки. Он может варьироваться от легкого раздражения до откровенного оскорбления. Часто используется вместе с другими темными шаблонами. Вот пример:

Рисунок 11.29 - Диалог подтверждения при удалении услуги из корзины

Заметьте, что в примере формулировки кнопок действий носят манипулятивный характер, хотя исходный вопрос таковым не является. Этот шаблон является обоюдоострым мечом, так как пользователь может почувствовать отказ от всей услуги и отменить всю операцию.

Замаскированная реклама

При внедрении рекламы на страницу она может маскироваться под реальный контент, имитируя стили и кнопки действий с целью заставить пользователя вызвать перенаправление или загрузить файл. В некоторых случаях маскировка такова, что отличить призыв к действию на сайте от рекламы невозможно. Подобная схема популярна на бесплатных сайтах, предлагающих размещение файлов для скачивания, где часто можно встретить несколько кнопок Скачать на странице, но только одна из них действительно загружает нужный файл, а остальные перенаправляют пользователя на сторонний сайт. Вот один из примеров:

Рисунок 11.30 - FileHippo.com размещает бесплатное программное обеспечение. Некоторые рекламные объявления маскируются под кнопки загрузки

На этом скриншоте с сайта FileHippo.com при переходе на страницу загрузки VLC Media Player на сайте представлены несколько кнопок Скачать. Если пользователь не обратит на них внимания, это может вызвать действие, отличное от предполагаемой загрузки программного обеспечения.

Дружественный спам

В этом темном шаблоне приложение запрашивает доступ к контактам пользователя с целью расширения его сети или круга общения. Если пользователь соглашается, то весь его список контактов "забрасывается" письмами, как бы исходящими от него, с предложением услуги. Зачастую после предоставления этой информации она также передается сторонним организациям и рекламодателям.

Перечень темных шаблонов может не быть напрямую связан с каким-либо одним средством массовой информации или структурой, но избегать или предотвращать их - этическая обязанность людей, работающих в этой отрасли.

Подведение итогов

В этой главе мы рассмотрели важные закономерности, позволяющие создать для пользователя удовлетворительный пользовательский опыт. Мы также познакомились с важными терминами, позволяющими разговаривать с дизайнерами на равных и с взаимопониманием, что является необходимым условием для сотрудничества и предоставления пользователю максимально положительного опыта.

Мы также рассмотрели некоторые из наиболее распространенных "темных" шаблонов, которые представляют собой приемы и реализации рабочих процессов, направленные на манипулирование пользователями и зачастую лишающие их конфиденциальности и ресурсов.

Хотя эта глава носит в основном информационный характер, она должна дать вам более полное представление о среде, в которой создаются веб-приложения, и о том, каких стандартов следует придерживаться для удобства работы с ними. Все это - знания, которые должен знать хороший инженер и разработчик.

Вопросы для проверки

Приведем несколько простых вопросов, которые помогут вам обобщить то, что вы узнали в этой главе:

  • Что такое UI и UX шаблоны?
  • Можете ли вы назвать преимущества использования шаблонов UX?
  • Какую пользу может принести использование стандартных шаблонов в компонентах Vue 3?
  • Что такое темные шаблоны и почему их следует избегать?
+ \ No newline at end of file diff --git a/ru/book/Chapter_1__The_Vue_3_Framework.html b/ru/book/Chapter_1__The_Vue_3_Framework.html index aafcf4d43..ae04bc449 100644 --- a/ru/book/Chapter_1__The_Vue_3_Framework.html +++ b/ru/book/Chapter_1__The_Vue_3_Framework.html @@ -6,13 +6,13 @@ Фреймворк Vue 3 | Vue FAQ - + - + - - + + @@ -90,8 +90,8 @@ <template>     <component :is="action"></component>      <button @click="action = 'EditItem'">Edit</button> -</template>

В этом простом примере, когда пользователь нажмет кнопку Edit, значение action изменится на EditItem, и компонент заменится. Документацию можно найти здесь:https://vuejs.org/api/built-in-special-elements.html.

Поняв, что такое фреймворки и компоненты, мы теперь лучше подготовлены к дальнейшей работе.

Кодовые соглашения (code conventions) в книге

В этой книге мы будем использовать набор кодовых соглашений и рекомендаций, которые являются хорошей практикой для Vue 3. Они помогут вам не только понять примеры, приведенные в этой книге, но и код, который вы можете встретить в природе, поскольку все больше разработчиков используют его. Давайте начнем с самого начала.

Переменные и пропсы

Они всегда пишутся в нижнем регистре, а пробелы заменяются знаком подчеркивания, например, total_count и person_id.

Константы

Ссылки на инжектируемые объекты начинаются со знака $, например, $router, $modals и $notifications.

Ссылки на реактивные данные начинаются с _ и набираются в змеином регистре (snake case), например, _total и _first_input.

Ссылки на константные значения обозначаются заглавными буквами, например, OPTION и LANGUAGE_CODE.

Функции-конструкторы для инжектируемых зависимостей будут начинаться с use, например, const $store=useStore().

Имена классов и компонентов

Они записываются в PascalCase (каждое слово начинается с буквы верхнего регистра), например, Person, Task и QueueBuilder.

Функции, методы, события и имена файлов

Они пишутся в CamelCase, например, doSubscribe() и processQueue().

Экземпляры

Экземпляры будут иметь абстрактное имя, за которым следует слово Service в случае обычных JavaScript-объектов, предоставляющих функции, Model для моделей состояний и так далее. Мы будем использовать сервисы для инкапсуляции функциональности.

Например: const projectService=new ProjectService().

Совет

В своей команде всегда используйте кодовые соглашения, с которыми все согласны. Это сделает код более читаемым и удобным для сопровождения. Можно также порекомендовать использовать линтер (процессор для фиксации соглашений в коде).

Как уже говорилось, эти соглашения набирают популярность, поэтому вы можете встретить их во многих проектах. Однако они не являются обязательными стандартами и уж точно не предписаны фреймворком. Вы можете писать все заглавными буквами, если это ваш стиль, но на самом деле важно, чтобы вы и ваша команда определили и соблюдали свои собственные соглашения в последовательной манере. В конечном итоге важно, чтобы при написании кода у всех нас был общий язык.

Подведение итогов

В этой главе мы прошли путь от основ библиотек и фреймворков до директив Vue 3, компонентов и даже кодовых соглашений. Эти понятия все еще немного абстрактны, поэтому мы будем доводить их до реализации по мере продвижения по книге и работы с реальным кодом. Однако сейчас мы готовы для изучения принципов проектирования и паттернов в следующей главе.

Вопросы для проверки

Для того чтобы помочь вам закрепить содержание этой главы, вы можете воспользоваться следующими вопросами:

  • В чем разница между библиотекой и фреймворком?
  • Почему Vue является "прогрессивным" фреймворком?
  • Что такое однофайловые компоненты?
  • Какие директивы наиболее часто используются при разработке Vue?
  • Почему важны соглашения в коде?

Если вы можете быстро ответить на эти вопросы в уме, то вы готовы к работе! Если нет, то, возможно, вам стоит кратко просмотреть главу, чтобы убедиться, что у вас есть основа для дальнейшей работы.

- +</template>

В этом простом примере, когда пользователь нажмет кнопку Edit, значение action изменится на EditItem, и компонент заменится. Документацию можно найти здесь:https://vuejs.org/api/built-in-special-elements.html.

Поняв, что такое фреймворки и компоненты, мы теперь лучше подготовлены к дальнейшей работе.

Кодовые соглашения (code conventions) в книге

В этой книге мы будем использовать набор кодовых соглашений и рекомендаций, которые являются хорошей практикой для Vue 3. Они помогут вам не только понять примеры, приведенные в этой книге, но и код, который вы можете встретить в природе, поскольку все больше разработчиков используют его. Давайте начнем с самого начала.

Переменные и пропсы

Они всегда пишутся в нижнем регистре, а пробелы заменяются знаком подчеркивания, например, total_count и person_id.

Константы

Ссылки на инжектируемые объекты начинаются со знака $, например, $router, $modals и $notifications.

Ссылки на реактивные данные начинаются с _ и набираются в змеином регистре (snake case), например, _total и _first_input.

Ссылки на константные значения обозначаются заглавными буквами, например, OPTION и LANGUAGE_CODE.

Функции-конструкторы для инжектируемых зависимостей будут начинаться с use, например, const $store=useStore().

Имена классов и компонентов

Они записываются в PascalCase (каждое слово начинается с буквы верхнего регистра), например, Person, Task и QueueBuilder.

Функции, методы, события и имена файлов

Они пишутся в CamelCase, например, doSubscribe() и processQueue().

Экземпляры

Экземпляры будут иметь абстрактное имя, за которым следует слово Service в случае обычных JavaScript-объектов, предоставляющих функции, Model для моделей состояний и так далее. Мы будем использовать сервисы для инкапсуляции функциональности.

Например: const projectService=new ProjectService().

Совет

В своей команде всегда используйте кодовые соглашения, с которыми все согласны. Это сделает код более читаемым и удобным для сопровождения. Можно также порекомендовать использовать линтер (процессор для фиксации соглашений в коде).

Как уже говорилось, эти соглашения набирают популярность, поэтому вы можете встретить их во многих проектах. Однако они не являются обязательными стандартами и уж точно не предписаны фреймворком. Вы можете писать все заглавными буквами, если это ваш стиль, но на самом деле важно, чтобы вы и ваша команда определили и соблюдали свои собственные соглашения в последовательной манере. В конечном итоге важно, чтобы при написании кода у всех нас был общий язык.

Подведение итогов

В этой главе мы прошли путь от основ библиотек и фреймворков до директив Vue 3, компонентов и даже кодовых соглашений. Эти понятия все еще немного абстрактны, поэтому мы будем доводить их до реализации по мере продвижения по книге и работы с реальным кодом. Однако сейчас мы готовы для изучения принципов проектирования и паттернов в следующей главе.

Вопросы для проверки

Для того чтобы помочь вам закрепить содержание этой главы, вы можете воспользоваться следующими вопросами:

  • В чем разница между библиотекой и фреймворком?
  • Почему Vue является "прогрессивным" фреймворком?
  • Что такое однофайловые компоненты?
  • Какие директивы наиболее часто используются при разработке Vue?
  • Почему важны соглашения в коде?

Если вы можете быстро ответить на эти вопросы в уме, то вы готовы к работе! Если нет, то, возможно, вам стоит кратко просмотреть главу, чтобы убедиться, что у вас есть основа для дальнейшей работы.

+ \ No newline at end of file diff --git a/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html b/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html index cf2eea0df..693f5c7d8 100644 --- a/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html +++ b/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html @@ -6,13 +6,13 @@ Принципы и шаблоны проектирования программного обеспечения | Vue FAQ - + - + - - + + @@ -319,8 +319,8 @@ MyFuncA()     .then(result => { a = result; return MyFuncB(); })     .then(result => { b = result; return MyFuncC(); }) -    .then(result => { c = result; console.log(a + b + c); });

Этот формат сложнее для понимания и, конечно, более многословен. Для таких случаев предпочтительнее использовать синтаксис async/await.

Использование обещаний отлично подходит для обертывания длинных или неопределенных операций и интеграции с другими рассмотренными нами шаблонами (façade, decorator и т.д.). Это важный шаблон, который мы будем широко использовать в наших приложениях.

Подведение итогов

В этой главе мы рассмотрели принципы разработки программного обеспечения и важные шаблоны проектирования, привели примеры на обычном JavaScript и, когда это было уместно, намекнули на реализацию с помощью Vue 3. Эти шаблоны могут быть сложны для восприятия при первом знакомстве с ними, но мы будем использовать их и возвращаться к ним в остальных частях книги, так что эта глава будет работать как справочник. Это позволит вам лучше понять, когда и как применять те или иные шаблоны в зависимости от потребностей вашего приложения.

В следующей главе мы начнем реализовывать проект с нуля и заложим основы для приложений, которые мы будем создавать в остальных частях книги. По мере продвижения вперед мы будем ссылаться на эти шаблоны, чтобы помочь вам закрепить их применение.

Вопросы для проверки

  • В чем разница между принципом и шаблоном проектирования?
  • Почему шаблон singleton так важен?
  • Как можно управлять зависимостями?
  • Какие шаблоны делают возможной реактивность?
  • Взаимосвязаны ли шаблоны между собой? Почему? Можете ли вы привести пример?
  • Что такое асинхронное программирование и почему оно так важно?
  • Можете ли вы придумать примеры использования promised функций?
- +    .then(result => { c = result; console.log(a + b + c); });

Этот формат сложнее для понимания и, конечно, более многословен. Для таких случаев предпочтительнее использовать синтаксис async/await.

Использование обещаний отлично подходит для обертывания длинных или неопределенных операций и интеграции с другими рассмотренными нами шаблонами (façade, decorator и т.д.). Это важный шаблон, который мы будем широко использовать в наших приложениях.

Подведение итогов

В этой главе мы рассмотрели принципы разработки программного обеспечения и важные шаблоны проектирования, привели примеры на обычном JavaScript и, когда это было уместно, намекнули на реализацию с помощью Vue 3. Эти шаблоны могут быть сложны для восприятия при первом знакомстве с ними, но мы будем использовать их и возвращаться к ним в остальных частях книги, так что эта глава будет работать как справочник. Это позволит вам лучше понять, когда и как применять те или иные шаблоны в зависимости от потребностей вашего приложения.

В следующей главе мы начнем реализовывать проект с нуля и заложим основы для приложений, которые мы будем создавать в остальных частях книги. По мере продвижения вперед мы будем ссылаться на эти шаблоны, чтобы помочь вам закрепить их применение.

Вопросы для проверки

  • В чем разница между принципом и шаблоном проектирования?
  • Почему шаблон singleton так важен?
  • Как можно управлять зависимостями?
  • Какие шаблоны делают возможной реактивность?
  • Взаимосвязаны ли шаблоны между собой? Почему? Можете ли вы привести пример?
  • Что такое асинхронное программирование и почему оно так важно?
  • Можете ли вы придумать примеры использования promised функций?
+ \ No newline at end of file diff --git a/ru/book/Chapter_3__Setting_Up_a_Working_Project.html b/ru/book/Chapter_3__Setting_Up_a_Working_Project.html index 9305d996a..f4e7989a6 100644 --- a/ru/book/Chapter_3__Setting_Up_a_Working_Project.html +++ b/ru/book/Chapter_3__Setting_Up_a_Working_Project.html @@ -6,13 +6,13 @@ Установка рабочего проекта | Vue FAQ - + - + - - + + @@ -132,8 +132,8 @@   No tasks </div> </div>

Для отображения списка задач у нас есть два практически одинаковых блока кода, начинающихся на строках //4 и //5 - один для отложенных задач, другой - для выполненных. Мы остановимся только на первом блоке (начинающемся на строке //4), поскольку поведение этих блоков практически одинаково.

В первом элементе div мы создаем небольшой заголовок, который отображает количество элементов в массиве _pending, интерполируя его длину. Для этого используется следующая строка:

js
Pending ({{ _pending.length }})

Обратите внимание, что мы можем обращаться к атрибутам массива непосредственно внутри двойных фигурных скобок, без использования атрибута .value. Хотя в JavaScript-коде мы должны написать это как _pending.value.length, при использовании интерполяции в HTML Vue достаточно умён, чтобы определить реактивную переменную в нашей секции шаблона и получить доступ к ее значению напрямую. Это верно как для вычисляемых свойств, так и для реактивных переменных, созданных с помощью ref().

В следующем элементе div мы создаем список с помощью директивы v-for/:key, которая будет перебирать наш массив _pending и создавать копию элемента для каждого элемента. Внутри каждого из них мы теперь можем ссылаться на каждый элемент с именем todo, которое мы объявили в директиве v-for.

Далее мы обернем input и span внутри элемента label и привяжем свойство todo.checked (Boolean) к input с помощью v-model. Vue позаботится о присвоении значения true или false в зависимости от состояния флажка. Когда это произойдет, он также вызовет пересчет свойств computed, и мы увидим, как при установке/снятии флажка элемент перемещается между группами (ожидающие и завершенные), а также обновляет общее количество каждого блока. У нас также есть элемент span для отображения текста задачи.

И наконец, для случаев, когда группа списка пуста, у нас также есть элемент div, который будет виден только в том случае, если этот список пуст, в строке //6 (\pending.length==0)

Как уже упоминалось, часть, отображающая наш список "выполненных" дел, работает аналогичным образом, применяя ту же логику.

В данном случае объем наших стилей будет невелик, так как нам потребуется всего пара дополнительных настроек, поскольку основная часть работы была выполнена с помощью библиотеки w3.css. Внутри нашей секции style добавьте следующее:

css
.todo-container {max-width: 100%; min-width: 30rem;}
-label {cursor: pointer; display: flex;}

Класс todo-container ограничивает максимальную и минимальную ширину нашего компонента, а также мы модифицируем элемент label для отображения его дочерних элементов с помощью макета flex

Чтобы увидеть приложение в действии, сохраните все изменения и запустите сервер разработки Vite, выполнив в терминале следующую команду:

sh
$ npm run dev

После того как Vite будет готов, откройте его адрес в браузере, как мы это делали ранее. Если все в порядке, вы должны увидеть, что наш список дел работает так, как ожидалось. В противном случае проверьте исходный код в репозитории, чтобы убедиться, что набранный вами код соответствует полному примеру.

Краткая критика нашего приложения To-Do

Приложение, которое мы только что сделали, работает и является немного более продвинутым, чем простое Hello World или кнопка счетчика. Однако мы не применили все лучшие практики и паттерны, которые должны или могли бы применить. Это сделано специально, в качестве обучающего упражнения.

Иногда, чтобы понять, как правильно построить что-то, нужно сначала построить это так, чтобы оно работало как есть. В целом, все инженерные практики понимают, что существует итеративный процесс доработки, который обеспечивает обучение и совершенствование с каждым взаимодействием.

Как только мы создали первый прототип, самое время сделать шаг назад и подвергнуть его искренней критике, подумав о том, как мы можем его улучшить и сделать лучше. В данном случае, вот наша критика:

  • В нашем шаблоне есть дублирование кода, поскольку вычисляемые свойства _pending и _done в принципе одинаковы, с небольшим отличием, основанным на значении переменной.
  • Мы не используем возможности компонентов, поскольку все построено в одном компоненте.
  • Наш компонент также создает наши модели (элементы To-Do), поэтому наша бизнес-логика привязана к нашему компоненту.
  • Мы сделали очень мало в плане санитизации и контроля ввода. Можно предвидеть, что некоторый код, даже с одинаковыми входными данными, сломает наше приложение.
  • Наш список дел непостоянен. Обновление страницы может очистить наш список.
  • В нашей задаче есть только два состояния (выполнено и отложено). А что, если мы хотим иметь третье или более состояний? Например, "в процессе", "в ожидании" или "следующий в очереди"
  • Текущий дизайн не предусматривает возможности редактирования или удаления задачи после ее создания.
  • Мы можем одновременно управлять только одним списком элементов.

По мере продвижения вперед мы будем совершенствовать наше приложение и применять принципы и паттерны, чтобы сделать его более устойчивым и полезным. В следующей главе мы рассмотрим, как скомпоновать веб-приложение с помощью веб-компонентов более доступным способом.

Подведение итогов

В этой главе мы начали создавать приложения, используя реальные инструменты, от IDE до инструментов командной строки, для создания каркаса приложения, предварительного просмотра и сборки приложения. Мы также создали простое приложение To-Do и узнали, как можно интегрировать сторонние CSS-библиотеки и шрифты иконок в наше приложение, а также определили некоторые общие рекомендации по использованию других библиотек.

Мы также критически подошли к нашему простому приложению, чтобы улучшить его функциональность, а заодно и свои навыки. В следующей главе мы рассмотрим, как лучше организовать наш код и создать иерархию компонентов для создания пользовательских интерфейсов.

Вопросы для проверки

  • Каковы требования к разработке приложения Vue 3 с помощью Vite?
  • Возможно ли интегрировать сторонние библиотеки и фреймворки с Vue 3?
  • Каковы шаги по интеграции библиотеки, работающей только с CSS, в приложение Vue?
  • Является ли хорошей идеей создание приложения внутри одного компонента? Почему да или нет? Можете ли вы назвать сценарии, когда однокомпонентное приложение является подходящим вариантом? А как насчет сценария, когда это не так?
  • Почему разработка программного обеспечения - это итеративный процесс совершенствования?
- +label {cursor: pointer; display: flex;}

Класс todo-container ограничивает максимальную и минимальную ширину нашего компонента, а также мы модифицируем элемент label для отображения его дочерних элементов с помощью макета flex

Чтобы увидеть приложение в действии, сохраните все изменения и запустите сервер разработки Vite, выполнив в терминале следующую команду:

sh
$ npm run dev

После того как Vite будет готов, откройте его адрес в браузере, как мы это делали ранее. Если все в порядке, вы должны увидеть, что наш список дел работает так, как ожидалось. В противном случае проверьте исходный код в репозитории, чтобы убедиться, что набранный вами код соответствует полному примеру.

Краткая критика нашего приложения To-Do

Приложение, которое мы только что сделали, работает и является немного более продвинутым, чем простое Hello World или кнопка счетчика. Однако мы не применили все лучшие практики и паттерны, которые должны или могли бы применить. Это сделано специально, в качестве обучающего упражнения.

Иногда, чтобы понять, как правильно построить что-то, нужно сначала построить это так, чтобы оно работало как есть. В целом, все инженерные практики понимают, что существует итеративный процесс доработки, который обеспечивает обучение и совершенствование с каждым взаимодействием.

Как только мы создали первый прототип, самое время сделать шаг назад и подвергнуть его искренней критике, подумав о том, как мы можем его улучшить и сделать лучше. В данном случае, вот наша критика:

  • В нашем шаблоне есть дублирование кода, поскольку вычисляемые свойства _pending и _done в принципе одинаковы, с небольшим отличием, основанным на значении переменной.
  • Мы не используем возможности компонентов, поскольку все построено в одном компоненте.
  • Наш компонент также создает наши модели (элементы To-Do), поэтому наша бизнес-логика привязана к нашему компоненту.
  • Мы сделали очень мало в плане санитизации и контроля ввода. Можно предвидеть, что некоторый код, даже с одинаковыми входными данными, сломает наше приложение.
  • Наш список дел непостоянен. Обновление страницы может очистить наш список.
  • В нашей задаче есть только два состояния (выполнено и отложено). А что, если мы хотим иметь третье или более состояний? Например, "в процессе", "в ожидании" или "следующий в очереди"
  • Текущий дизайн не предусматривает возможности редактирования или удаления задачи после ее создания.
  • Мы можем одновременно управлять только одним списком элементов.

По мере продвижения вперед мы будем совершенствовать наше приложение и применять принципы и паттерны, чтобы сделать его более устойчивым и полезным. В следующей главе мы рассмотрим, как скомпоновать веб-приложение с помощью веб-компонентов более доступным способом.

Подведение итогов

В этой главе мы начали создавать приложения, используя реальные инструменты, от IDE до инструментов командной строки, для создания каркаса приложения, предварительного просмотра и сборки приложения. Мы также создали простое приложение To-Do и узнали, как можно интегрировать сторонние CSS-библиотеки и шрифты иконок в наше приложение, а также определили некоторые общие рекомендации по использованию других библиотек.

Мы также критически подошли к нашему простому приложению, чтобы улучшить его функциональность, а заодно и свои навыки. В следующей главе мы рассмотрим, как лучше организовать наш код и создать иерархию компонентов для создания пользовательских интерфейсов.

Вопросы для проверки

  • Каковы требования к разработке приложения Vue 3 с помощью Vite?
  • Возможно ли интегрировать сторонние библиотеки и фреймворки с Vue 3?
  • Каковы шаги по интеграции библиотеки, работающей только с CSS, в приложение Vue?
  • Является ли хорошей идеей создание приложения внутри одного компонента? Почему да или нет? Можете ли вы назвать сценарии, когда однокомпонентное приложение является подходящим вариантом? А как насчет сценария, когда это не так?
  • Почему разработка программного обеспечения - это итеративный процесс совершенствования?
+ \ No newline at end of file diff --git a/ru/book/Chapter_4__User_Interface_Composition_with_Components.html b/ru/book/Chapter_4__User_Interface_Composition_with_Components.html index 312e99923..61ddfcb94 100644 --- a/ru/book/Chapter_4__User_Interface_Composition_with_Components.html +++ b/ru/book/Chapter_4__User_Interface_Composition_with_Components.html @@ -6,13 +6,13 @@ Композиция пользовательского интерфейса с помощью компонентов | Vue FAQ - + - + - - + + @@ -186,8 +186,8 @@          case "in_progress":        return "completed"          case "completed":          return "not_started"      } -}

Эта функция, учитывая текущий статус, вернет следующий. Вызывая эту функцию при каждом щелчке мыши, мы можем обновлять состояние каждого элемента в чистом виде.

Последним моментом, который следует отметить в этой новой реализации, является использование вычисляемых свойств в компоненте ToDoSummary. С их помощью мы выводим на экран сводные карточки с различными состояниями наших элементов. Обратите внимание, как хорошо работает реактивность - как только мы изменяем состояние элемента в списке, сводка немедленно обновляется!

После того как новая реализация приведена в порядок, пришло время сделать шаг назад и взглянуть на нашу работу критически.

Небольшая критика нашего нового приложения To-Do

Новая версия приложения To-Do - это явное улучшение по сравнению с нашим первым подходом, но ее можно усовершенствовать:

  • У нас по-прежнему только один список задач.
  • Все по-прежнему происходит на одной странице.
  • Наши элементы эфемерны. Они исчезают, когда мы закрываем или обновляем браузер.
  • Нет никакой безопасности, нет возможности иметь несколько пользователей и т.д.
  • Мы можем добавлять только обычный текст. А как насчет изображений или насыщенного текста?
  • После некоторой работы мы могли бы расширить наше приложение, чтобы оно управляло несколькими проектами, дополнительным контентом, заданиями и т.д.
  • Мы добились хороших результатов, но нам еще многое предстоит сделать.

Подведение итогов

В этой главе мы подробно рассмотрели компоненты и узнали, как они могут взаимодействовать, разделять функциональность и реализовывать шаблоны проектирования в рамках фреймворка. Мы также рассмотрели подход к преобразованию грубого эскиза или детального проекта в компоненты.

Затем мы узнали о специальных компонентах, создали плагин для модальных диалогов с использованием инъекции зависимостей фреймворка и применили другие шаблоны, чтобы сделать наше кодирование более простым и конгруэнтным. Кроме того, мы провели рефакторинг нашего приложения и расширили его возможности, взглянув на более эффективное управление состояниями, независимое от HTML-элемента, который мы использовали ранее. Мы добились значительного прогресса, но нам еще есть над чем работать.

В следующей главе мы создадим одностраничное приложение (SPA) с использованием того, чему мы научились за это время.

Вопросы для проверки

Ответьте на следующие вопросы, чтобы проверить свои знания по этой главе:

  • Как мы можем начать с визуального дизайна или прототипа и спланировать реализацию с помощью компонентов?
  • Какими способами компоненты могут взаимодействовать друг с другом?
  • Как мы можем повторно использовать код в нескольких компонентах? Есть ли другой способ?
  • Что такое плагин и как его создать?
  • Какие шаблоны мы применили к новому приложению To-Do?
  • Что бы вы изменили в реализации?
- +}

Эта функция, учитывая текущий статус, вернет следующий. Вызывая эту функцию при каждом щелчке мыши, мы можем обновлять состояние каждого элемента в чистом виде.

Последним моментом, который следует отметить в этой новой реализации, является использование вычисляемых свойств в компоненте ToDoSummary. С их помощью мы выводим на экран сводные карточки с различными состояниями наших элементов. Обратите внимание, как хорошо работает реактивность - как только мы изменяем состояние элемента в списке, сводка немедленно обновляется!

После того как новая реализация приведена в порядок, пришло время сделать шаг назад и взглянуть на нашу работу критически.

Небольшая критика нашего нового приложения To-Do

Новая версия приложения To-Do - это явное улучшение по сравнению с нашим первым подходом, но ее можно усовершенствовать:

  • У нас по-прежнему только один список задач.
  • Все по-прежнему происходит на одной странице.
  • Наши элементы эфемерны. Они исчезают, когда мы закрываем или обновляем браузер.
  • Нет никакой безопасности, нет возможности иметь несколько пользователей и т.д.
  • Мы можем добавлять только обычный текст. А как насчет изображений или насыщенного текста?
  • После некоторой работы мы могли бы расширить наше приложение, чтобы оно управляло несколькими проектами, дополнительным контентом, заданиями и т.д.
  • Мы добились хороших результатов, но нам еще многое предстоит сделать.

Подведение итогов

В этой главе мы подробно рассмотрели компоненты и узнали, как они могут взаимодействовать, разделять функциональность и реализовывать шаблоны проектирования в рамках фреймворка. Мы также рассмотрели подход к преобразованию грубого эскиза или детального проекта в компоненты.

Затем мы узнали о специальных компонентах, создали плагин для модальных диалогов с использованием инъекции зависимостей фреймворка и применили другие шаблоны, чтобы сделать наше кодирование более простым и конгруэнтным. Кроме того, мы провели рефакторинг нашего приложения и расширили его возможности, взглянув на более эффективное управление состояниями, независимое от HTML-элемента, который мы использовали ранее. Мы добились значительного прогресса, но нам еще есть над чем работать.

В следующей главе мы создадим одностраничное приложение (SPA) с использованием того, чему мы научились за это время.

Вопросы для проверки

Ответьте на следующие вопросы, чтобы проверить свои знания по этой главе:

  • Как мы можем начать с визуального дизайна или прототипа и спланировать реализацию с помощью компонентов?
  • Какими способами компоненты могут взаимодействовать друг с другом?
  • Как мы можем повторно использовать код в нескольких компонентах? Есть ли другой способ?
  • Что такое плагин и как его создать?
  • Какие шаблоны мы применили к новому приложению To-Do?
  • Что бы вы изменили в реализации?
+ \ No newline at end of file diff --git a/ru/book/Chapter_5__Single-Page_Applications.html b/ru/book/Chapter_5__Single-Page_Applications.html index 962e623e5..47aeaec13 100644 --- a/ru/book/Chapter_5__Single-Page_Applications.html +++ b/ru/book/Chapter_5__Single-Page_Applications.html @@ -6,13 +6,13 @@ Одностраничные приложения | Vue FAQ - + - + - - + + @@ -191,8 +191,8 @@ .then(     result => console.log(result[0]),     err => console.log(err) -)

Вот и все! Выделенная строка побуждает MetaMask открыть новое окно и запросить у пользователя разрешение на подключение его кошелька к вашему веб-приложению, а затем вернуть удобный промис. В случае разрешения результатом будет массив строк, в котором первой позицией будет адрес кошелька для текущей сети. В случае отказа будет выдана ошибка.

Совет

При использовании MetaMask можно открыть в браузере Инструменты разработчика и набрать в одной строке приведенный ниже код для его тестирования.

С помощью MetaMask тот же код для сети Ethereum также работает при подключении к сетям Polygon и Binance Smart Chain (три по цене одного!). Другие сети и кошельки, например кошелек Phantom, работают по тому же принципу и внедряют в объект windows новый объект .solana. Ознакомьтесь с документацией по целевому блокчейну, чтобы узнать подробности каждой реализации.

Взаимодействие с каждым блокчейном и его кодом выходит за рамки данной книги, поэтому мы ограничимся идентификацией пользователя по адресу его кошелька. Получив эту идентификацию, логика приложения должна сохранить ее для дальнейшего использования, поскольку она действует как идентификатор пользователя.

Для аутентификации и взаимодействия с несколькими блокчейнами существуют также решения сторонних разработчиков, и нам следует рассмотреть их, прежде чем реализовывать собственное решение.

Подведение итогов

В этой главе мы значительно улучшили наше приложение и создали продуманный SPA с навигацией с помощью маршрутизатора Vue. Это важная концепция, позволяющая сегментировать приложение и организовать работу между членами команды разработчиков. Фракционирование приложения по пути навигации упрощает разработку и сопровождение и делает их более организованными.

Мы также изучили несколько стандартных паттернов аутентификации, которые можно использовать в наших приложениях. Они охватывают большое количество сценариев, используемых сегодня в индустрии, начиная от самых простых имени пользователя и пароля и заканчивая новыми Web3 DApps.

Мы также уделили время тому, как работают стандартные протоколы, такие как OAuth, а также OTP, и как они могут быть реализованы для дополнительного уровня безопасности в качестве второго фактора аутентификации. Все эти навыки актуальны и необходимы для современных стандартов веб-приложений.

В следующей главе мы познакомимся с прогрессивными веб-приложениями (PWAs).

Вопросы для проверки

В этой главе мы рассмотрели множество различных тем и ввели новые понятия. Используйте следующие вопросы, чтобы закрепить полученные знания:

  • Когда лучше использовать SPA вместо MPA и наоборот?
  • Каковы преимущества использования маршрутизатора в SPA? Назовите не менее трех из собственного анализа.
  • Как можно использовать представления для определения компоновки приложения?
  • Как можно получить доступ к параметрам и строке запроса, переданным маршруту, в JavaScript?
  • Каковы некоторые общие стандартные шаблоны для аутентификации пользователей?
  • Каковы некоторые соображения безопасности при аутентификации пользователей в SPA?
- +)

Вот и все! Выделенная строка побуждает MetaMask открыть новое окно и запросить у пользователя разрешение на подключение его кошелька к вашему веб-приложению, а затем вернуть удобный промис. В случае разрешения результатом будет массив строк, в котором первой позицией будет адрес кошелька для текущей сети. В случае отказа будет выдана ошибка.

Совет

При использовании MetaMask можно открыть в браузере Инструменты разработчика и набрать в одной строке приведенный ниже код для его тестирования.

С помощью MetaMask тот же код для сети Ethereum также работает при подключении к сетям Polygon и Binance Smart Chain (три по цене одного!). Другие сети и кошельки, например кошелек Phantom, работают по тому же принципу и внедряют в объект windows новый объект .solana. Ознакомьтесь с документацией по целевому блокчейну, чтобы узнать подробности каждой реализации.

Взаимодействие с каждым блокчейном и его кодом выходит за рамки данной книги, поэтому мы ограничимся идентификацией пользователя по адресу его кошелька. Получив эту идентификацию, логика приложения должна сохранить ее для дальнейшего использования, поскольку она действует как идентификатор пользователя.

Для аутентификации и взаимодействия с несколькими блокчейнами существуют также решения сторонних разработчиков, и нам следует рассмотреть их, прежде чем реализовывать собственное решение.

Подведение итогов

В этой главе мы значительно улучшили наше приложение и создали продуманный SPA с навигацией с помощью маршрутизатора Vue. Это важная концепция, позволяющая сегментировать приложение и организовать работу между членами команды разработчиков. Фракционирование приложения по пути навигации упрощает разработку и сопровождение и делает их более организованными.

Мы также изучили несколько стандартных паттернов аутентификации, которые можно использовать в наших приложениях. Они охватывают большое количество сценариев, используемых сегодня в индустрии, начиная от самых простых имени пользователя и пароля и заканчивая новыми Web3 DApps.

Мы также уделили время тому, как работают стандартные протоколы, такие как OAuth, а также OTP, и как они могут быть реализованы для дополнительного уровня безопасности в качестве второго фактора аутентификации. Все эти навыки актуальны и необходимы для современных стандартов веб-приложений.

В следующей главе мы познакомимся с прогрессивными веб-приложениями (PWAs).

Вопросы для проверки

В этой главе мы рассмотрели множество различных тем и ввели новые понятия. Используйте следующие вопросы, чтобы закрепить полученные знания:

  • Когда лучше использовать SPA вместо MPA и наоборот?
  • Каковы преимущества использования маршрутизатора в SPA? Назовите не менее трех из собственного анализа.
  • Как можно использовать представления для определения компоновки приложения?
  • Как можно получить доступ к параметрам и строке запроса, переданным маршруту, в JavaScript?
  • Каковы некоторые общие стандартные шаблоны для аутентификации пользователей?
  • Каковы некоторые соображения безопасности при аутентификации пользователей в SPA?
+ \ No newline at end of file diff --git a/ru/book/Chapter_6__Progressive_Web_Applications.html b/ru/book/Chapter_6__Progressive_Web_Applications.html index 63a20cd38..e87962ee7 100644 --- a/ru/book/Chapter_6__Progressive_Web_Applications.html +++ b/ru/book/Chapter_6__Progressive_Web_Applications.html @@ -6,13 +6,13 @@ Прогрессивные веб-приложения | Vue FAQ - + - + - - + + @@ -140,8 +140,8 @@            "prefer_related_applications": false      }   })] -})

Используя этот плагин, мы снимаем со сборщика бремя генерации service worker и веб-манифеста. Это необходимо, поскольку при каждой промышленной сборке Vite будет генерировать разные имена файлов для каждого скрипта в соответствии с нашей стратегией "ленивой" загрузки компонентов, о которой мы говорили в предыдущей главе.

В предыдущем примере мы передаем в плагин VitePWA() объект с некоторыми разумными опциями для автоматического создания и внедрения манифеста и рабочего скрипта. Если нам нужен более тонкий контроль над создаваемой стратегией рабочего сервиса, а также над веб-манифестом, то можно использовать плагин в "режиме инъекции" и предоставить базовый файл для нашего рабочего сервиса.

В этом случае в скрипт будут инжектироваться сгенерированные в процессе сборки файлы. Под капотом плагин использует Workbox, инструмент, о котором мы уже упоминали и который мы можем настраивать непосредственно через поле workbox. Более подробное рассмотрение различных реализаций и стратегий выходит за рамки данной книги, но читателю следует обратиться к документации по плагину Vite-PWA и Workbox для конкретных контекстов и случаев использования.

Тестирование показателей PWA с помощью Google Lighthouse

В браузерах на основе Chrome вместе с инструментами разработчика поставляется утилита Lighthouse, специально предназначенная для тестирования и оценки веб-страниц, а также готовности PWA. Чтобы получить доступ к этому инструменту, после открытия своего приложения браузере выполните следующие действия:

  1. Откройте инструменты разработчика (нажав F12 в Windows/Linux, Fn + F12 в Mac, или через меню браузера).
  2. Выберите меню Маяк в правом верхнем углу.
  3. Выберите Mobile или Desktop, а также убедитесь, что отмечена категория Progressive Web App.
  4. Нажмите Анализировать загрузку страницы в правом верхнем углу инструмента.

Инструменты разработчика должны выглядеть примерно так:

image

Рисунок 6.7 - Утилита "Lighthouse".

Утилита проведет ряд тестов, и в каждой категории будет отображаться рейтинг, а также подробный список элементов, которые прошли или не прошли тест. Если наше приложение не соответствует критериям PWA, то в пунктах, отмеченных красным цветом, будет указано, почему и как это исправить:

image

Рисунок 6.8 - Оценки примера кода главы 6 в Lighthouse.

Наш пример кода приложения полностью соответствует требованиям PWA и успешно проходит все тесты. Конечно, этого легче добиться с небольшими приложениями. На практике каждый рейтинг выше 90 является отличным.

Подведение итогов

В этой главе мы рассмотрели простой SPA и научились превращать его в PWA как вручную, так и с помощью плагина в Vite. Пользователи могут устанавливать PWA на свои платформы наряду с родными приложениями и взаимодействовать с ними, даже если они не подключены к Интернету.

PWA обладают множеством преимуществ по сравнению с приложениями, работающими только в Интернете. Мы также рассмотрели, как с помощью Lighthouse можно измерить и оценить наше приложение в нескольких стандартных для отрасли категориях. В этой главе мы закончили рассмотрение поэтапного создания приложений с использованием веб-технологий и впредь будем уделять основное внимание шаблонам и моделям для повышения внутренней производительности и эффективности.

Вопросы для проверки

Для закрепления понятий, изученных в этой главе, ответьте на следующие вопросы:

  • В чем разница между SPA и PWA?
  • Каковы преимущества PWA?
  • Каким основным трем требованиям должно соответствовать веб-приложение, чтобы считаться PWA?
  • Какие инструменты можно использовать для постепенной подготовки приложения к работе в качестве PWA?
  • Что такое service worker и каковы некоторые стратегии его использования?
  • Что такое веб-манифест и зачем он нужен?
- +})

Используя этот плагин, мы снимаем со сборщика бремя генерации service worker и веб-манифеста. Это необходимо, поскольку при каждой промышленной сборке Vite будет генерировать разные имена файлов для каждого скрипта в соответствии с нашей стратегией "ленивой" загрузки компонентов, о которой мы говорили в предыдущей главе.

В предыдущем примере мы передаем в плагин VitePWA() объект с некоторыми разумными опциями для автоматического создания и внедрения манифеста и рабочего скрипта. Если нам нужен более тонкий контроль над создаваемой стратегией рабочего сервиса, а также над веб-манифестом, то можно использовать плагин в "режиме инъекции" и предоставить базовый файл для нашего рабочего сервиса.

В этом случае в скрипт будут инжектироваться сгенерированные в процессе сборки файлы. Под капотом плагин использует Workbox, инструмент, о котором мы уже упоминали и который мы можем настраивать непосредственно через поле workbox. Более подробное рассмотрение различных реализаций и стратегий выходит за рамки данной книги, но читателю следует обратиться к документации по плагину Vite-PWA и Workbox для конкретных контекстов и случаев использования.

Тестирование показателей PWA с помощью Google Lighthouse

В браузерах на основе Chrome вместе с инструментами разработчика поставляется утилита Lighthouse, специально предназначенная для тестирования и оценки веб-страниц, а также готовности PWA. Чтобы получить доступ к этому инструменту, после открытия своего приложения браузере выполните следующие действия:

  1. Откройте инструменты разработчика (нажав F12 в Windows/Linux, Fn + F12 в Mac, или через меню браузера).
  2. Выберите меню Маяк в правом верхнем углу.
  3. Выберите Mobile или Desktop, а также убедитесь, что отмечена категория Progressive Web App.
  4. Нажмите Анализировать загрузку страницы в правом верхнем углу инструмента.

Инструменты разработчика должны выглядеть примерно так:

image

Рисунок 6.7 - Утилита "Lighthouse".

Утилита проведет ряд тестов, и в каждой категории будет отображаться рейтинг, а также подробный список элементов, которые прошли или не прошли тест. Если наше приложение не соответствует критериям PWA, то в пунктах, отмеченных красным цветом, будет указано, почему и как это исправить:

image

Рисунок 6.8 - Оценки примера кода главы 6 в Lighthouse.

Наш пример кода приложения полностью соответствует требованиям PWA и успешно проходит все тесты. Конечно, этого легче добиться с небольшими приложениями. На практике каждый рейтинг выше 90 является отличным.

Подведение итогов

В этой главе мы рассмотрели простой SPA и научились превращать его в PWA как вручную, так и с помощью плагина в Vite. Пользователи могут устанавливать PWA на свои платформы наряду с родными приложениями и взаимодействовать с ними, даже если они не подключены к Интернету.

PWA обладают множеством преимуществ по сравнению с приложениями, работающими только в Интернете. Мы также рассмотрели, как с помощью Lighthouse можно измерить и оценить наше приложение в нескольких стандартных для отрасли категориях. В этой главе мы закончили рассмотрение поэтапного создания приложений с использованием веб-технологий и впредь будем уделять основное внимание шаблонам и моделям для повышения внутренней производительности и эффективности.

Вопросы для проверки

Для закрепления понятий, изученных в этой главе, ответьте на следующие вопросы:

  • В чем разница между SPA и PWA?
  • Каковы преимущества PWA?
  • Каким основным трем требованиям должно соответствовать веб-приложение, чтобы считаться PWA?
  • Какие инструменты можно использовать для постепенной подготовки приложения к работе в качестве PWA?
  • Что такое service worker и каковы некоторые стратегии его использования?
  • Что такое веб-манифест и зачем он нужен?
+ \ No newline at end of file diff --git a/ru/book/Chapter_7__Data_Flow_Management.html b/ru/book/Chapter_7__Data_Flow_Management.html index 230484685..929f9e0c3 100644 --- a/ru/book/Chapter_7__Data_Flow_Management.html +++ b/ru/book/Chapter_7__Data_Flow_Management.html @@ -6,13 +6,13 @@ Управление потоками данных | Vue FAQ - + - + - - + + @@ -205,8 +205,8 @@ <template> <strong>Child Component</strong> Counter: {{ $sessionStorage.counter }} -</template>

Заметьте, что теперь мы можем использовать этот объект как хранилище Pinia или простой реактивный объект, и значение sessionStorage всегда будет синхронизировано и сохранится, даже если мы обновим страницу. Для просмотра полного примера ознакомьтесь с реализацией примера кода в репозитории GitHub. При его запуске вы увидите секцию, подобную этой:

image

Рисунок 7.6 - Пример нашего реактивного объекта $sessionStorage

В этом примере мы также реализовали родительский компонент с элементом ввода. При изменении значения оно автоматически синхронизируется и отражается в дочернем компоненте, а также в sessionStorage. Если открыть инструменты разработчика браузера и перейти в раздел Web Storage, то можно увидеть это отражение. Вот скриншот того, как это выглядит в Chrome на системе Ubuntu:

image

Рисунок 7.7 - Сессионное хранилище, показывающее элемент из примера

Так же, как мы реализовали этот шаблон для сессионного хранилища, мы можем с небольшими изменениями применить его и к локальному хранилищу.

Подведение итогов

В этой главе мы подробно рассмотрели различные подходы и методы управления потоком данных между нашими компонентами, сервисами и хранилищами, предоставляемыми современными браузерами.

Мы также уделили время интеграции наших знаний, экспериментируя с хранением сессий и шаблоном Decorator для создания реактивного/постоянного центрального состояния. Мы уделили время разграничению подходов и посмотрели код для реализации каждого метода. Все эти новые навыки ежедневно используются при разработке приложений Vue 3.

В следующей главе мы рассмотрим повышение производительности нашего приложения с помощью современных инструментов JavaScript: web workers.

Вопросы для проверки

Используйте эти вопросы для обзора того, что вы узнали в этой главе:

  • Какие методы доступны нам для обмена данными между родственными компонентами?
  • Что такое шина сообщений/событий, и когда она наиболее полезна?
  • Что такое централизованное управление состоянием, и как его можно реализовать?
  • В чем разница между sessionStorage и localStorage?
  • Как мы можем увидеть, какая информация хранится в sessionStorage или localStorage?
- +</template>

Заметьте, что теперь мы можем использовать этот объект как хранилище Pinia или простой реактивный объект, и значение sessionStorage всегда будет синхронизировано и сохранится, даже если мы обновим страницу. Для просмотра полного примера ознакомьтесь с реализацией примера кода в репозитории GitHub. При его запуске вы увидите секцию, подобную этой:

image

Рисунок 7.6 - Пример нашего реактивного объекта $sessionStorage

В этом примере мы также реализовали родительский компонент с элементом ввода. При изменении значения оно автоматически синхронизируется и отражается в дочернем компоненте, а также в sessionStorage. Если открыть инструменты разработчика браузера и перейти в раздел Web Storage, то можно увидеть это отражение. Вот скриншот того, как это выглядит в Chrome на системе Ubuntu:

image

Рисунок 7.7 - Сессионное хранилище, показывающее элемент из примера

Так же, как мы реализовали этот шаблон для сессионного хранилища, мы можем с небольшими изменениями применить его и к локальному хранилищу.

Подведение итогов

В этой главе мы подробно рассмотрели различные подходы и методы управления потоком данных между нашими компонентами, сервисами и хранилищами, предоставляемыми современными браузерами.

Мы также уделили время интеграции наших знаний, экспериментируя с хранением сессий и шаблоном Decorator для создания реактивного/постоянного центрального состояния. Мы уделили время разграничению подходов и посмотрели код для реализации каждого метода. Все эти новые навыки ежедневно используются при разработке приложений Vue 3.

В следующей главе мы рассмотрим повышение производительности нашего приложения с помощью современных инструментов JavaScript: web workers.

Вопросы для проверки

Используйте эти вопросы для обзора того, что вы узнали в этой главе:

  • Какие методы доступны нам для обмена данными между родственными компонентами?
  • Что такое шина сообщений/событий, и когда она наиболее полезна?
  • Что такое централизованное управление состоянием, и как его можно реализовать?
  • В чем разница между sessionStorage и localStorage?
  • Как мы можем увидеть, какая информация хранится в sessionStorage или localStorage?
+ \ No newline at end of file diff --git a/ru/book/Chapter_8__Multithreading_with_Web_Workers.html b/ru/book/Chapter_8__Multithreading_with_Web_Workers.html index 0bd84d7da..949d47769 100644 --- a/ru/book/Chapter_8__Multithreading_with_Web_Workers.html +++ b/ru/book/Chapter_8__Multithreading_with_Web_Workers.html @@ -6,13 +6,13 @@ Многопоточность с Web Workers | Vue FAQ - + - + - - + + @@ -277,8 +277,8 @@ }) app.listen(PORT, ()=>{                                      //10      console.log("Server listening on port " + PORT) -})

С помощью этих нескольких строк кода мы можем запустить небольшой сервер, принимающий и отвечающий на запросы в формате JSON. Мы импортируем конструктор express (строка //1), а также плагин (строка //2). Это важно для того, чтобы мы могли обращаться к этому серверу с любого домена (origin).

Cross-Origin Request Sharing (CORS) служит для обхода мер безопасности, применяемых серверами для предотвращения обслуживания запросов из других источников (origins), кроме своего собственного. Чтобы разрешить запросы из других источников, его необходимо включить.

После создания серверного приложения (строка //3) мы передаем плагин (строка //4). Также мы передаем еще один плагин (строка //5), чтобы сервер идентифицировал и отвечал на сетевые вызовы с помощью JSON-объектов. Далее мы создаем две конечные точки, одну для GET запросов (строка //6) и вторую для POST запроса.

Первый параметр - это URL, по которому сервер будет прослушивать обращения. В данном случае они одинаковы, так как единственным отличием будет тип метода запроса. Это стандартная практика.

Каждая конечная точка получает в качестве последнего аргумента функцию обратного вызова, имеющую не менее двух параметров: req (запрос) и res (ответ). Эти объекты содержат методы и информацию о полученном запросе, а также необходимые методы для создания ответа клиенту.

Для запросов GET полученные данные передаются вместе с URL в виде "строки запроса", поэтому для доступа к ним Express красиво упаковывает их в виде объекта в поле request.query (строка //7).

Поскольку мы просто отвечаем теми же полученными данными, в строке //8 мы используем объект res для создания дополненного JSON-ответа с тем же объектом данных. Мы делаем это потому, что считаем, что можем получать вызовы из любого домена (поскольку включили CORS), и хотим быть уверены, что ответ будет полностью понятен. JSON with Padding (JSONP) - это метод отправки ответа с помощью другого метода. Нам не нужно беспокоиться об этом, так как оба конца (отправитель и получатель) обрабатываются сервером Express и клиентом Axios.

В методе post разница заключается в том, что данные содержатся в теле сообщения (строка //9), отсюда и разная обработка. Наконец, сервер начинает прослушивать указанный порт (строка //10). Теперь мы можем обращаться к серверу по адресу http://localhost:3000/, который мы настроили в нашей сетевой службе как адрес по умолчанию для Axios.

В результате мы получили возможность работать с сервером по адресу http://localhost:3000/.

После создания этого сервера мы можем провести полное тестирование всех частей системы.

Подведение итогов

В этой главе мы рассмотрели несколько очень важных концепций, позволяющих кардинально улучшить архитектуру и производительность нашего приложения. Web workers - это удивительная технология, позволяющая веб-приложениям использовать преимущества современных аппаратных архитектур и современных операционных систем.

С точки зрения стационарности, многопоточность с использованием web workers не требует особых дополнительных усилий и сложностей, а выигрыш от ее применения весьма ощутим. Мы также увидели, как использовать web workers для доступа к сетевым сервисам, а также к локальной постоянной базе данных, предоставляемой браузером (IndexedDB).

Мы познакомились еще с двумя шаблонами проектирования для реализации масштабируемой архитектуры нашего приложения и проверили их концепции и реализацию на примере простых компонентов и сервисов. Использование web workers значительно повышает производительность и качество выполнения хорошо спроектированного веб-приложения.

В следующей главе мы рассмотрим инструменты и методы автоматического тестирования нашего кода, обеспечивающие соответствие отдельных его частей своему назначению в соответствии со спецификациями и требованиями к программному обеспечению.

Вопросы для проверки

  • Какие ограничения JavaScript могут повлиять на производительность веб-приложения?
  • Что такое web workers? Каковы их ограничения?
  • Как приложения Vue могут взаимодействовать с web workers?
  • Какие преимущества дает использование такого шаблона проектирования, как Business delegate, для работы с web workers?
  • Что можно изменить в коде примера, чтобы управлять несколькими web workers, а не одним? В каких случаях, по вашему мнению, это целесообразно?
- +})

С помощью этих нескольких строк кода мы можем запустить небольшой сервер, принимающий и отвечающий на запросы в формате JSON. Мы импортируем конструктор express (строка //1), а также плагин (строка //2). Это важно для того, чтобы мы могли обращаться к этому серверу с любого домена (origin).

Cross-Origin Request Sharing (CORS) служит для обхода мер безопасности, применяемых серверами для предотвращения обслуживания запросов из других источников (origins), кроме своего собственного. Чтобы разрешить запросы из других источников, его необходимо включить.

После создания серверного приложения (строка //3) мы передаем плагин (строка //4). Также мы передаем еще один плагин (строка //5), чтобы сервер идентифицировал и отвечал на сетевые вызовы с помощью JSON-объектов. Далее мы создаем две конечные точки, одну для GET запросов (строка //6) и вторую для POST запроса.

Первый параметр - это URL, по которому сервер будет прослушивать обращения. В данном случае они одинаковы, так как единственным отличием будет тип метода запроса. Это стандартная практика.

Каждая конечная точка получает в качестве последнего аргумента функцию обратного вызова, имеющую не менее двух параметров: req (запрос) и res (ответ). Эти объекты содержат методы и информацию о полученном запросе, а также необходимые методы для создания ответа клиенту.

Для запросов GET полученные данные передаются вместе с URL в виде "строки запроса", поэтому для доступа к ним Express красиво упаковывает их в виде объекта в поле request.query (строка //7).

Поскольку мы просто отвечаем теми же полученными данными, в строке //8 мы используем объект res для создания дополненного JSON-ответа с тем же объектом данных. Мы делаем это потому, что считаем, что можем получать вызовы из любого домена (поскольку включили CORS), и хотим быть уверены, что ответ будет полностью понятен. JSON with Padding (JSONP) - это метод отправки ответа с помощью другого метода. Нам не нужно беспокоиться об этом, так как оба конца (отправитель и получатель) обрабатываются сервером Express и клиентом Axios.

В методе post разница заключается в том, что данные содержатся в теле сообщения (строка //9), отсюда и разная обработка. Наконец, сервер начинает прослушивать указанный порт (строка //10). Теперь мы можем обращаться к серверу по адресу http://localhost:3000/, который мы настроили в нашей сетевой службе как адрес по умолчанию для Axios.

В результате мы получили возможность работать с сервером по адресу http://localhost:3000/.

После создания этого сервера мы можем провести полное тестирование всех частей системы.

Подведение итогов

В этой главе мы рассмотрели несколько очень важных концепций, позволяющих кардинально улучшить архитектуру и производительность нашего приложения. Web workers - это удивительная технология, позволяющая веб-приложениям использовать преимущества современных аппаратных архитектур и современных операционных систем.

С точки зрения стационарности, многопоточность с использованием web workers не требует особых дополнительных усилий и сложностей, а выигрыш от ее применения весьма ощутим. Мы также увидели, как использовать web workers для доступа к сетевым сервисам, а также к локальной постоянной базе данных, предоставляемой браузером (IndexedDB).

Мы познакомились еще с двумя шаблонами проектирования для реализации масштабируемой архитектуры нашего приложения и проверили их концепции и реализацию на примере простых компонентов и сервисов. Использование web workers значительно повышает производительность и качество выполнения хорошо спроектированного веб-приложения.

В следующей главе мы рассмотрим инструменты и методы автоматического тестирования нашего кода, обеспечивающие соответствие отдельных его частей своему назначению в соответствии со спецификациями и требованиями к программному обеспечению.

Вопросы для проверки

  • Какие ограничения JavaScript могут повлиять на производительность веб-приложения?
  • Что такое web workers? Каковы их ограничения?
  • Как приложения Vue могут взаимодействовать с web workers?
  • Какие преимущества дает использование такого шаблона проектирования, как Business delegate, для работы с web workers?
  • Что можно изменить в коде примера, чтобы управлять несколькими web workers, а не одним? В каких случаях, по вашему мнению, это целесообразно?
+ \ No newline at end of file diff --git a/ru/book/Chapter_9__Testing_and_Source_Control.html b/ru/book/Chapter_9__Testing_and_Source_Control.html index b167aadd6..cb225b3d5 100644 --- a/ru/book/Chapter_9__Testing_and_Source_Control.html +++ b/ru/book/Chapter_9__Testing_and_Source_Control.html @@ -6,13 +6,13 @@ Тестирование и системы контроля версий | Vue FAQ - + - + - - + + @@ -128,8 +128,8 @@ *.ntvs* *.njsproj *.sln -*.sw?

Это обычный текстовый файл, который указывает Git'у не отслеживать файлы и каталоги, указанные в каждой строке. Вы также можете использовать подстановочные знаки, такие как звездочка (*) и вопросительный знак (?), для включения шаблона совпадения. Это очень полезно, поскольку существуют части кодовой базы, которые не нужно отслеживать, например, зависимости и бинарные файлы (изображения и т.п.). Убедитесь, что этот файл есть в вашей директории, прежде чем делать массовый staging.

После того как файлы будут помещены в stage, вы можете проверить их с помощью следующей команды:

sh
$ git status

В случае нашего примера проекта это будет выглядеть примерно так:

image

Рисунок 9.9 - Первая постановка в Git

Обратите внимание, что Git также сообщает нам, что мы находимся в ветке (branch) master, и что в нее еще не было сделано ни одного коммита.

Ветка master является основной веткой для нашего кода и создается по умолчанию. Это специальная ветка, которая используется для хранения стабильного кода наших приложений. В таких инструментах, как GitLab и GitHub (о них мы поговорим позже), эти ветки также вызывают определенные события после фиксации (commit). А пока давайте двинемся дальше и создадим нашу первый commit с помощью этой команды:

sh
$ git commit -m "Первая фиксация"

Мы увидим следующие результаты:

image

Рисунок 9.10 - Результаты первой фиксации

С помощью этих простых строк мы начали следить за своим исходным кодом. Теперь, как уже говорилось, мы закоммитили наш исходный код в ветке master. Git позволяет сделать мгновенную копию состояния нашего кода, подобно снимку экрана, и продолжить работу с этого места, не затрагивая оригинал. Это называется ветвление (branching) и является важной частью использования Git.

Управление ветвями и слияниями

Использование ветвей для управления разработкой - очень хороший способ двигаться вперед на определенной основе. Ниже приведены наиболее распространенные команды для управления ветвями:

ДействиеПример команды
Создайте ветку и переключитесь на нее$ git checkout -b [branch_name]
Создать ветку, но остаться в текущей$ git branch [branch_name]
Удаление ветки$ git branch -d [branch_name]
Переход к ветке$ git checkout [branch_name]
Слияние ветки с текущей$ git merge [branch_name]
Проверка текущей ветки$ git branch

Переместившись в другую ветку, вы можете выполнять все обычные операции Git (редактировать и удалять файлы и т.д.), не затрагивая другие ветки.

Конфликты при слиянии

При слиянии нескольких веток вместе или с master возможно и более чем вероятно, что некоторые файлы будут иметь расхождения с текущей веткой. В этом случае слияние (merge) завершится неудачей, и пользователю будет предложено устранить различия.

Git делает следующее: помечает целевой файл (файл в текущей ветке) маркерами в тексте, которые пользователь может редактировать. Как только они будут отредактированы, файл может быть размещен и зафиксирован, тем самым завершая слияние. Давайте попробуем сделать это без кода, специально создав несоответствие, которое нужно исправить. Выполните следующие шаги:

  1. Создайте новую ветку, dev, с помощью этой команды: $ git checkout -b dev.
  2. Отредактируйте index.html, добавив в строку 11 (перед тегом script) следующее: <div>A div created in branch dev</div>.
  3. Сохраните файл, поместите его в stage и закоммитьте изменения командой $ git add index.html, а затем $ git commit -m "added div in dev".
  4. Сейчас мы перейдем на ветку master с помощью $ git checkout master.
  5. Заметьте, что строка 11 с div исчезла из index.html. Это связано с тем, что данная редакция в этом файле так и не была сделана. Теперь добавьте в эту строку следующее: <p>Это изменение было сделано в master</p>.
  6. Сохраните файл, выполните stage и закомитьте его с другим сообщением (см. шаг 3).

Теперь мы попытаемся объединить обе ветки, и, поскольку index.html был закоммичен в обеих с разным кодом, это не удастся! Чтобы начать слияние, выполните команду $ git merge dev.

В терминале появится сообщение об ошибке, а в index.html добавятся новые строки, указывающие на несоответствия. В нашем примере кода это выглядит следующим образом:

image

Рисунок 9.11 - Конфликт слияния

  1. Для устранения конфликта достаточно отредактировать исходный код по своему усмотрению (также удалить лишние метки, добавленные Git'ом), затем сохранить файл, поставить его и, наконец, сделать коммит. Вы получите сообщение о том, что слияние было разрешено.

Работа с ветвями и разрешение слияний при их появлении - обычная и довольно полезная практика, но мы все еще не используем весь потенциал Git'а. Как вы помните, Git - это распределенная СУБД, и здесь используется ее огромный потенциал. Введём удаленный репозиторий.

Работа с удаленными репозиториями

Подобно тому, как мы работаем с локальным репозиторием, Git может синхронизировать код с удаленным репозиторием. Это позволяет членам команды из любой точки мира совместно работать над одной и той же кодовой базой, разрешать конфликты, а также синхронизировать свой код с чужим. Работа с удаленным репозиторием включает в себя следующие шаги по настройке:

  1. Необходимо создать удаленный репозиторий и указать URL для подключения к нему.
  2. Добавляем удаленный репозиторий как новый origin в наш локальный репозиторий следующей командой:
sh
$ git remote add origin URL
  1. Настраиваем нашу ветку master на синхронизацию с удаленным репозиторием:
sh
$ git push -set-upstream origin master
  1. Получаем изменения из удаленного репозитория:
sh
$ git pull origin master
  1. Отправляем изменения в удаленный репозиторий:
sh
$ git push origin master

После начального выполнения шагов с 1 по 3, дальнейшая работа будет включать шаги 4 и 5. Эти действия позволят поддерживать локальный репозиторий в синхронизированном состоянии с удаленным репозиторием. На практике современные IDE, такие как Visual Studio Code, уже предоставляют графические средства для выполнения этих операций, что повышает удобство работы над проектом. Они также включают в себя визуальные средства для разрешения конфликтов во время слияний.

Настройка Git-сервера для локальной сети выходит за рамки данной книги, но это введение было бы неполным без слов о GitHub и GitLab. Обычно, когда люди впервые слышат о Git, они ассоциируют его с GitHub, что вполне объяснимо, поскольку последний гораздо более популярен в средствах массовой информации.

GitHub - это не Git. Это веб-платформа, предоставляющая инструменты, построенные поверх Git, для размещения онлайн-проектов, содержащих удаленные репозитории. Таким образом, вы можете прекрасно работать с Git локально и синхронизироваться с удаленным репозиторием GitHub или GitLab. Это наиболее распространенный случай.

GitHub предоставляет средства обмена сообщениями и документацией, а также многое другое - даже дополнительные сервисы, позволяющие при обнаружении событий в вашем репозитории вызывать определенные действия и сервисы, некоторые из которых предоставляются локально (за отдельную плату), другие - удаленно (например, webhooks).

Например, можно сделать локальный коммит, выложить изменения в ветку master на GitHub и запустить целый набор процедур, от компиляции до деплоя на сайт.

Опять же, управление всеми этими возможностями выходит за рамки нашей главы, но важно помнить, что все это основано и построено на Git, поэтому, если вы понимаете, как работает и что делает Git, у вас будет прочная основа для дальнейшего использования других инструментов и сервисов. Есть еще одно понятие, ставшее привычным в этой теме, - непрерывная интеграция и доставка, которое мы рассмотрим далее.

Непрерывная интеграция и доставка

Непрерывная интеграция (Continuous Integration (CI)) - это практика, реализуемая с помощью рассмотренных нами технологий, при которой разработчики как можно чаще фиксируют свои изменения в центральном (удаленном) репозитории. Центральный репозиторий обнаруживает поступившие изменения и запускает автоматические тесты на код. Затем он компилирует/сборку конечного продукта. Это происходит непрерывно, в отличие от практики слияния и компиляции в определенную дату перед запуском.

Непрерывная доставка.

Непрерывная доставка (Continuous Delivery (CD)) строится на основе CI и предполагает развертывание выпущенного продукта в конечном месте. Вы можете настроить этот процесс на создание предварительных версий программного обеспечения или веб-приложений (например, бета-версий, ночных сборок и т.д.), а также запрограммировать дату выпуска для конечного размещения и доставки клиентам (иногда эта последняя часть может включать в себя отдельный процесс и называется Continuous Deployment). Оба упомянутых ранее сервиса (GitHub и GitLab) предлагают подобные услуги.

Используя эти концепции, можно организовать целый автоматизированный рабочий процесс от рабочего стола до Интернета, где простой Git-коммит и push на сервер запускают тестирование приложения и его публикацию в Интернете. Способ реализации этого рабочего процесса зависит от инструмента, используемого для реализации CI и CD.

Подведение итогов

В этой главе мы рассмотрели очень важные понятия, касающиеся заботы о качестве нашего кода.

Мы узнали, как устанавливать официальные инструменты для выполнения автоматизированных тестов в нашем коде и компонентах, а также как отслеживать изменения и управлять ими в исходном коде. Хотя приведенные здесь примеры и информация носят ознакомительный характер, они достаточно подробны для того, чтобы применять их в собственных проектах и постоянно расширять свои познавательные навыки.

Концепции CI и CD, а также сервисы, предоставляемые онлайновыми репозиториями, также дают прочную основу для их освоения, поскольку все они основаны на функциональности, предоставляемой Git'ом.

Все эти инструменты имеют профессиональную ценность для разработчика и необходимы в современной индустрии.

Вопросы для проверки

  • Почему важно автоматизированное тестирование? Устраняет ли оно необходимость проведения ручного тестирования?
  • Что необходимо для тестирования наших однофайловых компонентов в Vue?
  • Что такое source control, и почему он необходим?
  • Что такое Git, и чем он отличается от GitHub/GitLab?
  • Когда вы изменяете файл в ветке, изменяется ли он во всех остальных ветках? Почему это происходит или не происходит?
  • Одинаковы ли команды для управления Git'ом на всех платформах?
  • Что означают термины CI и CD, и какую ценность они добавляют в рабочий процесс?
- +*.sw?

Это обычный текстовый файл, который указывает Git'у не отслеживать файлы и каталоги, указанные в каждой строке. Вы также можете использовать подстановочные знаки, такие как звездочка (*) и вопросительный знак (?), для включения шаблона совпадения. Это очень полезно, поскольку существуют части кодовой базы, которые не нужно отслеживать, например, зависимости и бинарные файлы (изображения и т.п.). Убедитесь, что этот файл есть в вашей директории, прежде чем делать массовый staging.

После того как файлы будут помещены в stage, вы можете проверить их с помощью следующей команды:

sh
$ git status

В случае нашего примера проекта это будет выглядеть примерно так:

image

Рисунок 9.9 - Первая постановка в Git

Обратите внимание, что Git также сообщает нам, что мы находимся в ветке (branch) master, и что в нее еще не было сделано ни одного коммита.

Ветка master является основной веткой для нашего кода и создается по умолчанию. Это специальная ветка, которая используется для хранения стабильного кода наших приложений. В таких инструментах, как GitLab и GitHub (о них мы поговорим позже), эти ветки также вызывают определенные события после фиксации (commit). А пока давайте двинемся дальше и создадим нашу первый commit с помощью этой команды:

sh
$ git commit -m "Первая фиксация"

Мы увидим следующие результаты:

image

Рисунок 9.10 - Результаты первой фиксации

С помощью этих простых строк мы начали следить за своим исходным кодом. Теперь, как уже говорилось, мы закоммитили наш исходный код в ветке master. Git позволяет сделать мгновенную копию состояния нашего кода, подобно снимку экрана, и продолжить работу с этого места, не затрагивая оригинал. Это называется ветвление (branching) и является важной частью использования Git.

Управление ветвями и слияниями

Использование ветвей для управления разработкой - очень хороший способ двигаться вперед на определенной основе. Ниже приведены наиболее распространенные команды для управления ветвями:

ДействиеПример команды
Создайте ветку и переключитесь на нее$ git checkout -b [branch_name]
Создать ветку, но остаться в текущей$ git branch [branch_name]
Удаление ветки$ git branch -d [branch_name]
Переход к ветке$ git checkout [branch_name]
Слияние ветки с текущей$ git merge [branch_name]
Проверка текущей ветки$ git branch

Переместившись в другую ветку, вы можете выполнять все обычные операции Git (редактировать и удалять файлы и т.д.), не затрагивая другие ветки.

Конфликты при слиянии

При слиянии нескольких веток вместе или с master возможно и более чем вероятно, что некоторые файлы будут иметь расхождения с текущей веткой. В этом случае слияние (merge) завершится неудачей, и пользователю будет предложено устранить различия.

Git делает следующее: помечает целевой файл (файл в текущей ветке) маркерами в тексте, которые пользователь может редактировать. Как только они будут отредактированы, файл может быть размещен и зафиксирован, тем самым завершая слияние. Давайте попробуем сделать это без кода, специально создав несоответствие, которое нужно исправить. Выполните следующие шаги:

  1. Создайте новую ветку, dev, с помощью этой команды: $ git checkout -b dev.
  2. Отредактируйте index.html, добавив в строку 11 (перед тегом script) следующее: <div>A div created in branch dev</div>.
  3. Сохраните файл, поместите его в stage и закоммитьте изменения командой $ git add index.html, а затем $ git commit -m "added div in dev".
  4. Сейчас мы перейдем на ветку master с помощью $ git checkout master.
  5. Заметьте, что строка 11 с div исчезла из index.html. Это связано с тем, что данная редакция в этом файле так и не была сделана. Теперь добавьте в эту строку следующее: <p>Это изменение было сделано в master</p>.
  6. Сохраните файл, выполните stage и закомитьте его с другим сообщением (см. шаг 3).

Теперь мы попытаемся объединить обе ветки, и, поскольку index.html был закоммичен в обеих с разным кодом, это не удастся! Чтобы начать слияние, выполните команду $ git merge dev.

В терминале появится сообщение об ошибке, а в index.html добавятся новые строки, указывающие на несоответствия. В нашем примере кода это выглядит следующим образом:

image

Рисунок 9.11 - Конфликт слияния

  1. Для устранения конфликта достаточно отредактировать исходный код по своему усмотрению (также удалить лишние метки, добавленные Git'ом), затем сохранить файл, поставить его и, наконец, сделать коммит. Вы получите сообщение о том, что слияние было разрешено.

Работа с ветвями и разрешение слияний при их появлении - обычная и довольно полезная практика, но мы все еще не используем весь потенциал Git'а. Как вы помните, Git - это распределенная СУБД, и здесь используется ее огромный потенциал. Введём удаленный репозиторий.

Работа с удаленными репозиториями

Подобно тому, как мы работаем с локальным репозиторием, Git может синхронизировать код с удаленным репозиторием. Это позволяет членам команды из любой точки мира совместно работать над одной и той же кодовой базой, разрешать конфликты, а также синхронизировать свой код с чужим. Работа с удаленным репозиторием включает в себя следующие шаги по настройке:

  1. Необходимо создать удаленный репозиторий и указать URL для подключения к нему.
  2. Добавляем удаленный репозиторий как новый origin в наш локальный репозиторий следующей командой:
sh
$ git remote add origin URL
  1. Настраиваем нашу ветку master на синхронизацию с удаленным репозиторием:
sh
$ git push -set-upstream origin master
  1. Получаем изменения из удаленного репозитория:
sh
$ git pull origin master
  1. Отправляем изменения в удаленный репозиторий:
sh
$ git push origin master

После начального выполнения шагов с 1 по 3, дальнейшая работа будет включать шаги 4 и 5. Эти действия позволят поддерживать локальный репозиторий в синхронизированном состоянии с удаленным репозиторием. На практике современные IDE, такие как Visual Studio Code, уже предоставляют графические средства для выполнения этих операций, что повышает удобство работы над проектом. Они также включают в себя визуальные средства для разрешения конфликтов во время слияний.

Настройка Git-сервера для локальной сети выходит за рамки данной книги, но это введение было бы неполным без слов о GitHub и GitLab. Обычно, когда люди впервые слышат о Git, они ассоциируют его с GitHub, что вполне объяснимо, поскольку последний гораздо более популярен в средствах массовой информации.

GitHub - это не Git. Это веб-платформа, предоставляющая инструменты, построенные поверх Git, для размещения онлайн-проектов, содержащих удаленные репозитории. Таким образом, вы можете прекрасно работать с Git локально и синхронизироваться с удаленным репозиторием GitHub или GitLab. Это наиболее распространенный случай.

GitHub предоставляет средства обмена сообщениями и документацией, а также многое другое - даже дополнительные сервисы, позволяющие при обнаружении событий в вашем репозитории вызывать определенные действия и сервисы, некоторые из которых предоставляются локально (за отдельную плату), другие - удаленно (например, webhooks).

Например, можно сделать локальный коммит, выложить изменения в ветку master на GitHub и запустить целый набор процедур, от компиляции до деплоя на сайт.

Опять же, управление всеми этими возможностями выходит за рамки нашей главы, но важно помнить, что все это основано и построено на Git, поэтому, если вы понимаете, как работает и что делает Git, у вас будет прочная основа для дальнейшего использования других инструментов и сервисов. Есть еще одно понятие, ставшее привычным в этой теме, - непрерывная интеграция и доставка, которое мы рассмотрим далее.

Непрерывная интеграция и доставка

Непрерывная интеграция (Continuous Integration (CI)) - это практика, реализуемая с помощью рассмотренных нами технологий, при которой разработчики как можно чаще фиксируют свои изменения в центральном (удаленном) репозитории. Центральный репозиторий обнаруживает поступившие изменения и запускает автоматические тесты на код. Затем он компилирует/сборку конечного продукта. Это происходит непрерывно, в отличие от практики слияния и компиляции в определенную дату перед запуском.

Непрерывная доставка.

Непрерывная доставка (Continuous Delivery (CD)) строится на основе CI и предполагает развертывание выпущенного продукта в конечном месте. Вы можете настроить этот процесс на создание предварительных версий программного обеспечения или веб-приложений (например, бета-версий, ночных сборок и т.д.), а также запрограммировать дату выпуска для конечного размещения и доставки клиентам (иногда эта последняя часть может включать в себя отдельный процесс и называется Continuous Deployment). Оба упомянутых ранее сервиса (GitHub и GitLab) предлагают подобные услуги.

Используя эти концепции, можно организовать целый автоматизированный рабочий процесс от рабочего стола до Интернета, где простой Git-коммит и push на сервер запускают тестирование приложения и его публикацию в Интернете. Способ реализации этого рабочего процесса зависит от инструмента, используемого для реализации CI и CD.

Подведение итогов

В этой главе мы рассмотрели очень важные понятия, касающиеся заботы о качестве нашего кода.

Мы узнали, как устанавливать официальные инструменты для выполнения автоматизированных тестов в нашем коде и компонентах, а также как отслеживать изменения и управлять ими в исходном коде. Хотя приведенные здесь примеры и информация носят ознакомительный характер, они достаточно подробны для того, чтобы применять их в собственных проектах и постоянно расширять свои познавательные навыки.

Концепции CI и CD, а также сервисы, предоставляемые онлайновыми репозиториями, также дают прочную основу для их освоения, поскольку все они основаны на функциональности, предоставляемой Git'ом.

Все эти инструменты имеют профессиональную ценность для разработчика и необходимы в современной индустрии.

Вопросы для проверки

  • Почему важно автоматизированное тестирование? Устраняет ли оно необходимость проведения ручного тестирования?
  • Что необходимо для тестирования наших однофайловых компонентов в Vue?
  • Что такое source control, и почему он необходим?
  • Что такое Git, и чем он отличается от GitHub/GitLab?
  • Когда вы изменяете файл в ветке, изменяется ли он во всех остальных ветках? Почему это происходит или не происходит?
  • Одинаковы ли команды для управления Git'ом на всех платформах?
  • Что означают термины CI и CD, и какую ценность они добавляют в рабочий процесс?
+ \ No newline at end of file diff --git a/ru/book/index.html b/ru/book/index.html index 778a1aaf7..d617fbae8 100644 --- a/ru/book/index.html +++ b/ru/book/index.html @@ -6,13 +6,13 @@ Vue.js 3 - Шаблоны проектирования и лучшие практики | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Vue.js 3 - Шаблоны проектирования и лучшие практики

Автор: Pablo Garaguso

image




Здесь представлен перевод книги "Vue.js 3 - Design Patterns and Best Practices" на русский язык

Предисловие

Vue 3 - это последняя и наиболее производительная версия "прогрессивного фреймворка" Vue.js для создания реактивных и отзывчивых пользовательских интерфейсов. Сам фреймворк представляет новые концепции и подходы к проектированию; шаблоны, которые могут быть необычными для других библиотек и фреймворков. Изучение основ фреймворка и понимание принципов проектирования програмных систем, а также шаблонов проектирования (design patterns), поможет вам определить компромиссы каждого подхода и построить надежные приложения.

Книга начинается с базовых концепций, а затем с помощью примеров и сценариев кодирования ведет постепенно к построению более сложных архитектур. Вы начнете с простой страницы и закончите многопоточным приложением, автономным и инсталируемым Progressive Web Application (PWA). Также рассматривается использование новых инструментов тестирования, доступных для Vue 3.

Помимо демонстрации того, как все делается, эта книга поможет вам научиться думать и искать подход к решению общих проблем, которые уже нашли свое решение в шаблонах проектирования. Это позволит вам сэкономить время и сделать ваше программное обеспечение более приспособленным к будущим изменениям.

Для кого эта книга

Эта книга предназначена для разработчиков Vue, которые заботятся о принципах проектирования фреймворка Vue и использовании часто встречающихся паттернов проектирования при разработке веб-приложений. Вы узнаете, как использовать и настраивать новый сборщик Vite, библиотеку для управления состоянием Pinia, Router 4, web workers и другие технологии для создания производительных и надежных приложений. Предварительное знание JavaScirpt и базовые знания Vue будут полезны.

Чтобы получить максимальную пользу от этой книги

Эта книга предполагает, что вы знакомы с веб-технологиями, такими как JavaScript, HTML и CSS. Разработчики, заинтересованные в расширении своего понимания паттернов проектирования и архитектуры получат максимальную пользу от этой книги. Студенты и новички в мире веб-приложений, могут также следовать этой книге, уделяя пристальное внимание примерам кода и используя предоставленные проекты.

Программное/аппаратное обеспечение, рассматриваемое в книгеТребования к операционной системе
Official Vue 3 ecosystem:

• Vue 3 framework
• Pinia
• Vue Router
• Vite
• Vitest
• Vue Testing Tools
Windows, macOS, or Linux
Node.js (any version + v16 LTS)Windows, macOS, or Linux
Web servers: NGINX, ApacheWindows or Linux
Visual Studio CodeWindows, macOS, or Linux
Chrome browserWindows, macOS, or Linux

Особых требований к аппаратному обеспечению современных компьютеров нет, но рекомендуется иметь, по крайней мере, следующее:

  • Intel или AMD CPU на как минимум 1 GHz
  • 4 GB RAM (больше - лучше)
  • Как минимум 10 GB места на диске (для программ и кода)

Как правило, если на вашем компьютере может работать современный веб-браузер (Chrome/Chromium, Mozilla Firefox или Microsoft Edge), то он должен отвечать всем требованиям для установки и запуска всех инструментов разработчика, упомянутых в этой книге.

Купить книгу

Книга в бумажном варианте на английском языке доступна для покупки на сайте O'Reilly

Скачать файлы кода примеров

Файлы кода примеров этой книги можно загрузить с GitHub по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices.

Код в действии

Видеоролики Программирование в действии для этой книги можно посмотреть на сайте https://packt.link/FtCMS.




Я выражаю Вам признательность за преданность этой дисциплине и благодарю за прочтение этой книги. Желаю Вам благополучия и блестящих успехов в дальнейших начинаниях и профессиональной карьере.

Искренне,

Пабло Давид Гарагусо

www.pdgaraguso.com

- +
Skip to content

Vue.js 3 - Шаблоны проектирования и лучшие практики

Автор: Pablo Garaguso

image




Здесь представлен перевод книги "Vue.js 3 - Design Patterns and Best Practices" на русский язык

Предисловие

Vue 3 - это последняя и наиболее производительная версия "прогрессивного фреймворка" Vue.js для создания реактивных и отзывчивых пользовательских интерфейсов. Сам фреймворк представляет новые концепции и подходы к проектированию; шаблоны, которые могут быть необычными для других библиотек и фреймворков. Изучение основ фреймворка и понимание принципов проектирования програмных систем, а также шаблонов проектирования (design patterns), поможет вам определить компромиссы каждого подхода и построить надежные приложения.

Книга начинается с базовых концепций, а затем с помощью примеров и сценариев кодирования ведет постепенно к построению более сложных архитектур. Вы начнете с простой страницы и закончите многопоточным приложением, автономным и инсталируемым Progressive Web Application (PWA). Также рассматривается использование новых инструментов тестирования, доступных для Vue 3.

Помимо демонстрации того, как все делается, эта книга поможет вам научиться думать и искать подход к решению общих проблем, которые уже нашли свое решение в шаблонах проектирования. Это позволит вам сэкономить время и сделать ваше программное обеспечение более приспособленным к будущим изменениям.

Для кого эта книга

Эта книга предназначена для разработчиков Vue, которые заботятся о принципах проектирования фреймворка Vue и использовании часто встречающихся паттернов проектирования при разработке веб-приложений. Вы узнаете, как использовать и настраивать новый сборщик Vite, библиотеку для управления состоянием Pinia, Router 4, web workers и другие технологии для создания производительных и надежных приложений. Предварительное знание JavaScirpt и базовые знания Vue будут полезны.

Чтобы получить максимальную пользу от этой книги

Эта книга предполагает, что вы знакомы с веб-технологиями, такими как JavaScript, HTML и CSS. Разработчики, заинтересованные в расширении своего понимания паттернов проектирования и архитектуры получат максимальную пользу от этой книги. Студенты и новички в мире веб-приложений, могут также следовать этой книге, уделяя пристальное внимание примерам кода и используя предоставленные проекты.

Программное/аппаратное обеспечение, рассматриваемое в книгеТребования к операционной системе
Official Vue 3 ecosystem:

• Vue 3 framework
• Pinia
• Vue Router
• Vite
• Vitest
• Vue Testing Tools
Windows, macOS, or Linux
Node.js (any version + v16 LTS)Windows, macOS, or Linux
Web servers: NGINX, ApacheWindows or Linux
Visual Studio CodeWindows, macOS, or Linux
Chrome browserWindows, macOS, or Linux

Особых требований к аппаратному обеспечению современных компьютеров нет, но рекомендуется иметь, по крайней мере, следующее:

  • Intel или AMD CPU на как минимум 1 GHz
  • 4 GB RAM (больше - лучше)
  • Как минимум 10 GB места на диске (для программ и кода)

Как правило, если на вашем компьютере может работать современный веб-браузер (Chrome/Chromium, Mozilla Firefox или Microsoft Edge), то он должен отвечать всем требованиям для установки и запуска всех инструментов разработчика, упомянутых в этой книге.

Купить книгу

Книга в бумажном варианте на английском языке доступна для покупки на сайте O'Reilly

Скачать файлы кода примеров

Файлы кода примеров этой книги можно загрузить с GitHub по адресу https://github.com/PacktPublishing/Vue.js-3-Design-Patterns-and-Best-Practices.

Код в действии

Видеоролики Программирование в действии для этой книги можно посмотреть на сайте https://packt.link/FtCMS.




Я выражаю Вам признательность за преданность этой дисциплине и благодарю за прочтение этой книги. Желаю Вам благополучия и блестящих успехов в дальнейших начинаниях и профессиональной карьере.

Искренне,

Пабло Давид Гарагусо

www.pdgaraguso.com

+ \ No newline at end of file diff --git a/ru/book/summary.html b/ru/book/summary.html index 2bdf5a512..3fac7d2bd 100644 --- a/ru/book/summary.html +++ b/ru/book/summary.html @@ -6,13 +6,13 @@ Что включает в себя эта книга | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Что включает в себя эта книга

Глава 1, Фреймворк Vue 3

Что представляет собой прогрессивный фреймворк Vue 3? В этой главе представлены наиболее важные аспекты фреймворка и другие ключевые понятия.

Глава 2, Принципы и шаблоны проектирования программного обеспечения

Принципы и шаблоны проектирования программного обеспечения являются визитной карточкой хорошей архитектуры программного обеспечения. В этой главе рассказывается о них, приводятся примеры для реализации на JavaScript и Vue 3.

Глава 3, Создание рабочего проекта

В этой главе мы создаем рабочий проект, который будет использоваться в качестве базовой основы для будущих проектов. В ней вы шаг за шагом узнаете, как начать работу над проектом, используя нужные инструменты.

Глава 4, Композиция пользовательского интерфейса с помощью компонентов

Эта глава знакомит с концепцией пользовательских интерфейсов и подводит к реализации веб-приложения, начиная с концептуального визуального дизайна до разработки соответствующих компонентов.

Глава 5, Одностраничные приложения

Это ключевая глава, в которой представлен маршрутизатор Vue Router для создания одностраничных веб-приложений.

Глава 6, Прогрессивные веб-приложения

В этой главе на основе SPA создаются PWA, а также представлены инструменты для оценки их полноты и производительности.

Глава 7, Управление потоками данных

Эта глава знакомит с ключевыми концепциями проектирования и управления потоками данных и информации в приложении. В ней представлена Pinia как официальный фреймворк управления состояниями для Vue 3.

Глава 8, Многопоточность с помощью web-workers

Эта глава посвящена повышению производительности крупномасштабного приложения с помощью многопоточности с web-workers. В ней также представлены дополнительные паттерны для создания простой в реализации и удобной в обслуживании архитектуры.

Глава 9, Тестирование и контроль исходных текстов

В этой главе мы знакомимся с официальными инструментами тестирования предоставляемыми командой Vue, а также с наиболее распространенной системой контроля версий: Git. В главе показано, как создавать тестовые примеры для кода на JavaScript, а также компонентов Vue 3.

Глава 10, Развертывание приложения

В этой главе представлены концепции, необходимые для понимания того, как опубликовать приложение Vue 3 на живом рабочем сервере и как защитить его с помощью Let's Encrypt.

Глава 11, UX Patterns

Эта бонусная глава расширяет понятия пользовательского интерфейса и паттернов пользовательского опыта, чтобы обеспечить общий язык между разработчиком и дизайнером. В ней представлены общие шаблоны, предусмотренные стандартом HTML 5, и другие общие элементы.

Приложение: Миграция с Vue 2 на Vue 3

В этом приложении представлено руководство по изменениям и вариантам миграции для опытных разработчиков Vue 2.

- +
Skip to content

Что включает в себя эта книга

Глава 1, Фреймворк Vue 3

Что представляет собой прогрессивный фреймворк Vue 3? В этой главе представлены наиболее важные аспекты фреймворка и другие ключевые понятия.

Глава 2, Принципы и шаблоны проектирования программного обеспечения

Принципы и шаблоны проектирования программного обеспечения являются визитной карточкой хорошей архитектуры программного обеспечения. В этой главе рассказывается о них, приводятся примеры для реализации на JavaScript и Vue 3.

Глава 3, Создание рабочего проекта

В этой главе мы создаем рабочий проект, который будет использоваться в качестве базовой основы для будущих проектов. В ней вы шаг за шагом узнаете, как начать работу над проектом, используя нужные инструменты.

Глава 4, Композиция пользовательского интерфейса с помощью компонентов

Эта глава знакомит с концепцией пользовательских интерфейсов и подводит к реализации веб-приложения, начиная с концептуального визуального дизайна до разработки соответствующих компонентов.

Глава 5, Одностраничные приложения

Это ключевая глава, в которой представлен маршрутизатор Vue Router для создания одностраничных веб-приложений.

Глава 6, Прогрессивные веб-приложения

В этой главе на основе SPA создаются PWA, а также представлены инструменты для оценки их полноты и производительности.

Глава 7, Управление потоками данных

Эта глава знакомит с ключевыми концепциями проектирования и управления потоками данных и информации в приложении. В ней представлена Pinia как официальный фреймворк управления состояниями для Vue 3.

Глава 8, Многопоточность с помощью web-workers

Эта глава посвящена повышению производительности крупномасштабного приложения с помощью многопоточности с web-workers. В ней также представлены дополнительные паттерны для создания простой в реализации и удобной в обслуживании архитектуры.

Глава 9, Тестирование и контроль исходных текстов

В этой главе мы знакомимся с официальными инструментами тестирования предоставляемыми командой Vue, а также с наиболее распространенной системой контроля версий: Git. В главе показано, как создавать тестовые примеры для кода на JavaScript, а также компонентов Vue 3.

Глава 10, Развертывание приложения

В этой главе представлены концепции, необходимые для понимания того, как опубликовать приложение Vue 3 на живом рабочем сервере и как защитить его с помощью Let's Encrypt.

Глава 11, UX Patterns

Эта бонусная глава расширяет понятия пользовательского интерфейса и паттернов пользовательского опыта, чтобы обеспечить общий язык между разработчиком и дизайнером. В ней представлены общие шаблоны, предусмотренные стандартом HTML 5, и другие общие элементы.

Приложение: Миграция с Vue 2 на Vue 3

В этом приложении представлено руководство по изменениям и вариантам миграции для опытных разработчиков Vue 2.

+ \ No newline at end of file diff --git a/ru/deployment/ci-cd.html b/ru/deployment/ci-cd.html index 5e7d82b2d..b7ea5ceeb 100644 --- a/ru/deployment/ci-cd.html +++ b/ru/deployment/ci-cd.html @@ -6,13 +6,13 @@ CI/CD | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

CI/CD

Что такое CI/CD?

CI/CD (Continuous Integration, Continuous Delivery — непрерывная интеграция и доставка) — это технология автоматизации билда, тестирования и развертывания разрабатываемого проекта.

Другими словами, процесс перехода лежащего в репозитории кода в рабочий продукт на облачном сервере, например.

Элементы CI/CD полезны не только девопс инженеру, но и простому фронтендеру, позволяя ему после git commit/push изменений кода получить рабочий сайт, например, на GitHub Pages без дополнительных действий.

Основные инструменты для CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis

- +
Skip to content

CI/CD

Что такое CI/CD?

CI/CD (Continuous Integration, Continuous Delivery — непрерывная интеграция и доставка) — это технология автоматизации билда, тестирования и развертывания разрабатываемого проекта.

Другими словами, процесс перехода лежащего в репозитории кода в рабочий продукт на облачном сервере, например.

Элементы CI/CD полезны не только девопс инженеру, но и простому фронтендеру, позволяя ему после git commit/push изменений кода получить рабочий сайт, например, на GitHub Pages без дополнительных действий.

Основные инструменты для CI/CD: GitHub Actions, GitLab CI/CD, Jenkins, Trevis

+ \ No newline at end of file diff --git a/ru/deployment/docker.html b/ru/deployment/docker.html index 0f5ffbeb7..0fd6c404b 100644 --- a/ru/deployment/docker.html +++ b/ru/deployment/docker.html @@ -6,13 +6,13 @@ Docker | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ - - + + \ No newline at end of file diff --git a/ru/deployment/github-actions.html b/ru/deployment/github-actions.html index a0a41aef7..0c1773ae2 100644 --- a/ru/deployment/github-actions.html +++ b/ru/deployment/github-actions.html @@ -6,13 +6,13 @@ Github Actions | Vue FAQ - + - + - - + + @@ -186,8 +186,8 @@ backups_remove_count=5; cd $backup_dir && rm -rf work logs images; cd $root_backup_dir && dirs_to_be_removed=`ls -dt "$root_backup_dir/"* | tail -n +$backups_remove_count`; - rm $dirs_to_be_removed -rf; - + rm $dirs_to_be_removed -rf; + \ No newline at end of file diff --git a/ru/deployment/hosting.html b/ru/deployment/hosting.html index 2d5f69a12..91dbdc6fc 100644 --- a/ru/deployment/hosting.html +++ b/ru/deployment/hosting.html @@ -6,13 +6,13 @@ Хостинг | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Хостинг

Где разместить сайт?

После билда фронтенд проекта вы получаете набор html/css/js/jpeg и других статичных файлов, которые надо разместить на вебсервере, чтобы к вашему сайту был доступ.

Варианты размещения с бесплатными планами:

Также многие облачные провайдеры (Amazon, Google, Oracle, Microsoft) предоставляют бесплатные тарифы с возможностью получить виртуальный сервер, на котором можно установить вебсервер (Nginx, Apache) и захостить свой сайт самостоятельно. В этом случае на нем же можно разместить и бэкенд.

Домен

Купить домен сейчас очень просто и недорого (от 200 рублей в год), в связи с чем рекомендуется это сделать. GitHub Pages и другие хостеры позволяют подключить кастомный домен к вашему сайту. Поддомены удобны для организации окружения разработки (environments):

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL сертификаты

Современные браузеры требуют, чтобы сайт был доступен по HTTPS протоколу. Для этого для вашего домена необходим SSL сертификат. Хостинг провайдеры типа Firebase или Github Pages обеспечат вам сертификат сами. Если вы хостите свой сайт самостоятельно на облачном сервере, то можно сгенерировать сертификат с помощью программы CertBot.

- +
Skip to content

Хостинг

Где разместить сайт?

После билда фронтенд проекта вы получаете набор html/css/js/jpeg и других статичных файлов, которые надо разместить на вебсервере, чтобы к вашему сайту был доступ.

Варианты размещения с бесплатными планами:

Также многие облачные провайдеры (Amazon, Google, Oracle, Microsoft) предоставляют бесплатные тарифы с возможностью получить виртуальный сервер, на котором можно установить вебсервер (Nginx, Apache) и захостить свой сайт самостоятельно. В этом случае на нем же можно разместить и бэкенд.

Домен

Купить домен сейчас очень просто и недорого (от 200 рублей в год), в связи с чем рекомендуется это сделать. GitHub Pages и другие хостеры позволяют подключить кастомный домен к вашему сайту. Поддомены удобны для организации окружения разработки (environments):

  • dev.website.com
  • dev-api.website.com
  • website.com
  • api.website.com
  • docs.website.com
SSL сертификаты

Современные браузеры требуют, чтобы сайт был доступен по HTTPS протоколу. Для этого для вашего домена необходим SSL сертификат. Хостинг провайдеры типа Firebase или Github Pages обеспечат вам сертификат сами. Если вы хостите свой сайт самостоятельно на облачном сервере, то можно сгенерировать сертификат с помощью программы CertBot.

+ \ No newline at end of file diff --git a/ru/development/architectural-patterns.html b/ru/development/architectural-patterns.html index 398e77b75..9d9bd0915 100644 --- a/ru/development/architectural-patterns.html +++ b/ru/development/architectural-patterns.html @@ -6,13 +6,13 @@ Архитектурные решения | Vue FAQ - + - + - - + + @@ -80,7 +80,7 @@ meta: { requiresAuth: true, backRoute: "/" }, } ] -};
Как сделать один глобальные прелоадер (аналог Suspense)?

Если в приложении одновременно может выполняться несколько асинхронных функций (загрузка с бэкенда, например), а анимационный прелоадер надо показывать один, то можно несложно реализовать его через composable функцию:

AppLoader.vue
vue
<script setup>
+};
Как сделать один глобальный прелоадер (аналог Suspense)?

Если в приложении одновременно может выполняться несколько асинхронных функций (загрузка с бэкенда, например), а анимационный прелоадер надо показывать один, то можно несложно реализовать его через composable функцию:

AppLoader.vue
vue
<script setup>
 import { useAppLoader } from "@/app/composables/useAppLoader";
 const { loading } = useAppLoader();
 </script>
@@ -106,13 +106,13 @@
   }
 
   return { loading, startLoading, stopLoading };
-}
Some component
js
import { useAppLoader } from "@/app/composables/useAppLoader";
+}
SomeComponent
js
import { useAppLoader } from "@/app/composables/useAppLoader";
 const { startLoading, stopLoading } = useAppLoader();
 
 startLoading();
 product.value = await api.products.product(props.productId);
-stopLoading();

uuid - любая функция для генерации уникального id.

- +stopLoading();

uuid - любая функция для генерации уникального id.

+ \ No newline at end of file diff --git a/ru/development/assets.html b/ru/development/assets.html index 8141fa892..8a2a5de1c 100644 --- a/ru/development/assets.html +++ b/ru/development/assets.html @@ -6,13 +6,13 @@ Ресурсы приложения | Vue FAQ - + - + - - + + @@ -148,8 +148,8 @@ import json from "./example.json"; // import a root field as named exports - helps with tree-shaking! -import { field } from "./example.json"; - +import { field } from "./example.json"; + \ No newline at end of file diff --git a/ru/development/building.html b/ru/development/building.html index 1b500023a..10dc5ba52 100644 --- a/ru/development/building.html +++ b/ru/development/building.html @@ -6,13 +6,13 @@ Создание и сборка приложения | Vue FAQ - + - + - - + + @@ -58,8 +58,8 @@ } }

Также может требуеться настройка алиаса в ESLint конфиге для плагинов типа eslint-plugin-import и eslint-import-resolver-typescript, если они используются.

Как посмотреть, сколько в моем js бандле занимают разные библиотеки?

rollup-plugin-visualizer - отличное средство для этого

Запускается генерация статистики из командной строки так (один из вариантов):

sh
npx vite-bundle-visualizer
 npx vite-bundle-visualizer -t list
-npx vite-bundle-visualizer -t raw-data
- +npx vite-bundle-visualizer -t raw-data + \ No newline at end of file diff --git a/ru/development/ide.html b/ru/development/ide.html index c730ab884..9d6f2421b 100644 --- a/ru/development/ide.html +++ b/ru/development/ide.html @@ -6,13 +6,13 @@ Настройка IDE | Vue FAQ - + - + - - + + @@ -280,8 +280,8 @@ "vite.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, webpack.config.*, windi.config.*", "vue.config.*": "*.env, .babelrc*, .codecov, .cssnanorc*, .env.*, .envrc, .htmlnanorc*, .lighthouserc.*, .mocha*, .postcssrc*, .terserrc*, api-extractor.json, ava.config.*, babel.config.*, contentlayer.config.*, cssnano.config.*, cypress.*, env.d.ts, formkit.config.*, formulate.config.*, histoire.config.*, htmlnanorc.*, jasmine.*, jest.config.*, jsconfig.*, karma*, lighthouserc.*, playwright.config.*, postcss.config.*, puppeteer.config.*, rspack.config.*, svgo.config.*, tailwind.config.*, tsconfig.*, tsdoc.*, uno.config.*, unocss.config.*, vitest.config.*, webpack.config.*, windi.config.*" } -}
ESlint

Линтер - правая рука кодера. Он проверяет ошибки, форматирует код, делает еще много полезного

В то же время, хорошо настроить ESlint - довольно нетривиальная задача. Множество плагинов к нему, часть устаревшие, многие конфликтуют между собой.

Поэтому для не очень изощренных знатоков ESlint-a самое лучшее воспользоваться готовым решением. Второй человек в экосистеме Vue Antony Fu поделился своим конфигом

Для его установки достаточно добавить @antfu/eslint-config пакет в package.json devDependencies. Если заглянуть внутрь, там будет десятки подобранных пакетов и настроек.

К сожалению, форматирование <style> блока во .vue файлах не работает, поэтому приходится еще и включать Prettier в ручном режиме.

Онлайн песочницы для Vue 3
Еще программы, полезные в веб разработке
  • Hoppscotch/ - запросы к API
  • Postman - запросы к API, создание API
  • Xshell - удобный SSH клиент
  • HeidiSQL - клиент для доступа к SQL базам данных
Какая конфигурация компьютера подходит для фронтенд разработки?

Оперативной памяти минимум 16Гб и хороший (быстрый) SSD диск, всё остальное вторично, включая процессор. Потратьте лучше деньги на качественный второй монитор 22+ дюймов, удобную клавиатуру и мышку.

Для фулстек разработки (и не только) удобно еще иметь мини-ПК, куда переносится база данных, вебсервер и другие [микро]сервисы. Он может работать как сервер, без монитора и клавиатуры.

Также на него можно поставить репозиторий исходного кода. С основной машины подсоединение идет в VS Code через SSH Remote connection. В итоге и бэк, и фронт (Node.js) запускаются на твоем минисервере, и твой ноут больше не греется и не пытается взлететь с помощью бешено вращающихся вентиляторов.

Работать так значительно производительней (MySQL, вебсервера, Docker крутятся на Linux быстрей и надёжней, как и Nodе.js), комфортней и тише. Кулер мини-ПК в штатном режиме включается только на пару секунд при загрузке ОС.

- +}
ESlint

Линтер - правая рука кодера. Он проверяет ошибки, форматирует код, делает еще много полезного

В то же время, хорошо настроить ESlint - довольно нетривиальная задача. Множество плагинов к нему, часть устаревшие, многие конфликтуют между собой.

Поэтому для не очень изощренных знатоков ESlint-a самое лучшее воспользоваться готовым решением. Второй человек в экосистеме Vue Antony Fu поделился своим конфигом

Для его установки достаточно добавить @antfu/eslint-config пакет в package.json devDependencies. Если заглянуть внутрь, там будет десятки подобранных пакетов и настроек.

К сожалению, форматирование <style> блока во .vue файлах не работает, поэтому приходится еще и включать Prettier в ручном режиме.

Онлайн песочницы для Vue 3
Еще программы, полезные в веб разработке
  • Hoppscotch/ - запросы к API
  • Postman - запросы к API, создание API
  • Xshell - удобный SSH клиент
  • HeidiSQL - клиент для доступа к SQL базам данных
Какая конфигурация компьютера подходит для фронтенд разработки?

Оперативной памяти минимум 16Гб и хороший (быстрый) SSD диск, всё остальное вторично, включая процессор. Потратьте лучше деньги на качественный второй монитор 22+ дюймов, удобную клавиатуру и мышку.

Для фулстек разработки (и не только) удобно еще иметь мини-ПК, куда переносится база данных, вебсервер и другие [микро]сервисы. Он может работать как сервер, без монитора и клавиатуры.

Также на него можно поставить репозиторий исходного кода. С основной машины подсоединение идет в VS Code через SSH Remote connection. В итоге и бэк, и фронт (Node.js) запускаются на твоем минисервере, и твой ноут больше не греется и не пытается взлететь с помощью бешено вращающихся вентиляторов.

Работать так значительно производительней (MySQL, вебсервера, Docker крутятся на Linux быстрей и надёжней, как и Nodе.js), комфортней и тише. Кулер мини-ПК в штатном режиме включается только на пару секунд при загрузке ОС.

+ \ No newline at end of file diff --git a/ru/development/libraries.html b/ru/development/libraries.html index b53aca433..736b6af06 100644 --- a/ru/development/libraries.html +++ b/ru/development/libraries.html @@ -6,13 +6,13 @@ Подскажите удобную библиотеку | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Подскажите удобную библиотеку

Для работы с датами

moment безвозвратно устарел. Есть day.js и day-fnc.js

Однако в 95% случаев хватает возможностей стандартного JavaScript Intl пакета

Для UI компонентов

Существует достаточно много CSS и UI библиотек

Вот в этой статье есть небольшой обзор их тяжеловесности

Quasar и PrimeVue выглядят солидно.

- +
Skip to content

Подскажите удобную библиотеку

Для работы с датами

moment безвозвратно устарел. Есть day.js и day-fnc.js

Однако в 95% случаев хватает возможностей стандартного JavaScript Intl пакета

Для UI компонентов

Существует достаточно много CSS и UI библиотек

Вот в этой статье есть небольшой обзор их тяжеловесности

Quasar и PrimeVue выглядят солидно.

+ \ No newline at end of file diff --git a/ru/development/misc.html b/ru/development/misc.html index 997df24e4..d5cf000a5 100644 --- a/ru/development/misc.html +++ b/ru/development/misc.html @@ -6,13 +6,13 @@ Полезные советы | Vue FAQ - + - + - - + + @@ -43,8 +43,8 @@ delete window.devtoolsFormatters; // will print out data without custom formatting console.log(obj); -window.devtoolsFormatters = old; - +window.devtoolsFormatters = old; + \ No newline at end of file diff --git a/ru/development/stores.html b/ru/development/stores.html index 2300fabed..2445cb642 100644 --- a/ru/development/stores.html +++ b/ru/development/stores.html @@ -6,13 +6,13 @@ State management во Vue 3 | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

State management во Vue 3

Зачем нужен State management?

Иногда в приложении нужно передать реактивные данные или функцию из одного компонента в другой, и эти компоненты не принадлежат одной иерархии. Механизмы пропсов/ивентов или provide/inject не подходят для этого. Поэтому во Vue 2 появился Vuex - state management библиотека, которая позволяет хранить реактивный стейт и предоставлять доступ к нему отовсюду.

Библиотека управления стейтом на фронтенде обычно называется "стором".

Как можно передать реактивные данные из одного компонента в другой во Vue 3?
  • Если один компонент является прямым потомком другого - пропсы и ивенты
  • Если один компонент непрямой потомок другого - provide/inject или проп/ивент дриллинг (плохая практика)
  • Если они в разных ветках иерархии - стор или Vue 3 ref/reactive

Vue 3 ref/reactive - это когда в отдельном js модуле вы определяете и экспортируете реактивную переменную:

export const userLoggedIn = ref(false);

После чего она доступна во всём приложении через импорт данного модуля.

Однако, расшаривать просто переменную - архитектурно плохая идея. Обычно вокруг этой переменной есть бизнес логика, которую и надо сделать доступной.

Например, для аутентификации нужен не только сам факт, что пользователь залогинился, но и сопутствующие методы - login(), logout(), register(), isAuthenticated(). Синтез некоего стейта и сопутствующей бизнес логики дал так называемые composable функции во Vue 3.

В некотором смысле - аналог объекта в ООП.

Что такое стор (store) на фронтенде?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Стор (например, Pinia) — это сущность, содержащая состояние и бизнес-логику, которая не привязана к вашему дереву компонентов. Другими словами, здесь находится глобальное состояние. Это что-то вроде компонента, который всегда присутствует, и который каждый может считывать и писать в него.

Официальная документация Pinia

Выглядит как очень неудачное, двусмысленное и запутывающее определение.

С точки зрения разработчика не фронтенда (по сути любой другой язык, кроме JavaScript, плюс частично JavaScript), аналогом конструкции с названиемстор будет база данных - SQL, NoSQL или кэширующий Redis. Там есть аналоги стейта и геттеров (View в SQL БД). Но в 99.99% случаях в базе данных не будет никакой бизнес логики, за исключением ограничений для консистентности данных (например, unique или foreign keys).

С точки зрения разработчика не фронтенда, сторы фронтенда - это просто объекты / stateful сервисы, построенные по шаблону синглтон. Называть их "глобальными сторами" как минимум нелогично.

Скорей всего, это произошло исторически. Сперва был один Vuex, он был один стор и глобален. Потом у него появились модули. Потом у Pinia эти модули стали независимы и расползлись по всему приложению. В итоге, в приложении куча мелких локальных (по области использования) сторов, каждый из которых считает себя глобальным, даже если его использует 2-3 компонента из 1000 на проекте, и даже если в этом сторе 1% - стейта, и 99% - бизнес и сопутствующей логики.

В этом плане использование композабл функций для той же цели (an entity holding state and business logic that isn't bound to your Component tree) - намного более логично. И называть их следует не useAuthStore, а useAuth или useAuthService.

Vuex или Pinia?

Во Vue 3 основной внешней библиотекой управления стейтом стала Pinia. В отличие от Vuex у нее есть поддержка TypeScript, она удобней и, естественно, пользуется преимуществами Vue 3.

Vuex официально устарел (deprecated)

Pinia или Composable functions?

Во Vue 3 появилось нечто, делающее отдельную библиотеку для управления стейтом ненужной. А именно, реактивные типыRef и Reactive, которыми можно пользоваться за пределами компонент. Стало возможным делать свои сторы на основе composable функций и подключать их в любом компоненте.

Основное декларируемое отличие Pinia - интеграция с Vue DevTools, плагины и SSR поддержка. Однако, нужно ли ему то или другое, каждый разработчик решает сам. Работать с composables в DevTools вполне комфортно.

Composable функция, в свою очередь, может иметь как глобальный, так и локальный (переменные объявлены внутри функции) стейты. Это бывает удобно в определенных случаях - можно создать несколько экземпляров composable функций, каждая со своим стейтом. Например, когда у вас на сайте несколько новостных виджетов, различающихся только категорией новостей.

Кроме того, с функциональной точки зрения composable функции имеют полный доступ ко всему Vue Reactivity API, что делает их гибче, чем Pinia.

Composable функции с глобальным стейтом не работают в SSR режиме.

Что касается производительности, то по тестам на изменениях Reactive Pinia примерно в полтора раза медленней Vue 3 Reactive, а на Ref - в 20 раз. Это потому, что Ref (примитивные типы) в Pinia становится частью Reactive. Setup store не решают эту проблему.

Также надо помнить, что любая зависимость (в данном случае библиотека Pinia) может принести проблемы, аналогичные с ситуацией "RIP Vuex", когда библиотека умирает, устаревает, перестает поддерживаться или в ней находят уязвимости. Composable функции, в свою очередь, выглядят основательным нововведением во Vue фреймворк.

Вот интересное обсуждение по теме на /r/vuejs. Пример кода от Reddit пользователя @ferferga показывает, как использовать классы TypeScript с private методами, геттерами, сеттерами (без .value) и поддержкой типов первого класса в качестве store на Composition API (что было бы невозможно с Pinia). Использование классов TS здесь, возможно, не является хорошей практикой, но демонстрирует гибкость и мощь Composition API.

Также вот лайфхак для Devtools от пользователя @coolcosmos: Я просто использую рефы. Минус в том, что вы теряете Devtools, но в режиме разработки я временно импортирую все свои рефы и передаю их в Pinia, так что у меня есть все плюсы и никаких минусов.

Как разделять логику между компонентом и composable функциями?

Удобно представлять это как MVC шаблон, где роль View (и частично Controller) выполняют компоненты, отвечающие преимущественно за визуализацию, а логика и модель (Model и частично Controller) приходятся на композабл функции и их реактивный стейт.

Чтобы понять, что класть в композабл, а что в компонент (который может состоять из нескольких компонент), представьте, что вы меняете компонент на другой - отображающий ваши данные как-то иначе. В идеале, модель (композабл) должен остаться тем же самым, вы переписываете только компонент, в котором логика, ответственная только за отображение.

В то же время, логика (Controller) может делиться между компонентом и композаблом. Например, валидация данных формы может происходить в компоненте (проверка, что поле заполнено), в компоненте с помощью сторонней утилиты (проверка, что пароль - "сложный") и в композабле (проверка, что username - уникален)

- +
Skip to content

State management во Vue 3

Зачем нужен State management?

Иногда в приложении нужно передать реактивные данные или функцию из одного компонента в другой, и эти компоненты не принадлежат одной иерархии. Механизмы пропсов/ивентов или provide/inject не подходят для этого. Поэтому во Vue 2 появился Vuex - state management библиотека, которая позволяет хранить реактивный стейт и предоставлять доступ к нему отовсюду.

Библиотека управления стейтом на фронтенде обычно называется "стором".

Как можно передать реактивные данные из одного компонента в другой во Vue 3?
  • Если один компонент является прямым потомком другого - пропсы и ивенты
  • Если один компонент непрямой потомок другого - provide/inject или проп/ивент дриллинг (плохая практика)
  • Если они в разных ветках иерархии - стор или Vue 3 ref/reactive

Vue 3 ref/reactive - это когда в отдельном js модуле вы определяете и экспортируете реактивную переменную:

export const userLoggedIn = ref(false);

После чего она доступна во всём приложении через импорт данного модуля.

Однако, расшаривать просто переменную - архитектурно плохая идея. Обычно вокруг этой переменной есть бизнес логика, которую и надо сделать доступной.

Например, для аутентификации нужен не только сам факт, что пользователь залогинился, но и сопутствующие методы - login(), logout(), register(), isAuthenticated(). Синтез некоего стейта и сопутствующей бизнес логики дал так называемые composable функции во Vue 3.

В некотором смысле - аналог объекта в ООП.

Что такое стор (store) на фронтенде?

A Store (like Pinia) is an entity holding state and business logic that isn't bound to your Component tree. In other words, it hosts global state. It's a bit like a component that is always there and that everybody can read off and write to.

Стор (например, Pinia) — это сущность, содержащая состояние и бизнес-логику, которая не привязана к вашему дереву компонентов. Другими словами, здесь находится глобальное состояние. Это что-то вроде компонента, который всегда присутствует, и который каждый может считывать и писать в него.

Официальная документация Pinia

Выглядит как очень неудачное, двусмысленное и запутывающее определение.

С точки зрения разработчика не фронтенда (по сути любой другой язык, кроме JavaScript, плюс частично JavaScript), аналогом конструкции с названиемстор будет база данных - SQL, NoSQL или кэширующий Redis. Там есть аналоги стейта и геттеров (View в SQL БД). Но в 99.99% случаях в базе данных не будет никакой бизнес логики, за исключением ограничений для консистентности данных (например, unique или foreign keys).

С точки зрения разработчика не фронтенда, сторы фронтенда - это просто объекты / stateful сервисы, построенные по шаблону синглтон. Называть их "глобальными сторами" как минимум нелогично.

Скорей всего, это произошло исторически. Сперва был один Vuex, он был один стор и глобален. Потом у него появились модули. Потом у Pinia эти модули стали независимы и расползлись по всему приложению. В итоге, в приложении куча мелких локальных (по области использования) сторов, каждый из которых считает себя глобальным, даже если его использует 2-3 компонента из 1000 на проекте, и даже если в этом сторе 1% - стейта, и 99% - бизнес и сопутствующей логики.

В этом плане использование композабл функций для той же цели (an entity holding state and business logic that isn't bound to your Component tree) - намного более логично. И называть их следует не useAuthStore, а useAuth или useAuthService.

Vuex или Pinia?

Во Vue 3 основной внешней библиотекой управления стейтом стала Pinia. В отличие от Vuex у нее есть поддержка TypeScript, она удобней и, естественно, пользуется преимуществами Vue 3.

Vuex официально устарел (deprecated)

Pinia или Composable functions?

Во Vue 3 появилось нечто, делающее отдельную библиотеку для управления стейтом ненужной. А именно, реактивные типыRef и Reactive, которыми можно пользоваться за пределами компонент. Стало возможным делать свои сторы на основе composable функций и подключать их в любом компоненте.

Основное декларируемое отличие Pinia - интеграция с Vue DevTools, плагины и SSR поддержка. Однако, нужно ли ему то или другое, каждый разработчик решает сам. Работать с composables в DevTools вполне комфортно.

Composable функция, в свою очередь, может иметь как глобальный, так и локальный (переменные объявлены внутри функции) стейты. Это бывает удобно в определенных случаях - можно создать несколько экземпляров composable функций, каждая со своим стейтом. Например, когда у вас на сайте несколько новостных виджетов, различающихся только категорией новостей.

Кроме того, с функциональной точки зрения composable функции имеют полный доступ ко всему Vue Reactivity API, что делает их гибче, чем Pinia.

Composable функции с глобальным стейтом не работают в SSR режиме.

Что касается производительности, то по тестам на изменениях Reactive Pinia примерно в полтора раза медленней Vue 3 Reactive, а на Ref - в 20 раз. Это потому, что Ref (примитивные типы) в Pinia становится частью Reactive. Setup store не решают эту проблему.

Также надо помнить, что любая зависимость (в данном случае библиотека Pinia) может принести проблемы, аналогичные с ситуацией "RIP Vuex", когда библиотека умирает, устаревает, перестает поддерживаться или в ней находят уязвимости. Composable функции, в свою очередь, выглядят основательным нововведением во Vue фреймворк.

Вот интересное обсуждение по теме на /r/vuejs. Пример кода от Reddit пользователя @ferferga показывает, как использовать классы TypeScript с private методами, геттерами, сеттерами (без .value) и поддержкой типов первого класса в качестве store на Composition API (что было бы невозможно с Pinia). Использование классов TS здесь, возможно, не является хорошей практикой, но демонстрирует гибкость и мощь Composition API.

Также вот лайфхак для Devtools от пользователя @coolcosmos: Я просто использую рефы. Минус в том, что вы теряете Devtools, но в режиме разработки я временно импортирую все свои рефы и передаю их в Pinia, так что у меня есть все плюсы и никаких минусов.

Как разделять логику между компонентом и composable функциями?

Удобно представлять это как MVC шаблон, где роль View (и частично Controller) выполняют компоненты, отвечающие преимущественно за визуализацию, а логика и модель (Model и частично Controller) приходятся на композабл функции и их реактивный стейт.

Чтобы понять, что класть в композабл, а что в компонент (который может состоять из нескольких компонент), представьте, что вы меняете компонент на другой - отображающий ваши данные как-то иначе. В идеале, модель (композабл) должен остаться тем же самым, вы переписываете только компонент, в котором логика, ответственная только за отображение.

В то же время, логика (Controller) может делиться между компонентом и композаблом. Например, валидация данных формы может происходить в компоненте (проверка, что поле заполнено), в компоненте с помощью сторонней утилиты (проверка, что пароль - "сложный") и в композабле (проверка, что username - уникален)

+ \ No newline at end of file diff --git a/ru/development/testing.html b/ru/development/testing.html index 9b4353d65..b53685271 100644 --- a/ru/development/testing.html +++ b/ru/development/testing.html @@ -6,13 +6,13 @@ Тестирование | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Тестирование

Нужно ли тестирование на фронтенде?

Тесты бывают нескольких типов, среди них - unit тесты и интеграционные (e2e) теcты

Unit тестированием во Vue занимаются Vitest, Jest

С тестированием на фронте нужно быть аккуратней, так как написание и переписывание тестов зачастую может занять время, сопоставимое с самой разработкой. В то же время, полезность этих тестов будет под большим вопросом. Их целесообразность проявляется на больших проектах с большим количеством разработчиков. Там unit тесты также отнимают время, но снижают вероятность, что кто-то что-то испортит. В то же время на стартапе unit тесты далеко не самый нужный ингридиент для быстрого создания MVP.

Фронтенд разработка в этом аспекте очень сильно отличается от бэкенд разработки, где unit тесты действительно полезны.

Хорошая статья на эту тему - Unit Test Fetish

Что такое e2e тесты?

На фронте, особенно для веб приложения, которое уже в продакшне и должно время от времени обновляться, важны e2e тесты.

e2e (end-to-end) тестирование — это процесс тестирования программного обеспечения, который имитирует реальные действия пользователей на уровне интерфейса.

При этом будет запущен браузер (обычно, в headless режиме - без UI), и он по написанным скриптам будет проверять работу сайта - наличие элементов на странице, возможность логина и т.п.

Основные средства для e2e тестирования - Cypress, WebdriverIO

При CI/CD проекта прогон тестов - один из основных моментов наряду с линтингом и билдом.

- +
Skip to content

Тестирование

Нужно ли тестирование на фронтенде?

Тесты бывают нескольких типов, среди них - unit тесты и интеграционные (e2e) теcты

Unit тестированием во Vue занимаются Vitest, Jest

С тестированием на фронте нужно быть аккуратней, так как написание и переписывание тестов зачастую может занять время, сопоставимое с самой разработкой. В то же время, полезность этих тестов будет под большим вопросом. Их целесообразность проявляется на больших проектах с большим количеством разработчиков. Там unit тесты также отнимают время, но снижают вероятность, что кто-то что-то испортит. В то же время на стартапе unit тесты далеко не самый нужный ингридиент для быстрого создания MVP.

Фронтенд разработка в этом аспекте очень сильно отличается от бэкенд разработки, где unit тесты действительно полезны.

Хорошая статья на эту тему - Unit Test Fetish

Что такое e2e тесты?

На фронте, особенно для веб приложения, которое уже в продакшне и должно время от времени обновляться, важны e2e тесты.

e2e (end-to-end) тестирование — это процесс тестирования программного обеспечения, который имитирует реальные действия пользователей на уровне интерфейса.

При этом будет запущен браузер (обычно, в headless режиме - без UI), и он по написанным скриптам будет проверять работу сайта - наличие элементов на странице, возможность логина и т.п.

Основные средства для e2e тестирования - Cypress, WebdriverIO

При CI/CD проекта прогон тестов - один из основных моментов наряду с линтингом и билдом.

+ \ No newline at end of file diff --git a/ru/frontend/about-frameworks.html b/ru/frontend/about-frameworks.html index 455bd2497..d4bf3731f 100644 --- a/ru/frontend/about-frameworks.html +++ b/ru/frontend/about-frameworks.html @@ -6,13 +6,13 @@ О фронтенд фреймворках | Vue FAQ - + - + - - + + @@ -39,8 +39,8 @@ someArr = [...someArr, newItem]; // Vue -someArr.value.push(newItem.value);

Использование нативного ES6 объекта Proxy позволяет избежать декомпозиции и создания промежуточного массива. Также это более производительное решение.

- +someArr.value.push(newItem.value);

Использование нативного ES6 объекта Proxy позволяет избежать декомпозиции и создания промежуточного массива. Также это более производительное решение.

+ \ No newline at end of file diff --git a/ru/frontend/architecture.html b/ru/frontend/architecture.html index df6eba66e..bb0204d02 100644 --- a/ru/frontend/architecture.html +++ b/ru/frontend/architecture.html @@ -6,13 +6,13 @@ Архитектура фронтэнд приложений | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Архитектура фронтэнд приложений

Что такое хорошая архитектура веб-приложения

Есть разные теоретические определения и обоснования данного понятия, но грубо говоря это следующее.

Допустим ты разрабатываешь проект, уже на финальном этапе. К тебе подходит заказчик и говорит что-то типа: я хочу добавить тень ко всем кнопкам, я хочу изменить UI библиотеку, мы решили поддерживать несколько языков, мы решили заменить вот этот модуль на другой, нужно сделать более детальную адаптивность для разных разрешений, мы решили добавить темы, мы меняем провайдера услуг по обработке платежей, у нас повышается число пользователей / сайт тормозит / надо его ускорить, надо повысить уровень безопасности сайта, мы взяли мидл программиста, введи его в курс дела быстро, и пусть он добавляет функционал или фиксит баги и т.п.

Хорошая архитектура фронтенд приложения позволяет выполнить всё это наиболее эффективно с наименьшими затратами.

ООП на фронтенде

Многие приходя из разработки на объектно-ориентированных языках пытаются использовать концепции ООП и на фронте и программировать с классами, наследованием, полиморфизмом и прочим.

Это ошибка. Основные вычисления на фронте связаны с UI - показ данных, обработка взаимодействия с пользователем. Системы классов и микросервисов на них просто не нужны. Конечно, можно создать базовую кнопку, обернуть ее в два кастомных компонента и считать это наследованием, но в коде этого не получается. Поэтому надо учиться мыслить другими категориями - компоненты, композаблы, js модули. И использовать свою мощь JavaScript-a, а не пытаться натянуть его на ООП.

В то же время неплохой аналогией объекта с глобальным ("статичным") и локальным ("объектным") состоянием является композабл функция. Это можно использовать в определённых ситуациях.

Полезные советы
Избегайте зависимостей

Если есть возможность не вводить новую зависимость (не подключать новый npm пакет) - не делайте это. Это может немного сэкономит ваше время, но сторонняя библиотека рано или поздно устареет, перестанет поддерживаться, в ней могут обнаружить уязвимость. Кроме того она увеличивает размер вашего бандла, что напрямую влияет на производительность вашего приложения. Tree shaking хорош в рекламных зазываниях, но работает реально далеко не всегда.

Если вам нужна, например, функция debounce, не торопитесь подключать её вместе с какой-либо библиотекой. Загуглите её реализацию и скопируйте 15 строк кода, сделав свою функцию.


Используйте обертки над компонентами UI библиотек и сторонних утилит

Если вы используете компоненты какой-то UI библиотеки, не используйте их напрямую - сделайте обертки для них. Например, BaseButton или BaseInput. Это намного облегчит стилизацию компонент, а также сильно упростит переход на другую библиотеку, или замену на свои компоненты.

То же самое с утилитами.


Регулярный рефакторинг

Время от времени делайте рефакторинг кода, перемещая компоненты и модули туда, где они должны быть логически, переименовывая их, и структурируя и улучшая сам код. Это полезно и для кода, и для вашего профессионального роста.


Используйте CSS3

Старайтесь использовать для адаптивноcти чистый CSS3. Не привязывайтесь к колоночным моделям CSS и UI библиотек, если только это не проект из разряда: "сделал и забыл, пусть заказчик дальше с ним мучается".

Потратьте пару дней на изучение Флексбокса и вы сможете верстать на нём быстрей и лучше, чем на любом Тайлвинде.


Используйте современные стандарты и возможности языков

Например, семантические элементы HTML5 - aside, header, section, article, details и.т.д.

CSS3 - Flexbox и Grid, Container query


Документируйте проект

Рисуйте use-case и другие диаграммы, описывайте основной функционал проекта и важные детали его реализации - это как минимум повысит ваш уровень как разработчика ПО.

VitePress - очень удобный инструмент для технического документирования.

- +
Skip to content

Архитектура фронтэнд приложений

Что такое хорошая архитектура веб-приложения

Есть разные теоретические определения и обоснования данного понятия, но грубо говоря это следующее.

Допустим ты разрабатываешь проект, уже на финальном этапе. К тебе подходит заказчик и говорит что-то типа: я хочу добавить тень ко всем кнопкам, я хочу изменить UI библиотеку, мы решили поддерживать несколько языков, мы решили заменить вот этот модуль на другой, нужно сделать более детальную адаптивность для разных разрешений, мы решили добавить темы, мы меняем провайдера услуг по обработке платежей, у нас повышается число пользователей / сайт тормозит / надо его ускорить, надо повысить уровень безопасности сайта, мы взяли мидл программиста, введи его в курс дела быстро, и пусть он добавляет функционал или фиксит баги и т.п.

Хорошая архитектура фронтенд приложения позволяет выполнить всё это наиболее эффективно с наименьшими затратами.

ООП на фронтенде

Многие приходя из разработки на объектно-ориентированных языках пытаются использовать концепции ООП и на фронте и программировать с классами, наследованием, полиморфизмом и прочим.

Это ошибка. Основные вычисления на фронте связаны с UI - показ данных, обработка взаимодействия с пользователем. Системы классов и микросервисов на них просто не нужны. Конечно, можно создать базовую кнопку, обернуть ее в два кастомных компонента и считать это наследованием, но в коде этого не получается. Поэтому надо учиться мыслить другими категориями - компоненты, композаблы, js модули. И использовать свою мощь JavaScript-a, а не пытаться натянуть его на ООП.

В то же время неплохой аналогией объекта с глобальным ("статичным") и локальным ("объектным") состоянием является композабл функция. Это можно использовать в определённых ситуациях.

Полезные советы
Избегайте зависимостей

Если есть возможность не вводить новую зависимость (не подключать новый npm пакет) - не делайте это. Это может немного сэкономит ваше время, но сторонняя библиотека рано или поздно устареет, перестанет поддерживаться, в ней могут обнаружить уязвимость. Кроме того она увеличивает размер вашего бандла, что напрямую влияет на производительность вашего приложения. Tree shaking хорош в рекламных зазываниях, но работает реально далеко не всегда.

Если вам нужна, например, функция debounce, не торопитесь подключать её вместе с какой-либо библиотекой. Загуглите её реализацию и скопируйте 15 строк кода, сделав свою функцию.


Используйте обертки над компонентами UI библиотек и сторонних утилит

Если вы используете компоненты какой-то UI библиотеки, не используйте их напрямую - сделайте обертки для них. Например, BaseButton или BaseInput. Это намного облегчит стилизацию компонент, а также сильно упростит переход на другую библиотеку, или замену на свои компоненты.

То же самое с утилитами.


Регулярный рефакторинг

Время от времени делайте рефакторинг кода, перемещая компоненты и модули туда, где они должны быть логически, переименовывая их, и структурируя и улучшая сам код. Это полезно и для кода, и для вашего профессионального роста.


Используйте CSS3

Старайтесь использовать для адаптивноcти чистый CSS3. Не привязывайтесь к колоночным моделям CSS и UI библиотек, если только это не проект из разряда: "сделал и забыл, пусть заказчик дальше с ним мучается".

Потратьте пару дней на изучение Флексбокса и вы сможете верстать на нём быстрей и лучше, чем на любом Тайлвинде.


Используйте современные стандарты и возможности языков

Например, семантические элементы HTML5 - aside, header, section, article, details и.т.д.

CSS3 - Flexbox и Grid, Container query


Документируйте проект

Рисуйте use-case и другие диаграммы, описывайте основной функционал проекта и важные детали его реализации - это как минимум повысит ваш уровень как разработчика ПО.

VitePress - очень удобный инструмент для технического документирования.

+ \ No newline at end of file diff --git a/ru/frontend/css-ui-libs.html b/ru/frontend/css-ui-libs.html index c6c5a2d21..926cb7bf6 100644 --- a/ru/frontend/css-ui-libs.html +++ b/ru/frontend/css-ui-libs.html @@ -6,13 +6,13 @@ CSS и UI библиотеки | Vue FAQ - + - + - - + + @@ -35,8 +35,8 @@
Skip to content

CSS и UI библиотеки

Что такое CSS и UI библиотеки?

CSS и UI библиотеки либо предоставляют свои, либо помогают создавать кастомные UI компоненты типа Button или Select? что может значительно ускорить разработку.

CSS библиотеки не содержат JavaScript кода и, соответственно, имеют ограничения для сложных компонент типа Select или Dropdown.

Есть отдельный тип Headless-UI библиотек, которые предлагают компоненты без стилизованной визуализации - только логику компонента и Accessibility требования. Разработчику нужно самому добавить CSS стили.

Плюсы и минусы UI библиотек?

Плюсы: укоряет разработку, если пользоваться ей на проекте максимально, вносит в приложение единый стиль

Минусы: как и любая зависимость может устареть (трагедия Vuetify 2), добавляет веса в итоговый бандл.

В этой статье хорошо сравниваются 10 Vue 3 UI библиотек.

Как снизить зависимость от чужих библиотек?

Оборачивайте компоненты UI библиотеки в свои.

vue
<!-- BaseButton.vue -->
 <template>
   <QButton ... />
-</template>

и используйте в своем коде BaseButton. Таким образом в дальнейшем вам будет намного проще проапгрейдиться, заменить библиотеку или заменить данный компонент на самописный. И даже просто изменить у компонента стили.

Лэйаут и адаптивность страниц средствами CSS и UI библиотек

Использование колоночной системы и иного функционала CSS и UI библиотек типа распространенного Tailwind удобно для небольших проектов и иногда ускоряет верстку, однако очень сильно ухудшает качество кода в целом, включая его поддерживаемость и расширяемость. Как будто мир вновь вернулся во времена IE6, когда все стили и JavaScript также располагались в аттрибутах тэгов, и вся эволюция CSS в понятную, удобную, красивую иерарxичную модель классов была зря, как и разделение веба на документ (шаблон), презентационный слой (CSS стили) и логику (JavaScript).

В интернете полно статей, почему подход подобный Tailwind это плохо. Можно отметить только, что при должном умении верстать на чистом CSS3 также быстро и намного удобней и приятней в плане DX, чем через средства CSS и UI библиотек.

Цитата

Хорошие разработчики знают причины, по которым стандарты, паттерны и хорошие практики стали таковыми.

Плохие разработчики придерживаются любой новой тенденции, которая может сэкономить им немного времени на обучение.

- +</template>

и используйте в своем коде BaseButton. Таким образом в дальнейшем вам будет намного проще проапгрейдиться, заменить библиотеку или заменить данный компонент на самописный. И даже просто изменить у компонента стили.

Лэйаут и адаптивность страниц средствами CSS и UI библиотек

Использование колоночной системы и иного функционала CSS и UI библиотек типа распространенного Tailwind удобно для небольших проектов и иногда ускоряет верстку, однако очень сильно ухудшает качество кода в целом, включая его поддерживаемость и расширяемость. Как будто мир вновь вернулся во времена IE6, когда все стили и JavaScript также располагались в аттрибутах тэгов, и вся эволюция CSS в понятную, удобную, красивую иерарxичную модель классов была зря, как и разделение веба на документ (шаблон), презентационный слой (CSS стили) и логику (JavaScript).

В интернете полно статей, почему подход подобный Tailwind это плохо. Можно отметить только, что при должном умении верстать на чистом CSS3 также быстро и намного удобней и приятней в плане DX, чем через средства CSS и UI библиотек.

Цитата

Хорошие разработчики знают причины, по которым стандарты, паттерны и хорошие практики стали таковыми.

Плохие разработчики придерживаются любой новой тенденции, которая может сэкономить им немного времени на обучение.

+ \ No newline at end of file diff --git a/ru/frontend/learning.html b/ru/frontend/learning.html index afafb4fd9..f0676d8b9 100644 --- a/ru/frontend/learning.html +++ b/ru/frontend/learning.html @@ -6,13 +6,13 @@ Изучение Vue | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Изучение Vue

Источники информации по Vue

Почему-то считается, что на фронтенде есть всего два варианта получать знания - документация Vue и обучающие видео с Ютюба и всевозможных курсов.

Но документация это не учебник, а справочник, и отделить зерна от плевел на Ютюбе очень сложно. Я встречал полезные видео, но все они предназначались для уже неплохо знающих Vue разработчиков, и показывали какие-то новые или нестандартные моменты.


Главным учителем должна быть книга, которая именно учит, а не даёт справочную информацию.

Прекрасный учебник по Vue на английском языке - вышедшая в мае 2023 года Vue.js 3 Design Patterns and Best Practices. Можно зарегистрироваться на oReilly и читать 10 дней бесплатно. Даже скачать. Несмотря на название, книга учит именно программированию, причем, довольно с таки начального уровня.

Перевод данной книги на русский язык находится на этом сайте: (учебник).

Примеры из книги находятся в открытом доступе и вполне достойны изучения.

Больше на русском, к сожалению, почти ничего нет, но, во-первых, есть Google translate, а во-вторых, стать уверенным разработчиком без хотя бы среднего знания технического английского вряд ли получится.

Так же надо отметить, что документация Vue на русском порой сильно отстает от документации на английском.


Заметка

Можно провести аналогию между хорошим разработчиком и водителем:

  1. Изучение основ вождения, ПДД и устройства двигателя внутреннего сгорания - документация Vue и спецификация JavaScript
  2. Практическое обучение вождению в автошколе - хорошие учебники типа "Vue.js 3 Design Patterns and Best Practices"
  3. Реальный опыт вождения - коммерческий опыт разработки
  4. Курсы экстремального вождения, поставить стакан воды на капот и проехать на двадцатилетней машине с механической коробкой передач по разбитым улицам - качественные опен сорс проекты и сертификации

Невозможно стать хорошим разработчиком/водителем как без 1., так и только с 1. Обучающие видео из интернета (как платные так и бесплатные) могут как быть частью 4., так и быть абсолютно бесполезными и даже вредными (очень часто), в зависимости от их качества и мотивации ученика.

Vue 2 или Vue 3?

Vue 3.
Composition API.

Если вам нужен будет Vue 2 для поддержки существующего проекта, то вы сами будете знать ответ на этот вопрос.

Разница между Vue 2 и Vue 3 большая. Это не тот случай, когда надо выучить предварительно предыдущую версию, чтобы лучше и легче понять следующую.

Нужно ли знать JavaScript предварительно?

Обязательно, минимум на среднем уровне. Если этого нет, я бы предложил сперва пройти короткий курс javascript-a, чтобы человек знал об объекте document, умел обращаться с методами массива и не очень боялся промисов. Также, HTML и CSS как минимум на базовом уровне.

Вот легко читаемая книжка - "Морган Н. - JavaScript для детей. Самоучитель по программированию - 2016. Перед началом изучения Vue желательно понимать 70% первой части, а также параграфы 10 и 12.

Также классический ресурс по JavaScript - learn.javascript.ru

70 вопросов по JavaScript для подготовки к собеседованию - отличный тест, проверить себя по знанию языка.


Совет

Также абсолютно необходимый предварительный скилл - умение гуглить.

Есть ли сертификация по Vue?

Vue.js Certification

Vue Style Guide

Обязательно ознакомьтесь с Vue Style Guide и старайтесь придерживаться его лучших практик при написании кода.

Время от времени возвращайтесь к этому источнику и улучшайте свой код.

ESlint также помогает держать свой код в соответствии с лучшими практиками.

Нужен ли ментор?

Ментор полезен и начинающему, и опытному разработчику. Можно бесполезно убить два дня на решение проблемы, которую за 20 минут может объяснить более опытный человек. Причем, этот двухдневный "опыт" больше никогда не пригодится.

В компаниях эту роль обычно выполняют более компетентные доброжелательные коллеги.

В интернете есть сервисы типа Solvery, которые могут помочь в этом вопросе.

Всё равно хочу видео

Есть качественные у Vue Mastery, однако большинство устарели.

Довольно грамотно и качественно объясняет технологии фронтенда и Vue 3 Илья Климов.

Что еще посмотреть кроме Vue? React?

Можно и React, если есть реальный вариант использования этих знаний, однако намного лучше расширить свой кругозор разработчика. Попробуйте написать простой API на бэкенде. Самый легкий и удобный язык для этого - PHP, но можно и на Node.js или Python. Попробуйте транспортные протоколы JSON-RPC и WebSockets. Захостите свое приложение на GitHub Pages или другой аналогичный сервис, поэкспериментируйте с GitHub Actions - они очень помогают с автоматизацией деплоя и CI/CD в целом. Поработайте с Cloud провайдерами (многие предлагают бесплатные ресурсы), настройте виртуальный сервер. Зарегистрируйте домен, сделайте продуктовый законченный сайт - даже если это будет просто ваш сайт-резюме или что-то элементарное на VitePress (используется данным сайтом). Поработайте с FireStore и открытыми API для различных данных. Посмотрите Swagger. Поизучайте SQL, установите MySQL и поиграйте с ним, либо сделайте это на SupaBase. Понимание, как данные хранятся и обрабатываются на бэкенде, сильно поможет в выборе правильных стратегий на фронте.

Изучайте, как работает современный Интернет, и какие технологии и лучшие практики распространены в нем сейчас.

- +
Skip to content

Изучение Vue

Источники информации по Vue

Почему-то считается, что на фронтенде есть всего два варианта получать знания - документация Vue и обучающие видео с Ютюба и всевозможных курсов.

Но документация это не учебник, а справочник, и отделить зерна от плевел на Ютюбе очень сложно. Я встречал полезные видео, но все они предназначались для уже неплохо знающих Vue разработчиков, и показывали какие-то новые или нестандартные моменты.


Главным учителем должна быть книга, которая именно учит, а не даёт справочную информацию.

Прекрасный учебник по Vue на английском языке - вышедшая в мае 2023 года Vue.js 3 Design Patterns and Best Practices. Можно зарегистрироваться на oReilly и читать 10 дней бесплатно. Даже скачать. Несмотря на название, книга учит именно программированию, причем, довольно с таки начального уровня.

Перевод данной книги на русский язык находится на этом сайте: (учебник).

Примеры из книги находятся в открытом доступе и вполне достойны изучения.

Больше на русском, к сожалению, почти ничего нет, но, во-первых, есть Google translate, а во-вторых, стать уверенным разработчиком без хотя бы среднего знания технического английского вряд ли получится.

Так же надо отметить, что документация Vue на русском порой сильно отстает от документации на английском.


Заметка

Можно провести аналогию между хорошим разработчиком и водителем:

  1. Изучение основ вождения, ПДД и устройства двигателя внутреннего сгорания - документация Vue и спецификация JavaScript
  2. Практическое обучение вождению в автошколе - хорошие учебники типа "Vue.js 3 Design Patterns and Best Practices"
  3. Реальный опыт вождения - коммерческий опыт разработки
  4. Курсы экстремального вождения, поставить стакан воды на капот и проехать на двадцатилетней машине с механической коробкой передач по разбитым улицам - качественные опен сорс проекты и сертификации

Невозможно стать хорошим разработчиком/водителем как без 1., так и только с 1. Обучающие видео из интернета (как платные так и бесплатные) могут как быть частью 4., так и быть абсолютно бесполезными и даже вредными (очень часто), в зависимости от их качества и мотивации ученика.

Vue 2 или Vue 3?

Vue 3.
Composition API.

Если вам нужен будет Vue 2 для поддержки существующего проекта, то вы сами будете знать ответ на этот вопрос.

Разница между Vue 2 и Vue 3 большая. Это не тот случай, когда надо выучить предварительно предыдущую версию, чтобы лучше и легче понять следующую.

Нужно ли знать JavaScript предварительно?

Обязательно, минимум на среднем уровне. Если этого нет, я бы предложил сперва пройти короткий курс javascript-a, чтобы человек знал об объекте document, умел обращаться с методами массива и не очень боялся промисов. Также, HTML и CSS как минимум на базовом уровне.

Вот легко читаемая книжка - "Морган Н. - JavaScript для детей. Самоучитель по программированию - 2016. Перед началом изучения Vue желательно понимать 70% первой части, а также параграфы 10 и 12.

Также классический ресурс по JavaScript - learn.javascript.ru

70 вопросов по JavaScript для подготовки к собеседованию - отличный тест, проверить себя по знанию языка.


Совет

Также абсолютно необходимый предварительный скилл - умение гуглить.

Есть ли сертификация по Vue?

Vue.js Certification

Vue Style Guide

Обязательно ознакомьтесь с Vue Style Guide и старайтесь придерживаться его лучших практик при написании кода.

Время от времени возвращайтесь к этому источнику и улучшайте свой код.

ESlint также помогает держать свой код в соответствии с лучшими практиками.

Нужен ли ментор?

Ментор полезен и начинающему, и опытному разработчику. Можно бесполезно убить два дня на решение проблемы, которую за 20 минут может объяснить более опытный человек. Причем, этот двухдневный "опыт" больше никогда не пригодится.

В компаниях эту роль обычно выполняют более компетентные доброжелательные коллеги.

В интернете есть сервисы типа Solvery, которые могут помочь в этом вопросе.

Всё равно хочу видео

Есть качественные у Vue Mastery, однако большинство устарели.

Довольно грамотно и качественно объясняет технологии фронтенда и Vue 3 Илья Климов.

Что еще посмотреть кроме Vue? React?

Можно и React, если есть реальный вариант использования этих знаний, однако намного лучше расширить свой кругозор разработчика. Попробуйте написать простой API на бэкенде. Самый легкий и удобный язык для этого - PHP, но можно и на Node.js или Python. Попробуйте транспортные протоколы JSON-RPC и WebSockets. Захостите свое приложение на GitHub Pages или другой аналогичный сервис, поэкспериментируйте с GitHub Actions - они очень помогают с автоматизацией деплоя и CI/CD в целом. Поработайте с Cloud провайдерами (многие предлагают бесплатные ресурсы), настройте виртуальный сервер. Зарегистрируйте домен, сделайте продуктовый законченный сайт - даже если это будет просто ваш сайт-резюме или что-то элементарное на VitePress (используется данным сайтом). Поработайте с FireStore и открытыми API для различных данных. Посмотрите Swagger. Поизучайте SQL, установите MySQL и поиграйте с ним, либо сделайте это на SupaBase. Понимание, как данные хранятся и обрабатываются на бэкенде, сильно поможет в выборе правильных стратегий на фронте.

Изучайте, как работает современный Интернет, и какие технологии и лучшие практики распространены в нем сейчас.

+ \ No newline at end of file diff --git a/ru/frontend/spa-pwa-ssr-ssg.html b/ru/frontend/spa-pwa-ssr-ssg.html index e82d9827e..15affe244 100644 --- a/ru/frontend/spa-pwa-ssr-ssg.html +++ b/ru/frontend/spa-pwa-ssr-ssg.html @@ -6,14 +6,14 @@ SPA, PWA, SSG, SSR и SEO | Vue FAQ - + - + - + - + @@ -33,8 +33,8 @@ -
Skip to content

SPA, PWA, SSG, SSR и SEO

Web 1.0 -> Web 2.0

Сперва был статичный HTML и браузеры показывали его. Чуть позже придумали немножко JavaScript-а, чтобы обрабатывать формочки и делать небольшую анимацию. Потом появился CSS, и все увидели, что это красиво. После кто-то предложил идею JSON для формата данных, а затем Микрософт подарила миру XMLHttpRequest, и JavaScript-у разрешили отправлять и получать данные с сервера.

Так родился SPA.

SPA

SPA (Single Page Application) работает примерно как обычное десктоп/мобильное приложение - при первом обращении на сервер получает програмную оболочку, необходимую для отображения сайта, а затем уже пересылает на/с сервера данные, обычно в JSON формате. Так получается намного эффективней способа, когда с каждым запросом с сервера приходила новая HTML страница с всеми ресурсами.

Для пользователя UX повышается значительно.

spa-vs-mpa

PWA

PWA (Progressive Web Application) - еще один шаг, чтобы улучшить пользовательский опыт и максимально приблизить веб приложения по ощущениям пользователя к нативным.

При PWA к SPA добавляются два элемента:

  1. Манифест. Текстовый файл со свойствами приложения. Благодаря ему иконка веб-приложения может быть установлена также как и у нативных приложений на домашний экран смартфона. Кроме того, при запуске PWA может не показывать элементы браузера и казаться обычным приложением.

  2. Service worker. Это прослойка в браузере между сервером и самим браузером, которая позволяет сделать управляемое кэширование. Другими словами, сохранить приложение со всеми ресурсами на смартфоне/компьютере, чтобы при запуске оно сразу запускалось. Если не нужны данные с сервера, то приложение может работать оффлайн (например, Заметки).

Больше о PWA можно прочесть на сайте, созданном командой Chrome - https://web.dev/

Апгрейд SPA до PWA очень небольшой по трудозатратам, но очень значительный по выгоде. Разрабатывать SPA и не делать его PWA - это как снять люксовый номер в гостинице, но лечь спать на его входе в коридоре на коврике, потому что до спальни лень дойти.

PWA -> Workbox и vite-plugin-pwa

Манифест и Service worker настолько просты, что создание обертки над SW - Workbox, и плагина для Vite vite-plugin-pwa логическому объяснению не поддается. Кода получается в несколько раз больше, нужно грузить дополнительные зависимости и разбираться в конфигурациях оберток. Простое сделали сложным.

Лучше задействовать Манифест и Service worker как они созданы изначально, и написать два этих простых файла по шаблонам из спецификаций.

SSG

SSG (Static Site Generation) — подход, когда содержимое сайта предварительно генерируется в html-файлы, которые потом раздаются с сервера.

Сразу подходит для индексации поисковиками.

SSR

SSR (Server Side Rendering), способ генерации html на стороне сервера, когда генерация происходит в момент обращения. После запроса клиентом странички, сервер на своей стороне выполняет API-запросы, а затем формирует html-страницу. Соответственно, на сервере нужен Node.js сервер, который довольно сильно нагружает "железо".

Кроме того, есть множество ограничений при написании кода и использования тех или иных JavaScript и Vue возможностей. Как пишет Google относительно SSR - "A rehydration problem: one app for the price of two".

SEO оптимизация

Для того, чтобы поисковик мог проиндексировать страницу вашего сайта, при обращении к ней он должен получить HTML с контентом (текст, картинки, видео). Со SPA сайтами, в которых контент подгружается динамически JavaScript-ом, такое иногда не получается, но иногда и получается. Как следует из этих экспериментов Google уже умеет индексировать SPA приложения, Yandex - еще нет.

Самым популярным и неэффективным методом для надежного индексации всеми поисковиками является использование SSR (SSG подходит для несложных по структуре сайтов без бэкенда, вроде документаций).

Google позволяет посмотреть, как ваш сайт выглядит/индексируется его кроулером, который как-то всё-таки работает со скриптами, поэтому для начала проверьте, нужно ли вам усложняться вообще.

Если проблемы обнаружились, то можно воспользоваться динамической отрисовкой

dynamic-rendering

Смысл в том, чтобы обрабатывать запросы обычных пользователей и поисковых ботов по-разному и отдавать им разные страницы. Для пользователей - SPA, для поисковиков - сгенеренные налету либо заранее страницы. Распределение может вести вебсервер или точка входа на ваш сайт (index.php вместо index.html).

На картинке выше подразумевается некий Prerenderer (которые тоже есть в качестве стороннего сервиса или своего решения), однако в большинстве случаев намного проще генерить HTML страницу для бота напрямую.

То есть, например, для страницы товара в онлайн магазине это может быть его текстовое описание с картинками и отзывами покупателей в любом HTML форматировании. Для этого достаточно скрипта на PHP/Express/Python и т.д. в 100-200 строк, что намного менее трудозатратней SSR решений, а так же снижает требования в серверному "железу" на порядки (вывод можно закэшировать в статичный HTML файл).

При совпадении фактического контента (текст, картинки) такой страницы с контентом SPA в браузере, Google не рассматривает упрощенную для его бота версию как обман. Данная метода была еще до появления всяких SSR. Проверено многолетним использованием.

PageSpeed и другие тесты производительности

PageSpeed и подобные инструменты очень полезны в выявлении неоптимизированных мест в вашем веб-приложении, однако для SPA и PWA он не совсем верен.

Точней, некоторые его метрики не учитывают UX в целом. Нормально сделанный PWA при самой первой загрузке и установке, конечно, проиграет по FCP метрике аналогу на SSR, но после размещения всех своих ресурсов локально на браузере клиента, никакой SSR и близко не сравнится с ним по скорости работы и комфорту для пользователя, не говоря уже о прочих возможностях типа оффлайн работы и установке как нативного приложения.

SSR может быть, наверное, полезен для каких-то исключительных случаев, но в целом он выглядит тупиковой ветвью во фронтенд разработке.

- +
Skip to content

SPA, PWA, SSG, SSR и SEO

Web 1.0 -> Web 2.0

Сперва был статичный HTML и браузеры показывали его. Чуть позже придумали немножко JavaScript-а, чтобы обрабатывать формочки и делать небольшую анимацию. Потом появился CSS, и все увидели, что это красиво. После кто-то предложил идею JSON для формата данных, а затем Микрософт подарила миру XMLHttpRequest, и JavaScript-у разрешили отправлять и получать данные с сервера.

Так родился SPA.

SPA

SPA (Single Page Application) работает примерно как обычное десктоп/мобильное приложение - при первом обращении на сервер получает програмную оболочку, необходимую для отображения сайта, а затем уже пересылает на/с сервера данные, обычно в JSON формате. Так получается намного эффективней способа, когда с каждым запросом с сервера приходила новая HTML страница с всеми ресурсами.

Для пользователя UX повышается значительно.

spa-vs-mpa

PWA

PWA (Progressive Web Application) - еще один шаг, чтобы улучшить пользовательский опыт и максимально приблизить веб приложения по ощущениям пользователя к нативным.

При PWA к SPA добавляются два элемента:

  1. Манифест. Текстовый файл со свойствами приложения. Благодаря ему иконка веб-приложения может быть установлена также как и у нативных приложений на домашний экран смартфона. Кроме того, при запуске PWA может не показывать элементы браузера и казаться обычным приложением.

  2. Service worker. Это прослойка в браузере между сервером и самим браузером, которая позволяет сделать управляемое кэширование. Другими словами, сохранить приложение со всеми ресурсами на смартфоне/компьютере, чтобы при запуске оно сразу запускалось. Если не нужны данные с сервера, то приложение может работать оффлайн (например, Заметки).

Больше о PWA можно прочесть на сайте, созданном командой Chrome - https://web.dev/

Апгрейд SPA до PWA очень небольшой по трудозатратам, но очень значительный по выгоде. Разрабатывать SPA и не делать его PWA - это как снять люксовый номер в гостинице, но лечь спать на его входе в коридоре на коврике, потому что до спальни лень дойти.

PWA -> Workbox и vite-plugin-pwa

Манифест и Service worker настолько просты, что создание обертки над SW - Workbox, и плагина для Vite vite-plugin-pwa логическому объяснению не поддается. Кода получается в несколько раз больше, нужно грузить дополнительные зависимости и разбираться в конфигурациях оберток. Простое сделали сложным.

Лучше задействовать Манифест и Service worker как они созданы изначально, и написать два этих простых файла по шаблонам из спецификаций.

SSG

SSG (Static Site Generation) — подход, когда содержимое сайта предварительно генерируется в html-файлы, которые потом раздаются с сервера.

Сразу подходит для индексации поисковиками.

SSR

SSR (Server Side Rendering), способ генерации html на стороне сервера, когда генерация происходит в момент обращения. После запроса клиентом странички, сервер на своей стороне выполняет API-запросы, а затем формирует html-страницу. Соответственно, на сервере нужен Node.js сервер, который довольно сильно нагружает "железо".

Кроме того, есть множество ограничений при написании кода и использования тех или иных JavaScript и Vue возможностей. Как пишет Google относительно SSR - "A rehydration problem: one app for the price of two".

SEO оптимизация

Для того, чтобы поисковик мог проиндексировать страницу вашего сайта, при обращении к ней он должен получить HTML с контентом (текст, картинки, видео). Со SPA сайтами, в которых контент подгружается динамически JavaScript-ом, такое иногда не получается, но иногда и получается. Как следует из этих экспериментов Google уже умеет индексировать SPA приложения, Yandex - еще нет.

Самым популярным и неэффективным методом для надежного индексации всеми поисковиками является использование SSR (SSG подходит для несложных по структуре сайтов без бэкенда, вроде документаций).

Google позволяет посмотреть, как ваш сайт выглядит/индексируется его кроулером, который как-то всё-таки работает со скриптами, поэтому для начала проверьте, нужно ли вам усложняться вообще.

Если проблемы обнаружились, то можно воспользоваться динамической отрисовкой

dynamic-rendering

Смысл в том, чтобы обрабатывать запросы обычных пользователей и поисковых ботов по-разному и отдавать им разные страницы. Для пользователей - SPA, для поисковиков - сгенеренные налету либо заранее страницы. Распределение может вести вебсервер или точка входа на ваш сайт (index.php вместо index.html).

На картинке выше подразумевается некий Prerenderer (которые тоже есть в качестве стороннего сервиса или своего решения), однако в большинстве случаев намного проще генерить HTML страницу для бота напрямую.

То есть, например, для страницы товара в онлайн магазине это может быть его текстовое описание с картинками и отзывами покупателей в любом HTML форматировании. Для этого достаточно скрипта на PHP/Express/Python и т.д. в 100-200 строк, что намного менее трудозатратней SSR решений, а так же снижает требования в серверному "железу" на порядки (вывод можно закэшировать в статичный HTML файл).

При совпадении фактического контента (текст, картинки) такой страницы с контентом SPA в браузере, Google не рассматривает упрощенную для его бота версию как обман. Данная метода была еще до появления всяких SSR. Проверено многолетним использованием.

PageSpeed и другие тесты производительности

PageSpeed и подобные инструменты очень полезны в выявлении неоптимизированных мест в вашем веб-приложении, однако для SPA и PWA он не совсем верен.

Точней, некоторые его метрики не учитывают UX в целом. Нормально сделанный PWA при самой первой загрузке и установке, конечно, проиграет по FCP метрике аналогу на SSR, но после размещения всех своих ресурсов локально на браузере клиента, никакой SSR и близко не сравнится с ним по скорости работы и комфорту для пользователя, не говоря уже о прочих возможностях типа оффлайн работы и установке как нативного приложения.

SSR может быть, наверное, полезен для каких-то исключительных случаев, но в целом он выглядит тупиковой ветвью во фронтенд разработке.

+ \ No newline at end of file diff --git a/ru/index.html b/ru/index.html index 5ef71f543..0e61a0028 100644 --- a/ru/index.html +++ b/ru/index.html @@ -6,13 +6,13 @@ Vue FAQ - + - + - - + + @@ -33,7 +33,7 @@
Skip to content

Vue FAQ

Vue JavaScript framework FAQ

Наиболее часто задаваемые вопросы по Vue.js

Vue FAQ
- + \ No newline at end of file diff --git a/ru/misc/CHANGELOG.html b/ru/misc/CHANGELOG.html index d2c924206..11d5b5318 100644 --- a/ru/misc/CHANGELOG.html +++ b/ru/misc/CHANGELOG.html @@ -6,13 +6,13 @@ История изменений | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

История изменений


v1.4 (24-11-2023)

Новое

  • Перевод книги 'Vue.js 3 Design Patterns and Best Practices'
  • vue-webapp

Изменено

  • Фронтенд / Как изучать Vue?


v1.3 (10-10-2023)

Изменено

  • Общение с бэкендом / CORS
  • Фронтенд / Как изучать Vue?
  • Разработка / Полезные советы


v1.2 (27-09-2023)

Новое

  • Деплой на сервере / Github Actions

Изменено

  • Деплой на сервере / CI/CD
  • Разработка / Сторы - Vuex, Pinia и Composition API
  • Фронтенд / О фронтенд фреймворках
  • Несущественные изменения и исправление ошибок в разных разделах


v1.1 (15-09-2023)

Новое

  • Разработка / Сторы

Изменено

  • Разработка / Полезные советы


v1.0 (11-09-2023)

Новое

  • Начальный запуск
- +
Skip to content

История изменений


v1.4 (24-11-2023)

Новое

  • Перевод книги 'Vue.js 3 Design Patterns and Best Practices'
  • vue-webapp

Изменено

  • Фронтенд / Как изучать Vue?


v1.3 (10-10-2023)

Изменено

  • Общение с бэкендом / CORS
  • Фронтенд / Как изучать Vue?
  • Разработка / Полезные советы


v1.2 (27-09-2023)

Новое

  • Деплой на сервере / Github Actions

Изменено

  • Деплой на сервере / CI/CD
  • Разработка / Сторы - Vuex, Pinia и Composition API
  • Фронтенд / О фронтенд фреймворках
  • Несущественные изменения и исправление ошибок в разных разделах


v1.1 (15-09-2023)

Новое

  • Разработка / Сторы

Изменено

  • Разработка / Полезные советы


v1.0 (11-09-2023)

Новое

  • Начальный запуск
+ \ No newline at end of file diff --git a/ru/misc/cheat-sheets.html b/ru/misc/cheat-sheets.html index 164e26c92..8d6a19596 100644 --- a/ru/misc/cheat-sheets.html +++ b/ru/misc/cheat-sheets.html @@ -6,13 +6,13 @@ Шпаргалки (Cheat Sheet) | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/ru/misc/contribute.html b/ru/misc/contribute.html index 7634b44f7..99973b1e1 100644 --- a/ru/misc/contribute.html +++ b/ru/misc/contribute.html @@ -6,13 +6,13 @@ Внесите лепту в развитие данного ресурса | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Внесите лепту в развитие данного ресурса

Вы можете предложить корректировку любого или добавление нового материала используя форму ниже.

GitHub way внесения изменений (fork -> edit -> create PR) также всячески приветствуется.

- +
Skip to content

Внесите лепту в развитие данного ресурса

Вы можете предложить корректировку любого или добавление нового материала используя форму ниже.

GitHub way внесения изменений (fork -> edit -> create PR) также всячески приветствуется.

+ \ No newline at end of file diff --git a/ru/misc/glossary.html b/ru/misc/glossary.html index edf5dfcbb..17ebcfb52 100644 --- a/ru/misc/glossary.html +++ b/ru/misc/glossary.html @@ -6,13 +6,13 @@ Глоссарий и сокращения | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Глоссарий и сокращения

  • DX (developer experience) - опыт разработчика, удобство его работы над приложением. Сюда входит всё - качество кода, удобство работы с IDE, грамотная архитектура проекта, комментирование, качество документации, использование на проекте проверенных и лучших практик и т.п.
  • UX (user experience) - опыт пользователя. Общее его впечатление от удобства работы с сайтом/приложением.
  • UI (user interface) - дизайн вебсайта/приложения с точки зрения визуальной эстетики и стиля
  • SW (service worker) - сервис воркер (элемент PWA)
  • AT (access token) - токен при JWT аутентификации
  • RT (refresh token) - токен при JWT аутентификации
- +
Skip to content

Глоссарий и сокращения

  • DX (developer experience) - опыт разработчика, удобство его работы над приложением. Сюда входит всё - качество кода, удобство работы с IDE, грамотная архитектура проекта, комментирование, качество документации, использование на проекте проверенных и лучших практик и т.п.
  • UX (user experience) - опыт пользователя. Общее его впечатление от удобства работы с сайтом/приложением.
  • UI (user interface) - дизайн вебсайта/приложения с точки зрения визуальной эстетики и стиля
  • SW (service worker) - сервис воркер (элемент PWA)
  • AT (access token) - токен при JWT аутентификации
  • RT (refresh token) - токен при JWT аутентификации
+ \ No newline at end of file diff --git a/ru/misc/introduction.html b/ru/misc/introduction.html index 7ff30f8bb..8cada31b1 100644 --- a/ru/misc/introduction.html +++ b/ru/misc/introduction.html @@ -6,13 +6,13 @@ Предисловие | Vue FAQ - + - + - - + + @@ -32,8 +32,8 @@ -
Skip to content

Предисловие

Данный FAQ (Frequently Asked Questions - Часто задаваемые вопросы) создан по наиболее часто затрагиваемым темам в Reddit r/vuejs/ и Телеграм чате @vuejs_ru

Уровень вопросов и ответов охватывает как начинающих так и опытных фронтэнд разработчиков.

В качестве ответов используется как общепризнанная, проверенная и объективная информация, так и субъективное мнение составителя.

Повышение сложности не идет сверху вниз. И в первых вопросах-ответах описываются неочевидные моменты, могущие быть интересными для опытных программистов.

Основные источники информации - официальная документация Vue 3 и Vite, книга Vue.js 3 Design Patterns and Best Practices, r/vuejs/, @vuejs_ru

Актуальность информации - 2022-2023 года.

У нас есть Телеграм канал

В нем публикуются анонсы о новых материалах на данном ресурсе и другая интересная относящаяся к Vue.js информация: https://t.me/vuefaq

- +
Skip to content

Предисловие

Данный FAQ (Frequently Asked Questions - Часто задаваемые вопросы) создан по наиболее часто затрагиваемым темам в Reddit r/vuejs/ и Телеграм чате @vuejs_ru

Уровень вопросов и ответов охватывает как начинающих так и опытных фронтэнд разработчиков.

В качестве ответов используется как общепризнанная, проверенная и объективная информация, так и субъективное мнение составителя.

Повышение сложности не идет сверху вниз. И в первых вопросах-ответах описываются неочевидные моменты, могущие быть интересными для опытных программистов.

Основные источники информации - официальная документация Vue 3 и Vite, книга Vue.js 3 Design Patterns and Best Practices, r/vuejs/, @vuejs_ru

Актуальность информации - 2022-2023 года.

У нас есть Телеграм канал

В нем публикуются анонсы о новых материалах на данном ресурсе и другая интересная относящаяся к Vue.js информация: https://t.me/vuefaq

+ \ No newline at end of file diff --git a/ru/vue-webapp/contribution.html b/ru/vue-webapp/contribution.html index 374d714ae..b6304520b 100644 --- a/ru/vue-webapp/contribution.html +++ b/ru/vue-webapp/contribution.html @@ -6,13 +6,13 @@ Участие в проекте | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Участие в проекте

create-vue-webapp и vue-webapp являются open source проектами под лицензией MIT.

Приглашаем к участию всех желающих.

- +
Skip to content

Участие в проекте

create-vue-webapp и vue-webapp являются open source проектами под лицензией MIT.

Приглашаем к участию всех желающих.

+ \ No newline at end of file diff --git a/ru/vue-webapp/getting-started.html b/ru/vue-webapp/getting-started.html index d63ff6d1b..52cf38648 100644 --- a/ru/vue-webapp/getting-started.html +++ b/ru/vue-webapp/getting-started.html @@ -6,13 +6,13 @@ Установка | Vue FAQ - + - + - - + + @@ -34,46 +34,46 @@ -
Skip to content

Установка

Установка через create vue-webapp

При данном способе можно выбрать, какие опции будут установлены:

sh
$ pnpm create vue-webapp
-
- Project name: ... my-vue-project
- Add a Splash screen? ... no / yes
- Make it PWA (adds service worker and manifest)? ... no / yes
- Add Open Graph meta tags? ... no / yes
- Add Google Analytics code? ... no / yes
- Add Github Action Workflow for publishing it on GitHub Pages? ... no / yes
- Select application layout » MainLayout
- Select navigation drawer » SimpleDrawer
- Select webapp navbar » MantineSimpleNavbar
- Select webapp header » MantineSimpleHeader
- Select webapp footer » MantineRichFooter
- Add API layer (REST)? ... no / yes
- Add JSON-RPC adapter? ... no / yes
-
-Scaffolding project in /home/ubuntu/my-vue-project...
"Молчаливая" установка

Возможно установка без ручного ввода параметров с указанием конфигурационного файла с опциями:

bash
pnpm create vue-webapp -c config.json
-// or
-pnpm create vue-webapp --config config.json

Формат файла config.json:

json
{
-  "projectName": "my-vue-project",
-  "splashScreen": false,
-  "pwa": true,
-  "openGraph": false,
-  "googleAnalytics": false,
-  "githubActionsGithubPagesWorkflow": true,
-  "layout": "MainLayout",
-  "navigationDrawer": "SimpleDrawer",
-  "navbar": "MantineSimpleNavbar",
-  "header": "MantineSimpleHeader",
-  "footer": "MantineRichFooter",
-  "api": true,
-  "jsonRpc": false,
-  "overwrite": true
-}

Параметр overwrite означает перезаписывание содержимого уже существующей директории. Может принимать значения "yes", "no" и "ignore".

Также, команда

bash
$ pnpm create vue-webapp .

создаст проект в текущей директории.

Данный метод создаст проект только с выбранными компонентами и функционалом.

Инициализация и запуск веб приложения

sh
$ cd my-vue-project
-$ pnpm i
-$ pnpm dev

Результат в браузере:

image

Установка из репозитория

При данном способе будет установлено всё, однако непосредственно в проекте будет подключена не вся функциональность. Удобно для ознакомления и тестирования всех доступных компонент и функционала.

sh
$ git clone https://github.com/vuesence/vue-webapp.git
-$ cd vue-webapp
-$ pnpm i
-$ pnpm dev
- +
Skip to content

Установка

Установка через create vue-webapp

При данном способе можно выбрать, какие опции будут установлены:

sh
$ pnpm create vue-webapp
+
+ Project name: ... my-vue-project
+ Add a Splash screen? ... no / yes
+ Make it PWA (adds service worker and manifest)? ... no / yes
+ Add Open Graph meta tags? ... no / yes
+ Add Google Analytics code? ... no / yes
+ Add Github Action Workflow for publishing it on GitHub Pages? ... no / yes
+ Select application layout » MainLayout
+ Select navigation drawer » SimpleDrawer
+ Select webapp navbar » MantineSimpleNavbar
+ Select webapp header » MantineSimpleHeader
+ Select webapp footer » MantineRichFooter
+ Add API layer (REST)? ... no / yes
+ Add JSON-RPC adapter? ... no / yes
+
+Scaffolding project in /home/ubuntu/my-vue-project...
"Молчаливая" установка

Возможно установка без ручного ввода параметров с указанием конфигурационного файла с опциями:

bash
pnpm create vue-webapp -c config.json
+// or
+pnpm create vue-webapp --config config.json

Формат файла config.json:

json
{
+  "projectName": "my-vue-project",
+  "splashScreen": false,
+  "pwa": true,
+  "openGraph": false,
+  "googleAnalytics": false,
+  "githubActionsGithubPagesWorkflow": true,
+  "layout": "MainLayout",
+  "navigationDrawer": "SimpleDrawer",
+  "navbar": "MantineSimpleNavbar",
+  "header": "MantineSimpleHeader",
+  "footer": "MantineRichFooter",
+  "api": true,
+  "jsonRpc": false,
+  "overwrite": true
+}

Параметр overwrite означает перезаписывание содержимого уже существующей директории. Может принимать значения "yes", "no" и "ignore".

Также, команда

bash
$ pnpm create vue-webapp .

создаст проект в текущей директории.

Данный метод создаст проект только с выбранными компонентами и функционалом.

Инициализация и запуск веб приложения

sh
$ cd my-vue-project
+$ pnpm i
+$ pnpm dev

Результат в браузере:

image

Установка из репозитория

При данном способе будет установлено всё, однако непосредственно в проекте будет подключена не вся функциональность. Удобно для ознакомления и тестирования всех доступных компонент и функционала.

sh
$ git clone https://github.com/vuesence/vue-webapp.git
+$ cd vue-webapp
+$ pnpm i
+$ pnpm dev
+ \ No newline at end of file diff --git a/ru/vue-webapp/guidelines.html b/ru/vue-webapp/guidelines.html index 6eada1389..bf211a24c 100644 --- a/ru/vue-webapp/guidelines.html +++ b/ru/vue-webapp/guidelines.html @@ -6,13 +6,13 @@ Принципы | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Принципы

  • Лёгкое эффективное вебприложение с высоким современным UI/UX
  • Vue 3, Composition API, script setup синтаксис
  • Не использовать сторонние библиотеки без необходимости. Единственная обязательная зависимость - vue-router
  • Использование чистого и эффективного HTML5 и CSS3 для верстки
  • Подключение требуемого функционала только по необходимости
  • Высокая кастомизация

  • Подключение определенной функциональности, например i18n, означает не просто добавление этой библиотеки в package.json, а полноценную минимальную работающую интеграцию - создание соответствующей composable функции, нескольких локалей, и применение t() в шаблоне для иллюстрации с необходимыми комментариями в коде для облегчения последующего использования и кастомизации.

  • Подключение определенной функциональности, использующей стороннюю библиотеку (например, тостер или модальное окно), делается через обёртку, чтобы потом разработчику при желании было легко поменять конкретный пакет, реализующий данный функционал.

  • Для веб приложения используется TypeScript, однако продолжать писать приложение можно на чистом JavaScript.

  • В качестве сборщика используется Vite.

  • В качестве CSS препроцессора используется SCSS.

  • Для линтинга и форматирования в ESlint используется eslint-config Antony Fu.

  • На "выходе" получается готовое Vue 3 приложение без зависимостей от каких-либо фреймворков/библиотек/пакетов, если только пользователь явно не включил их в каркас.

- +
Skip to content

Принципы

  • Лёгкое эффективное вебприложение с высоким современным UI/UX
  • Vue 3, Composition API, script setup синтаксис
  • Не использовать сторонние библиотеки без необходимости. Единственная обязательная зависимость - vue-router
  • Использование чистого и эффективного HTML5 и CSS3 для верстки
  • Подключение требуемого функционала только по необходимости
  • Высокая кастомизация

  • Подключение определенной функциональности, например i18n, означает не просто добавление этой библиотеки в package.json, а полноценную минимальную работающую интеграцию - создание соответствующей composable функции, нескольких локалей, и применение t() в шаблоне для иллюстрации с необходимыми комментариями в коде для облегчения последующего использования и кастомизации.

  • Подключение определенной функциональности, использующей стороннюю библиотеку (например, тостер или модальное окно), делается через обёртку, чтобы потом разработчику при желании было легко поменять конкретный пакет, реализующий данный функционал.

  • Для веб приложения используется TypeScript, однако продолжать писать приложение можно на чистом JavaScript.

  • В качестве сборщика используется Vite.

  • В качестве CSS препроцессора используется SCSS.

  • Для линтинга и форматирования в ESlint используется eslint-config Antony Fu.

  • На "выходе" получается готовое Vue 3 приложение без зависимостей от каких-либо фреймворков/библиотек/пакетов, если только пользователь явно не включил их в каркас.

+ \ No newline at end of file diff --git a/ru/vue-webapp/index.html b/ru/vue-webapp/index.html index f7b22c6f9..f9ef65a92 100644 --- a/ru/vue-webapp/index.html +++ b/ru/vue-webapp/index.html @@ -6,13 +6,13 @@ Vue 3 webapp билдер | Vue FAQ - + - + - - + + @@ -34,15 +34,15 @@ -
Skip to content

Vue 3 webapp билдер

Краткое описание

Vue 3 вебсайт билдер (GitHub) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.

sh
$ pnpm create vue-webapp
-
- Project name: ... my-vue-project
- Add a Splash screen? ... no / yes
- Make it PWA (adds service worker and manifest)? ... no / yes
- Add Open Graph meta tags? ... no / yes
- Add Google Analytics code? ... no / yes
-...

Обоснование

Существует довольно много (в основном специфичных и быстро устаревающих) бойлерплейтов для создания Vue приложения. Обычно под этим подразумевается создание пустого проекта с определенными библиотеками. Другими словами, это просто настройка окружения для начала разработки без, непосредственно, кода.

В то же время, у многих других фронтенд и бэкенд фреймворков есть стартер-киты, позволяющие быстро создать готовый блог, онлайн магазин, сайт-визитку, портфолио, документацию и т.п., что значительно помогает как и в изучении самого фреймворка, соответствующих технологий и лучших практик, так и для решения стоящих перед бизнесом задач.

В результате может возникнуть впечатление, что Vue - довольно низкоуровневый фреймворк, и чтобы создавать вебприложения быстро, эффективно и удобно, необходимо взять какую-либо надстройку или иное решение - Nuxt, Vue Storefront, Astro, VitePress - которые прямо позиционируют себя как средство для решения определенных (или широкого круга) бизнес задач.

Появилась идея для создания инструмента, аналогичного create-vue, создающего каркас готового к работе веб приложения. С одной стороны, вполне работоспособного, адаптивного вебсайта с необходимым функционалом, чтобы начинающий разработчик мог ознакомиться с проверенным подходом в решении встающих при этом задач. С другой, достаточно минималистичным, не навязывающим опытному разработчику нежелаемые им зависимости, и создающим скелет из устоявшихся лучших практик для дальнейшего развития приложения.

Понятно, что определение той или иной "лучшей практики" (fetch или axios?) может быть довольно спорным моментом и зависит от контекста, но тем не менее.

image

- +
Skip to content

Vue 3 webapp билдер

Краткое описание

Vue 3 вебсайт билдер (GitHub) позволяет создать каркас будущего веб приложения, с возможностью выбора бизнес-шаблона (портфолио, блог, магазин и .т.д.), макета сайта, дизайна и элементов функционала (API модуль, i18n, PWA, splash screen, auth модуль, темы и т.д.), для дальнейшей кастомизации и наполнения контентом.

sh
$ pnpm create vue-webapp
+
+ Project name: ... my-vue-project
+ Add a Splash screen? ... no / yes
+ Make it PWA (adds service worker and manifest)? ... no / yes
+ Add Open Graph meta tags? ... no / yes
+ Add Google Analytics code? ... no / yes
+...

Обоснование

Существует довольно много (в основном специфичных и быстро устаревающих) бойлерплейтов для создания Vue приложения. Обычно под этим подразумевается создание пустого проекта с определенными библиотеками. Другими словами, это просто настройка окружения для начала разработки без, непосредственно, кода.

В то же время, у многих других фронтенд и бэкенд фреймворков есть стартер-киты, позволяющие быстро создать готовый блог, онлайн магазин, сайт-визитку, портфолио, документацию и т.п., что значительно помогает как и в изучении самого фреймворка, соответствующих технологий и лучших практик, так и для решения стоящих перед бизнесом задач.

В результате может возникнуть впечатление, что Vue - довольно низкоуровневый фреймворк, и чтобы создавать вебприложения быстро, эффективно и удобно, необходимо взять какую-либо надстройку или иное решение - Nuxt, Vue Storefront, Astro, VitePress - которые прямо позиционируют себя как средство для решения определенных (или широкого круга) бизнес задач.

Появилась идея для создания инструмента, аналогичного create-vue, создающего каркас готового к работе веб приложения. С одной стороны, вполне работоспособного, адаптивного вебсайта с необходимым функционалом, чтобы начинающий разработчик мог ознакомиться с проверенным подходом в решении встающих при этом задач. С другой, достаточно минималистичным, не навязывающим опытному разработчику нежелаемые им зависимости, и создающим скелет из устоявшихся лучших практик для дальнейшего развития приложения.

Понятно, что определение той или иной "лучшей практики" (fetch или axios?) может быть довольно спорным моментом и зависит от контекста, но тем не менее.

image

+ \ No newline at end of file diff --git a/ru/vue-webapp/objectives.html b/ru/vue-webapp/objectives.html index 4d66a3fca..b17cfc3de 100644 --- a/ru/vue-webapp/objectives.html +++ b/ru/vue-webapp/objectives.html @@ -6,13 +6,13 @@ Цели | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Цели

  1. Создание конструктора каркаса простого сразу работающего SPA приложения под конкретную задачу за пару минут, с возможностью его дальнейшей стилизации и наполнения контентом.
  2. Тонкая кастомизация его с помощью небольших функциональных блоков кода.
  3. Сбор и обобщение лучших техник и практик при создании современного реактивного фронтенда.
  4. Дать возможность начинающим разработчикам на готовых примерах ознакомиться с экосистемой Vue.js, изучить лучшие практики фронтенда и Vue 3 от построения архитектуры приложения до наименования CSS классов.
  5. Дать возможность опытным разработчикам быстро и эффективно создавать каркас готового веб приложения и использовать переиспользуемые блоки кода (boilerplate), особенно такие, которые не могут быть распространяемы как NPM пакеты.

Данное приложение должно выполнять роль конструктора каркаса вебсайта, с возможностью выбора при создании:

  • Глобального бизнес-шаблона сайта (портфолио, блог, онлайн-магазин и.т.д)
  • Варианта общего лэйаута вебприложения
  • Вариантов конкретных компонент (header, footer, navigation drawer и т.д.)
  • Варианта общего стиля/дизайна
  • Отдельного функционала, инжектируемого как функциональные фрагменты (API модуль, i18n, PWA, splash screen, Auth модуль, themes и т.д. )
  • Вариантов GitHub Actions с возможностью билда и деплоя на популярные хостинги
  • Возможности подключения/интеграции при желании распространенных библиотек (в том числе UI)
  • Возможности интеграции c определенными headless CRM и API сервисами

Отдельно планируется создание веб-витрины, на которой пользователь, динамично меняя параметры, сможет посмотреть и протестировать доступные макеты сайта, темы/стилизации, компоненты (header, footer и т.д.) и функционал развертываемого приложения, а также их комбинацию друг с другом.

- +
Skip to content

Цели

  1. Создание конструктора каркаса простого сразу работающего SPA приложения под конкретную задачу за пару минут, с возможностью его дальнейшей стилизации и наполнения контентом.
  2. Тонкая кастомизация его с помощью небольших функциональных блоков кода.
  3. Сбор и обобщение лучших техник и практик при создании современного реактивного фронтенда.
  4. Дать возможность начинающим разработчикам на готовых примерах ознакомиться с экосистемой Vue.js, изучить лучшие практики фронтенда и Vue 3 от построения архитектуры приложения до наименования CSS классов.
  5. Дать возможность опытным разработчикам быстро и эффективно создавать каркас готового веб приложения и использовать переиспользуемые блоки кода (boilerplate), особенно такие, которые не могут быть распространяемы как NPM пакеты.

Данное приложение должно выполнять роль конструктора каркаса вебсайта, с возможностью выбора при создании:

  • Глобального бизнес-шаблона сайта (портфолио, блог, онлайн-магазин и.т.д)
  • Варианта общего лэйаута вебприложения
  • Вариантов конкретных компонент (header, footer, navigation drawer и т.д.)
  • Варианта общего стиля/дизайна
  • Отдельного функционала, инжектируемого как функциональные фрагменты (API модуль, i18n, PWA, splash screen, Auth модуль, themes и т.д. )
  • Вариантов GitHub Actions с возможностью билда и деплоя на популярные хостинги
  • Возможности подключения/интеграции при желании распространенных библиотек (в том числе UI)
  • Возможности интеграции c определенными headless CRM и API сервисами

Отдельно планируется создание веб-витрины, на которой пользователь, динамично меняя параметры, сможет посмотреть и протестировать доступные макеты сайта, темы/стилизации, компоненты (header, footer и т.д.) и функционал развертываемого приложения, а также их комбинацию друг с другом.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/adaptability.html b/ru/vue-webapp/options/adaptability.html index 5f0cd5cac..8e53d1c7a 100644 --- a/ru/vue-webapp/options/adaptability.html +++ b/ru/vue-webapp/options/adaptability.html @@ -6,13 +6,13 @@ Адаптивность | Vue FAQ - + - + - - + + @@ -57,8 +57,8 @@ <div class="box"></div> <div class="box"></div> <div class="box"></div> -</div> - +</div> + \ No newline at end of file diff --git a/ru/vue-webapp/options/api.html b/ru/vue-webapp/options/api.html index 5ff881fe8..609e3e4f9 100644 --- a/ru/vue-webapp/options/api.html +++ b/ru/vue-webapp/options/api.html @@ -6,13 +6,13 @@ API модуль | Vue FAQ - + - + - - + + @@ -73,8 +73,8 @@ }; export { api }; -export default api;

Совет

JSON-RPC протокол очень удобен и является де-факто стандартом для web 3.0. Рекомендуется для использования вместо REST

- +export default api;

Совет

JSON-RPC протокол очень удобен и является де-факто стандартом для web 3.0. Рекомендуется для использования вместо REST

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/baseIcon.html b/ru/vue-webapp/options/baseIcon.html index da8f7ff94..8fdbad638 100644 --- a/ru/vue-webapp/options/baseIcon.html +++ b/ru/vue-webapp/options/baseIcon.html @@ -6,13 +6,13 @@ BaseIcon | Vue FAQ - + - + - - + + @@ -45,8 +45,8 @@ <header class="header"> <BaseIcon name="hamburger" class="drawer-toggle" @click="isDrawerOpen = !isDrawerOpen" /> </header> -</template>

utils.ts при инициализации с помощью import.meta.glob считывает из директории @/assets/images/ все файлы с расширениями .svg и .png и использует их имена как идентификаторы иконок для BaseIcon.

- +</template>

utils.ts при инициализации с помощью import.meta.glob считывает из директории @/assets/images/ все файлы с расширениями .svg и .png и использует их имена как идентификаторы иконок для BaseIcon.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/description.html b/ru/vue-webapp/options/description.html index 24fce3df4..34e87e689 100644 --- a/ru/vue-webapp/options/description.html +++ b/ru/vue-webapp/options/description.html @@ -6,13 +6,13 @@ Детали реализации | Vue FAQ - + - + - - + + @@ -37,8 +37,8 @@
Skip to content

Детали реализации

Инъекции кода в index.html

Чтобы не раздувать index.html инъекции фрагментов кода в него (Open graph, Google analytics, Splash screen, Service worker) делаются через vite-plugin-html-injection Vite плагин.

Сами фрагменты кода расположены в ./src/utils/injections/ директории. Там же находится конфигурационный файл плагина injection-config.ts.

CSS tricks

В приложении на больших разрешениях применен хак для недопущения прыгания экрана при появлении/исчезновении главного скролбара

css
html {
   overflow-x: hidden;
   margin-right: calc(-1 * (100vw - 100%));
-}
- +} + \ No newline at end of file diff --git a/ru/vue-webapp/options/drawer.html b/ru/vue-webapp/options/drawer.html index 8c74e2c8a..227791e14 100644 --- a/ru/vue-webapp/options/drawer.html +++ b/ru/vue-webapp/options/drawer.html @@ -6,13 +6,13 @@ Navigation drawers | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Navigation drawers

На данный момент можно выбрать из двух видов навигационных шторок.

SimpleDrawer

image

Всегда открыт для разрешений экрана notebook и desktop, а для мобильных устройств и планшетов открывается по клику/нажатию на иконку "гамбургера".

TouchSlideoutDrawer

image

Аналогичен SimpleDrawer, но управляется с помощью прикосновений на сенсорных экранах. Добавляет приятный UX.

Функциональность реализована с помощью useTouchSwipe composable функции и TouchSlideoutDrawer компонента.

- +
Skip to content

Navigation drawers

На данный момент можно выбрать из двух видов навигационных шторок.

SimpleDrawer

image

Всегда открыт для разрешений экрана notebook и desktop, а для мобильных устройств и планшетов открывается по клику/нажатию на иконку "гамбургера".

TouchSlideoutDrawer

image

Аналогичен SimpleDrawer, но управляется с помощью прикосновений на сенсорных экранах. Добавляет приятный UX.

Функциональность реализована с помощью useTouchSwipe composable функции и TouchSlideoutDrawer компонента.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/footer.html b/ru/vue-webapp/options/footer.html index bee54d768..acb19571e 100644 --- a/ru/vue-webapp/options/footer.html +++ b/ru/vue-webapp/options/footer.html @@ -6,13 +6,13 @@ Footers | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content
- +
Skip to content
+ \ No newline at end of file diff --git a/ru/vue-webapp/options/ga-gp.html b/ru/vue-webapp/options/ga-gp.html index 10fdcabe1..26969b28a 100644 --- a/ru/vue-webapp/options/ga-gp.html +++ b/ru/vue-webapp/options/ga-gp.html @@ -6,13 +6,13 @@ Github Actions сценарий для развертывания на Github Pages | Vue FAQ - + - + - - + + @@ -36,8 +36,8 @@
Skip to content

Github Actions сценарий для развертывания на Github Pages

Deployment

Использует JamesIves/github-pages-deploy-action Github Action для размещения сайта на ветке gh-pages того же репозитория, что автоматически делает сайт доступный по адресу https://youGitHubUsername.github.io/my-vue-webapp (если ваш проект и репозиторий называется my-vue-webapp).

  • Создайте в репозитории ветку с названием gh-pages
  • Перейдите в раздел "Settings" вашего репозитория
  • В разделе "Code and automation" на боковой панели нажмите Pages.
  • В разделе "Build and deployment" в пункте "Source" выберите "Deploy from a branch".
  • В разделе "Build and deployment" под заголовком "Branch" воспользуйтесь раскрывающимся меню ветки и выберите нужную ветку - gh-pages.

Более подробно:

Настройка base в Vite конфиге

Если у вас не кастомный домен, то в vite.config.ts необходимо прописать название вашего репозитория в качестве base, чтобы сайт был доступен по вышеуказанной ссылке:

js
export default defineConfig({
   base: "/my-vue-webapp/",
-});

Если у вас кастомный домен (типа yourname.com), то этот параметр не нужен.

- +});

Если у вас кастомный домен (типа yourname.com), то этот параметр не нужен.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/google-analytics.html b/ru/vue-webapp/options/google-analytics.html index 0ecc72973..0c8c6c16d 100644 --- a/ru/vue-webapp/options/google-analytics.html +++ b/ru/vue-webapp/options/google-analytics.html @@ -6,13 +6,13 @@ Google analytics | Vue FAQ - + - + - - + + @@ -41,8 +41,8 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-JL65GWRNQQ'); -</script>

Необходимо заменить значение id на ваше.

- +</script>

Необходимо заменить значение id на ваше.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/header.html b/ru/vue-webapp/options/header.html index 6c90f2ad8..938e0397d 100644 --- a/ru/vue-webapp/options/header.html +++ b/ru/vue-webapp/options/header.html @@ -6,13 +6,13 @@ Headers | Vue FAQ - + - + - - + + @@ -34,16 +34,16 @@ -
Skip to content

Headers

Все хедеры адаптивны.

SimpleHeader

image

Простой sticky header

MantineSimpleHeader

image

Простой sticky header в стиле Mantine UI

MantineLayeredHeader

image

sticky header с уровнями в стиле Mantine UI

SlidingHeader

image

Может содержать два разных header-а, второй появляется после того, как пользователь проскроллит страницу вниз

template
<AppHeader :threshold-hide="200" :threshold-open="400">
-    <template #first-header>
-        <AppHeaderFirst />
-    </template>
-
-    <template #second-header>
-        <AppHeaderSecond />
-    </template>
-</AppHeader>
- +
Skip to content

Headers

Все хедеры адаптивны.

SimpleHeader

image

Простой sticky header

MantineSimpleHeader

image

Простой sticky header в стиле Mantine UI

MantineLayeredHeader

image

sticky header с уровнями в стиле Mantine UI

SlidingHeader

image

Может содержать два разных header-а, второй появляется после того, как пользователь проскроллит страницу вниз

template
<AppHeader :threshold-hide="200" :threshold-open="400">
+    <template #first-header>
+        <AppHeaderFirst />
+    </template>
+
+    <template #second-header>
+        <AppHeaderSecond />
+    </template>
+</AppHeader>
+ \ No newline at end of file diff --git a/ru/vue-webapp/options/i18n.html b/ru/vue-webapp/options/i18n.html index cd76fc631..ea64ae2b7 100644 --- a/ru/vue-webapp/options/i18n.html +++ b/ru/vue-webapp/options/i18n.html @@ -6,13 +6,13 @@ i18n | Vue FAQ - + - + - - + + @@ -57,8 +57,8 @@ {{ t('msg') }} ({{ locale.code }}) </button> </div> -</template>

i18next расширения

У i18next есть расширение для Vue DevTools (довольно бесполезное), и есть расширение I18next Ally для VS Code (весьма полезное). Так вот i18next Ally работает с новой реализацией если в package.json будет прописан пакет vue-i18n в dependencies (в коде подключать его не надо). Рекомендую. Оба расширения, впрочем, неплохо едят ресурсы, так что пользоваться ими лучше по надобности.

В итоге

JavaScript бандл после билда меньше на 50 Кб по сравнению с i18next. Нужный функционал есть.

- +</template>

i18next расширения

У i18next есть расширение для Vue DevTools (довольно бесполезное), и есть расширение I18next Ally для VS Code (весьма полезное). Так вот i18next Ally работает с новой реализацией если в package.json будет прописан пакет vue-i18n в dependencies (в коде подключать его не надо). Рекомендую. Оба расширения, впрочем, неплохо едят ресурсы, так что пользоваться ими лучше по надобности.

В итоге

JavaScript бандл после билда меньше на 50 Кб по сравнению с i18next. Нужный функционал есть.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/index.html b/ru/vue-webapp/options/index.html index 0e272eec6..51ae24270 100644 --- a/ru/vue-webapp/options/index.html +++ b/ru/vue-webapp/options/index.html @@ -6,13 +6,13 @@ Опции при создании приложения | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Опции при создании приложения

Доступные опции

На данный момент доступно конфигурирование следующих опций:

  • Layout - макет приложения
  • Header - верхняя часть в макете приложения
  • Footer - нижняя часть в макете приложения
  • Drawer - навигационная шторка
  • Navbar - навигационное меню (внутри шторки)
  • Github Pages deploy Workflow - GitHub Actions сценарий для билда и деплоя приложения на GitHub Pages
  • PWA - добавление Service worker и Манифеста к приложению
  • API модуль - абстрактный слой для связи с бэкенд API
  • JSON-RPC - адаптер для API модуля
  • Splash screen - экран-заставка во время старта приложения для улучшения UX
  • Google analytics - код для подключения статистики
  • Open graph - мета тэги для построения сниппетов соцсетями

Доступно по умолчанию

  • Dark theme - темная тема. Все подключаемые компоненты поддерживают переключение тем
  • BaseIcon - компонент иконки с возможностью динамичного указания имени
  • BaseToggle - компонент переключателя

В разработке

  • Глобальный прелоадер
  • i18n - интернационализация приложения с помощью различных вариантов i18n библиотек.

В планах

  • Онлайн витрина для динамичного тестирования различных вариантов частей приложения и функционала
  • Расширение числа вариантов layout, header, footer и других компонент
  • Auth - каркас модуля для аутентификации на JWT токенах, включая различные варианты форм регистрации и логина
  • Интеграция Auth с популярными сервис провайдерами (Firebase и др.)
  • GitHub Actions для деплоя приложения на различные сервисы (Vercel, Heroku, Firesbase) и другие полезные CI/CD сценарии.
  • Проверка при старте на свою новую версию и перезагрузка для избежания проблем с кэшем браузера
  • Themes - темы приложения (включают в себя как разные цветовые палитры, так и возможность менять другие CSS параметры для глубокой кастомизации шаблона и компонентов)
- +
Skip to content

Опции при создании приложения

Доступные опции

На данный момент доступно конфигурирование следующих опций:

  • Layout - макет приложения
  • Header - верхняя часть в макете приложения
  • Footer - нижняя часть в макете приложения
  • Drawer - навигационная шторка
  • Navbar - навигационное меню (внутри шторки)
  • Github Pages deploy Workflow - GitHub Actions сценарий для билда и деплоя приложения на GitHub Pages
  • PWA - добавление Service worker и Манифеста к приложению
  • API модуль - абстрактный слой для связи с бэкенд API
  • JSON-RPC - адаптер для API модуля
  • Splash screen - экран-заставка во время старта приложения для улучшения UX
  • Google analytics - код для подключения статистики
  • Open graph - мета тэги для построения сниппетов соцсетями

Доступно по умолчанию

  • Dark theme - темная тема. Все подключаемые компоненты поддерживают переключение тем
  • BaseIcon - компонент иконки с возможностью динамичного указания имени
  • BaseToggle - компонент переключателя

В разработке

  • Глобальный прелоадер
  • i18n - интернационализация приложения с помощью различных вариантов i18n библиотек.

В планах

  • Онлайн витрина для динамичного тестирования различных вариантов частей приложения и функционала
  • Расширение числа вариантов layout, header, footer и других компонент
  • Auth - каркас модуля для аутентификации на JWT токенах, включая различные варианты форм регистрации и логина
  • Интеграция Auth с популярными сервис провайдерами (Firebase и др.)
  • GitHub Actions для деплоя приложения на различные сервисы (Vercel, Heroku, Firesbase) и другие полезные CI/CD сценарии.
  • Проверка при старте на свою новую версию и перезагрузка для избежания проблем с кэшем браузера
  • Themes - темы приложения (включают в себя как разные цветовые палитры, так и возможность менять другие CSS параметры для глубокой кастомизации шаблона и компонентов)
+ \ No newline at end of file diff --git a/ru/vue-webapp/options/layout-main.html b/ru/vue-webapp/options/layout-main.html index 47287e0cb..16ab34d9a 100644 --- a/ru/vue-webapp/options/layout-main.html +++ b/ru/vue-webapp/options/layout-main.html @@ -6,13 +6,13 @@ MainLayout | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

MainLayout

Стандартный макет с хедером, футером и сайдбаром в notebook и desktop режимах. В tablet и mobile режимах сайдбар выезжает слева при нажатии на "гамбургер" иконку.

image

AppSidebar виден в режимах notebook и desktop, и скрывается в tablet и mobile

Routing

Смена содержимого центральной панели обеспечивается через маршруты vue-router

- +
Skip to content

MainLayout

Стандартный макет с хедером, футером и сайдбаром в notebook и desktop режимах. В tablet и mobile режимах сайдбар выезжает слева при нажатии на "гамбургер" иконку.

image

AppSidebar виден в режимах notebook и desktop, и скрывается в tablet и mobile

Routing

Смена содержимого центральной панели обеспечивается через маршруты vue-router

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/layout-one-column.html b/ru/vue-webapp/options/layout-one-column.html index 1a8fea8ce..1519459a8 100644 --- a/ru/vue-webapp/options/layout-one-column.html +++ b/ru/vue-webapp/options/layout-one-column.html @@ -6,13 +6,13 @@ OneColumnLayout | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

OneColumnLayout

Аналогичен MainLayout, но без сайдбара в notebook и desktop режимах. Может применяться, например, если вся навигация помещается в хедер. В tablet и mobile режимах сайдбар также выезжает при нажатии на "гамбургер" иконку.

image

В обоих случаях максимальная ширина лэйаута устанавливается CSS переменной --vwa-layout-max-width.

- +
Skip to content

OneColumnLayout

Аналогичен MainLayout, но без сайдбара в notebook и desktop режимах. Может применяться, например, если вся навигация помещается в хедер. В tablet и mobile режимах сайдбар также выезжает при нажатии на "гамбургер" иконку.

image

В обоих случаях максимальная ширина лэйаута устанавливается CSS переменной --vwa-layout-max-width.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/navbar.html b/ru/vue-webapp/options/navbar.html index 0e4a0a634..89cbc881f 100644 --- a/ru/vue-webapp/options/navbar.html +++ b/ru/vue-webapp/options/navbar.html @@ -6,13 +6,13 @@ Navbar | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Navbar

Navbar находится внутри NavigationDrawer

На данный момент можно выбрать из двух видов:

SimpleNavbar

image

MantineSimpleNavbar

image

- +
Skip to content

Navbar

Navbar находится внутри NavigationDrawer

На данный момент можно выбрать из двух видов:

SimpleNavbar

image

MantineSimpleNavbar

image

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/open-graph.html b/ru/vue-webapp/options/open-graph.html index 73bf32185..07dbeb972 100644 --- a/ru/vue-webapp/options/open-graph.html +++ b/ru/vue-webapp/options/open-graph.html @@ -6,13 +6,13 @@ Google analytics | Vue FAQ - + - + - - + + @@ -47,8 +47,8 @@ <!-- <meta property="twitter:url" content="" /> --> <meta name="twitter:title" content="-twitter:title-" /> <meta name="twitter:description" content="" /> -<meta name="twitter:image" content="images" />

Необходимо проставить нужные значения.

- +<meta name="twitter:image" content="images" />

Необходимо проставить нужные значения.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/pwa.html b/ru/vue-webapp/options/pwa.html index 2686ebaab..9d5abc0c7 100644 --- a/ru/vue-webapp/options/pwa.html +++ b/ru/vue-webapp/options/pwa.html @@ -6,13 +6,13 @@ PWA | Vue FAQ - + - + - - + + @@ -48,8 +48,8 @@ "development", "education" ], - "icons": [...]

Service worker

Позволяет сделать управляемым кэширование на стороне клиента и сильно улучшить пользовательский опыт.

Для данной реализации service-worker.js не используются сторонние библиотеки типа Workbox.

Для кэширования используется стратегия Cache first. Создаётся три отдельных кэша для разных типов ресурсов: assets (js и css), images и fonts. Для каждого поддерживается версионность.

При выпуске новой версии приложения можно изменять значение VERSION в service-worker.js. Это очистит весь кэш в браузере клиента.

- + "icons": [...]

Service worker

Позволяет сделать управляемым кэширование на стороне клиента и сильно улучшить пользовательский опыт.

Для данной реализации service-worker.js не используются сторонние библиотеки типа Workbox.

Для кэширования используется стратегия Cache first. Создаётся три отдельных кэша для разных типов ресурсов: assets (js и css), images и fonts. Для каждого поддерживается версионность.

При выпуске новой версии приложения можно изменять значение VERSION в service-worker.js. Это очистит весь кэш в браузере клиента.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/splash-screen.html b/ru/vue-webapp/options/splash-screen.html index 8823acb15..4dda2ef30 100644 --- a/ru/vue-webapp/options/splash-screen.html +++ b/ru/vue-webapp/options/splash-screen.html @@ -6,13 +6,13 @@ Splash screen | Vue FAQ - + - + - - + + @@ -34,8 +34,8 @@ -
Skip to content

Splash screen

Заставка при старте приложения вместо пустого экрана может повысить восприятие вашего приложения пользователями (UX) и укрепить узнаваемость вашего бренда.

image

Код заставки находится полностью в index.html. Контролируется CSS классом splash на body.

Убирается заставка в App.vue / onMounted() после загрузки всей необходимых для начала работы приложения ресурсов.

- +
Skip to content

Splash screen

Заставка при старте приложения вместо пустого экрана может повысить восприятие вашего приложения пользователями (UX) и укрепить узнаваемость вашего бренда.

image

Код заставки находится полностью в index.html. Контролируется CSS классом splash на body.

Убирается заставка в App.vue / onMounted() после загрузки всей необходимых для начала работы приложения ресурсов.

+ \ No newline at end of file diff --git a/ru/vue-webapp/options/themes.html b/ru/vue-webapp/options/themes.html index 9390be1c4..844d8ebf3 100644 --- a/ru/vue-webapp/options/themes.html +++ b/ru/vue-webapp/options/themes.html @@ -6,13 +6,13 @@ Темы | Vue FAQ - + - + - - + + @@ -52,8 +52,8 @@ --vwa-c-text-3: rgba(235, 235, 245, 0.38); } -/* ... etc */ - +/* ... etc */ + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index f4326bbff..5e2aa2c65 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://vue-faq.org/en/backend/api.html2024-01-28https://vue-faq.org/ru/backend/api.html2024-01-28https://vue-faq.org/en/backend/auth.html2024-01-28https://vue-faq.org/ru/backend/auth.html2024-01-28https://vue-faq.org/en/backend/backend.html2024-01-28https://vue-faq.org/ru/backend/backend.html2024-01-28https://vue-faq.org/en/backend/cors.html2024-01-28https://vue-faq.org/ru/backend/cors.html2024-01-28https://vue-faq.org/en/backend/protocols.html2024-01-28https://vue-faq.org/ru/backend/protocols.html2024-01-28https://vue-faq.org/en/deployment/ci-cd.html2024-01-28https://vue-faq.org/ru/deployment/ci-cd.html2024-01-28https://vue-faq.org/en/deployment/docker.html2024-01-28https://vue-faq.org/ru/deployment/docker.html2024-01-28https://vue-faq.org/en/deployment/github-actions.html2024-01-28https://vue-faq.org/ru/deployment/github-actions.html2024-01-28https://vue-faq.org/en/deployment/hosting.html2024-01-28https://vue-faq.org/ru/deployment/hosting.html2024-01-28https://vue-faq.org/en/development/architectural-patterns.html2024-01-28https://vue-faq.org/ru/development/architectural-patterns.html2024-01-28https://vue-faq.org/en/development/assets.html2024-01-28https://vue-faq.org/ru/development/assets.html2024-01-28https://vue-faq.org/en/development/building.html2024-01-28https://vue-faq.org/ru/development/building.html2024-01-28https://vue-faq.org/en/development/ide.html2024-01-28https://vue-faq.org/ru/development/ide.html2024-01-28https://vue-faq.org/en/development/libraries.html2024-01-28https://vue-faq.org/ru/development/libraries.html2024-01-28https://vue-faq.org/en/development/misc.html2024-01-28https://vue-faq.org/ru/development/misc.html2024-01-28https://vue-faq.org/en/development/stores.html2024-01-28https://vue-faq.org/ru/development/stores.html2024-01-28https://vue-faq.org/en/development/testing.html2024-01-28https://vue-faq.org/ru/development/testing.html2024-01-28https://vue-faq.org/en/frontend/about-frameworks.html2024-01-28https://vue-faq.org/ru/frontend/about-frameworks.html2024-01-28https://vue-faq.org/en/frontend/architecture.html2024-01-28https://vue-faq.org/ru/frontend/architecture.html2024-01-28https://vue-faq.org/en/frontend/css-ui-libs.html2024-01-28https://vue-faq.org/ru/frontend/css-ui-libs.html2024-01-28https://vue-faq.org/en/frontend/learning.html2024-01-28https://vue-faq.org/ru/frontend/learning.html2024-01-28https://vue-faq.org/en/frontend/spa-pwa-ssr-ssg.html2024-01-28https://vue-faq.org/ru/frontend/spa-pwa-ssr-ssg.html2024-01-28https://vue-faq.org/en/2024-01-28https://vue-faq.org/2024-01-28https://vue-faq.org/ru/2024-01-28https://vue-faq.org/en/misc/CHANGELOG.html2024-01-28https://vue-faq.org/ru/misc/CHANGELOG.html2024-01-28https://vue-faq.org/en/misc/cheat-sheets.html2024-01-28https://vue-faq.org/ru/misc/cheat-sheets.html2024-01-28https://vue-faq.org/en/misc/contribute.html2024-01-28https://vue-faq.org/ru/misc/contribute.html2024-01-28https://vue-faq.org/en/misc/glossary.html2024-01-28https://vue-faq.org/ru/misc/glossary.html2024-01-28https://vue-faq.org/en/misc/introduction.html2024-01-28https://vue-faq.org/ru/misc/introduction.html2024-01-28https://vue-faq.org/en/vue-webapp/contribution.html2024-01-28https://vue-faq.org/ru/vue-webapp/contribution.html2024-01-28https://vue-faq.org/en/vue-webapp/getting-started.html2024-01-28https://vue-faq.org/ru/vue-webapp/getting-started.html2024-01-28https://vue-faq.org/en/vue-webapp/guidelines.html2024-01-28https://vue-faq.org/ru/vue-webapp/guidelines.html2024-01-28https://vue-faq.org/en/vue-webapp/2024-01-28https://vue-faq.org/ru/vue-webapp/2024-01-28https://vue-faq.org/en/vue-webapp/objectives.html2024-01-28https://vue-faq.org/ru/vue-webapp/objectives.html2024-01-28https://vue-faq.org/en/vue-webapp/options/adaptability.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/adaptability.html2024-01-28https://vue-faq.org/en/vue-webapp/options/api.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/api.html2024-01-28https://vue-faq.org/en/vue-webapp/options/baseIcon.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/baseIcon.html2024-01-28https://vue-faq.org/en/vue-webapp/options/description.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/description.html2024-01-28https://vue-faq.org/en/vue-webapp/options/drawer.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/drawer.html2024-01-28https://vue-faq.org/en/vue-webapp/options/footer.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/footer.html2024-01-28https://vue-faq.org/en/vue-webapp/options/ga-gp.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/ga-gp.html2024-01-28https://vue-faq.org/en/vue-webapp/options/google-analytics.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/google-analytics.html2024-01-28https://vue-faq.org/en/vue-webapp/options/header.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/header.html2024-01-28https://vue-faq.org/en/vue-webapp/options/i18n.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/i18n.html2024-01-28https://vue-faq.org/en/vue-webapp/options/2024-01-28https://vue-faq.org/ru/vue-webapp/options/2024-01-28https://vue-faq.org/en/vue-webapp/options/layout-main.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/layout-main.html2024-01-28https://vue-faq.org/en/vue-webapp/options/layout-one-column.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/layout-one-column.html2024-01-28https://vue-faq.org/en/vue-webapp/options/navbar.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/navbar.html2024-01-28https://vue-faq.org/en/vue-webapp/options/open-graph.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/open-graph.html2024-01-28https://vue-faq.org/en/vue-webapp/options/pwa.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/pwa.html2024-01-28https://vue-faq.org/en/vue-webapp/options/splash-screen.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/splash-screen.html2024-01-28https://vue-faq.org/en/vue-webapp/options/themes.html2024-01-28https://vue-faq.org/ru/vue-webapp/options/themes.html2024-01-28https://vue-faq.org/ru/articles/2024-01-28https://vue-faq.org/ru/arty-crafty/analysis/architecture-and-design.html2024-01-28https://vue-faq.org/ru/arty-crafty/analysis/business-analysis.html2024-01-28https://vue-faq.org/ru/arty-crafty/analysis/data-model.html2024-01-28https://vue-faq.org/ru/arty-crafty/analysis/research.html2024-01-28https://vue-faq.org/ru/arty-crafty/analysis/tech-stack.html2024-01-28https://vue-faq.org/ru/arty-crafty/analysis/ui-design.html2024-01-28https://vue-faq.org/ru/arty-crafty/analysis/ui-layout.html2024-01-28https://vue-faq.org/ru/arty-crafty/backend/baas-choosing.html2024-01-28https://vue-faq.org/ru/arty-crafty/backend/db-data-model.html2024-01-28https://vue-faq.org/ru/arty-crafty/backend/hoppscotch.html2024-01-28https://vue-faq.org/ru/arty-crafty/backend/supabase-api.html2024-01-28https://vue-faq.org/ru/arty-crafty/backend/supabase.html2024-01-28https://vue-faq.org/ru/arty-crafty/2024-01-28https://vue-faq.org/ru/arty-crafty/introduction/development-stages.html2024-01-28https://vue-faq.org/ru/arty-crafty/introduction/goals.html2024-01-28https://vue-faq.org/ru/arty-crafty/introduction/repository.html2024-01-28https://vue-faq.org/ru/arty-crafty/showcase-data/api-service-adapter.html2024-01-28https://vue-faq.org/ru/arty-crafty/showcase-data/mobile-menu.html2024-01-28https://vue-faq.org/ru/arty-crafty/showcase/codeium.html2024-01-28https://vue-faq.org/ru/arty-crafty/showcase/customization.html2024-01-28https://vue-faq.org/ru/arty-crafty/showcase/favourites.html2024-01-28https://vue-faq.org/ru/arty-crafty/showcase/product-category.html2024-01-28https://vue-faq.org/ru/arty-crafty/showcase/project-setup.html2024-01-28https://vue-faq.org/ru/book/Appendix__Migrating_from_Vue_2.html2024-01-28https://vue-faq.org/ru/book/Chapter_10__Deploying_Your_Application.html2024-01-28https://vue-faq.org/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html2024-01-28https://vue-faq.org/ru/book/Chapter_1__The_Vue_3_Framework.html2024-01-28https://vue-faq.org/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html2024-01-28https://vue-faq.org/ru/book/Chapter_3__Setting_Up_a_Working_Project.html2024-01-28https://vue-faq.org/ru/book/Chapter_4__User_Interface_Composition_with_Components.html2024-01-28https://vue-faq.org/ru/book/Chapter_5__Single-Page_Applications.html2024-01-28https://vue-faq.org/ru/book/Chapter_6__Progressive_Web_Applications.html2024-01-28https://vue-faq.org/ru/book/Chapter_7__Data_Flow_Management.html2024-01-28https://vue-faq.org/ru/book/Chapter_8__Multithreading_with_Web_Workers.html2024-01-28https://vue-faq.org/ru/book/Chapter_9__Testing_and_Source_Control.html2024-01-28https://vue-faq.org/ru/book/2024-01-28https://vue-faq.org/ru/book/summary.html2024-01-28 \ No newline at end of file +https://vue-faq.org/en/backend/api.html2024-01-29https://vue-faq.org/ru/backend/api.html2024-01-29https://vue-faq.org/en/backend/auth.html2024-01-29https://vue-faq.org/ru/backend/auth.html2024-01-29https://vue-faq.org/en/backend/backend.html2024-01-29https://vue-faq.org/ru/backend/backend.html2024-01-29https://vue-faq.org/en/backend/cors.html2024-01-29https://vue-faq.org/ru/backend/cors.html2024-01-29https://vue-faq.org/en/backend/protocols.html2024-01-29https://vue-faq.org/ru/backend/protocols.html2024-01-29https://vue-faq.org/en/deployment/ci-cd.html2024-01-29https://vue-faq.org/ru/deployment/ci-cd.html2024-01-29https://vue-faq.org/en/deployment/docker.html2024-01-29https://vue-faq.org/ru/deployment/docker.html2024-01-29https://vue-faq.org/en/deployment/github-actions.html2024-01-29https://vue-faq.org/ru/deployment/github-actions.html2024-01-29https://vue-faq.org/en/deployment/hosting.html2024-01-29https://vue-faq.org/ru/deployment/hosting.html2024-01-29https://vue-faq.org/en/development/architectural-patterns.html2024-01-29https://vue-faq.org/ru/development/architectural-patterns.html2024-01-29https://vue-faq.org/en/development/assets.html2024-01-29https://vue-faq.org/ru/development/assets.html2024-01-29https://vue-faq.org/en/development/building.html2024-01-29https://vue-faq.org/ru/development/building.html2024-01-29https://vue-faq.org/en/development/ide.html2024-01-29https://vue-faq.org/ru/development/ide.html2024-01-29https://vue-faq.org/en/development/libraries.html2024-01-29https://vue-faq.org/ru/development/libraries.html2024-01-29https://vue-faq.org/en/development/misc.html2024-01-29https://vue-faq.org/ru/development/misc.html2024-01-29https://vue-faq.org/en/development/stores.html2024-01-29https://vue-faq.org/ru/development/stores.html2024-01-29https://vue-faq.org/en/development/testing.html2024-01-29https://vue-faq.org/ru/development/testing.html2024-01-29https://vue-faq.org/en/frontend/about-frameworks.html2024-01-29https://vue-faq.org/ru/frontend/about-frameworks.html2024-01-29https://vue-faq.org/en/frontend/architecture.html2024-01-29https://vue-faq.org/ru/frontend/architecture.html2024-01-29https://vue-faq.org/en/frontend/css-ui-libs.html2024-01-29https://vue-faq.org/ru/frontend/css-ui-libs.html2024-01-29https://vue-faq.org/en/frontend/learning.html2024-01-29https://vue-faq.org/ru/frontend/learning.html2024-01-29https://vue-faq.org/en/frontend/spa-pwa-ssr-ssg.html2024-01-29https://vue-faq.org/ru/frontend/spa-pwa-ssr-ssg.html2024-01-29https://vue-faq.org/en/2024-01-29https://vue-faq.org/2024-01-29https://vue-faq.org/ru/2024-01-29https://vue-faq.org/en/misc/CHANGELOG.html2024-01-29https://vue-faq.org/ru/misc/CHANGELOG.html2024-01-29https://vue-faq.org/en/misc/cheat-sheets.html2024-01-29https://vue-faq.org/ru/misc/cheat-sheets.html2024-01-29https://vue-faq.org/en/misc/contribute.html2024-01-29https://vue-faq.org/ru/misc/contribute.html2024-01-29https://vue-faq.org/en/misc/glossary.html2024-01-29https://vue-faq.org/ru/misc/glossary.html2024-01-29https://vue-faq.org/en/misc/introduction.html2024-01-29https://vue-faq.org/ru/misc/introduction.html2024-01-29https://vue-faq.org/en/vue-webapp/contribution.html2024-01-29https://vue-faq.org/ru/vue-webapp/contribution.html2024-01-29https://vue-faq.org/en/vue-webapp/getting-started.html2024-01-29https://vue-faq.org/ru/vue-webapp/getting-started.html2024-01-29https://vue-faq.org/en/vue-webapp/guidelines.html2024-01-29https://vue-faq.org/ru/vue-webapp/guidelines.html2024-01-29https://vue-faq.org/en/vue-webapp/2024-01-29https://vue-faq.org/ru/vue-webapp/2024-01-29https://vue-faq.org/en/vue-webapp/objectives.html2024-01-29https://vue-faq.org/ru/vue-webapp/objectives.html2024-01-29https://vue-faq.org/en/vue-webapp/options/adaptability.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/adaptability.html2024-01-29https://vue-faq.org/en/vue-webapp/options/api.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/api.html2024-01-29https://vue-faq.org/en/vue-webapp/options/baseIcon.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/baseIcon.html2024-01-29https://vue-faq.org/en/vue-webapp/options/description.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/description.html2024-01-29https://vue-faq.org/en/vue-webapp/options/drawer.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/drawer.html2024-01-29https://vue-faq.org/en/vue-webapp/options/footer.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/footer.html2024-01-29https://vue-faq.org/en/vue-webapp/options/ga-gp.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/ga-gp.html2024-01-29https://vue-faq.org/en/vue-webapp/options/google-analytics.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/google-analytics.html2024-01-29https://vue-faq.org/en/vue-webapp/options/header.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/header.html2024-01-29https://vue-faq.org/en/vue-webapp/options/i18n.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/i18n.html2024-01-29https://vue-faq.org/en/vue-webapp/options/2024-01-29https://vue-faq.org/ru/vue-webapp/options/2024-01-29https://vue-faq.org/en/vue-webapp/options/layout-main.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/layout-main.html2024-01-29https://vue-faq.org/en/vue-webapp/options/layout-one-column.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/layout-one-column.html2024-01-29https://vue-faq.org/en/vue-webapp/options/navbar.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/navbar.html2024-01-29https://vue-faq.org/en/vue-webapp/options/open-graph.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/open-graph.html2024-01-29https://vue-faq.org/en/vue-webapp/options/pwa.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/pwa.html2024-01-29https://vue-faq.org/en/vue-webapp/options/splash-screen.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/splash-screen.html2024-01-29https://vue-faq.org/en/vue-webapp/options/themes.html2024-01-29https://vue-faq.org/ru/vue-webapp/options/themes.html2024-01-29https://vue-faq.org/ru/articles/2024-01-29https://vue-faq.org/ru/arty-crafty/analysis/architecture-and-design.html2024-01-29https://vue-faq.org/ru/arty-crafty/analysis/business-analysis.html2024-01-29https://vue-faq.org/ru/arty-crafty/analysis/data-model.html2024-01-29https://vue-faq.org/ru/arty-crafty/analysis/research.html2024-01-29https://vue-faq.org/ru/arty-crafty/analysis/tech-stack.html2024-01-29https://vue-faq.org/ru/arty-crafty/analysis/ui-design.html2024-01-29https://vue-faq.org/ru/arty-crafty/analysis/ui-layout.html2024-01-29https://vue-faq.org/ru/arty-crafty/backend/baas-choosing.html2024-01-29https://vue-faq.org/ru/arty-crafty/backend/db-data-model.html2024-01-29https://vue-faq.org/ru/arty-crafty/backend/hoppscotch.html2024-01-29https://vue-faq.org/ru/arty-crafty/backend/supabase-api.html2024-01-29https://vue-faq.org/ru/arty-crafty/backend/supabase.html2024-01-29https://vue-faq.org/ru/arty-crafty/2024-01-29https://vue-faq.org/ru/arty-crafty/introduction/development-stages.html2024-01-29https://vue-faq.org/ru/arty-crafty/introduction/goals.html2024-01-29https://vue-faq.org/ru/arty-crafty/introduction/repository.html2024-01-29https://vue-faq.org/ru/arty-crafty/showcase-data/api-service-adapter.html2024-01-29https://vue-faq.org/ru/arty-crafty/showcase-data/mobile-menu.html2024-01-29https://vue-faq.org/ru/arty-crafty/showcase/codeium.html2024-01-29https://vue-faq.org/ru/arty-crafty/showcase/customization.html2024-01-29https://vue-faq.org/ru/arty-crafty/showcase/favourites.html2024-01-29https://vue-faq.org/ru/arty-crafty/showcase/product-category.html2024-01-29https://vue-faq.org/ru/arty-crafty/showcase/project-setup.html2024-01-29https://vue-faq.org/ru/book/Appendix__Migrating_from_Vue_2.html2024-01-29https://vue-faq.org/ru/book/Chapter_10__Deploying_Your_Application.html2024-01-29https://vue-faq.org/ru/book/Chapter_11__Bonus_Chapter_-_UX_Patterns.html2024-01-29https://vue-faq.org/ru/book/Chapter_1__The_Vue_3_Framework.html2024-01-29https://vue-faq.org/ru/book/Chapter_2__Software_Design_Principles_and_Patterns.html2024-01-29https://vue-faq.org/ru/book/Chapter_3__Setting_Up_a_Working_Project.html2024-01-29https://vue-faq.org/ru/book/Chapter_4__User_Interface_Composition_with_Components.html2024-01-29https://vue-faq.org/ru/book/Chapter_5__Single-Page_Applications.html2024-01-29https://vue-faq.org/ru/book/Chapter_6__Progressive_Web_Applications.html2024-01-29https://vue-faq.org/ru/book/Chapter_7__Data_Flow_Management.html2024-01-29https://vue-faq.org/ru/book/Chapter_8__Multithreading_with_Web_Workers.html2024-01-29https://vue-faq.org/ru/book/Chapter_9__Testing_and_Source_Control.html2024-01-29https://vue-faq.org/ru/book/2024-01-29https://vue-faq.org/ru/book/summary.html2024-01-29 \ No newline at end of file